diff options
Diffstat (limited to 'klinkstatus/src/ui/klshistorycombo.cpp')
-rw-r--r-- | klinkstatus/src/ui/klshistorycombo.cpp | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/klinkstatus/src/ui/klshistorycombo.cpp b/klinkstatus/src/ui/klshistorycombo.cpp new file mode 100644 index 00000000..36deb385 --- /dev/null +++ b/klinkstatus/src/ui/klshistorycombo.cpp @@ -0,0 +1,198 @@ +// +// C++ Implementation: klshistorycombo +// +// Description: +// +// +// Author: Paulo Moura Guedes <moura@kdewebdev.org>, (C) 2004 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "klshistorycombo.h" +#include "klsconfig.h" + +#include <kapplication.h> +#include <kconfig.h> +#include <kcompletionbox.h> +#include <kdebug.h> +#include <kstdaccel.h> +#include <kurldrag.h> +#include <kglobalsettings.h> + + +bool KLSHistoryCombo::items_saved_ = false; + + +KLSHistoryCombo::KLSHistoryCombo(QWidget *parent, const char *name) + : KHistoryCombo(parent, name) +{ + setMaxCount(KLSConfig::maxCountComboUrl()); + + setDuplicatesEnabled(false); + setAutoCompletion(false); + + connect(this, SIGNAL(activated(const QString& )), + this, SLOT(addToHistory(const QString& ))); +} + +KLSHistoryCombo::~KLSHistoryCombo() +{} + +void KLSHistoryCombo::init() +{ + loadItems(); +} + +void KLSHistoryCombo::saveItems() +{ + if(items_saved_) + return; + + QStringList items = historyItems(); + + KLSConfig::setComboUrlHistory(items); + KLSConfig::writeConfig(); + + items_saved_ = true; +} + +void KLSHistoryCombo::loadItems() +{ + clear(); + + QStringList items = KLSConfig::comboUrlHistory(); + + bool block = signalsBlocked(); + blockSignals( true ); + + setHistoryItems(items); + blockSignals(block); + + completionObject()->setItems(items); + + setCompletionMode(KGlobalSettings::completionMode()); +} + +bool KLSHistoryCombo::eventFilter( QObject *o, QEvent *ev ) +{ + // Handle Ctrl+Del/Backspace etc better than the Qt widget, which always + // jumps to the next whitespace. + QLineEdit *edit = lineEdit(); + if ( o == edit ) + { + int type = ev->type(); + if ( type == QEvent::KeyPress ) + { + QKeyEvent *e = static_cast<QKeyEvent *>( ev ); + + if ( e->key() == Key_Return || e->key() == Key_Enter ) + { + //m_modifier = e->state(); + return false; + } + + int delete_word_back = KStdAccel::deleteWordBack().keyCodeQt(); + int delete_word_forward = KStdAccel::deleteWordForward().keyCodeQt(); + + if ( KKey( e ) == KKey(delete_word_back) || + KKey( e ) == KKey(delete_word_forward) || + ((e->state() & ControlButton) && + (e->key() == Key_Left || e->key() == Key_Right) ) ) + { + selectWord(e); + e->accept(); + return true; + } + } + + else if ( type == QEvent::MouseButtonDblClick ) + { + edit->selectAll(); + return true; + } + } + return KComboBox::eventFilter( o, ev ); +} + +/* + Handle Ctrl+Cursor etc better than the Qt widget, which always + jumps to the next whitespace. This code additionally jumps to + the next [/#?:], which makes more sense for URLs. The list of + chars that will stop the cursor are '/', '.', '?', '#', ':'. +*/ +void KLSHistoryCombo::selectWord(QKeyEvent *e) +{ + QLineEdit* edit = lineEdit(); + QString text = edit->text(); + int pos = edit->cursorPosition(); + int pos_old = pos; + int count = 0; + + // TODO: make these a parameter when in kdelibs/kdeui... + QValueList<QChar> chars; + chars << QChar('/') << QChar('.') << QChar('?') << QChar('#') << QChar(':'); + bool allow_space_break = true; + + if( e->key() == Key_Left || e->key() == Key_Backspace ) + { + do + { + pos--; + count++; + if( allow_space_break && text[pos].isSpace() && count > 1 ) + break; + } + while( pos >= 0 && (chars.findIndex(text[pos]) == -1 || count <= 1) ); + + if( e->state() & ShiftButton ) + { + edit->cursorForward(true, 1-count); + } + else if( e->key() == Key_Backspace ) + { + edit->cursorForward(false, 1-count); + QString text = edit->text(); + int pos_to_right = edit->text().length() - pos_old; + QString cut = text.left(edit->cursorPosition()) + text.right(pos_to_right); + edit->setText(cut); + edit->setCursorPosition(pos_old-count+1); + } + else + { + edit->cursorForward(false, 1-count); + } + } + else if( e->key() == Key_Right || e->key() == Key_Delete ) + { + do + { + pos++; + count++; + if( allow_space_break && text[pos].isSpace() ) + break; + } + while( pos < (int) text.length() && chars.findIndex(text[pos]) == -1 ); + + if( e->state() & ShiftButton ) + { + edit->cursorForward(true, count+1); + } + else if( e->key() == Key_Delete ) + { + edit->cursorForward(false, -count-1); + QString text = edit->text(); + int pos_to_right = text.length() - pos - 1; + QString cut = text.left(pos_old) + + (pos_to_right > 0 ? text.right(pos_to_right) : QString() ); + edit->setText(cut); + edit->setCursorPosition(pos_old); + } + else + { + edit->cursorForward(false, count+1); + } + } +} + +#include "klshistorycombo.moc" |