From 43636e0371d99c0e3d623a39dfde6f1f685968fe Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Thu, 7 Feb 2013 19:48:27 -0600 Subject: Rename kcompletionbox --- kabc/addresslineedit.cpp | 2 +- tdehtml/rendering/render_form.cpp | 2 +- tdeio/tdefile/tdefiledialog.cpp | 2 +- tdeui/CMakeLists.txt | 4 +- tdeui/MAINTAINERS | 2 +- tdeui/Makefile.am | 4 +- tdeui/kcombobox.cpp | 2 +- tdeui/kcompletionbox.cpp | 562 -------------------------------------- tdeui/kcompletionbox.h | 246 ----------------- tdeui/klineedit.cpp | 2 +- tdeui/tdecompletionbox.cpp | 562 ++++++++++++++++++++++++++++++++++++++ tdeui/tdecompletionbox.h | 246 +++++++++++++++++ tdeui/tests/klineedittest.cpp | 2 +- win/pro_files/tdeui/tdeui.pro | 2 +- 14 files changed, 820 insertions(+), 820 deletions(-) delete mode 100644 tdeui/kcompletionbox.cpp delete mode 100644 tdeui/kcompletionbox.h create mode 100644 tdeui/tdecompletionbox.cpp create mode 100644 tdeui/tdecompletionbox.h diff --git a/kabc/addresslineedit.cpp b/kabc/addresslineedit.cpp index cd6820fcd..a61e7a5c9 100644 --- a/kabc/addresslineedit.cpp +++ b/kabc/addresslineedit.cpp @@ -32,7 +32,7 @@ #include #include -#include +#include #include #include #include diff --git a/tdehtml/rendering/render_form.cpp b/tdehtml/rendering/render_form.cpp index 2309ff5d7..89f38a7b2 100644 --- a/tdehtml/rendering/render_form.cpp +++ b/tdehtml/rendering/render_form.cpp @@ -23,7 +23,7 @@ * */ -#include +#include #include #include #include diff --git a/tdeio/tdefile/tdefiledialog.cpp b/tdeio/tdefile/tdefiledialog.cpp index ad0b20456..ed50ae49b 100644 --- a/tdeio/tdefile/tdefiledialog.cpp +++ b/tdeio/tdefile/tdefiledialog.cpp @@ -47,7 +47,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/tdeui/CMakeLists.txt b/tdeui/CMakeLists.txt index 68edcc4e7..b8e11ed32 100644 --- a/tdeui/CMakeLists.txt +++ b/tdeui/CMakeLists.txt @@ -66,7 +66,7 @@ install( FILES kedittoolbar.h kdockwidget.h kanimwidget.h krootpixmap.h kaboutkde.h kaboutapplication.h kpanelapplet.h kpushbutton.h kdcopactionproxy.h kcolorcombo.h - kpanelextension.h kcompletionbox.h ksqueezedtextlabel.h + kpanelextension.h tdecompletionbox.h ksqueezedtextlabel.h kcommand.h twindowlistmenu.h tdefontcombo.h tdeaccelgen.h ktip.h kdatewidget.h karrowbutton.h kguiitem.h kstdguiitem.h kstringvalidator.h twindowinfo.h @@ -129,7 +129,7 @@ set( ${target}_SRCS kanimwidget.cpp krootpixmap.cpp kaboutkde.cpp kaboutapplication.cpp kpanelapplet.cpp kdcopactionproxy.cpp kcolorcombo.cpp kpushbutton.cpp kpanelextension.cpp - kcompletionbox.cpp ksqueezedtextlabel.cpp tdecmodule.cpp + tdecompletionbox.cpp ksqueezedtextlabel.cpp tdecmodule.cpp kcommand.cpp twindowlistmenu.cpp tdefontcombo.cpp ktip.cpp kdatewidget.cpp karrowbutton.cpp tdemainwindowiface.cpp tdemainwindowiface.skel kguiitem.cpp kstdguiitem.cpp diff --git a/tdeui/MAINTAINERS b/tdeui/MAINTAINERS index 1b981e334..4e22d00a0 100644 --- a/tdeui/MAINTAINERS +++ b/tdeui/MAINTAINERS @@ -23,7 +23,7 @@ kcolordialog.cpp Waldo Bastian kcolordrag.cpp kcombobox.cpp Dawit Alemayehu , Carsten Pfeiffer kcommand.cpp Werner Trobin -kcompletionbox.cpp Carsten Pfeiffer +tdecompletionbox.cpp Carsten Pfeiffer kcursor.cpp Carsten Pfeiffer kdatepicker.cpp kdatetbl.cpp diff --git a/tdeui/Makefile.am b/tdeui/Makefile.am index 5da7403fc..4a1b472ff 100644 --- a/tdeui/Makefile.am +++ b/tdeui/Makefile.am @@ -63,7 +63,7 @@ include_HEADERS = kprogressbox.h kprogress.h kcolordlg.h \ kedittoolbar.h kdockwidget.h kanimwidget.h \ krootpixmap.h kaboutkde.h kaboutapplication.h \ kpanelapplet.h kpushbutton.h kdcopactionproxy.h kcolorcombo.h \ - kpanelextension.h kcompletionbox.h ksqueezedtextlabel.h \ + kpanelextension.h tdecompletionbox.h ksqueezedtextlabel.h \ kcommand.h twindowlistmenu.h tdefontcombo.h tdeaccelgen.h ktip.h \ kdatewidget.h karrowbutton.h kguiitem.h kstdguiitem.h \ kstringvalidator.h twindowinfo.h \ @@ -110,7 +110,7 @@ libtdeui_la_SOURCES = \ kanimwidget.cpp krootpixmap.cpp kaboutkde.cpp \ kaboutapplication.cpp kpanelapplet.cpp kdcopactionproxy.cpp \ kcolorcombo.cpp kpushbutton.cpp kpanelextension.cpp \ - kcompletionbox.cpp ksqueezedtextlabel.cpp tdecmodule.cpp \ + tdecompletionbox.cpp ksqueezedtextlabel.cpp tdecmodule.cpp \ kcommand.cpp twindowlistmenu.cpp tdefontcombo.cpp ktip.cpp \ kdatewidget.cpp karrowbutton.cpp tdemainwindowiface.cpp \ tdemainwindowiface.skel kguiitem.cpp kstdguiitem.cpp \ diff --git a/tdeui/kcombobox.cpp b/tdeui/kcombobox.cpp index c79284717..3ddb4390b 100644 --- a/tdeui/kcombobox.cpp +++ b/tdeui/kcombobox.cpp @@ -25,7 +25,7 @@ #include #include -#include +#include #include #include #include diff --git a/tdeui/kcompletionbox.cpp b/tdeui/kcompletionbox.cpp deleted file mode 100644 index 2dd4e9ccf..000000000 --- a/tdeui/kcompletionbox.cpp +++ /dev/null @@ -1,562 +0,0 @@ -/* This file is part of the KDE libraries - - Copyright (c) 2000,2001,2002 Carsten Pfeiffer - Copyright (c) 2000 Stefan Schimanski <1Stein@gmx.de> - Copyright (c) 2000,2001,2002,2003,2004 Dawit Alemayehu - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License (LGPL) as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - - -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "kcompletionbox.h" - -class TDECompletionBox::TDECompletionBoxPrivate -{ -public: - TQWidget *m_parent; // necessary to set the focus back - TQString cancelText; - bool tabHandling; - bool down_workaround; - bool upwardBox; - bool emitSelected; -}; - -TDECompletionBox::TDECompletionBox( TQWidget *parent, const char *name ) - :TDEListBox( parent, name, (WFlags)WType_Popup ), d(new TDECompletionBoxPrivate) -{ - - d->m_parent = parent; - d->tabHandling = true; - d->down_workaround = false; - d->upwardBox = false; - d->emitSelected = true; - - setColumnMode( 1 ); - setLineWidth( 1 ); - setFrameStyle( TQFrame::Box | TQFrame::Plain ); - - if ( parent ) - setFocusProxy( parent ); - else - setFocusPolicy( TQ_NoFocus ); - - setVScrollBarMode( Auto ); - setHScrollBarMode( AlwaysOff ); - - connect( this, TQT_SIGNAL( doubleClicked( TQListBoxItem * )), - TQT_SLOT( slotActivated( TQListBoxItem * )) ); - - // grmbl, just TQListBox workarounds :[ Thanks Volker. - connect( this, TQT_SIGNAL( currentChanged( TQListBoxItem * )), - TQT_SLOT( slotCurrentChanged() )); - connect( this, TQT_SIGNAL( clicked( TQListBoxItem * )), - TQT_SLOT( slotItemClicked( TQListBoxItem * )) ); -} - -TDECompletionBox::~TDECompletionBox() -{ - d->m_parent = 0L; - delete d; -} - -TQStringList TDECompletionBox::items() const -{ - TQStringList list; - - const TQListBoxItem* currItem = firstItem(); - - while (currItem) { - list.append(currItem->text()); - currItem = currItem->next(); - } - - return list; -} - -void TDECompletionBox::slotActivated( TQListBoxItem *item ) -{ - if ( !item ) - return; - - hide(); - emit activated( item->text() ); -} - -bool TDECompletionBox::eventFilter( TQObject *o, TQEvent *e ) -{ - int type = e->type(); - - if ( TQT_BASE_OBJECT(o) == TQT_BASE_OBJECT(d->m_parent) ) { - if ( isVisible() ) { - if ( type == TQEvent::KeyPress ) { - TQKeyEvent *ev = TQT_TQKEYEVENT( e ); - switch ( ev->key() ) { - case Key_BackTab: - if ( d->tabHandling && (ev->state() == Qt::NoButton || - (ev->state() & ShiftButton)) ) { - up(); - ev->accept(); - return true; - } - break; - case Key_Tab: - if ( d->tabHandling && (ev->state() == Qt::NoButton) ) { - down(); // Only on TAB!! - ev->accept(); - return true; - } - break; - case Key_Down: - down(); - ev->accept(); - return true; - case Key_Up: - // If there is no selected item and we've popped up above - // our parent, select the first item when they press up. - if ( selectedItem() || - mapToGlobal( TQPoint( 0, 0 ) ).y() > - d->m_parent->mapToGlobal( TQPoint( 0, 0 ) ).y() ) - up(); - else - down(); - ev->accept(); - return true; - case Key_Prior: - pageUp(); - ev->accept(); - return true; - case Key_Next: - pageDown(); - ev->accept(); - return true; - case Key_Escape: - canceled(); - ev->accept(); - return true; - case Key_Enter: - case Key_Return: - if ( ev->state() & ShiftButton ) { - hide(); - ev->accept(); // Consume the Enter event - return true; - } - break; - case Key_End: - if ( ev->state() & ControlButton ) - { - end(); - ev->accept(); - return true; - } - case Key_Home: - if ( ev->state() & ControlButton ) - { - home(); - ev->accept(); - return true; - } - default: - break; - } - } - else if ( type == TQEvent::AccelOverride ) { - // Override any acceleartors that match - // the key sequences we use here... - TQKeyEvent *ev = TQT_TQKEYEVENT( e ); - switch ( ev->key() ) { - case Key_Down: - case Key_Up: - case Key_Prior: - case Key_Next: - case Key_Escape: - case Key_Enter: - case Key_Return: - ev->accept(); - return true; - break; - case Key_Tab: - case Key_BackTab: - if ( ev->state() == Qt::NoButton || - (ev->state() & ShiftButton)) - { - ev->accept(); - return true; - } - break; - case Key_Home: - case Key_End: - if ( ev->state() & ControlButton ) - { - ev->accept(); - return true; - } - break; - default: - break; - } - } - - // parent loses focus or gets a click -> we hide - else if ( type == TQEvent::FocusOut || type == TQEvent::Resize || - type == TQEvent::Close || type == TQEvent::Hide || - type == TQEvent::Move ) { - hide(); - } - } - } - - // any mouse-click on something else than "this" makes us hide - else if ( type == TQEvent::MouseButtonPress ) { - TQMouseEvent *ev = TQT_TQMOUSEEVENT( e ); - if ( !rect().contains( ev->pos() )) // this widget - hide(); - - if ( !d->emitSelected && currentItem() && !::tqqt_cast(o) ) - { - emit highlighted( currentText() ); - hide(); - ev->accept(); // Consume the mouse click event... - return true; - } - } - - return TDEListBox::eventFilter( o, e ); -} - - -void TDECompletionBox::popup() -{ - if ( count() == 0 ) - hide(); - else { - ensureCurrentVisible(); - bool block = signalsBlocked(); - blockSignals( true ); - setCurrentItem( 0 ); - blockSignals( block ); - clearSelection(); - if ( !isVisible() ) - show(); - else if ( size().height() != sizeHint().height() ) - sizeAndPosition(); - } -} - -void TDECompletionBox::sizeAndPosition() -{ - int currentGeom = height(); - TQPoint currentPos = pos(); - TQRect geom = calculateGeometry(); - resize( geom.size() ); - - int x = currentPos.x(), y = currentPos.y(); - if ( d->m_parent ) { - if ( !isVisible() ) { - TQRect screenSize = TDEGlobalSettings::desktopGeometry(d->m_parent); - - TQPoint orig = d->m_parent->mapToGlobal( TQPoint(0, d->m_parent->height()) ); - x = orig.x() + geom.x(); - y = orig.y() + geom.y(); - - if ( x + width() > screenSize.right() ) - x = screenSize.right() - width(); - if (y + height() > screenSize.bottom() ) { - y = y - height() - d->m_parent->height(); - d->upwardBox = true; - } - } - else { - // Are we above our parent? If so we must keep bottom edge anchored. - if (d->upwardBox) - y += (currentGeom-height()); - } - move( x, y); - } -} - -void TDECompletionBox::show() -{ - d->upwardBox = false; - if ( d->m_parent ) { - sizeAndPosition(); - tqApp->installEventFilter( this ); - } - - // ### we shouldn't need to call this, but without this, the scrollbars - // are pretty b0rked. - //triggerUpdate( true ); - - // Workaround for I'm not sure whose bug - if this TDECompletionBox' parent - // is in a layout, that layout will detect inserting new child (posted - // ChildInserted event), and will trigger relayout (post LayoutHint event). - // TQWidget::show() sends also posted ChildInserted events for the parent, - // and later all LayoutHint events, which causes layout updating. - // The problem is, TDECompletionBox::eventFilter() detects resizing - // of the parent, and calls hide() - and this hide() happen in the middle - // of show(), causing inconsistent state. I'll try to submit a Qt patch too. - tqApp->sendPostedEvents(); - TDEListBox::show(); -} - -void TDECompletionBox::hide() -{ - if ( d->m_parent ) - tqApp->removeEventFilter( this ); - d->cancelText = TQString::null; - TDEListBox::hide(); -} - -TQRect TDECompletionBox::calculateGeometry() const -{ - int x = 0, y = 0; - int ih = itemHeight(); - int h = QMIN( 15 * ih, (int) count() * ih ) + 2*frameWidth(); - - int w = (d->m_parent) ? d->m_parent->width() : TDEListBox::minimumSizeHint().width(); - w = QMAX( TDEListBox::minimumSizeHint().width(), w ); - - //If we're inside a combox, Qt by default makes the dropdown - // as wide as the combo, and gives the style a chance - // to adjust it. Do that here as well, for consistency - const TQObject* combo; - if ( d->m_parent && (combo = d->m_parent->parent() ) && - combo->inherits(TQCOMBOBOX_OBJECT_NAME_STRING) ) - { - const TQComboBox* cb = static_cast(TQT_TQWIDGET_CONST(combo)); - - //Expand to the combo width - w = QMAX( w, cb->width() ); - - TQPoint parentCorner = d->m_parent->mapToGlobal(TQPoint(0, 0)); - TQPoint comboCorner = cb->mapToGlobal(TQPoint(0, 0)); - - //We need to adjust our horizontal position to also be WRT to the combo - x += comboCorner.x() - parentCorner.x(); - - //The same with vertical one - y += cb->height() - d->m_parent->height() + - comboCorner.y() - parentCorner.y(); - - //Ask the style to refine this a bit - TQRect styleAdj = style().querySubControlMetrics(TQStyle::CC_ComboBox, - cb, TQStyle::SC_ComboBoxListBoxPopup, - TQStyleOption(x, y, w, h)); - //TQCommonStyle returns TQRect() by default, so this is what we get if the - //style doesn't implement this - if (!styleAdj.isNull()) - return styleAdj; - - } - return TQRect(x, y, w, h); -} - -TQSize TDECompletionBox::sizeHint() const -{ - return calculateGeometry().size(); -} - -void TDECompletionBox::down() -{ - int i = currentItem(); - - if ( i == 0 && d->down_workaround ) { - d->down_workaround = false; - setCurrentItem( 0 ); - setSelected( 0, true ); - emit highlighted( currentText() ); - } - - else if ( i < (int) count() - 1 ) - setCurrentItem( i + 1 ); -} - -void TDECompletionBox::up() -{ - if ( currentItem() > 0 ) - setCurrentItem( currentItem() - 1 ); -} - -void TDECompletionBox::pageDown() -{ - int i = currentItem() + numItemsVisible(); - i = i > (int)count() - 1 ? (int)count() - 1 : i; - setCurrentItem( i ); -} - -void TDECompletionBox::pageUp() -{ - int i = currentItem() - numItemsVisible(); - i = i < 0 ? 0 : i; - setCurrentItem( i ); -} - -void TDECompletionBox::home() -{ - setCurrentItem( 0 ); -} - -void TDECompletionBox::end() -{ - setCurrentItem( count() -1 ); -} - -void TDECompletionBox::setTabHandling( bool enable ) -{ - d->tabHandling = enable; -} - -bool TDECompletionBox::isTabHandling() const -{ - return d->tabHandling; -} - -void TDECompletionBox::setCancelledText( const TQString& text ) -{ - d->cancelText = text; -} - -TQString TDECompletionBox::cancelledText() const -{ - return d->cancelText; -} - -void TDECompletionBox::canceled() -{ - if ( !d->cancelText.isNull() ) - emit userCancelled( d->cancelText ); - if ( isVisible() ) - hide(); -} - -class TDECompletionBoxItem : public TQListBoxItem -{ -public: - //Returns true if dirty. - bool reuse( const TQString& newText ) - { - if ( text() == newText ) - return false; - setText( newText ); - return true; - } -}; - - -void TDECompletionBox::insertItems( const TQStringList& items, int index ) -{ - bool block = signalsBlocked(); - blockSignals( true ); - insertStringList( items, index ); - blockSignals( block ); - d->down_workaround = true; -} - -void TDECompletionBox::setItems( const TQStringList& items ) -{ - bool block = signalsBlocked(); - blockSignals( true ); - - TQListBoxItem* item = firstItem(); - if ( !item ) { - insertStringList( items ); - } - else { - //Keep track of whether we need to change anything, - //so we can avoid a repaint for identical updates, - //to reduce flicker - bool dirty = false; - - TQStringList::ConstIterator it = items.constBegin(); - const TQStringList::ConstIterator itEnd = items.constEnd(); - - for ( ; it != itEnd; ++it) { - if ( item ) { - const bool changed = ((TDECompletionBoxItem*)item)->reuse( *it ); - dirty = dirty || changed; - item = item->next(); - } - else { - dirty = true; - //Inserting an item is a way of making this dirty - insertItem( new TQListBoxText( *it ) ); - } - } - - //If there is an unused item, mark as dirty -> less items now - if ( item ) { - dirty = true; - } - - TQListBoxItem* tmp = item; - while ( (item = tmp ) ) { - tmp = item->next(); - delete item; - } - - if (dirty) - triggerUpdate( false ); - } - - if ( isVisible() && size().height() != sizeHint().height() ) - sizeAndPosition(); - - blockSignals( block ); - d->down_workaround = true; -} - -void TDECompletionBox::slotCurrentChanged() -{ - d->down_workaround = false; -} - -void TDECompletionBox::slotItemClicked( TQListBoxItem *item ) -{ - if ( item ) - { - if ( d->down_workaround ) { - d->down_workaround = false; - emit highlighted( item->text() ); - } - - hide(); - emit activated( item->text() ); - } -} - -void TDECompletionBox::setActivateOnSelect(bool state) -{ - d->emitSelected = state; -} - -bool TDECompletionBox::activateOnSelect() const -{ - return d->emitSelected; -} - -void TDECompletionBox::virtual_hook( int id, void* data ) -{ TDEListBox::virtual_hook( id, data ); } - -#include "kcompletionbox.moc" diff --git a/tdeui/kcompletionbox.h b/tdeui/kcompletionbox.h deleted file mode 100644 index b874fec99..000000000 --- a/tdeui/kcompletionbox.h +++ /dev/null @@ -1,246 +0,0 @@ -/* This file is part of the KDE libraries - - Copyright (c) 2000 Carsten Pfeiffer - 2000 Stefan Schimanski <1Stein@gmx.de> - 2000,2001,2002,2003,2004 Dawit Alemayehu - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License (LGPL) as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - -#ifndef KCOMPLETIONBOX_H -#define KCOMPLETIONBOX_H - -class TQEvent; -#include -#include - -/** - * @short A helper widget for "completion-widgets" (KLineEdit, KComboBox)) - * - * A little utility class for "completion-widgets", like KLineEdit or - * KComboBox. TDECompletionBox is a listbox, displayed as a rectangle without - * any window decoration, usually directly under the lineedit or combobox. - * It is filled with all possible matches for a completion, so the user - * can select the one he wants. - * - * It is used when TDEGlobalSettings::Completion == CompletionPopup or CompletionPopupAuto. - * - * @author Carsten Pfeiffer - */ -class TDEUI_EXPORT TDECompletionBox : public TDEListBox -{ - Q_OBJECT - TQ_PROPERTY( bool isTabHandling READ isTabHandling WRITE setTabHandling ) - TQ_PROPERTY(TQString cancelledText READ cancelledText WRITE setCancelledText) - TQ_PROPERTY( bool activateOnSelect READ activateOnSelect WRITE setActivateOnSelect ) - -public: - /** - * Constructs a TDECompletionBox. - * - * The parent widget is used to give the focus back when pressing the - * up-button on the very first item. - */ - TDECompletionBox( TQWidget *parent, const char *name = 0 ); - - /** - * Destroys the box - */ - ~TDECompletionBox(); - - virtual TQSize sizeHint() const; - - /** - * @returns true if selecting an item results in the emition of the selected signal. - * - * @since 3.4.1 - */ - bool activateOnSelect() const; - -public slots: - /** - * Returns a list of all items currently in the box. - */ - TQStringList items() const; - - /** - * Inserts @p items into the box. Does not clear the items before. - * @p index determines at which position @p items will be inserted. - * (defaults to appending them at the end) - */ - void insertItems( const TQStringList& items, int index = -1 ); - - /** - * Clears the box and inserts @p items. - */ - void setItems( const TQStringList& items ); - - /** - * Adjusts the size of the box to fit the width of the parent given in the - * constructor and pops it up at the most appropriate place, relative to - * the parent. - * - * Depending on the screensize and the position of the parent, this may - * be a different place, however the default is to pop it up and the - * lower left corner of the parent. - * - * Make sure to hide() the box when appropriate. - */ - virtual void popup(); - - /** - * Makes this widget (when visible) capture Tab-key events to traverse the - * items in the dropdown list. - * - * Default off, as it conflicts with the usual behavior of Tab to traverse - * widgets. It is useful for cases like Konqueror's Location Bar, though. - * - * @see isTabHandling - */ - void setTabHandling( bool enable ); - - /** - * @returns true if this widget is handling Tab-key events to traverse the - * items in the dropdown list, otherwise false. - * - * Default is false. - * - * @see setTabHandling - */ - bool isTabHandling() const; - - /** - * Sets the text to be emitted if the user chooses not to - * pick from the available matches. - * - * If the canceled text is not set through this function, the - * userCancelled signal will not be emitted. - * - * @see userCancelled( const TQString& ) - * @param txt the text to be emitted if the user cancels this box - */ - void setCancelledText( const TQString& txt); - - /** - * @returns the text set via setCancelledText() or TQString::null. - */ - TQString cancelledText() const; - - /** - * Set whether or not the selected signal should be emitted when an - * item is selected. By default the selected signal is emitted. - * - * @param state false if the signal should not be emitted. - * @since 3.4.1 - */ - void setActivateOnSelect(bool state); - - - /** - * Moves the selection one line down or select the first item if nothing is selected yet. - */ - void down(); - - /** - * Moves the selection one line up or select the first item if nothing is selected yet. - */ - void up(); - - /** - * Moves the selection one page down. - */ - void pageDown(); - - /** - * Moves the selection one page up. - */ - void pageUp(); - - /** - * Moves the selection up to the first item. - */ - void home(); - - /** - * Moves the selection down to the last item. - */ - void end(); - - /** - * Re-implemented for internal reasons. API is unaffected. - */ - virtual void show(); - - /** - * Re-implemented for internal reasons. API is unaffected. - */ - virtual void hide(); - -signals: - /** - * Emitted when an item was selected, contains the text of - * the selected item. - */ - void activated( const TQString& ); - - /** - * Emitted whenever the user chooses to ignore the available - * selections and close the this box. - */ - void userCancelled( const TQString& ); - -protected: - /** - * This calculates the size of the dropdown and the relative position of the top - * left corner with respect to the parent widget. This matches the geometry and position - * normally used by K/TQComboBox when used with one. - */ - TQRect calculateGeometry() const; - - /** - * This properly sizes and positions the listbox. - */ - void sizeAndPosition(); - - /** - * Reimplemented from TDEListBox to get events from the viewport (to hide - * this widget on mouse-click, Escape-presses, etc. - */ - virtual bool eventFilter( TQObject *, TQEvent * ); - -protected slots: - /** - * Called when an item was activated. Emits - * activated() with the item. - */ - virtual void slotActivated( TQListBoxItem * ); - -private slots: - void slotSetCurrentItem( TQListBoxItem *i ) { setCurrentItem( i ); } // grrr - void slotCurrentChanged(); - void canceled(); - void slotItemClicked( TQListBoxItem * ); - -protected: - virtual void virtual_hook( int id, void* data ); - -private: - class TDECompletionBoxPrivate; - TDECompletionBoxPrivate* const d; -}; - - -#endif // KCOMPLETIONBOX_H diff --git a/tdeui/klineedit.cpp b/tdeui/klineedit.cpp index 66230b4a9..4e11f5fa3 100644 --- a/tdeui/klineedit.cpp +++ b/tdeui/klineedit.cpp @@ -36,7 +36,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/tdeui/tdecompletionbox.cpp b/tdeui/tdecompletionbox.cpp new file mode 100644 index 000000000..53a8c71fb --- /dev/null +++ b/tdeui/tdecompletionbox.cpp @@ -0,0 +1,562 @@ +/* This file is part of the KDE libraries + + Copyright (c) 2000,2001,2002 Carsten Pfeiffer + Copyright (c) 2000 Stefan Schimanski <1Stein@gmx.de> + Copyright (c) 2000,2001,2002,2003,2004 Dawit Alemayehu + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License (LGPL) as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "tdecompletionbox.h" + +class TDECompletionBox::TDECompletionBoxPrivate +{ +public: + TQWidget *m_parent; // necessary to set the focus back + TQString cancelText; + bool tabHandling; + bool down_workaround; + bool upwardBox; + bool emitSelected; +}; + +TDECompletionBox::TDECompletionBox( TQWidget *parent, const char *name ) + :TDEListBox( parent, name, (WFlags)WType_Popup ), d(new TDECompletionBoxPrivate) +{ + + d->m_parent = parent; + d->tabHandling = true; + d->down_workaround = false; + d->upwardBox = false; + d->emitSelected = true; + + setColumnMode( 1 ); + setLineWidth( 1 ); + setFrameStyle( TQFrame::Box | TQFrame::Plain ); + + if ( parent ) + setFocusProxy( parent ); + else + setFocusPolicy( TQ_NoFocus ); + + setVScrollBarMode( Auto ); + setHScrollBarMode( AlwaysOff ); + + connect( this, TQT_SIGNAL( doubleClicked( TQListBoxItem * )), + TQT_SLOT( slotActivated( TQListBoxItem * )) ); + + // grmbl, just TQListBox workarounds :[ Thanks Volker. + connect( this, TQT_SIGNAL( currentChanged( TQListBoxItem * )), + TQT_SLOT( slotCurrentChanged() )); + connect( this, TQT_SIGNAL( clicked( TQListBoxItem * )), + TQT_SLOT( slotItemClicked( TQListBoxItem * )) ); +} + +TDECompletionBox::~TDECompletionBox() +{ + d->m_parent = 0L; + delete d; +} + +TQStringList TDECompletionBox::items() const +{ + TQStringList list; + + const TQListBoxItem* currItem = firstItem(); + + while (currItem) { + list.append(currItem->text()); + currItem = currItem->next(); + } + + return list; +} + +void TDECompletionBox::slotActivated( TQListBoxItem *item ) +{ + if ( !item ) + return; + + hide(); + emit activated( item->text() ); +} + +bool TDECompletionBox::eventFilter( TQObject *o, TQEvent *e ) +{ + int type = e->type(); + + if ( TQT_BASE_OBJECT(o) == TQT_BASE_OBJECT(d->m_parent) ) { + if ( isVisible() ) { + if ( type == TQEvent::KeyPress ) { + TQKeyEvent *ev = TQT_TQKEYEVENT( e ); + switch ( ev->key() ) { + case Key_BackTab: + if ( d->tabHandling && (ev->state() == Qt::NoButton || + (ev->state() & ShiftButton)) ) { + up(); + ev->accept(); + return true; + } + break; + case Key_Tab: + if ( d->tabHandling && (ev->state() == Qt::NoButton) ) { + down(); // Only on TAB!! + ev->accept(); + return true; + } + break; + case Key_Down: + down(); + ev->accept(); + return true; + case Key_Up: + // If there is no selected item and we've popped up above + // our parent, select the first item when they press up. + if ( selectedItem() || + mapToGlobal( TQPoint( 0, 0 ) ).y() > + d->m_parent->mapToGlobal( TQPoint( 0, 0 ) ).y() ) + up(); + else + down(); + ev->accept(); + return true; + case Key_Prior: + pageUp(); + ev->accept(); + return true; + case Key_Next: + pageDown(); + ev->accept(); + return true; + case Key_Escape: + canceled(); + ev->accept(); + return true; + case Key_Enter: + case Key_Return: + if ( ev->state() & ShiftButton ) { + hide(); + ev->accept(); // Consume the Enter event + return true; + } + break; + case Key_End: + if ( ev->state() & ControlButton ) + { + end(); + ev->accept(); + return true; + } + case Key_Home: + if ( ev->state() & ControlButton ) + { + home(); + ev->accept(); + return true; + } + default: + break; + } + } + else if ( type == TQEvent::AccelOverride ) { + // Override any acceleartors that match + // the key sequences we use here... + TQKeyEvent *ev = TQT_TQKEYEVENT( e ); + switch ( ev->key() ) { + case Key_Down: + case Key_Up: + case Key_Prior: + case Key_Next: + case Key_Escape: + case Key_Enter: + case Key_Return: + ev->accept(); + return true; + break; + case Key_Tab: + case Key_BackTab: + if ( ev->state() == Qt::NoButton || + (ev->state() & ShiftButton)) + { + ev->accept(); + return true; + } + break; + case Key_Home: + case Key_End: + if ( ev->state() & ControlButton ) + { + ev->accept(); + return true; + } + break; + default: + break; + } + } + + // parent loses focus or gets a click -> we hide + else if ( type == TQEvent::FocusOut || type == TQEvent::Resize || + type == TQEvent::Close || type == TQEvent::Hide || + type == TQEvent::Move ) { + hide(); + } + } + } + + // any mouse-click on something else than "this" makes us hide + else if ( type == TQEvent::MouseButtonPress ) { + TQMouseEvent *ev = TQT_TQMOUSEEVENT( e ); + if ( !rect().contains( ev->pos() )) // this widget + hide(); + + if ( !d->emitSelected && currentItem() && !::tqqt_cast(o) ) + { + emit highlighted( currentText() ); + hide(); + ev->accept(); // Consume the mouse click event... + return true; + } + } + + return TDEListBox::eventFilter( o, e ); +} + + +void TDECompletionBox::popup() +{ + if ( count() == 0 ) + hide(); + else { + ensureCurrentVisible(); + bool block = signalsBlocked(); + blockSignals( true ); + setCurrentItem( 0 ); + blockSignals( block ); + clearSelection(); + if ( !isVisible() ) + show(); + else if ( size().height() != sizeHint().height() ) + sizeAndPosition(); + } +} + +void TDECompletionBox::sizeAndPosition() +{ + int currentGeom = height(); + TQPoint currentPos = pos(); + TQRect geom = calculateGeometry(); + resize( geom.size() ); + + int x = currentPos.x(), y = currentPos.y(); + if ( d->m_parent ) { + if ( !isVisible() ) { + TQRect screenSize = TDEGlobalSettings::desktopGeometry(d->m_parent); + + TQPoint orig = d->m_parent->mapToGlobal( TQPoint(0, d->m_parent->height()) ); + x = orig.x() + geom.x(); + y = orig.y() + geom.y(); + + if ( x + width() > screenSize.right() ) + x = screenSize.right() - width(); + if (y + height() > screenSize.bottom() ) { + y = y - height() - d->m_parent->height(); + d->upwardBox = true; + } + } + else { + // Are we above our parent? If so we must keep bottom edge anchored. + if (d->upwardBox) + y += (currentGeom-height()); + } + move( x, y); + } +} + +void TDECompletionBox::show() +{ + d->upwardBox = false; + if ( d->m_parent ) { + sizeAndPosition(); + tqApp->installEventFilter( this ); + } + + // ### we shouldn't need to call this, but without this, the scrollbars + // are pretty b0rked. + //triggerUpdate( true ); + + // Workaround for I'm not sure whose bug - if this TDECompletionBox' parent + // is in a layout, that layout will detect inserting new child (posted + // ChildInserted event), and will trigger relayout (post LayoutHint event). + // TQWidget::show() sends also posted ChildInserted events for the parent, + // and later all LayoutHint events, which causes layout updating. + // The problem is, TDECompletionBox::eventFilter() detects resizing + // of the parent, and calls hide() - and this hide() happen in the middle + // of show(), causing inconsistent state. I'll try to submit a Qt patch too. + tqApp->sendPostedEvents(); + TDEListBox::show(); +} + +void TDECompletionBox::hide() +{ + if ( d->m_parent ) + tqApp->removeEventFilter( this ); + d->cancelText = TQString::null; + TDEListBox::hide(); +} + +TQRect TDECompletionBox::calculateGeometry() const +{ + int x = 0, y = 0; + int ih = itemHeight(); + int h = QMIN( 15 * ih, (int) count() * ih ) + 2*frameWidth(); + + int w = (d->m_parent) ? d->m_parent->width() : TDEListBox::minimumSizeHint().width(); + w = QMAX( TDEListBox::minimumSizeHint().width(), w ); + + //If we're inside a combox, Qt by default makes the dropdown + // as wide as the combo, and gives the style a chance + // to adjust it. Do that here as well, for consistency + const TQObject* combo; + if ( d->m_parent && (combo = d->m_parent->parent() ) && + combo->inherits(TQCOMBOBOX_OBJECT_NAME_STRING) ) + { + const TQComboBox* cb = static_cast(TQT_TQWIDGET_CONST(combo)); + + //Expand to the combo width + w = QMAX( w, cb->width() ); + + TQPoint parentCorner = d->m_parent->mapToGlobal(TQPoint(0, 0)); + TQPoint comboCorner = cb->mapToGlobal(TQPoint(0, 0)); + + //We need to adjust our horizontal position to also be WRT to the combo + x += comboCorner.x() - parentCorner.x(); + + //The same with vertical one + y += cb->height() - d->m_parent->height() + + comboCorner.y() - parentCorner.y(); + + //Ask the style to refine this a bit + TQRect styleAdj = style().querySubControlMetrics(TQStyle::CC_ComboBox, + cb, TQStyle::SC_ComboBoxListBoxPopup, + TQStyleOption(x, y, w, h)); + //TQCommonStyle returns TQRect() by default, so this is what we get if the + //style doesn't implement this + if (!styleAdj.isNull()) + return styleAdj; + + } + return TQRect(x, y, w, h); +} + +TQSize TDECompletionBox::sizeHint() const +{ + return calculateGeometry().size(); +} + +void TDECompletionBox::down() +{ + int i = currentItem(); + + if ( i == 0 && d->down_workaround ) { + d->down_workaround = false; + setCurrentItem( 0 ); + setSelected( 0, true ); + emit highlighted( currentText() ); + } + + else if ( i < (int) count() - 1 ) + setCurrentItem( i + 1 ); +} + +void TDECompletionBox::up() +{ + if ( currentItem() > 0 ) + setCurrentItem( currentItem() - 1 ); +} + +void TDECompletionBox::pageDown() +{ + int i = currentItem() + numItemsVisible(); + i = i > (int)count() - 1 ? (int)count() - 1 : i; + setCurrentItem( i ); +} + +void TDECompletionBox::pageUp() +{ + int i = currentItem() - numItemsVisible(); + i = i < 0 ? 0 : i; + setCurrentItem( i ); +} + +void TDECompletionBox::home() +{ + setCurrentItem( 0 ); +} + +void TDECompletionBox::end() +{ + setCurrentItem( count() -1 ); +} + +void TDECompletionBox::setTabHandling( bool enable ) +{ + d->tabHandling = enable; +} + +bool TDECompletionBox::isTabHandling() const +{ + return d->tabHandling; +} + +void TDECompletionBox::setCancelledText( const TQString& text ) +{ + d->cancelText = text; +} + +TQString TDECompletionBox::cancelledText() const +{ + return d->cancelText; +} + +void TDECompletionBox::canceled() +{ + if ( !d->cancelText.isNull() ) + emit userCancelled( d->cancelText ); + if ( isVisible() ) + hide(); +} + +class TDECompletionBoxItem : public TQListBoxItem +{ +public: + //Returns true if dirty. + bool reuse( const TQString& newText ) + { + if ( text() == newText ) + return false; + setText( newText ); + return true; + } +}; + + +void TDECompletionBox::insertItems( const TQStringList& items, int index ) +{ + bool block = signalsBlocked(); + blockSignals( true ); + insertStringList( items, index ); + blockSignals( block ); + d->down_workaround = true; +} + +void TDECompletionBox::setItems( const TQStringList& items ) +{ + bool block = signalsBlocked(); + blockSignals( true ); + + TQListBoxItem* item = firstItem(); + if ( !item ) { + insertStringList( items ); + } + else { + //Keep track of whether we need to change anything, + //so we can avoid a repaint for identical updates, + //to reduce flicker + bool dirty = false; + + TQStringList::ConstIterator it = items.constBegin(); + const TQStringList::ConstIterator itEnd = items.constEnd(); + + for ( ; it != itEnd; ++it) { + if ( item ) { + const bool changed = ((TDECompletionBoxItem*)item)->reuse( *it ); + dirty = dirty || changed; + item = item->next(); + } + else { + dirty = true; + //Inserting an item is a way of making this dirty + insertItem( new TQListBoxText( *it ) ); + } + } + + //If there is an unused item, mark as dirty -> less items now + if ( item ) { + dirty = true; + } + + TQListBoxItem* tmp = item; + while ( (item = tmp ) ) { + tmp = item->next(); + delete item; + } + + if (dirty) + triggerUpdate( false ); + } + + if ( isVisible() && size().height() != sizeHint().height() ) + sizeAndPosition(); + + blockSignals( block ); + d->down_workaround = true; +} + +void TDECompletionBox::slotCurrentChanged() +{ + d->down_workaround = false; +} + +void TDECompletionBox::slotItemClicked( TQListBoxItem *item ) +{ + if ( item ) + { + if ( d->down_workaround ) { + d->down_workaround = false; + emit highlighted( item->text() ); + } + + hide(); + emit activated( item->text() ); + } +} + +void TDECompletionBox::setActivateOnSelect(bool state) +{ + d->emitSelected = state; +} + +bool TDECompletionBox::activateOnSelect() const +{ + return d->emitSelected; +} + +void TDECompletionBox::virtual_hook( int id, void* data ) +{ TDEListBox::virtual_hook( id, data ); } + +#include "tdecompletionbox.moc" diff --git a/tdeui/tdecompletionbox.h b/tdeui/tdecompletionbox.h new file mode 100644 index 000000000..b874fec99 --- /dev/null +++ b/tdeui/tdecompletionbox.h @@ -0,0 +1,246 @@ +/* This file is part of the KDE libraries + + Copyright (c) 2000 Carsten Pfeiffer + 2000 Stefan Schimanski <1Stein@gmx.de> + 2000,2001,2002,2003,2004 Dawit Alemayehu + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License (LGPL) as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef KCOMPLETIONBOX_H +#define KCOMPLETIONBOX_H + +class TQEvent; +#include +#include + +/** + * @short A helper widget for "completion-widgets" (KLineEdit, KComboBox)) + * + * A little utility class for "completion-widgets", like KLineEdit or + * KComboBox. TDECompletionBox is a listbox, displayed as a rectangle without + * any window decoration, usually directly under the lineedit or combobox. + * It is filled with all possible matches for a completion, so the user + * can select the one he wants. + * + * It is used when TDEGlobalSettings::Completion == CompletionPopup or CompletionPopupAuto. + * + * @author Carsten Pfeiffer + */ +class TDEUI_EXPORT TDECompletionBox : public TDEListBox +{ + Q_OBJECT + TQ_PROPERTY( bool isTabHandling READ isTabHandling WRITE setTabHandling ) + TQ_PROPERTY(TQString cancelledText READ cancelledText WRITE setCancelledText) + TQ_PROPERTY( bool activateOnSelect READ activateOnSelect WRITE setActivateOnSelect ) + +public: + /** + * Constructs a TDECompletionBox. + * + * The parent widget is used to give the focus back when pressing the + * up-button on the very first item. + */ + TDECompletionBox( TQWidget *parent, const char *name = 0 ); + + /** + * Destroys the box + */ + ~TDECompletionBox(); + + virtual TQSize sizeHint() const; + + /** + * @returns true if selecting an item results in the emition of the selected signal. + * + * @since 3.4.1 + */ + bool activateOnSelect() const; + +public slots: + /** + * Returns a list of all items currently in the box. + */ + TQStringList items() const; + + /** + * Inserts @p items into the box. Does not clear the items before. + * @p index determines at which position @p items will be inserted. + * (defaults to appending them at the end) + */ + void insertItems( const TQStringList& items, int index = -1 ); + + /** + * Clears the box and inserts @p items. + */ + void setItems( const TQStringList& items ); + + /** + * Adjusts the size of the box to fit the width of the parent given in the + * constructor and pops it up at the most appropriate place, relative to + * the parent. + * + * Depending on the screensize and the position of the parent, this may + * be a different place, however the default is to pop it up and the + * lower left corner of the parent. + * + * Make sure to hide() the box when appropriate. + */ + virtual void popup(); + + /** + * Makes this widget (when visible) capture Tab-key events to traverse the + * items in the dropdown list. + * + * Default off, as it conflicts with the usual behavior of Tab to traverse + * widgets. It is useful for cases like Konqueror's Location Bar, though. + * + * @see isTabHandling + */ + void setTabHandling( bool enable ); + + /** + * @returns true if this widget is handling Tab-key events to traverse the + * items in the dropdown list, otherwise false. + * + * Default is false. + * + * @see setTabHandling + */ + bool isTabHandling() const; + + /** + * Sets the text to be emitted if the user chooses not to + * pick from the available matches. + * + * If the canceled text is not set through this function, the + * userCancelled signal will not be emitted. + * + * @see userCancelled( const TQString& ) + * @param txt the text to be emitted if the user cancels this box + */ + void setCancelledText( const TQString& txt); + + /** + * @returns the text set via setCancelledText() or TQString::null. + */ + TQString cancelledText() const; + + /** + * Set whether or not the selected signal should be emitted when an + * item is selected. By default the selected signal is emitted. + * + * @param state false if the signal should not be emitted. + * @since 3.4.1 + */ + void setActivateOnSelect(bool state); + + + /** + * Moves the selection one line down or select the first item if nothing is selected yet. + */ + void down(); + + /** + * Moves the selection one line up or select the first item if nothing is selected yet. + */ + void up(); + + /** + * Moves the selection one page down. + */ + void pageDown(); + + /** + * Moves the selection one page up. + */ + void pageUp(); + + /** + * Moves the selection up to the first item. + */ + void home(); + + /** + * Moves the selection down to the last item. + */ + void end(); + + /** + * Re-implemented for internal reasons. API is unaffected. + */ + virtual void show(); + + /** + * Re-implemented for internal reasons. API is unaffected. + */ + virtual void hide(); + +signals: + /** + * Emitted when an item was selected, contains the text of + * the selected item. + */ + void activated( const TQString& ); + + /** + * Emitted whenever the user chooses to ignore the available + * selections and close the this box. + */ + void userCancelled( const TQString& ); + +protected: + /** + * This calculates the size of the dropdown and the relative position of the top + * left corner with respect to the parent widget. This matches the geometry and position + * normally used by K/TQComboBox when used with one. + */ + TQRect calculateGeometry() const; + + /** + * This properly sizes and positions the listbox. + */ + void sizeAndPosition(); + + /** + * Reimplemented from TDEListBox to get events from the viewport (to hide + * this widget on mouse-click, Escape-presses, etc. + */ + virtual bool eventFilter( TQObject *, TQEvent * ); + +protected slots: + /** + * Called when an item was activated. Emits + * activated() with the item. + */ + virtual void slotActivated( TQListBoxItem * ); + +private slots: + void slotSetCurrentItem( TQListBoxItem *i ) { setCurrentItem( i ); } // grrr + void slotCurrentChanged(); + void canceled(); + void slotItemClicked( TQListBoxItem * ); + +protected: + virtual void virtual_hook( int id, void* data ); + +private: + class TDECompletionBoxPrivate; + TDECompletionBoxPrivate* const d; +}; + + +#endif // KCOMPLETIONBOX_H diff --git a/tdeui/tests/klineedittest.cpp b/tdeui/tests/klineedittest.cpp index cfb4160d2..5146b7d15 100644 --- a/tdeui/tests/klineedittest.cpp +++ b/tdeui/tests/klineedittest.cpp @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include "klineedittest.h" diff --git a/win/pro_files/tdeui/tdeui.pro b/win/pro_files/tdeui/tdeui.pro index f4bde24ec..29924203c 100644 --- a/win/pro_files/tdeui/tdeui.pro +++ b/win/pro_files/tdeui/tdeui.pro @@ -37,7 +37,7 @@ kcolordialog.cpp \ kcolordrag.cpp \ kcombobox.cpp \ kcommand.cpp \ -kcompletionbox.cpp \ +tdecompletionbox.cpp \ tdeconfigdialog.cpp \ kcursor.cpp \ kdatepicker.cpp \ -- cgit v1.2.3