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;
69 enableClickMsg =
false;
71 completionRunning =
false;
74 s_backspacePerformsCompletion =
config.readEntry(
"Backspace performs completion",
false);
80 wideEnoughForClear =
true;
87 QString metaMsg =
i18nc(
"Italic placeholder text in line edits: 0 no, 1 yes",
"1");
88 italicizePlaceholder = (metaMsg.trimmed() !=
QString(
'0'));
98 void _k_slotSettingsChanged(
int category)
107 void _k_textChanged(
const QString &txt)
111 if (!completionRunning && (txt != userText)) {
113 #ifndef KDE_NO_DEPRECATED
114 emit q->userTextChanged(txt);
121 void _k_updateUserText(
const QString &txt)
123 if (!completionRunning && (txt != userText)) {
125 q->setModified(
true);
126 #ifndef KDE_NO_DEPRECATED
127 emit q->userTextChanged(txt);
129 emit q->textEdited(txt);
130 emit q->textChanged(txt);
138 void adjustForReadOnly()
140 if (style && style.data()->m_overlap) {
141 style.data()->m_overlap = 0;
151 bool overrideShortcut(
const QKeyEvent* e);
153 static bool s_initialized;
154 static bool s_backspacePerformsCompletion;
156 QColor previousHighlightColor;
157 QColor previousHighlightedTextColor;
159 bool userSelection: 1;
160 bool autoSuggest : 1;
161 bool disableRestoreSelection: 1;
162 bool handleURLDrops:1;
163 bool grabReturnKeyEvents:1;
164 bool enableSqueezedText:1;
165 bool completionRunning:1;
169 QPalette::ColorRole bgRole;
174 bool enableClickMsg:1;
178 bool possibleTripleClick :1;
181 bool wideEnoughForClear:1;
182 KLineEditButton *clearButton;
183 QWeakPointer<KLineEditStyle> style;
188 bool italicizePlaceholder:1;
190 QAction *noCompletionAction, *shellCompletionAction, *autoCompletionAction, *popupCompletionAction, *shortAutoCompletionAction, *popupAutoCompletionAction, *defaultAction;
196 QStyle *KLineEditStyle::style()
const
199 return m_subStyle.data();
202 return KdeUiProxyStyle::style();
205 QRect KLineEditStyle::subElementRect(SubElement element,
const QStyleOption *option,
const QWidget *widget)
const
207 if (element == SE_LineEditContents) {
208 KLineEditStyle *unconstThis =
const_cast<KLineEditStyle *
>(
this);
212 unconstThis->m_subStyle.clear();
215 unconstThis->m_sentinel =
true;
216 QStyle *s = m_subStyle ? m_subStyle.data() : style();
217 QRect rect = s->subElementRect(SE_LineEditContents, option, widget);
218 unconstThis->m_sentinel =
false;
220 if (option->direction == Qt::LeftToRight) {
221 return rect.adjusted(0, 0, -m_overlap, 0);
223 return rect.adjusted(m_overlap, 0, 0, 0);
227 return KdeUiProxyStyle::subElementRect(element, option, widget);
230 bool KLineEditPrivate::s_backspacePerformsCompletion =
false;
231 bool KLineEditPrivate::s_initialized =
false;
235 :
QLineEdit( string, parent ), d(new KLineEditPrivate(this))
241 :
QLineEdit( parent ), d(new KLineEditPrivate(this))
252 void KLineEdit::init()
254 d->possibleTripleClick =
false;
255 d->bgRole = backgroundRole();
258 QLineEdit::setContextMenuPolicy( Qt::DefaultContextMenu );
265 connect(
this, SIGNAL(selectionChanged()),
this, SLOT(slotRestoreSelectionColors()));
267 connect(
KGlobalSettings::self(), SIGNAL(settingsChanged(
int)),
this, SLOT(_k_slotSettingsChanged(
int)));
269 const QPalette p = palette();
270 if ( !d->previousHighlightedTextColor.isValid() )
271 d->previousHighlightedTextColor=p.color(QPalette::Normal,QPalette::HighlightedText);
272 if ( !d->previousHighlightColor.isValid() )
273 d->previousHighlightColor=p.color(QPalette::Normal,QPalette::Highlight);
276 setStyle(d->style.data());
278 connect(
this, SIGNAL(textChanged(
QString)),
this, SLOT(_k_textChanged(
QString)));
283 return d->clickMessage;
289 if (d->clearButton) {
293 d->clearButton =
new KLineEditButton(
this);
294 d->clearButton->setObjectName(
"KLineEditButton");
295 d->clearButton->setCursor( Qt::ArrowCursor );
296 d->clearButton->setToolTip(
i18nc(
"@action:button Clear current text in the line edit",
"Clear text" ) );
298 updateClearButtonIcon(text());
300 connect(
this, SIGNAL(textChanged(
QString)),
this, SLOT(updateClearButtonIcon(
QString)));
302 disconnect(
this, SIGNAL(textChanged(
QString)),
this, SLOT(updateClearButtonIcon(
QString)));
303 delete d->clearButton;
305 d->clickInClear =
false;
307 d->style.data()->m_overlap = 0;
314 return d->clearButton != 0;
320 if (d->clearButton) {
321 const int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth, 0,
this);
322 s = d->clearButton->sizeHint();
323 s.rwidth() += frameWidth;
329 void KLineEdit::updateClearButtonIcon(
const QString& text)
331 if (!d->clearButton) {
335 d->adjustForReadOnly();
340 if (d->clearButton->pixmap().isNull()) {
342 if (layoutDirection() == Qt::LeftToRight) {
343 d->clearButton->setPixmap(
SmallIcon(
"edit-clear-locationbar-rtl", 0, clearButtonState));
345 d->clearButton->setPixmap(
SmallIcon(
"edit-clear-locationbar-ltr", 0, clearButtonState));
350 if (d->wideEnoughForClear && text.length() > 0) {
351 d->clearButton->animateVisible(
true);
353 d->clearButton->animateVisible(
false);
358 void KLineEdit::updateClearButton()
360 if (!d->clearButton) {
364 d->adjustForReadOnly();
368 const QSize geom = size();
369 const int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth,0,
this);
370 const int buttonWidth = d->clearButton->sizeHint().width();
371 const QSize newButtonSize(buttonWidth, geom.height());
372 const QFontMetrics fm(font());
373 const int em = fm.width(
"m");
377 const bool wideEnough = geom.width() > 4 * em + buttonWidth + frameWidth;
379 if (newButtonSize != d->clearButton->size()) {
380 d->clearButton->resize(newButtonSize);
384 d->style.data()->m_overlap = wideEnough ? buttonWidth + frameWidth : 0;
387 if (layoutDirection() == Qt::LeftToRight ) {
388 d->clearButton->move(geom.width() - frameWidth - buttonWidth - 1, 0);
390 d->clearButton->move(frameWidth + 1, 0);
393 if (wideEnough != d->wideEnoughForClear) {
397 d->wideEnoughForClear = wideEnough;
398 updateClearButtonIcon(text());
408 d->completionBox && d->completionBox->isVisible() )
409 d->completionBox->hide();
413 if ( echoMode() != QLineEdit::Normal )
422 d->autoSuggest =
true;
424 d->autoSuggest =
false;
431 d->disableCompletionMap[ mode ] = disable;
436 if ( !d->autoSuggest )
445 setSelection(t.length(), txt.length()-t.length());
478 if ( input.isEmpty() || input == displayText() )
497 if ( match.isEmpty() )
499 if ( d->completionBox )
501 d->completionBox->hide();
502 d->completionBox->clear();
512 if ( match.isEmpty() || match == text )
518 if ( d->autoSuggest )
526 if (readOnly == isReadOnly ()) {
530 QLineEdit::setReadOnly(readOnly);
533 d->bgRole = backgroundRole();
534 setBackgroundRole(QPalette::Window);
535 if (d->enableSqueezedText && d->squeezedText.isEmpty()) {
536 d->squeezedText = text();
540 if (d->clearButton) {
541 d->clearButton->animateVisible(
false);
542 d->adjustForReadOnly();
545 if (!d->squeezedText.isEmpty()) {
547 d->squeezedText.clear();
550 setBackgroundRole(d->bgRole);
563 d->enableSqueezedText = enable;
568 return d->enableSqueezedText;
573 if( d->enableClickMsg )
575 d->drawClickMsg = text.isEmpty();
578 if( d->enableSqueezedText && isReadOnly() )
580 d->squeezedText = text;
585 QLineEdit::setText( text );
588 void KLineEdit::setSqueezedText()
590 d->squeezedStart = 0;
592 const QString fullText = d->squeezedText;
593 const QFontMetrics fm(fontMetrics());
594 const int labelWidth = size().width() - 2*style()->pixelMetric(QStyle::PM_DefaultFrameWidth) - 2;
595 const int textWidth = fm.width(fullText);
597 if (textWidth > labelWidth)
601 int squeezedWidth = fm.width(squeezedText);
604 int letters = fullText.length() * (labelWidth - squeezedWidth) / textWidth / 2;
605 squeezedText = fullText.left(letters) +
"..." + fullText.right(letters);
606 squeezedWidth = fm.width(squeezedText);
608 if (squeezedWidth < labelWidth)
615 squeezedText = fullText.left(letters) +
"..." + fullText.right(letters);
616 squeezedWidth = fm.width(squeezedText);
617 }
while (squeezedWidth < labelWidth);
619 squeezedText = fullText.left(letters) +
"..." + fullText.right(letters);
621 else if (squeezedWidth > labelWidth)
628 squeezedText = fullText.left(letters) +
"..." + fullText.right(letters);
629 squeezedWidth = fm.width(squeezedText);
630 }
while (squeezedWidth > labelWidth);
636 QLineEdit::setText(fullText);
640 QLineEdit::setText(squeezedText);
641 d->squeezedStart = letters;
642 d->squeezedEnd = fullText.length() - letters;
645 setToolTip( fullText );
650 QLineEdit::setText(fullText);
652 this->setToolTip(
"" );
653 QToolTip::showText(pos(),
QString());
656 setCursorPosition(0);
661 if( !copySqueezedText(
true))
665 bool KLineEdit::copySqueezedText(
bool clipboard)
const
667 if (!d->squeezedText.isEmpty() && d->squeezedStart)
670 if (!that->hasSelectedText())
672 int start = selectionStart(),
end = start + selectedText().length();
673 if (start >= d->squeezedStart+3)
674 start = start - 3 - d->squeezedStart + d->squeezedEnd;
675 else if (start > d->squeezedStart)
676 start = d->squeezedStart;
677 if (
end >= d->squeezedStart+3)
678 end =
end - 3 - d->squeezedStart + d->squeezedEnd;
679 else if (
end > d->squeezedStart)
680 end = d->squeezedEnd;
684 t = t.mid(start,
end - start);
685 disconnect( QApplication::clipboard(), SIGNAL(selectionChanged()),
this, 0);
686 QApplication::clipboard()->setText( t, clipboard ? QClipboard::Clipboard : QClipboard::Selection );
687 connect( QApplication::clipboard(), SIGNAL(selectionChanged()),
this,
688 SLOT(_q_clipboardChanged()) );
696 if (!d->squeezedText.isEmpty())
700 QLineEdit::resizeEvent(ev);
706 const int key = e->key() | e->modifiers();
724 QString text = QApplication::clipboard()->text( QClipboard::Selection);
750 cursorWordBackward(
true);
751 if ( hasSelectedText() )
760 cursorWordForward(
true);
761 if ( hasSelectedText() )
769 cursorWordBackward(
false);
775 cursorWordForward(
false);
795 if ( echoMode() == QLineEdit::Normal &&
798 if (e->key() == Qt::Key_Return || e->key() == Qt::Key_Enter) {
799 const bool trap = (d->completionBox && d->completionBox->isVisible());
800 const bool stopEvent = (trap || (d->grabReturnKeyEvents &&
801 (e->modifiers() == Qt::NoButton ||
802 e->modifiers() == Qt::KeypadModifier)));
805 emit QLineEdit::returnPressed();
812 d->completionBox->hide();
814 setCursorPosition(text().length());
825 const bool noModifier = (e->modifiers() == Qt::NoButton ||
826 e->modifiers() == Qt::ShiftModifier ||
827 e->modifiers() == Qt::KeypadModifier);
833 if ( !d->userSelection && hasSelectedText() &&
834 ( e->key() == Qt::Key_Right || e->key() == Qt::Key_Left ) &&
835 e->modifiers()==Qt::NoButton )
837 const QString old_txt = text();
838 d->disableRestoreSelection =
true;
839 const int start = selectionStart();
842 QLineEdit::keyPressEvent ( e );
843 const int cPosition=cursorPosition();
847 setSelection(old_txt.length(), cPosition - old_txt.length());
848 if (e->key() == Qt::Key_Right && cPosition > start )
851 d->_k_updateUserText(text());
854 d->disableRestoreSelection =
false;
858 if ( e->key() == Qt::Key_Escape )
860 if (hasSelectedText() && !d->userSelection )
877 const QString keycode = e->text();
878 if ( !keycode.isEmpty() && (keycode.unicode()->isPrint() ||
879 e->key() == Qt::Key_Backspace || e->key() == Qt::Key_Delete ) )
881 const bool hasUserSelection=d->userSelection;
882 const bool hadSelection=hasSelectedText();
884 bool cursorNotAtEnd=
false;
886 const int start = selectionStart();
887 const int cPos = cursorPosition();
893 if ( hadSelection && !hasUserSelection && start>cPos )
896 setCursorPosition(cPos);
900 d->disableRestoreSelection =
true;
901 QLineEdit::keyPressEvent ( e );
902 d->disableRestoreSelection =
false;
905 int len = txt.length();
906 if ( !hasSelectedText() && len )
908 if ( e->key() == Qt::Key_Backspace )
910 if ( hadSelection && !hasUserSelection && !cursorNotAtEnd )
917 if (!d->s_backspacePerformsCompletion || !len) {
918 d->autoSuggest =
false;
922 if (e->key() == Qt::Key_Delete )
923 d->autoSuggest=
false;
927 if( (e->key() == Qt::Key_Backspace || e->key() == Qt::Key_Delete) )
940 noModifier && !e->text().isEmpty() )
942 const QString old_txt = text();
943 const bool hasUserSelection=d->userSelection;
944 const bool hadSelection=hasSelectedText();
945 bool cursorNotAtEnd=
false;
947 const int start = selectionStart();
948 const int cPos = cursorPosition();
949 const QString keycode = e->text();
955 if (hadSelection && !hasUserSelection && start>cPos &&
956 ( (!keycode.isEmpty() && keycode.unicode()->isPrint()) ||
957 e->key() == Qt::Key_Backspace || e->key() == Qt::Key_Delete ) )
960 setCursorPosition(cPos);
964 const int selectedLength=selectedText().length();
966 d->disableRestoreSelection =
true;
967 QLineEdit::keyPressEvent ( e );
968 d->disableRestoreSelection =
false;
970 if (( selectedLength != selectedText().length() ) && !hasUserSelection )
971 slotRestoreSelectionColors();
974 int len = txt.length();
975 if ( ( txt != old_txt || txt != e->text() ) && len &&
976 ( (!keycode.isEmpty() && keycode.unicode()->isPrint()) ||
977 e->key() == Qt::Key_Backspace || e->key() == Qt::Key_Delete) )
979 if ( e->key() == Qt::Key_Backspace )
981 if ( hadSelection && !hasUserSelection && !cursorNotAtEnd )
988 if (!d->s_backspacePerformsCompletion) {
989 d->autoSuggest =
false;
993 if (e->key() == Qt::Key_Delete )
994 d->autoSuggest=
false;
996 if ( d->completionBox )
997 d->completionBox->setCancelledText( txt );
1001 if ( (e->key() == Qt::Key_Backspace || e->key() == Qt::Key_Delete ) &&
1003 d->autoSuggest=
true;
1007 else if (!len && d->completionBox && d->completionBox->isVisible())
1008 d->completionBox->hide();
1027 const int len = txt.length();
1028 if ( cursorPosition() == len && len != 0 )
1034 else if ( d->completionBox )
1035 d->completionBox->hide();
1095 const int selectedLength = selectedText().length();
1098 QLineEdit::keyPressEvent ( e );
1100 if ( selectedLength != selectedText().length() )
1101 slotRestoreSelectionColors();
1106 if ( e->button() == Qt::LeftButton )
1108 d->possibleTripleClick=
true;
1109 QTimer::singleShot( QApplication::doubleClickInterval(),
this,
1110 SLOT(tripleClickTimeout()) );
1112 QLineEdit::mouseDoubleClickEvent( e );
1117 if ( (e->button() == Qt::LeftButton ||
1118 e->button() == Qt::MidButton ) &&
1120 d->clickInClear = ( d->clearButton == childAt(e->pos()) || d->clearButton->underMouse() );
1122 if ( d->clickInClear ) {
1123 d->possibleTripleClick =
false;
1127 if ( e->button() == Qt::LeftButton && d->possibleTripleClick ) {
1135 if ( e->button() == Qt::MidButton ) {
1136 if ( hasSelectedText() ) {
1137 if ( QApplication::clipboard()->text( QClipboard::Selection ).length() >0 ) {
1143 QLineEdit::mousePressEvent( e );
1148 if ( d->clickInClear ) {
1149 if ( d->clearButton == childAt(e->pos()) || d->clearButton->underMouse() ) {
1151 if ( e->button() == Qt::MidButton ) {
1152 newText = QApplication::clipboard()->text( QClipboard::Selection );
1155 setSelection(0, text().size());
1159 emit textChanged( newText );
1162 d->clickInClear =
false;
1167 QLineEdit::mouseReleaseEvent( e );
1169 if (QApplication::clipboard()->supportsSelection() ) {
1170 if ( e->button() == Qt::LeftButton ) {
1172 copySqueezedText(
false );
1177 void KLineEdit::tripleClickTimeout()
1179 d->possibleTripleClick=
false;
1184 QMenu *popup = QLineEdit::createStandardContextMenu();
1190 enum { UndoAct, RedoAct, Separator1, CutAct, CopyAct, PasteAct, DeleteAct, ClearAct,
1191 Separator2, SelectAllAct, NCountActs };
1192 QAction *separatorAction = 0L;
1194 const int idx = actionList.indexOf( actionList[DeleteAct] ) + 1;
1195 if ( idx < actionList.count() )
1196 separatorAction = actionList.at( idx );
1197 if ( separatorAction )
1200 if ( text().isEmpty() )
1201 clearAllAction->setEnabled(
false );
1202 popup->insertAction( separatorAction, clearAllAction );
1213 QMenu *subMenu = popup->addMenu(
KIcon(
"text-completion"),
i18nc(
"@title:menu",
"Text Completion") );
1214 connect( subMenu, SIGNAL(triggered(
QAction*)),
1215 this, SLOT(completionMenuActivated(
QAction*)) );
1217 popup->addSeparator();
1219 QActionGroup* ag =
new QActionGroup(
this );
1220 d->noCompletionAction = ag->addAction(
i18nc(
"@item:inmenu Text Completion",
"None"));
1221 d->shellCompletionAction = ag->addAction(
i18nc(
"@item:inmenu Text Completion",
"Manual") );
1222 d->autoCompletionAction = ag->addAction(
i18nc(
"@item:inmenu Text Completion",
"Automatic") );
1223 d->popupCompletionAction = ag->addAction(
i18nc(
"@item:inmenu Text Completion",
"Dropdown List") );
1224 d->shortAutoCompletionAction = ag->addAction(
i18nc(
"@item:inmenu Text Completion",
"Short Automatic") );
1225 d->popupAutoCompletionAction = ag->addAction(
i18nc(
"@item:inmenu Text Completion",
"Dropdown List && Automatic"));
1226 subMenu->addActions( ag->actions() );
1230 d->shellCompletionAction->setCheckable(
true );
1231 d->noCompletionAction->setCheckable(
true );
1232 d->popupCompletionAction->setCheckable(
true );
1233 d->autoCompletionAction->setCheckable(
true );
1234 d->shortAutoCompletionAction->setCheckable(
true );
1235 d->popupAutoCompletionAction->setCheckable(
true );
1253 if ( mode != defaultMode && !d->disableCompletionMap[ defaultMode ] )
1255 subMenu->addSeparator();
1256 d->defaultAction = subMenu->addAction(
i18nc(
"@item:inmenu Text Completion",
"Default") );
1265 if ( QLineEdit::contextMenuPolicy() != Qt::DefaultContextMenu )
1274 popup->exec(e->globalPos());
1278 void KLineEdit::completionMenuActivated(
QAction *act)
1282 if( act == d->noCompletionAction )
1286 else if( act == d->shellCompletionAction)
1290 else if( act == d->autoCompletionAction)
1294 else if( act == d->popupCompletionAction)
1298 else if( act == d->shortAutoCompletionAction)
1302 else if( act == d->popupAutoCompletionAction)
1306 else if( act == d->defaultAction )
1317 d->completionBox && d->completionBox->isVisible() )
1318 d->completionBox->hide();
1325 if( d->handleURLDrops )
1328 if ( !urlList.isEmpty() )
1341 KUrl::List::ConstIterator it;
1342 for( it = urlList.begin() ; it != urlList.end() ; ++it )
1344 if(!dropText.isEmpty())
1347 dropText += (*it).prettyUrl();
1351 setCursorPosition(dropText.length());
1357 QLineEdit::dropEvent(e);
1363 if ( ev->type() == QEvent::ShortcutOverride )
1365 QKeyEvent *e =
static_cast<QKeyEvent *
>( ev );
1366 if (d->overrideShortcut(e)) {
1369 }
else if (ev->type() == QEvent::ApplicationPaletteChange
1370 || ev->type() == QEvent::PaletteChange) {
1372 QPalette p = QApplication::palette();
1373 d->previousHighlightedTextColor=p.color(QPalette::Normal,QPalette::HighlightedText);
1374 d->previousHighlightColor=p.color(QPalette::Normal,QPalette::Highlight);
1376 }
else if (ev->type() == QEvent::StyleChange) {
1383 if (!qobject_cast<KLineEditStyle *>(style()) &&
1384 qstrcmp(style()->metaObject()->className(),
"QStyleSheetStyle") != 0 &&
1385 QLatin1String(style()->metaObject()->className()) != d->lastStyleClass) {
1391 kleStyle->m_subStyle = style();
1394 d->lastStyleClass = QLatin1String(style()->metaObject()->className());
1396 d->lastStyleClass.clear();
1400 return QLineEdit::event( ev );
1406 d->handleURLDrops=enable;
1411 return d->handleURLDrops;
1416 d->grabReturnKeyEvents = grab;
1421 return d->grabReturnKeyEvents;
1431 if ( d->completionBox )
1434 d->completionBox = box;
1437 connect( d->completionBox, SIGNAL(currentTextChanged(
QString)),
1438 SLOT(_k_slotCompletionBoxTextChanged(
QString)) );
1441 connect( d->completionBox, SIGNAL(activated(
QString)),
1443 connect( d->completionBox, SIGNAL(activated(
QString)),
1444 SIGNAL(textEdited(
QString)) );
1458 const bool wasModified = edit->isModified();
1460 edit->setModified(wasModified);
1469 else if (hasSelectedText() )
1471 if (d->userSelection)
1475 d->autoSuggest=
false;
1476 const int start = selectionStart() ;
1477 const QString s = text().remove(selectionStart(), selectedText().length());
1479 setCursorPosition(start);
1480 d->autoSuggest=
true;
1485 bool KLineEditPrivate::overrideShortcut(
const QKeyEvent* e)
1489 const int key = e->key() | e->modifiers();
1550 if (completionBox && completionBox->isVisible ())
1552 const int key = e->key();
1553 const Qt::KeyboardModifiers modifiers = e->modifiers();
1554 if ((key == Qt::Key_Backtab || key == Qt::Key_Tab) &&
1555 (modifiers == Qt::NoModifier || (modifiers & Qt::ShiftModifier)))
1568 if ( d->completionBox && d->completionBox->isVisible() ) {
1576 if ( !items.isEmpty() &&
1577 !(items.count() == 1 && txt == items.first()) )
1582 if ( d->completionBox->isVisible() )
1584 QListWidgetItem* currentItem = d->completionBox->currentItem();
1587 if ( currentItem != 0 ) {
1588 currentSelection = currentItem->text();
1591 d->completionBox->setItems( items );
1594 QListWidgetItem* matchedItem = matchedItems.isEmpty() ? 0 : matchedItems.first();
1597 const bool blocked = d->completionBox->blockSignals(
true );
1598 d->completionBox->setCurrentItem( matchedItem );
1599 d->completionBox->blockSignals( blocked );
1601 d->completionBox->setCurrentRow(-1);
1606 if ( !txt.isEmpty() )
1607 d->completionBox->setCancelledText( txt );
1608 d->completionBox->setItems( items );
1609 d->completionBox->popup();
1612 if ( d->autoSuggest && autoSuggest )
1614 const int index = items.first().indexOf( txt );
1615 const QString newText = items.first().mid( index );
1622 if ( d->completionBox && d->completionBox->isVisible() )
1623 d->completionBox->hide();
1629 if ( create && !d->completionBox ) {
1631 d->completionBox->setObjectName(
"completion box");
1632 d->completionBox->setFont(font());
1635 return d->completionBox;
1642 disconnect( oldComp, SIGNAL(matches(
QStringList)),
1664 if (!d->userSelection && userSelection)
1666 d->_k_updateUserText(text());
1669 QPalette p = palette();
1673 p.setColor(QPalette::Highlight, d->previousHighlightColor);
1674 p.setColor(QPalette::HighlightedText, d->previousHighlightedTextColor);
1678 QColor color=p.color(QPalette::Disabled, QPalette::Text);
1679 p.setColor(QPalette::HighlightedText, color);
1680 color=p.color(QPalette::Active, QPalette::Base);
1681 p.setColor(QPalette::Highlight, color);
1684 d->userSelection=userSelection;
1688 void KLineEdit::slotRestoreSelectionColors()
1690 if (d->disableRestoreSelection)
1701 void KLineEdit::_k_slotCompletionBoxTextChanged(
const QString& text )
1703 if (!text.isEmpty())
1713 if ( d->enableSqueezedText && isReadOnly() )
1714 return d->squeezedText;
1726 return d->autoSuggest;
1731 if (echoMode() == Password && d->threeStars) {
1740 setAttribute(Qt::WA_UpdatesDisabled,
true);
1742 const QString oldText = text();
1743 const bool isModifiedState = isModified();
1744 setText(oldText + oldText + oldText);
1745 QLineEdit::paintEvent(ev);
1747 setModified(isModifiedState);
1748 blockSignals(
false);
1749 setAttribute(Qt::WA_UpdatesDisabled,
false);
1751 QLineEdit::paintEvent( ev );
1754 if (d->enableClickMsg && d->drawClickMsg && !hasFocus() && text().isEmpty()) {
1757 f.setItalic(d->italicizePlaceholder);
1760 QColor color(palette().color(foregroundRole()));
1761 color.setAlphaF(0.5);
1764 QStyleOptionFrame opt;
1765 initStyleOption(&opt);
1766 QRect cr = style()->subElementRect(QStyle::SE_LineEditContents, &opt,
this);
1769 const int verticalMargin(1);
1770 const int horizontalMargin(2);
1772 int left, top, right, bottom;
1773 getTextMargins( &left, &top, &right, &bottom );
1774 cr.adjust( left, top, -right, -bottom );
1778 QFontMetrics fm = fontMetrics();
1779 Qt::Alignment va = alignment() & Qt::AlignVertical_Mask;
1781 switch (va & Qt::AlignVertical_Mask)
1783 case Qt::AlignBottom:
1784 vscroll = cr.y() + cr.height() - fm.height() - verticalMargin;
1788 vscroll = cr.y() + verticalMargin;
1792 vscroll = cr.y() + (cr.height() - fm.height() + 1) / 2;
1797 QRect lineRect(cr.x() + horizontalMargin, vscroll, cr.width() - 2*horizontalMargin, fm.height());
1798 p.drawText(lineRect, Qt::AlignLeft|Qt::AlignVCenter, d->clickMessage);
1805 if ( d->enableClickMsg && d->drawClickMsg )
1807 d->drawClickMsg =
false;
1810 QLineEdit::focusInEvent( ev );
1815 if ( d->enableClickMsg && text().isEmpty() )
1817 d->drawClickMsg =
true;
1820 QLineEdit::focusOutEvent( ev );
1825 d->enableClickMsg = !msg.isEmpty();
1826 d->clickMessage = msg;
1827 d->drawClickMsg = text().isEmpty();
1831 #ifndef KDE_NO_DEPRECATED
1834 QLineEdit::setContextMenuPolicy( showMenu ? Qt::DefaultContextMenu : Qt::NoContextMenu );
1838 #ifndef KDE_NO_DEPRECATED
1841 return ( contextMenuPolicy() == Qt::DefaultContextMenu );
1851 if (val ==
"NoEcho")
1852 setEchoMode(NoEcho);
1854 d->threeStars = (val ==
"ThreeStars");
1855 setEchoMode(Password);
1860 setEchoMode( Normal );
1866 return echoMode() == NoEcho || echoMode() == Password;
1874 d->completionRunning =
true;
1878 d->completionRunning =
false;
1881 #include "klineedit.moc"
1882 #include "klineedit_p.moc"