29 #include "klineedit_p.h"
46 #include <QtCore/QTimer>
47 #include <QtGui/QClipboard>
48 #include <QtGui/QStyleOption>
49 #include <QtGui/QToolTip>
53 class KLineEditPrivate
60 handleURLDrops =
true;
61 grabReturnKeyEvents =
false;
65 disableRestoreSelection =
false;
66 enableSqueezedText =
false;
68 enableClickMsg =
false;
70 completionRunning =
false;
73 s_backspacePerformsCompletion =
config.readEntry(
"Backspace performs completion",
false);
79 wideEnoughForClear =
true;
86 QString metaMsg =
i18nc(
"Italic placeholder text in line edits: 0 no, 1 yes",
"1");
87 italicizePlaceholder = (metaMsg.trimmed() !=
QString(
'0'));
97 void _k_slotSettingsChanged(
int category)
106 void _k_textChanged(
const QString &txt)
110 if (!completionRunning && (txt != userText)) {
112 #ifndef KDE_NO_DEPRECATED
113 emit q->userTextChanged(txt);
120 void _k_updateUserText(
const QString &txt)
122 if (!completionRunning && (txt != userText)) {
124 q->setModified(
true);
125 #ifndef KDE_NO_DEPRECATED
126 emit q->userTextChanged(txt);
128 emit q->textEdited(txt);
129 emit q->textChanged(txt);
137 void adjustForReadOnly()
139 if (style && style.data()->m_overlap) {
140 style.data()->m_overlap = 0;
150 bool overrideShortcut(
const QKeyEvent* e);
152 static bool s_initialized;
153 static bool s_backspacePerformsCompletion;
155 QColor previousHighlightColor;
156 QColor previousHighlightedTextColor;
158 bool userSelection: 1;
159 bool autoSuggest : 1;
160 bool disableRestoreSelection: 1;
161 bool handleURLDrops:1;
162 bool grabReturnKeyEvents:1;
163 bool enableSqueezedText:1;
164 bool completionRunning:1;
168 QPalette::ColorRole bgRole;
173 bool enableClickMsg:1;
176 bool possibleTripleClick :1;
179 bool wideEnoughForClear:1;
180 KLineEditButton *clearButton;
181 QWeakPointer<KLineEditStyle> style;
186 bool italicizePlaceholder:1;
188 QAction *noCompletionAction, *shellCompletionAction, *autoCompletionAction, *popupCompletionAction, *shortAutoCompletionAction, *popupAutoCompletionAction, *defaultAction;
194 QStyle *KLineEditStyle::style()
const
197 return m_subStyle.data();
200 return KdeUiProxyStyle::style();
203 QRect KLineEditStyle::subElementRect(SubElement element,
const QStyleOption *option,
const QWidget *widget)
const
205 if (element == SE_LineEditContents) {
206 KLineEditStyle *unconstThis =
const_cast<KLineEditStyle *
>(
this);
210 unconstThis->m_subStyle.clear();
213 unconstThis->m_sentinel =
true;
214 QStyle *s = m_subStyle ? m_subStyle.data() : style();
215 QRect rect = s->subElementRect(SE_LineEditContents, option, widget);
216 unconstThis->m_sentinel =
false;
218 if (option->direction == Qt::LeftToRight) {
219 return rect.adjusted(0, 0, -m_overlap, 0);
221 return rect.adjusted(m_overlap, 0, 0, 0);
225 return KdeUiProxyStyle::subElementRect(element, option, widget);
228 bool KLineEditPrivate::s_backspacePerformsCompletion =
false;
229 bool KLineEditPrivate::s_initialized =
false;
233 :
QLineEdit( string, parent ), d(new KLineEditPrivate(this))
239 :
QLineEdit( parent ), d(new KLineEditPrivate(this))
250 void KLineEdit::init()
252 d->possibleTripleClick =
false;
253 d->bgRole = backgroundRole();
256 QLineEdit::setContextMenuPolicy( Qt::DefaultContextMenu );
263 connect(
this, SIGNAL(selectionChanged()),
this, SLOT(slotRestoreSelectionColors()));
265 connect(
KGlobalSettings::self(), SIGNAL(settingsChanged(
int)),
this, SLOT(_k_slotSettingsChanged(
int)));
267 const QPalette p = palette();
268 if ( !d->previousHighlightedTextColor.isValid() )
269 d->previousHighlightedTextColor=p.color(QPalette::Normal,QPalette::HighlightedText);
270 if ( !d->previousHighlightColor.isValid() )
271 d->previousHighlightColor=p.color(QPalette::Normal,QPalette::Highlight);
274 setStyle(d->style.data());
276 connect(
this, SIGNAL(textChanged(
QString)),
this, SLOT(_k_textChanged(
QString)));
281 return d->clickMessage;
287 if (d->clearButton) {
291 d->clearButton =
new KLineEditButton(
this);
292 d->clearButton->setObjectName(
"KLineEditButton");
293 d->clearButton->setCursor( Qt::ArrowCursor );
294 d->clearButton->setToolTip(
i18nc(
"@action:button Clear current text in the line edit",
"Clear text" ) );
296 updateClearButtonIcon(text());
298 connect(
this, SIGNAL(textChanged(
QString)),
this, SLOT(updateClearButtonIcon(
QString)));
300 disconnect(
this, SIGNAL(textChanged(
QString)),
this, SLOT(updateClearButtonIcon(
QString)));
301 delete d->clearButton;
303 d->clickInClear =
false;
305 d->style.data()->m_overlap = 0;
312 return d->clearButton != 0;
318 if (d->clearButton) {
319 const int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth, 0,
this);
320 s = d->clearButton->sizeHint();
321 s.rwidth() += frameWidth;
327 void KLineEdit::updateClearButtonIcon(
const QString& text)
329 if (!d->clearButton) {
333 d->adjustForReadOnly();
338 if (d->clearButton->pixmap().isNull()) {
340 if (layoutDirection() == Qt::LeftToRight) {
341 d->clearButton->setPixmap(
SmallIcon(
"edit-clear-locationbar-rtl", 0, clearButtonState));
343 d->clearButton->setPixmap(
SmallIcon(
"edit-clear-locationbar-ltr", 0, clearButtonState));
348 if (d->wideEnoughForClear && text.length() > 0) {
349 d->clearButton->animateVisible(
true);
351 d->clearButton->animateVisible(
false);
356 void KLineEdit::updateClearButton()
358 if (!d->clearButton) {
362 d->adjustForReadOnly();
366 const QSize geom = size();
367 const int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth,0,
this);
368 const int buttonWidth = d->clearButton->sizeHint().width();
369 const QSize newButtonSize(buttonWidth, geom.height());
370 const QFontMetrics fm(font());
371 const int em = fm.width(
"m");
375 const bool wideEnough = geom.width() > 4 * em + buttonWidth + frameWidth;
377 if (newButtonSize != d->clearButton->size()) {
378 d->clearButton->resize(newButtonSize);
382 d->style.data()->m_overlap = wideEnough ? buttonWidth + frameWidth : 0;
385 if (layoutDirection() == Qt::LeftToRight ) {
386 d->clearButton->move(geom.width() - frameWidth - buttonWidth - 1, 0);
388 d->clearButton->move(frameWidth + 1, 0);
391 if (wideEnough != d->wideEnoughForClear) {
395 d->wideEnoughForClear = wideEnough;
396 updateClearButtonIcon(text());
406 d->completionBox && d->completionBox->isVisible() )
407 d->completionBox->hide();
411 if ( echoMode() != QLineEdit::Normal )
414 if (
kapp && !KAuthorized::authorize(
"lineedit_text_completion") )
420 d->autoSuggest =
true;
422 d->autoSuggest =
false;
429 d->disableCompletionMap[ mode ] = disable;
434 if ( !d->autoSuggest )
443 setSelection(t.length(), txt.length()-t.length());
476 if ( input.isEmpty() || input == displayText() )
495 if ( match.isEmpty() )
497 if ( d->completionBox )
499 d->completionBox->hide();
500 d->completionBox->clear();
510 if ( match.isEmpty() || match == text )
516 if ( d->autoSuggest )
524 if (readOnly == isReadOnly ()) {
528 QLineEdit::setReadOnly(readOnly);
531 d->bgRole = backgroundRole();
532 setBackgroundRole(QPalette::Window);
533 if (d->enableSqueezedText && d->squeezedText.isEmpty()) {
534 d->squeezedText = text();
538 if (d->clearButton) {
539 d->clearButton->animateVisible(
false);
540 d->adjustForReadOnly();
543 if (!d->squeezedText.isEmpty()) {
545 d->squeezedText.clear();
548 setBackgroundRole(d->bgRole);
561 d->enableSqueezedText = enable;
566 return d->enableSqueezedText;
571 if( d->enableClickMsg )
575 if( d->enableSqueezedText && isReadOnly() )
577 d->squeezedText = text;
582 QLineEdit::setText( text );
585 void KLineEdit::setSqueezedText()
587 d->squeezedStart = 0;
589 const QString fullText = d->squeezedText;
590 const QFontMetrics fm(fontMetrics());
591 const int labelWidth = size().width() - 2*style()->pixelMetric(QStyle::PM_DefaultFrameWidth) - 2;
592 const int textWidth = fm.width(fullText);
594 if (textWidth > labelWidth)
598 int squeezedWidth = fm.width(squeezedText);
601 int letters = fullText.length() * (labelWidth - squeezedWidth) / textWidth / 2;
602 squeezedText = fullText.left(letters) +
"..." + fullText.right(letters);
603 squeezedWidth = fm.width(squeezedText);
605 if (squeezedWidth < labelWidth)
612 squeezedText = fullText.left(letters) +
"..." + fullText.right(letters);
613 squeezedWidth = fm.width(squeezedText);
614 }
while (squeezedWidth < labelWidth);
616 squeezedText = fullText.left(letters) +
"..." + fullText.right(letters);
618 else if (squeezedWidth > labelWidth)
625 squeezedText = fullText.left(letters) +
"..." + fullText.right(letters);
626 squeezedWidth = fm.width(squeezedText);
627 }
while (squeezedWidth > labelWidth);
633 QLineEdit::setText(fullText);
637 QLineEdit::setText(squeezedText);
638 d->squeezedStart = letters;
639 d->squeezedEnd = fullText.length() - letters;
642 setToolTip( fullText );
647 QLineEdit::setText(fullText);
649 this->setToolTip(
"" );
650 QToolTip::showText(pos(),
QString());
653 setCursorPosition(0);
658 if( !copySqueezedText(
true))
662 bool KLineEdit::copySqueezedText(
bool clipboard)
const
664 if (!d->squeezedText.isEmpty() && d->squeezedStart)
667 if (!that->hasSelectedText())
669 int start = selectionStart(),
end = start + selectedText().length();
670 if (start >= d->squeezedStart+3)
671 start = start - 3 - d->squeezedStart + d->squeezedEnd;
672 else if (start > d->squeezedStart)
673 start = d->squeezedStart;
674 if (
end >= d->squeezedStart+3)
675 end =
end - 3 - d->squeezedStart + d->squeezedEnd;
676 else if (
end > d->squeezedStart)
677 end = d->squeezedEnd;
681 t = t.mid(start,
end - start);
682 disconnect( QApplication::clipboard(), SIGNAL(selectionChanged()),
this, 0);
683 QApplication::clipboard()->setText( t, clipboard ? QClipboard::Clipboard : QClipboard::Selection );
684 connect( QApplication::clipboard(), SIGNAL(selectionChanged()),
this,
685 SLOT(_q_clipboardChanged()) );
693 if (!d->squeezedText.isEmpty())
697 QLineEdit::resizeEvent(ev);
703 const int key = e->key() | e->modifiers();
721 QString text = QApplication::clipboard()->text( QClipboard::Selection);
747 cursorWordBackward(
true);
748 if ( hasSelectedText() )
757 cursorWordForward(
true);
758 if ( hasSelectedText() )
766 cursorWordBackward(
false);
772 cursorWordForward(
false);
792 if ( echoMode() == QLineEdit::Normal &&
795 if (e->key() == Qt::Key_Return || e->key() == Qt::Key_Enter) {
796 const bool trap = (d->completionBox && d->completionBox->isVisible());
797 const bool stopEvent = (trap || (d->grabReturnKeyEvents &&
798 (e->modifiers() == Qt::NoButton ||
799 e->modifiers() == Qt::KeypadModifier)));
802 emit QLineEdit::returnPressed();
809 d->completionBox->hide();
811 setCursorPosition(text().length());
822 const bool noModifier = (e->modifiers() == Qt::NoButton ||
823 e->modifiers() == Qt::ShiftModifier ||
824 e->modifiers() == Qt::KeypadModifier);
830 if ( !d->userSelection && hasSelectedText() &&
831 ( e->key() == Qt::Key_Right || e->key() == Qt::Key_Left ) &&
832 e->modifiers()==Qt::NoButton )
834 const QString old_txt = text();
835 d->disableRestoreSelection =
true;
836 const int start = selectionStart();
839 QLineEdit::keyPressEvent ( e );
840 const int cPosition=cursorPosition();
844 setSelection(old_txt.length(), cPosition - old_txt.length());
845 if (e->key() == Qt::Key_Right && cPosition > start )
848 d->_k_updateUserText(text());
851 d->disableRestoreSelection =
false;
855 if ( e->key() == Qt::Key_Escape )
857 if (hasSelectedText() && !d->userSelection )
874 const QString keycode = e->text();
875 if ( !keycode.isEmpty() && (keycode.unicode()->isPrint() ||
876 e->key() == Qt::Key_Backspace || e->key() == Qt::Key_Delete ) )
878 const bool hasUserSelection=d->userSelection;
879 const bool hadSelection=hasSelectedText();
881 bool cursorNotAtEnd=
false;
883 const int start = selectionStart();
884 const int cPos = cursorPosition();
890 if ( hadSelection && !hasUserSelection && start>cPos )
893 setCursorPosition(cPos);
897 d->disableRestoreSelection =
true;
898 QLineEdit::keyPressEvent ( e );
899 d->disableRestoreSelection =
false;
902 int len = txt.length();
903 if ( !hasSelectedText() && len )
905 if ( e->key() == Qt::Key_Backspace )
907 if ( hadSelection && !hasUserSelection && !cursorNotAtEnd )
914 if (!d->s_backspacePerformsCompletion || !len) {
915 d->autoSuggest =
false;
919 if (e->key() == Qt::Key_Delete )
920 d->autoSuggest=
false;
924 if( (e->key() == Qt::Key_Backspace || e->key() == Qt::Key_Delete) )
937 noModifier && !e->text().isEmpty() )
939 const QString old_txt = text();
940 const bool hasUserSelection=d->userSelection;
941 const bool hadSelection=hasSelectedText();
942 bool cursorNotAtEnd=
false;
944 const int start = selectionStart();
945 const int cPos = cursorPosition();
946 const QString keycode = e->text();
952 if (hadSelection && !hasUserSelection && start>cPos &&
953 ( (!keycode.isEmpty() && keycode.unicode()->isPrint()) ||
954 e->key() == Qt::Key_Backspace || e->key() == Qt::Key_Delete ) )
957 setCursorPosition(cPos);
961 const int selectedLength=selectedText().length();
963 d->disableRestoreSelection =
true;
964 QLineEdit::keyPressEvent ( e );
965 d->disableRestoreSelection =
false;
967 if (( selectedLength != selectedText().length() ) && !hasUserSelection )
968 slotRestoreSelectionColors();
971 int len = txt.length();
972 if ( ( txt != old_txt || txt != e->text() ) && len &&
973 ( (!keycode.isEmpty() && keycode.unicode()->isPrint()) ||
974 e->key() == Qt::Key_Backspace || e->key() == Qt::Key_Delete) )
976 if ( e->key() == Qt::Key_Backspace )
978 if ( hadSelection && !hasUserSelection && !cursorNotAtEnd )
985 if (!d->s_backspacePerformsCompletion) {
986 d->autoSuggest =
false;
990 if (e->key() == Qt::Key_Delete )
991 d->autoSuggest=
false;
993 if ( d->completionBox )
994 d->completionBox->setCancelledText( txt );
998 if ( (e->key() == Qt::Key_Backspace || e->key() == Qt::Key_Delete ) &&
1000 d->autoSuggest=
true;
1004 else if (!len && d->completionBox && d->completionBox->isVisible())
1005 d->completionBox->hide();
1024 const int len = txt.length();
1025 if ( cursorPosition() == len && len != 0 )
1031 else if ( d->completionBox )
1032 d->completionBox->hide();
1092 const int selectedLength = selectedText().length();
1095 QLineEdit::keyPressEvent ( e );
1097 if ( selectedLength != selectedText().length() )
1098 slotRestoreSelectionColors();
1103 if ( e->button() == Qt::LeftButton )
1105 d->possibleTripleClick=
true;
1106 QTimer::singleShot( QApplication::doubleClickInterval(),
this,
1107 SLOT(tripleClickTimeout()) );
1109 QLineEdit::mouseDoubleClickEvent( e );
1114 if ( (e->button() == Qt::LeftButton ||
1115 e->button() == Qt::MidButton ) &&
1117 d->clickInClear = ( d->clearButton == childAt(e->pos()) || d->clearButton->underMouse() );
1119 if ( d->clickInClear ) {
1120 d->possibleTripleClick =
false;
1124 if ( e->button() == Qt::LeftButton && d->possibleTripleClick ) {
1132 if ( e->button() == Qt::MidButton ) {
1133 if ( hasSelectedText() ) {
1134 if ( QApplication::clipboard()->text( QClipboard::Selection ).length() >0 ) {
1140 QLineEdit::mousePressEvent( e );
1145 if ( d->clickInClear ) {
1146 if ( d->clearButton == childAt(e->pos()) || d->clearButton->underMouse() ) {
1148 if ( e->button() == Qt::MidButton ) {
1149 newText = QApplication::clipboard()->text( QClipboard::Selection );
1152 setSelection(0, text().size());
1156 emit textChanged( newText );
1159 d->clickInClear =
false;
1164 QLineEdit::mouseReleaseEvent( e );
1166 if (QApplication::clipboard()->supportsSelection() ) {
1167 if ( e->button() == Qt::LeftButton ) {
1169 copySqueezedText(
false );
1174 void KLineEdit::tripleClickTimeout()
1176 d->possibleTripleClick=
false;
1181 QMenu *popup = QLineEdit::createStandardContextMenu();
1187 enum { UndoAct, RedoAct, Separator1, CutAct, CopyAct, PasteAct, DeleteAct, ClearAct,
1188 Separator2, SelectAllAct, NCountActs };
1189 QAction *separatorAction = 0L;
1191 const int idx = actionList.indexOf( actionList[DeleteAct] ) + 1;
1192 if ( idx < actionList.count() )
1193 separatorAction = actionList.at( idx );
1194 if ( separatorAction )
1197 if ( text().isEmpty() )
1198 clearAllAction->setEnabled(
false );
1199 popup->insertAction( separatorAction, clearAllAction );
1208 if (
compObj() && !isReadOnly() && KAuthorized::authorize(
"lineedit_text_completion") )
1210 QMenu *subMenu = popup->addMenu(
KIcon(
"text-completion"),
i18nc(
"@title:menu",
"Text Completion") );
1211 connect( subMenu, SIGNAL(triggered(
QAction*)),
1212 this, SLOT(completionMenuActivated(
QAction*)) );
1214 popup->addSeparator();
1216 QActionGroup* ag =
new QActionGroup(
this );
1217 d->noCompletionAction = ag->addAction(
i18nc(
"@item:inmenu Text Completion",
"None"));
1218 d->shellCompletionAction = ag->addAction(
i18nc(
"@item:inmenu Text Completion",
"Manual") );
1219 d->autoCompletionAction = ag->addAction(
i18nc(
"@item:inmenu Text Completion",
"Automatic") );
1220 d->popupCompletionAction = ag->addAction(
i18nc(
"@item:inmenu Text Completion",
"Dropdown List") );
1221 d->shortAutoCompletionAction = ag->addAction(
i18nc(
"@item:inmenu Text Completion",
"Short Automatic") );
1222 d->popupAutoCompletionAction = ag->addAction(
i18nc(
"@item:inmenu Text Completion",
"Dropdown List && Automatic"));
1223 subMenu->addActions( ag->actions() );
1227 d->shellCompletionAction->setCheckable(
true );
1228 d->noCompletionAction->setCheckable(
true );
1229 d->popupCompletionAction->setCheckable(
true );
1230 d->autoCompletionAction->setCheckable(
true );
1231 d->shortAutoCompletionAction->setCheckable(
true );
1232 d->popupAutoCompletionAction->setCheckable(
true );
1250 if ( mode != defaultMode && !d->disableCompletionMap[ defaultMode ] )
1252 subMenu->addSeparator();
1253 d->defaultAction = subMenu->addAction(
i18nc(
"@item:inmenu Text Completion",
"Default") );
1262 if ( QLineEdit::contextMenuPolicy() != Qt::DefaultContextMenu )
1271 popup->exec(e->globalPos());
1275 void KLineEdit::completionMenuActivated(
QAction *act)
1279 if( act == d->noCompletionAction )
1283 else if( act == d->shellCompletionAction)
1287 else if( act == d->autoCompletionAction)
1291 else if( act == d->popupCompletionAction)
1295 else if( act == d->shortAutoCompletionAction)
1299 else if( act == d->popupAutoCompletionAction)
1303 else if( act == d->defaultAction )
1314 d->completionBox && d->completionBox->isVisible() )
1315 d->completionBox->hide();
1322 if( d->handleURLDrops )
1325 if ( !urlList.isEmpty() )
1338 KUrl::List::ConstIterator it;
1339 for( it = urlList.begin() ; it != urlList.end() ; ++it )
1341 if(!dropText.isEmpty())
1344 dropText += (*it).prettyUrl();
1348 setCursorPosition(dropText.length());
1354 QLineEdit::dropEvent(e);
1360 if ( ev->type() == QEvent::ShortcutOverride )
1362 QKeyEvent *e =
static_cast<QKeyEvent *
>( ev );
1363 if (d->overrideShortcut(e)) {
1366 }
else if (ev->type() == QEvent::ApplicationPaletteChange
1367 || ev->type() == QEvent::PaletteChange) {
1369 QPalette p = QApplication::palette();
1370 d->previousHighlightedTextColor=p.color(QPalette::Normal,QPalette::HighlightedText);
1371 d->previousHighlightColor=p.color(QPalette::Normal,QPalette::Highlight);
1373 }
else if (ev->type() == QEvent::StyleChange) {
1380 if (!qobject_cast<KLineEditStyle *>(style()) &&
1381 qstrcmp(style()->metaObject()->className(),
"QStyleSheetStyle") != 0 &&
1382 QLatin1String(style()->metaObject()->className()) != d->lastStyleClass) {
1388 kleStyle->m_subStyle = style();
1391 d->lastStyleClass = QLatin1String(style()->metaObject()->className());
1393 d->lastStyleClass.clear();
1395 }
else if (ev->type() == QEvent::ApplicationLayoutDirectionChange
1396 || ev->type() == QEvent::LayoutDirectionChange) {
1397 updateClearButtonIcon(text());
1398 updateClearButton();
1401 return QLineEdit::event( ev );
1407 d->handleURLDrops=enable;
1412 return d->handleURLDrops;
1417 d->grabReturnKeyEvents = grab;
1422 return d->grabReturnKeyEvents;
1432 if ( d->completionBox )
1435 d->completionBox = box;
1438 connect( d->completionBox, SIGNAL(currentTextChanged(
QString)),
1439 SLOT(_k_slotCompletionBoxTextChanged(
QString)) );
1442 connect( d->completionBox, SIGNAL(activated(
QString)),
1444 connect( d->completionBox, SIGNAL(activated(
QString)),
1445 SIGNAL(textEdited(
QString)) );
1459 const bool wasModified = edit->isModified();
1461 edit->setModified(wasModified);
1470 else if (hasSelectedText() )
1472 if (d->userSelection)
1476 d->autoSuggest=
false;
1477 const int start = selectionStart() ;
1478 const QString s = text().remove(selectionStart(), selectedText().length());
1480 setCursorPosition(start);
1481 d->autoSuggest=
true;
1486 bool KLineEditPrivate::overrideShortcut(
const QKeyEvent* e)
1490 const int key = e->key() | e->modifiers();
1551 if (completionBox && completionBox->isVisible ())
1553 const int key = e->key();
1554 const Qt::KeyboardModifiers modifiers = e->modifiers();
1555 if ((key == Qt::Key_Backtab || key == Qt::Key_Tab) &&
1556 (modifiers == Qt::NoModifier || (modifiers & Qt::ShiftModifier)))
1569 if ( d->completionBox && d->completionBox->isVisible() ) {
1577 if ( !items.isEmpty() &&
1578 !(items.count() == 1 && txt == items.first()) )
1583 if ( d->completionBox->isVisible() )
1585 QListWidgetItem* currentItem = d->completionBox->currentItem();
1588 if ( currentItem != 0 ) {
1589 currentSelection = currentItem->text();
1592 d->completionBox->setItems( items );
1595 QListWidgetItem* matchedItem = matchedItems.isEmpty() ? 0 : matchedItems.first();
1598 const bool blocked = d->completionBox->blockSignals(
true );
1599 d->completionBox->setCurrentItem( matchedItem );
1600 d->completionBox->blockSignals( blocked );
1602 d->completionBox->setCurrentRow(-1);
1607 if ( !txt.isEmpty() )
1608 d->completionBox->setCancelledText( txt );
1609 d->completionBox->setItems( items );
1610 d->completionBox->popup();
1613 if ( d->autoSuggest && autoSuggest )
1615 const int index = items.first().indexOf( txt );
1616 const QString newText = items.first().mid( index );
1623 if ( d->completionBox && d->completionBox->isVisible() )
1624 d->completionBox->hide();
1630 if ( create && !d->completionBox ) {
1632 d->completionBox->setObjectName(
"completion box");
1633 d->completionBox->setFont(font());
1636 return d->completionBox;
1643 disconnect( oldComp, SIGNAL(matches(
QStringList)),
1665 if (!d->userSelection && userSelection)
1667 d->_k_updateUserText(text());
1670 QPalette p = palette();
1674 p.setColor(QPalette::Highlight, d->previousHighlightColor);
1675 p.setColor(QPalette::HighlightedText, d->previousHighlightedTextColor);
1679 QColor color=p.color(QPalette::Disabled, QPalette::Text);
1680 p.setColor(QPalette::HighlightedText, color);
1681 color=p.color(QPalette::Active, QPalette::Base);
1682 p.setColor(QPalette::Highlight, color);
1685 d->userSelection=userSelection;
1689 void KLineEdit::slotRestoreSelectionColors()
1691 if (d->disableRestoreSelection)
1702 void KLineEdit::_k_slotCompletionBoxTextChanged(
const QString& text )
1704 if (!text.isEmpty())
1714 if ( d->enableSqueezedText && isReadOnly() )
1715 return d->squeezedText;
1727 return d->autoSuggest;
1732 if (echoMode() == Password && d->threeStars) {
1741 setAttribute(Qt::WA_UpdatesDisabled,
true);
1743 const QString oldText = text();
1744 const bool isModifiedState = isModified();
1745 setText(oldText + oldText + oldText);
1746 QLineEdit::paintEvent(ev);
1748 setModified(isModifiedState);
1749 blockSignals(
false);
1750 setAttribute(Qt::WA_UpdatesDisabled,
false);
1752 QLineEdit::paintEvent( ev );
1755 if (d->enableClickMsg && text().isEmpty()) {
1758 f.setItalic(d->italicizePlaceholder);
1761 QColor color(palette().color(foregroundRole()));
1762 color.setAlphaF(0.5);
1765 QStyleOptionFrame opt;
1766 initStyleOption(&opt);
1767 QRect cr = style()->subElementRect(QStyle::SE_LineEditContents, &opt,
this);
1770 const int verticalMargin(1);
1771 const int horizontalMargin(2);
1773 int left, top, right, bottom;
1774 getTextMargins( &left, &top, &right, &bottom );
1775 cr.adjust( left, top, -right, -bottom );
1779 QFontMetrics fm = fontMetrics();
1780 Qt::Alignment va = alignment() & Qt::AlignVertical_Mask;
1782 switch (va & Qt::AlignVertical_Mask)
1784 case Qt::AlignBottom:
1785 vscroll = cr.y() + cr.height() - fm.height() - verticalMargin;
1789 vscroll = cr.y() + verticalMargin;
1793 vscroll = cr.y() + (cr.height() - fm.height() + 1) / 2;
1798 QRect lineRect(cr.x() + horizontalMargin, vscroll, cr.width() - 2*horizontalMargin, fm.height());
1799 p.drawText(lineRect, Qt::AlignLeft|Qt::AlignVCenter, d->clickMessage);
1806 QLineEdit::focusInEvent( ev );
1811 QLineEdit::focusOutEvent( ev );
1816 d->enableClickMsg = !msg.isEmpty();
1817 d->clickMessage = msg;
1821 #ifndef KDE_NO_DEPRECATED
1824 QLineEdit::setContextMenuPolicy( showMenu ? Qt::DefaultContextMenu : Qt::NoContextMenu );
1828 #ifndef KDE_NO_DEPRECATED
1831 return ( contextMenuPolicy() == Qt::DefaultContextMenu );
1841 if (val ==
"NoEcho")
1842 setEchoMode(NoEcho);
1844 d->threeStars = (val ==
"ThreeStars");
1845 setEchoMode(Password);
1850 setEchoMode( Normal );
1856 return echoMode() == NoEcho || echoMode() == Password;
1864 d->completionRunning =
true;
1868 d->completionRunning =
false;
1871 #include "klineedit.moc"
1872 #include "klineedit_p.moc"