diff options
author | Michele Calgaro <michele.calgaro@yahoo.it> | 2024-07-29 12:43:23 +0900 |
---|---|---|
committer | Michele Calgaro <michele.calgaro@yahoo.it> | 2024-07-29 12:43:23 +0900 |
commit | fef846914f8db6dc117e206ef913d519bf6bb33e (patch) | |
tree | d6567b31f7f22d0c8c66eec947dff1960efa25ac /src/widgets/qcombobox.cpp | |
parent | 8ef4ea451dd81dd66b34ed31aaa631f6df24a192 (diff) | |
download | tqt-fef846914f8db6dc117e206ef913d519bf6bb33e.tar.gz tqt-fef846914f8db6dc117e206ef913d519bf6bb33e.zip |
Rename basic widget nt* related files to equivalent tq*
Signed-off-by: Michele Calgaro <michele.calgaro@yahoo.it>
Diffstat (limited to 'src/widgets/qcombobox.cpp')
-rw-r--r-- | src/widgets/qcombobox.cpp | 2338 |
1 files changed, 0 insertions, 2338 deletions
diff --git a/src/widgets/qcombobox.cpp b/src/widgets/qcombobox.cpp deleted file mode 100644 index a491e7ca6..000000000 --- a/src/widgets/qcombobox.cpp +++ /dev/null @@ -1,2338 +0,0 @@ -/********************************************************************** -** -** Implementation of TQComboBox widget class -** -** Created : 940426 -** -** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. -** -** This file is part of the widgets module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "ntqcombobox.h" -#ifndef TQT_NO_COMBOBOX -#include "tqpopupmenu.h" -#include "ntqlistbox.h" -#include "tqpainter.h" -#include "ntqdrawutil.h" -#include "tqstrlist.h" -#include "tqpixmap.h" -#include "tqtimer.h" -#include "ntqapplication.h" -#include "ntqlineedit.h" -#include "tqbitmap.h" -#include "qeffects_p.h" -#include "tqstringlist.h" -#include "ntqcombobox.h" -#include "tqstyle.h" -#include <limits.h> -#if defined(QT_ACCESSIBILITY_SUPPORT) -#include "ntqaccessible.h" -#endif - -/*! - \class TQComboBox ntqcombobox.h - \brief The TQComboBox widget is a combined button and popup list. - - \ingroup basic - \mainclass - - A combobox is a selection widget which displays the current item - and can pop up a list of items. A combobox may be editable in - which case the user can enter arbitrary strings. - - Comboboxes provide a means of showing the user's current choice - out of a list of options in a way that takes up the minimum amount - of screen space. - - TQComboBox supports three different display styles: Aqua/Motif 1.x, - Motif 2.0 and Windows. In Motif 1.x, a combobox was called - XmOptionMenu. In Motif 2.0, OSF introduced an improved combobox - and named that XmComboBox. TQComboBox provides both. - - TQComboBox provides two different constructors. The simplest - constructor creates an "old-style" combobox in Motif (or Aqua) - style: - \code - TQComboBox *c = new TQComboBox( this, "read-only combobox" ); - \endcode - - The other constructor creates a new-style combobox in Motif style, - and can create both read-only and editable comboboxes: - \code - TQComboBox *c1 = new TQComboBox( FALSE, this, "read-only combobox" ); - TQComboBox *c2 = new TQComboBox( TRUE, this, "editable combobox" ); - \endcode - - New-style comboboxes use a list box in both Motif and Windows - styles, and both the content size and the on-screen size of the - list box can be limited with sizeLimit() and setMaxCount() - respectively. Old-style comboboxes use a popup in Aqua and Motif - style, and that popup will happily grow larger than the desktop if - you put enough data into it. - - The two constructors create identical-looking comboboxes in - Windows style. - - Comboboxes can contain pixmaps as well as strings; the - insertItem() and changeItem() functions are suitably overloaded. - For editable comboboxes, the function clearEdit() is provided, - to clear the displayed string without changing the combobox's - contents. - - A combobox emits two signals, activated() and highlighted(), when - a new item has been activated (selected) or highlighted (made - current). Both signals exist in two versions, one with a \c - TQString argument and one with an \c int argument. If the user - highlights or activates a pixmap, only the \c int signals are - emitted. Whenever the text of an editable combobox is changed the - textChanged() signal is emitted. - - When the user enters a new string in an editable combobox, the - widget may or may not insert it, and it can insert it in several - locations. The default policy is is \c AtBottom but you can change - this using setInsertionPolicy(). - - It is possible to constrain the input to an editable combobox - using TQValidator; see setValidator(). By default, any input is - accepted. - - If the combobox is not editable then it has a default - focusPolicy() of \c TabFocus, i.e. it will not grab focus if - clicked. This differs from both Windows and Motif. If the combobox - is editable then it has a default focusPolicy() of \c StrongFocus, - i.e. it will grab focus if clicked. - - A combobox can be populated using the insert functions, - insertStringList() and insertItem() for example. Items can be - changed with changeItem(). An item can be removed with - removeItem() and all items can be removed with clear(). The text - of the current item is returned by currentText(), and the text of - a numbered item is returned with text(). The current item can be - set with setCurrentItem() or setCurrentText(). The number of items - in the combobox is returned by count(); the maximum number of - items can be set with setMaxCount(). You can allow editing using - setEditable(). For editable comboboxes you can set auto-completion - using setAutoCompletion() and whether or not the user can add - duplicates is set with setDuplicatesEnabled(). - - <img src="qcombo1-m.png">(Motif 1, read-only)<br clear=all> - <img src="qcombo2-m.png">(Motif 2, editable)<br clear=all> - <img src="qcombo3-m.png">(Motif 2, read-only)<br clear=all> - <img src="qcombo1-w.png">(Windows style) - - Depending on the style, TQComboBox will use a TQListBox or a - TQPopupMenu to display the list of items. See setListBox() for - more information. - - \sa TQLineEdit TQListBox TQSpinBox TQRadioButton TQButtonGroup - \link guibooks.html#fowler GUI Design Handbook: Combo Box,\endlink - \link guibooks.html#fowler GUI Design Handbook: Drop-Down List Box.\endlink -*/ - - -/*! - \enum TQComboBox::Policy - - This enum specifies what the TQComboBox should do when a new string - is entered by the user. - - \value NoInsertion the string will not be inserted into the - combobox. - - \value AtTop insert the string as the first item in the combobox. - - \value AtCurrent replace the previously selected item with the - string the user has entered. - - \value AtBottom insert the string as the last item in the - combobox. - - \value AfterCurrent insert the string after the previously - selected item. - - \value BeforeCurrent insert the string before the previously - selected item. - - activated() is always emitted when the string is entered. - - If inserting the new string would cause the combobox to breach its - content size limit, the item at the other end of the list is - deleted. The definition of "other end" is - implementation-dependent. -*/ - - -/*! - \fn void TQComboBox::activated( int index ) - - This signal is emitted when a new item has been activated - (selected). The \a index is the position of the item in the - combobox. - - This signal is not emitted if the item is changed - programmatically, e.g. using setCurrentItem(). -*/ - -/*! - \overload void TQComboBox::activated( const TQString &string ) - - This signal is emitted when a new item has been activated - (selected). \a string is the selected string. - - You can also use the activated(int) signal, but be aware that its - argument is meaningful only for selected strings, not for user - entered strings. -*/ - -/*! - \fn void TQComboBox::highlighted( int index ) - - This signal is emitted when a new item has been set to be the - current item. The \a index is the position of the item in the - combobox. - - This signal is not emitted if the item is changed - programmatically, e.g. using setCurrentItem(). -*/ - -/*! - \overload void TQComboBox::highlighted( const TQString &string ) - - This signal is emitted when a new item has been set to be the - current item. \a string is the item's text. - - You can also use the highlighted(int) signal. -*/ - -/*! - \fn void TQComboBox::textChanged( const TQString &string ) - - This signal is used for editable comboboxes. It is emitted - whenever the contents of the text entry field changes. \a string - contains the new text. -*/ - -/*! - \property TQComboBox::autoCompletion - \brief whether auto-completion is enabled - - This property can only be set for editable comboboxes, for - non-editable comboboxes it has no effect. It is FALSE by default. -*/ - -/*! - \property TQComboBox::autoMask - \brief whether the combobox is automatically masked - - \sa TQWidget::setAutoMask() -*/ - -/*! \property TQComboBox::autoResize - \brief whether auto resize is enabled - \obsolete - - If this property is set to TRUE then the combobox will resize itself - whenever its contents change. The default is FALSE. -*/ - -/*! - \property TQComboBox::count - \brief the number of items in the combobox -*/ - -/*! - \property TQComboBox::currentItem - \brief the index of the current item in the combobox - - Note that the activated() and highlighted() signals are only - emitted when the user changes the current item, not when it is - changed programmatically. -*/ - -/*! - \property TQComboBox::currentText - \brief the text of the combobox's current item -*/ - -/*! - \property TQComboBox::duplicatesEnabled - \brief whether duplicates are allowed - - If the combobox is editable and the user enters some text in the - combobox's lineedit and presses Enter (and the insertionPolicy() - is not \c NoInsertion), then what happens is this: - \list - \i If the text is not already in the list, the text is inserted. - \i If the text is in the list and this property is TRUE (the - default), the text is inserted. - \i If the text is in the list and this property is FALSE, the text - is \e not inserted; instead the item which has matching text becomes - the current item. - \endlist - - This property only affects user-interaction. You can use - insertItem() to insert duplicates if you wish regardless of this - setting. -*/ - -/*! - \property TQComboBox::editable - \brief whether the combobox is editable - - This property's default is FALSE. Note that the combobox will be - cleared if this property is set to TRUE for a 1.x Motif style - combobox. To avoid this, use setEditable() before inserting any - items. Also note that the 1.x version of Motif didn't have any - editable comboboxes, so the combobox will change it's appearance - to a 2.0 style Motif combobox is it is set to be editable. -*/ - -/*! - \property TQComboBox::insertionPolicy - \brief the position of the items inserted by the user - - The default insertion policy is \c AtBottom. See \l Policy. -*/ - -/*! - \property TQComboBox::maxCount - \brief the maximum number of items allowed in the combobox -*/ - -/*! - \property TQComboBox::sizeLimit - \brief the maximum on-screen size of the combobox. - - This property is ignored for both Motif 1.x style and non-editable - comboboxes in Mac style. The default limit is ten - lines. If the number of items in the combobox is or grows larger - than lines, a scrollbar is added. -*/ - -class TQComboBoxPopup : public TQPopupMenu -{ -public: - TQComboBoxPopup( TQWidget *parent=0, const char *name=0 ) - : TQPopupMenu( parent, name ) - { - } - - int itemHeight( int index ) - { - return TQPopupMenu::itemHeight( index ); - } -}; - -static inline TQString escapedComboString(const TQString &str) -{ - TQString stringToReturn = str; - return stringToReturn.replace('&', "&&"); -} - -class TQComboBoxPopupItem : public TQCustomMenuItem -{ - TQListBoxItem *li; - TQSize sc; // Size cache optimization -public: - TQComboBoxPopupItem(TQListBoxItem *i) : TQCustomMenuItem(), li(i), sc(0, 0) { } - virtual bool fullSpan() const { return TRUE; } - virtual void paint( TQPainter*, const TQColorGroup&, bool, bool, int, int, int, int); - virtual TQSize sizeHint() { if (sc.isNull()) sc = TQSize(li->width(li->listBox()), TQMAX(25, li->height(li->listBox()))); return sc; } -}; -void TQComboBoxPopupItem::paint( TQPainter* p, const TQColorGroup&, bool, - bool, int x, int y, int, int) -{ - p->save(); - p->translate(x, y + ((sizeHint().height() / 2) - (li->height(li->listBox()) / 2))); - li->paint(p); - p->restore(); -} - - -class TQComboBoxData -{ -public: - TQComboBoxData( TQComboBox *cb ): ed( 0 ), usingLBox( FALSE ), pop( 0 ), lBox( 0 ), combo( cb ) - { - duplicatesEnabled = TRUE; - cb->setSizePolicy( TQSizePolicy( TQSizePolicy::Minimum, TQSizePolicy::Fixed ) ); - } - - inline bool usingListBox() { return usingLBox; } - inline TQListBox * listBox() { return lBox; } - inline TQComboBoxPopup * popup() { return pop; } - void updateLinedGeometry(); - void setListBox( TQListBox *l ); - void setPopupMenu( TQComboBoxPopup * pm, bool isPopup=TRUE ); - - int current; - int maxCount; - int sizeLimit; - TQComboBox::Policy p; - bool autoresize; - bool poppedUp; - bool mouseWasInsidePopup; - bool arrowPressed; - bool arrowDown; - bool discardNextMousePress; - bool shortClick; - bool useCompletion; - bool completeNow; - int completeAt; - bool duplicatesEnabled; - int fullHeight, currHeight; - - TQLineEdit * ed; // /bin/ed rules! - TQTimer *completionTimer; - - TQSize sizeHint; - -private: - bool usingLBox; - TQComboBoxPopup *pop; - TQListBox *lBox; - TQComboBox *combo; - -}; - -void TQComboBoxData::updateLinedGeometry() -{ - if ( !ed || !combo ) - return; - TQRect r = TQStyle::visualRect( combo->style().querySubControlMetrics(TQStyle::CC_ComboBox, combo, - TQStyle::SC_ComboBoxEditField), combo ); - - const TQPixmap *pix = current < combo->count() ? combo->pixmap( current ) : 0; - if ( pix && pix->width() < r.width() ) - r.setLeft( r.left() + pix->width() + 4 ); - if ( r != ed->geometry() ) - ed->setGeometry( r ); -} - -void TQComboBoxData::setListBox( TQListBox *l ) -{ - lBox = l; - usingLBox = TRUE; - l->setMouseTracking( TRUE ); -#ifdef TQ_WS_X11 - l->x11SetWindowType( TQWidget::X11WindowTypeCombo ); - l->x11SetWindowTransient( combo->topLevelWidget()); -#endif -} - -void TQComboBoxData::setPopupMenu( TQComboBoxPopup * pm, bool isPopup ) -{ - pop = pm; - if(isPopup) - usingLBox = FALSE; -#ifdef TQ_WS_X11 - if( pm ) { - pm->x11SetWindowType( TQWidget::X11WindowTypeCombo ); - pm->x11SetWindowTransient( combo->topLevelWidget()); - } -#endif -} - -static inline bool checkInsertIndex( const char *method, const char * name, - int count, int *index) -{ - bool range_err = (*index > count); -#if defined(QT_CHECK_RANGE) - if ( range_err ) - tqWarning( "TQComboBox::%s: (%s) Index %d out of range", - method, name ? name : "<no name>", *index ); -#else - Q_UNUSED( method ) - Q_UNUSED( name ) -#endif - if ( *index < 0 ) // append - *index = count; - return !range_err; -} - - -static inline bool checkIndex( const char *method, const char * name, - int count, int index ) -{ - bool range_err = (index >= count); -#if defined(QT_CHECK_RANGE) - if ( range_err ) - tqWarning( "TQComboBox::%s: (%s) Index %i out of range", - method, name ? name : "<no name>", index ); -#else - Q_UNUSED( method ) - Q_UNUSED( name ) -#endif - return !range_err; -} - - - -/*! - Constructs a combobox widget with parent \a parent called \a name. - - This constructor creates a popup list if the program uses Motif - (or Aqua) look and feel; this is compatible with Motif 1.x and - Aqua. - - Note: If you use this constructor to create your TQComboBox, then - the pixmap() function will always return 0. To workaround this, - use the other constructor. - -*/ - - - -TQComboBox::TQComboBox( TQWidget *parent, const char *name ) - : TQWidget( parent, name, WNoAutoErase ) -{ - d = new TQComboBoxData( this ); - if ( style().styleHint(TQStyle::SH_ComboBox_Popup, this) || - style().styleHint(TQStyle::SH_GUIStyle) == TQt::MotifStyle ) { - d->setPopupMenu( new TQComboBoxPopup( this, "in-combo" ) ); - d->popup()->setFont( font() ); - connect( d->popup(), TQ_SIGNAL(activated(int)), - TQ_SLOT(internalActivate(int)) ); - connect( d->popup(), TQ_SIGNAL(highlighted(int)), - TQ_SLOT(internalHighlight(int)) ); - } else { - setUpListBox(); - } - d->ed = 0; - d->current = 0; - d->maxCount = INT_MAX; - d->sizeLimit = 10; - d->p = AtBottom; - d->autoresize = FALSE; - d->poppedUp = FALSE; - d->arrowDown = FALSE; - d->arrowPressed = FALSE; - d->discardNextMousePress = FALSE; - d->shortClick = FALSE; - d->useCompletion = FALSE; - d->completeAt = 0; - d->completeNow = FALSE; - d->completionTimer = new TQTimer( this ); - - setFocusPolicy( TabFocus ); - setBackgroundMode( PaletteButton ); -} - - -/*! - Constructs a combobox with a maximum size and either Motif 2.0 or - Windows look and feel. - - The input field can be edited if \a rw is TRUE, otherwise the user - may only choose one of the items in the combobox. - - The \a parent and \a name arguments are passed on to the TQWidget - constructor. -*/ - - -TQComboBox::TQComboBox( bool rw, TQWidget *parent, const char *name ) - : TQWidget( parent, name, WNoAutoErase ) -{ - d = new TQComboBoxData( this ); - setUpListBox(); - - if(d->popup() && style().styleHint(TQStyle::SH_ComboBox_Popup, this)) - d->popup()->setItemChecked(d->current, FALSE); - d->current = 0; - d->maxCount = INT_MAX; - setSizeLimit(10); - d->p = AtBottom; - d->autoresize = FALSE; - d->poppedUp = FALSE; - d->arrowDown = FALSE; - d->discardNextMousePress = FALSE; - d->shortClick = FALSE; - d->useCompletion = FALSE; - d->completeAt = 0; - d->completeNow = FALSE; - d->completionTimer = new TQTimer( this ); - - setFocusPolicy( StrongFocus ); - - d->ed = 0; - if ( rw ) - setUpLineEdit(); - setBackgroundMode( PaletteButton, PaletteBase ); -} - - - -/*! - Destroys the combobox. -*/ - -TQComboBox::~TQComboBox() -{ - delete d; -} - -void TQComboBox::setDuplicatesEnabled( bool enable ) -{ - d->duplicatesEnabled = enable; -} - -bool TQComboBox::duplicatesEnabled() const -{ - return d->duplicatesEnabled; -} - -int TQComboBox::count() const -{ - if ( d->usingListBox() ) - return d->listBox()->count(); - else - return d->popup()->count(); -} - - -/*! - \overload - - Inserts the \a list of strings at position \a index in the - combobox. - - This is only for compatibility since it does not support Unicode - strings. See insertStringList(). -*/ - -void TQComboBox::insertStrList( const TQStrList &list, int index ) -{ - insertStrList( &list, index ); -} - -/*! - \overload - - Inserts the \a list of strings at position \a index in the - combobox. - - This is only for compatibility since it does not support Unicode - strings. See insertStringList(). -*/ - -void TQComboBox::insertStrList( const TQStrList *list, int index ) -{ - if ( !list ) { -#if defined(QT_CHECK_NULL) - Q_ASSERT( list != 0 ); -#endif - return; - } - TQStrListIterator it( *list ); - const char* tmp; - if ( index < 0 ) - index = count(); - while ( (tmp=it.current()) ) { - ++it; - if ( d->usingListBox() ) - d->listBox()->insertItem( TQString::fromLatin1(tmp), index ); - else - d->popup()->insertItem( escapedComboString(TQString::fromLatin1(tmp)), index, index ); - if ( index++ == d->current && d->current < count() ) { - if ( d->ed ) { - d->ed->setText( text( d->current ) ); - d->updateLinedGeometry(); - } else - update(); - currentChanged(); - } - } - if ( index != count() ) - reIndex(); -} - -/*! - Inserts the \a list of strings at position \a index in the - combobox. -*/ - -void TQComboBox::insertStringList( const TQStringList &list, int index ) -{ - TQStringList::ConstIterator it = list.begin(); - if ( index < 0 ) - index = count(); - while ( it != list.end() ) { - if ( d->usingListBox() ) - d->listBox()->insertItem( *it, index ); - else - d->popup()->insertItem( escapedComboString(*it), index, index ); - if ( index++ == d->current && d->current < count() ) { - if ( d->ed ) { - d->ed->setText( text( d->current ) ); - d->updateLinedGeometry(); - } else - update(); - currentChanged(); - } - ++it; - } - if ( index != count() ) - reIndex(); -} - -/*! - Inserts the array of char * \a strings at position \a index in the - combobox. - - The \a numStrings argument is the number of strings. If \a - numStrings is -1 (default), the \a strings array must be - terminated with 0. - - Example: - \code - static const char* items[] = { "red", "green", "blue", 0 }; - combo->insertStrList( items ); - \endcode - - \sa insertStringList() -*/ - -void TQComboBox::insertStrList( const char **strings, int numStrings, int index) -{ - if ( !strings ) { -#if defined(QT_CHECK_NULL) - Q_ASSERT( strings != 0 ); -#endif - return; - } - if ( index < 0 ) - index = count(); - int i = 0; - while ( (numStrings<0 && strings[i]!=0) || i<numStrings ) { - if ( d->usingListBox() ) - d->listBox()->insertItem( TQString::fromLatin1(strings[i]), index ); - else - d->popup()->insertItem( escapedComboString(TQString::fromLatin1(strings[i])), index, index ); - i++; - if ( index++ == d->current && d->current < count() ) { - if ( d->ed ) { - d->ed->setText( text( d->current ) ); - d->updateLinedGeometry(); - } else - update(); - currentChanged(); - } - } - if ( index != count() ) - reIndex(); -} - - -/*! - Inserts a text item with text \a t, at position \a index. The item - will be appended if \a index is negative. -*/ - -void TQComboBox::insertItem( const TQString &t, int index ) -{ - int cnt = count(); - if ( !checkInsertIndex( "insertItem", name(), cnt, &index ) ) - return; - if ( d->usingListBox() ) - d->listBox()->insertItem( t, index ); - else - d->popup()->insertItem( escapedComboString(t), index, index ); - if ( index != cnt ) - reIndex(); - if ( index == d->current && d->current < count() ) { - if ( d->ed ) { - d->ed->setText( text( d->current ) ); - d->updateLinedGeometry(); - } else - update(); - } - if ( index == d->current ) - currentChanged(); -} - -/*! - \overload - - Inserts a \a pixmap item at position \a index. The item will be - appended if \a index is negative. -*/ - -void TQComboBox::insertItem( const TQPixmap &pixmap, int index ) -{ - int cnt = count(); - if ( !checkInsertIndex( "insertItem", name(), cnt, &index ) ) - return; - if ( d->usingListBox() ) - d->listBox()->insertItem( pixmap, index ); - else - d->popup()->insertItem( pixmap, index, index ); - if ( index != cnt ) - reIndex(); - if ( index == d->current && d->current < count() ) { - if ( d->ed ) { - d->ed->setText( text( d->current ) ); - d->updateLinedGeometry(); - } else - update(); - } - if ( index == d->current ) - currentChanged(); -} - -/*! - \overload - - Inserts a \a pixmap item with additional text \a text at position - \a index. The item will be appended if \a index is negative. -*/ - -void TQComboBox::insertItem( const TQPixmap &pixmap, const TQString& text, int index ) -{ - int cnt = count(); - if ( !checkInsertIndex( "insertItem", name(), cnt, &index ) ) - return; - if ( d->usingListBox() ) - d->listBox()->insertItem( pixmap, text, index ); - else - d->popup()->insertItem( pixmap, escapedComboString(text), index, index ); - if ( index != cnt ) - reIndex(); - if ( index == d->current && d->current < count() ) { - if ( d->ed ) { - d->ed->setText( this->text( d->current ) ); - d->updateLinedGeometry(); - } else - update(); - } - if ( index == d->current ) - currentChanged(); -} - - -/*! - Removes the item at position \a index. -*/ - -void TQComboBox::removeItem( int index ) -{ - int cnt = count(); - if ( !checkIndex( "removeItem", name(), cnt, index ) ) - return; - if ( d->usingListBox() ) { - if ( style().styleHint(TQStyle::SH_ComboBox_Popup, this) && d->popup() ) - d->popup()->removeItemAt( index ); - d->listBox()->removeItem( index ); - } else { - d->popup()->removeItemAt( index ); - } - if ( index != cnt-1 ) - reIndex(); - if ( index == d->current ) { - if ( d->ed ) { - TQString s = TQString::fromLatin1(""); - if (d->current < cnt - 1) - s = text( d->current ); - d->ed->setText( s ); - d->updateLinedGeometry(); - } - else { - if ( d->usingListBox() ) { - d->current = d->listBox()->currentItem(); - } else { - if (d->current > count()-1 && d->current > 0) - d->current--; - } - update(); - } - currentChanged(); - } - else { - if ( !d->ed ) { - if (d->current < cnt - 1) - setCurrentItem( d->current ); - else - setCurrentItem( d->current - 1 ); - } - } - -} - - -/*! - Removes all combobox items. -*/ - -void TQComboBox::clear() -{ - if ( d->usingListBox() ) { - if ( style().styleHint(TQStyle::SH_ComboBox_Popup, this) && d->popup() ) - d->popup()->clear(); - d->listBox()->resize( 0, 0 ); - d->listBox()->clear(); - } else { - d->popup()->clear(); - } - - if(d->popup() && style().styleHint(TQStyle::SH_ComboBox_Popup, this)) - d->popup()->setItemChecked(d->current, FALSE); - d->current = 0; - if ( d->ed ) { - d->ed->setText( TQString::fromLatin1("") ); - d->updateLinedGeometry(); - } - currentChanged(); -} - - -TQString TQComboBox::currentText() const -{ - if ( d->ed ) - return d->ed->text(); - else if ( d->current < count() ) - return text( currentItem() ); - else - return TQString::null; -} - -void TQComboBox::setCurrentText( const TQString& txt ) -{ - int i; - for ( i = 0; i < count(); i++) - if ( text( i ) == txt ) - break; - if ( i < count() ) - setCurrentItem( i ); - else if ( d->ed ) - d->ed->setText( txt ); - else - changeItem( txt, currentItem() ); -} - - -/*! - Returns the text item at position \a index, or TQString::null if - the item is not a string. - - \sa currentText() -*/ - -TQString TQComboBox::text( int index ) const -{ - if ( !checkIndex( "text", name(), count(), index ) ) - return TQString::null; - if ( d->usingListBox() ) { - return d->listBox()->text( index ); - } else { - TQString retText = d->popup()->text(index); - retText.replace("&&", "&"); - return retText; - } -} - -/*! - Returns the pixmap item at position \a index, or 0 if the item is - not a pixmap. -*/ - -const TQPixmap *TQComboBox::pixmap( int index ) const -{ - if ( !checkIndex( "pixmap", name(), count(), index ) ) - return 0; - if ( d->usingListBox() ) - return d->listBox()->pixmap( index ); - else - return d->popup()->pixmap( index ); -} - -/*! - Replaces the item at position \a index with the text \a t. -*/ - -void TQComboBox::changeItem( const TQString &t, int index ) -{ - if ( !checkIndex( "changeItem", name(), count(), index ) ) - return; - if ( d->usingListBox() ) - d->listBox()->changeItem( t, index ); - else - d->popup()->changeItem( t, index ); - if ( index == d->current ) { - if ( d->ed ) { - d->ed->setText( text( d->current ) ); - d->updateLinedGeometry(); - } else - update(); - } -} - -/*! - \overload - - Replaces the item at position \a index with the pixmap \a im, - unless the combobox is editable. - - \sa insertItem() -*/ - -void TQComboBox::changeItem( const TQPixmap &im, int index ) -{ - if ( !checkIndex( "changeItem", name(), count(), index ) ) - return; - if ( d->usingListBox() ) - d->listBox()->changeItem( im, index ); - else - d->popup()->changeItem( im, index ); - if ( index == d->current ) - update(); -} - -/*! - \overload - - Replaces the item at position \a index with the pixmap \a im and - the text \a t. - - \sa insertItem() -*/ - -void TQComboBox::changeItem( const TQPixmap &im, const TQString &t, int index ) -{ - if ( !checkIndex( "changeItem", name(), count(), index ) ) - return; - if ( d->usingListBox() ) - d->listBox()->changeItem( im, t, index ); - else - d->popup()->changeItem( im, t, index ); - if ( index == d->current ) - update(); -} - - -int TQComboBox::currentItem() const -{ - return d->current; -} - -void TQComboBox::setCurrentItem( int index ) -{ - if ( index == d->current && !d->ed ) { - return; - } - if ( !checkIndex( "setCurrentItem", name(), count(), index ) ) { - return; - } - - if ( d->usingListBox() && !( listBox()->item(index) && listBox()->item(index)->isSelectable() ) ) - return; - - if(d->popup() && style().styleHint(TQStyle::SH_ComboBox_Popup, this)) - d->popup()->setItemChecked(d->current, FALSE); - d->current = index; - d->completeAt = 0; - if ( d->ed ) { - d->ed->setText( text( index ) ); - d->updateLinedGeometry(); - } - // ### We want to keep ListBox's currentItem in sync, even if NOT popuped... - if ( d->usingListBox() && d->listBox() ) { - d->listBox()->setCurrentItem( index ); - } else { - internalHighlight( index ); - // internalActivate( index ); ### this leads to weird behavior, as in 3.0.1 - } - - currentChanged(); -} - -bool TQComboBox::autoResize() const -{ - return d->autoresize; -} - -void TQComboBox::setAutoResize( bool enable ) -{ - if ( (bool)d->autoresize != enable ) { - d->autoresize = enable; - if ( enable ) - adjustSize(); - } -} - - -/*! - \reimp - - This implementation caches the size hint to avoid resizing when - the contents change dynamically. To invalidate the cached value - call setFont(). -*/ -TQSize TQComboBox::sizeHint() const -{ - if ( isVisible() && d->sizeHint.isValid() ) - return d->sizeHint; - - constPolish(); - int i, w; - TQFontMetrics fm = fontMetrics(); - - int maxW = count() ? 18 : 7 * fm.width(TQChar('x')) + 18; - int maxH = TQMAX( fm.lineSpacing(), 14 ) + 2; - - if ( !d->usingListBox() ) { - w = d->popup()->sizeHint().width() - 2* d->popup()->frameWidth(); - if ( w > maxW ) - maxW = w; - } else { - for( i = 0; i < count(); i++ ) { - w = d->listBox()->item( i )->width( d->listBox() ); - if ( w > maxW ) - maxW = w; - } - } - - d->sizeHint = (style().sizeFromContents(TQStyle::CT_ComboBox, this, - TQSize(maxW, maxH)). - expandedTo(TQApplication::globalStrut())); - - return d->sizeHint; -} - - -/*! - \internal - Receives activated signals from an internal popup list and emits - the activated() signal. -*/ - -void TQComboBox::internalActivate( int index ) -{ - if ( d->current != index ) { - if ( !d->usingListBox() || listBox()->item( index )->isSelectable() ) { - if(d->popup() && style().styleHint(TQStyle::SH_ComboBox_Popup, this)) - d->popup()->setItemChecked(d->current, FALSE); - d->current = index; - currentChanged(); - } - } - if ( d->usingListBox() ) - popDownListBox(); - else - d->popup()->removeEventFilter( this ); - d->poppedUp = FALSE; - - TQString t( text( index ) ); - if ( d->ed ) { - d->ed->setText( t ); - d->updateLinedGeometry(); - } - emit activated( index ); - emit activated( t ); -} - -/*! - \internal - Receives highlighted signals from an internal popup list and emits - the highlighted() signal. -*/ - -void TQComboBox::internalHighlight( int index ) -{ - emit highlighted( index ); - TQString t = text( index ); - if ( !t.isNull() ) - emit highlighted( t ); -} - -/*! - \internal - Receives timeouts after a click. Used to decide if a Motif style - popup should stay up or not after a click. -*/ -void TQComboBox::internalClickTimeout() -{ - d->shortClick = FALSE; -} - -/*! - Sets the palette for both the combobox button and the combobox - popup list to \a palette. -*/ - -void TQComboBox::setPalette( const TQPalette &palette ) -{ - TQWidget::setPalette( palette ); - if ( d->listBox() ) - d->listBox()->setPalette( palette ); - if ( d->popup() ) - d->popup()->setPalette( palette ); -} - -/*! - Sets the font for both the combobox button and the combobox popup - list to \a font. -*/ - -void TQComboBox::setFont( const TQFont &font ) -{ - d->sizeHint = TQSize(); // invalidate size hint - TQWidget::setFont( font ); - if ( d->usingListBox() ) - d->listBox()->setFont( font ); - else - d->popup()->setFont( font ); - if (d->ed) - d->ed->setFont( font ); - if ( d->autoresize ) - adjustSize(); -} - - -/*!\reimp -*/ - -void TQComboBox::resizeEvent( TQResizeEvent * e ) -{ - if ( d->ed ) - d->updateLinedGeometry(); - if ( d->listBox() ) - d->listBox()->resize( width(), d->listBox()->height() ); - TQWidget::resizeEvent( e ); -} - -/*!\reimp -*/ - -void TQComboBox::paintEvent( TQPaintEvent * ) -{ - TQPainter p( this ); - const TQColorGroup & g = colorGroup(); - p.setPen(g.text()); - - TQStyle::SFlags flags = TQStyle::Style_Default; - if (isEnabled()) - flags |= TQStyle::Style_Enabled; - if (hasFocus()) - flags |= TQStyle::Style_HasFocus; - if (hasMouse()) - flags |= TQStyle::Style_MouseOver; - - if ( width() < 5 || height() < 5 ) { - qDrawShadePanel( &p, rect(), g, FALSE, 2, - &g.brush( TQColorGroup::Button ) ); - return; - } - - bool reverse = TQApplication::reverseLayout(); - if ( !d->usingListBox() && - style().styleHint(TQStyle::SH_GUIStyle) == TQt::MotifStyle) { // motif 1.x style - int dist, buttonH, buttonW; - dist = 8; - buttonH = 7; - buttonW = 11; - int xPos; - int x0; - int w = width() - dist - buttonW - 1; - if ( reverse ) { - xPos = dist + 1; - x0 = xPos + 4; - } else { - xPos = w; - x0 = 4; - } - qDrawShadePanel( &p, rect(), g, FALSE, - style().pixelMetric(TQStyle::PM_DefaultFrameWidth, this), - &g.brush( TQColorGroup::Button ) ); - qDrawShadePanel( &p, xPos, (height() - buttonH)/2, - buttonW, buttonH, g, FALSE, - style().pixelMetric(TQStyle::PM_DefaultFrameWidth, this) ); - TQRect clip( x0, 2, w - 2 - 4 - 5, height() - 4 ); - TQString str = d->popup()->text( this->d->current ); - if ( !str.isNull() ) { - p.drawText( clip, AlignCenter | SingleLine, str ); - } - - TQPixmap *pix = d->popup()->pixmap( this->d->current ); - TQIconSet *iconSet = d->popup()->iconSet( this->d->current ); - if (pix || iconSet) { - TQPixmap pm = ( pix ? *pix : iconSet->pixmap() ); - p.setClipRect( clip ); - p.drawPixmap( 4, (height()-pm.height())/2, pm ); - p.setClipping( FALSE ); - } - - if ( hasFocus() ) - p.drawRect( xPos - 5, 4, width() - xPos + 1 , height() - 8 ); - } else if(!d->usingListBox()) { - style().drawComplexControl( TQStyle::CC_ComboBox, &p, this, rect(), g, - flags, (uint)TQStyle::SC_All, - (d->arrowDown ? - TQStyle::SC_ComboBoxArrow : - TQStyle::SC_None )); - - TQRect re = style().querySubControlMetrics( TQStyle::CC_ComboBox, this, - TQStyle::SC_ComboBoxEditField ); - re = TQStyle::visualRect(re, this); - p.setClipRect( re ); - - TQString str = d->popup()->text( this->d->current ); - TQPixmap *pix = d->popup()->pixmap( this->d->current ); - if ( !str.isNull() ) { - p.save(); - p.setFont(font()); - TQFontMetrics fm(font()); - int x = re.x(), y = re.y() + fm.ascent(); - if( pix ) - x += pix->width() + 5; - p.drawText( x, y, str ); - p.restore(); - } - if ( pix ) { - p.fillRect( re.x(), re.y(), pix->width() + 4, re.height(), - colorGroup().brush( TQColorGroup::Base ) ); - p.drawPixmap( re.x() + 2, re.y() + - ( re.height() - pix->height() ) / 2, *pix ); - } - } else { - style().drawComplexControl( TQStyle::CC_ComboBox, &p, this, rect(), g, - flags, (uint)TQStyle::SC_All, - (d->arrowDown ? - TQStyle::SC_ComboBoxArrow : - TQStyle::SC_None )); - - TQRect re = style().querySubControlMetrics( TQStyle::CC_ComboBox, this, - TQStyle::SC_ComboBoxEditField ); - re = TQStyle::visualRect(re, this); - p.setClipRect( re ); - - if ( !d->ed ) { - TQListBoxItem * item = d->listBox()->item( d->current ); - if ( item ) { - int itemh = item->height( d->listBox() ); - p.translate( re.x(), re.y() + (re.height() - itemh)/2 ); - item->paint( &p ); - } - } else if ( d->listBox() && d->listBox()->item( d->current ) ) { - TQListBoxItem * item = d->listBox()->item( d->current ); - const TQPixmap *pix = item->pixmap(); - if ( pix ) { - p.fillRect( re.x(), re.y(), pix->width() + 4, re.height(), - colorGroup().brush( TQColorGroup::Base ) ); - p.drawPixmap( re.x() + 2, re.y() + - ( re.height() - pix->height() ) / 2, *pix ); - } - } - p.setClipping( FALSE ); - } -} - - -/*!\reimp -*/ - -void TQComboBox::mousePressEvent( TQMouseEvent *e ) -{ - if ( e->button() != LeftButton ) - return; - if ( d->discardNextMousePress ) { - d->discardNextMousePress = FALSE; - return; - } - TQRect arrowRect = style().querySubControlMetrics( TQStyle::CC_ComboBox, this, - TQStyle::SC_ComboBoxArrow); - arrowRect = TQStyle::visualRect(arrowRect, this); - - // Correction for motif style, where arrow is smaller - // and thus has a rect that doesn't fit the button. - arrowRect.setHeight( TQMAX( height() - (2 * arrowRect.y()), arrowRect.height() ) ); - - if ( count() && ( !editable() || arrowRect.contains( e->pos() ) ) ) { - d->arrowPressed = FALSE; - - if ( d->usingListBox() ) { - listBox()->blockSignals( TRUE ); - tqApp->sendEvent( listBox(), e ); // trigger the listbox's autoscroll - listBox()->setCurrentItem(d->current); - listBox()->blockSignals( FALSE ); - popup(); - if ( arrowRect.contains( e->pos() ) ) { - d->arrowPressed = TRUE; - d->arrowDown = TRUE; - repaint( FALSE ); - } - } else { - popup(); - } - TQTimer::singleShot( 200, this, TQ_SLOT(internalClickTimeout())); - d->shortClick = TRUE; - } -} - -/*!\reimp -*/ - -void TQComboBox::mouseMoveEvent( TQMouseEvent * ) -{ -} - -/*!\reimp -*/ - -void TQComboBox::mouseReleaseEvent( TQMouseEvent * ) -{ -} - -/*!\reimp -*/ - -void TQComboBox::mouseDoubleClickEvent( TQMouseEvent *e ) -{ - mousePressEvent( e ); -} - - -/*!\reimp -*/ - -void TQComboBox::keyPressEvent( TQKeyEvent *e ) -{ - int c = currentItem(); - if ( ( e->key() == Key_F4 && e->state() == 0 ) || - ( e->key() == Key_Down && (e->state() & AltButton) ) || - ( !d->ed && e->key() == Key_Space ) ) { - if ( count() ) { - if ( !d->usingListBox() ) - d->popup()->setActiveItem( this->d->current ); - popup(); - } - return; - } else if ( d->usingListBox() && e->key() == Key_Up ) { - if ( c > 0 ) - setCurrentItem( c-1 ); - } else if ( d->usingListBox() && e->key() == Key_Down ) { - if ( ++c < count() ) - setCurrentItem( c ); - } else if ( d->usingListBox() && e->key() == Key_Home && ( !d->ed || !d->ed->hasFocus() ) ) { - setCurrentItem( 0 ); - } else if ( d->usingListBox() && e->key() == Key_End && ( !d->ed || !d->ed->hasFocus() ) ) { - setCurrentItem( count()-1 ); - } else if ( !d->ed && e->ascii() >= 32 && !e->text().isEmpty() ) { - if ( !d->completionTimer->isActive() ) { - d->completeAt = 0; - c = completionIndex( e->text(), ++c ); - if ( c >= 0 ) { - setCurrentItem( c ); - d->completeAt = e->text().length(); - } - } else { - d->completionTimer->stop(); - TQString ct = currentText().left( d->completeAt ) + e->text(); - c = completionIndex( ct, c ); - if ( c < 0 && d->completeAt > 0 ) { - c = completionIndex( e->text(), 0 ); - ct = e->text(); - } - d->completeAt = 0; - if ( c >= 0 ) { - setCurrentItem( c ); - d->completeAt = ct.length(); - } - } - d->completionTimer->start( 400, TRUE ); - } else { - e->ignore(); - return; - } - - c = currentItem(); - if ( count() && !text( c ).isNull() ) - emit activated( text( c ) ); - emit activated( c ); -} - - -/*!\reimp -*/ - -void TQComboBox::focusInEvent( TQFocusEvent * e ) -{ - TQWidget::focusInEvent( e ); - d->completeNow = FALSE; - d->completeAt = 0; -} - -/*!\reimp -*/ - -void TQComboBox::focusOutEvent( TQFocusEvent * e ) -{ - TQWidget::focusOutEvent( e ); - d->completeNow = FALSE; - d->completeAt = 0; -} - -/*!\reimp -*/ -#ifndef TQT_NO_WHEELEVENT -void TQComboBox::wheelEvent( TQWheelEvent *e ) -{ - if ( d->poppedUp ) { - if ( d->usingListBox() ) { - TQApplication::sendEvent( d->listBox(), e ); - } - } else { - if ( e->delta() > 0 ) { - int c = currentItem(); - if ( c > 0 ) { - setCurrentItem( c-1 ); - emit activated( currentItem() ); - emit activated( currentText() ); - } - } else { - int c = currentItem(); - if ( ++c < count() ) { - setCurrentItem( c ); - emit activated( currentItem() ); - emit activated( currentText() ); - } - } - e->accept(); - } -} -#endif - -/*! - \internal - Calculates the listbox height needed to contain all items, or as - many as the list box is supposed to contain. -*/ -static int listHeight( TQListBox *l, int sl ) -{ - if ( l->count() > 0 ) - return TQMIN( l->count(), (uint)sl) * l->item( 0 )->height(l); - else - return l->sizeHint().height(); -} - - -/*! - Pops up the combobox popup list. - - If the list is empty, no items appear. -*/ - -void TQComboBox::popup() -{ - if ( !count() || d->poppedUp ) - return; - - if( !d->usingListBox() || style().styleHint(TQStyle::SH_ComboBox_Popup, this) ) { - if(d->usingListBox()) { - if(!d->popup()) { - TQComboBoxPopup *p = new TQComboBoxPopup( this, "in-combo" ); - d->setPopupMenu( p, FALSE ); - p->setFont( font() ); - connect( p, TQ_SIGNAL(activated(int)), TQ_SLOT(internalActivate(int)) ); - connect( p, TQ_SIGNAL(highlighted(int)), TQ_SLOT(internalHighlight(int)) ); - } - d->popup()->clear(); - for(unsigned int i = 0; i < d->listBox()->count(); i++) { - TQListBoxItem *item = d->listBox()->item(i); - if(item->rtti() == TQListBoxText::RTTI) { - d->popup()->insertItem(escapedComboString(item->text()), i, i); - } else if(item->rtti() == TQListBoxPixmap::RTTI) { - if(item->pixmap()) - d->popup()->insertItem(TQIconSet(*item->pixmap()), escapedComboString(item->text()), i, i); - else - d->popup()->insertItem(escapedComboString(item->text()), i, i); - } else { - d->popup()->insertItem(new TQComboBoxPopupItem(item), i, i); - } - } - } - d->popup()->installEventFilter( this ); - if(d->popup() && style().styleHint(TQStyle::SH_ComboBox_Popup, this)) - d->popup()->setItemChecked(this->d->current, TRUE); - d->popup()->popup( mapToGlobal( TQPoint(0,0) ), this->d->current ); - update(); - } else { - // Send all listbox events to eventFilter(): - TQListBox* lb = d->listBox(); - lb->triggerUpdate( TRUE ); - lb->installEventFilter( this ); - d->mouseWasInsidePopup = FALSE; - int w = lb->variableWidth() ? lb->sizeHint().width() : width(); - int h = listHeight( lb, d->sizeLimit ) + 2; - TQRect screen = TQApplication::desktop()->availableGeometry( this ); - - int sx = screen.x(); // screen pos - int sy = screen.y(); - int sw = screen.width(); // screen width - int sh = screen.height(); // screen height - TQPoint pos = mapToGlobal( TQPoint(0,height()) ); - // ## Similar code is in TQPopupMenu - int x = pos.x(); - int y = pos.y(); - - // the complete widget must be visible - if ( x + w > sx + sw ) - x = sx+sw - w; - if ( x < sx ) - x = sx; - if (y + h > sy+sh && y - h - height() >= 0 ) - y = y - h - height(); - - TQRect rect = - style().querySubControlMetrics( TQStyle::CC_ComboBox, this, - TQStyle::SC_ComboBoxListBoxPopup, - TQStyleOption( x, y, w, h ) ); - // work around older styles that don't implement the combobox - // listbox popup subcontrol - if ( rect.isNull() ) - rect.setRect( x, y, w, h ); - lb->setGeometry( rect ); - - lb->raise(); - bool block = lb->signalsBlocked(); - lb->blockSignals( TRUE ); - TQListBoxItem* currentLBItem = 0; - if ( editable() && currentText() != text( currentItem() ) ) - currentLBItem = lb->findItem( currentText() ); - - currentLBItem = currentLBItem ? currentLBItem : lb->item( d->current ); - - lb->setCurrentItem( currentLBItem ); - lb->setContentsPos( lb->contentsX(), - lb->viewportToContents( lb->itemRect( currentLBItem ).topLeft() ).y() ); - - // set the current item to also be the selected item if it isn't already - if ( currentLBItem && currentLBItem->isSelectable() && !currentLBItem->isSelected() ) - lb->setSelected( currentLBItem, TRUE ); - lb->blockSignals( block ); - lb->setVScrollBarMode(TQScrollView::Auto); - -#ifndef TQT_NO_EFFECTS - if ( TQApplication::isEffectEnabled( UI_AnimateCombo ) ) { - if ( lb->y() < mapToGlobal(TQPoint(0,0)).y() ) - qScrollEffect( lb, TQEffects::UpScroll ); - else - qScrollEffect( lb ); - } else -#endif - lb->show(); - } - d->poppedUp = TRUE; -} - - -/*! - \reimp -*/ -void TQComboBox::updateMask() -{ - TQBitmap bm( size() ); - bm.fill( color0 ); - - { - TQPainter p( &bm, this ); - style().drawComplexControlMask(TQStyle::CC_ComboBox, &p, this, rect()); - } - - setMask( bm ); -} - -/*! - \internal - Pops down (removes) the combobox popup list box. -*/ -void TQComboBox::popDownListBox() -{ - Q_ASSERT( d->usingListBox() ); - d->listBox()->removeEventFilter( this ); - d->listBox()->viewport()->removeEventFilter( this ); - d->listBox()->hide(); - d->listBox()->setCurrentItem( d->current ); - if ( d->arrowDown ) { - d->arrowDown = FALSE; - repaint( FALSE ); - } - d->poppedUp = FALSE; - - update(); -} - - -/*! - \internal - Re-indexes the identifiers in the popup list. -*/ - -void TQComboBox::reIndex() -{ - if ( !d->usingListBox() ) { - int cnt = count(); - while ( cnt-- ) - d->popup()->setId( cnt, cnt ); - } -} - -/*! - \internal - Repaints the combobox. -*/ - -void TQComboBox::currentChanged() -{ - if ( d->autoresize ) - adjustSize(); - update(); - -#if defined(QT_ACCESSIBILITY_SUPPORT) - TQAccessible::updateAccessibility( this, 0, TQAccessible::ValueChanged ); -#endif -} - -/*! \reimp - - \internal - - The event filter steals events from the popup or listbox when they - are popped up. It makes the popup stay up after a short click in - motif style. In windows style it toggles the arrow button of the - combobox field, and activates an item and takes down the listbox - when the mouse button is released. -*/ - -bool TQComboBox::eventFilter( TQObject *object, TQEvent *event ) -{ - if ( !event ) - return TRUE; - else if ( object == d->ed ) { - if ( event->type() == TQEvent::KeyPress ) { - bool isAccepted = ( (TQKeyEvent*)event )->isAccepted(); - keyPressEvent( (TQKeyEvent *)event ); - if ( ((TQKeyEvent *)event)->isAccepted() ) { - d->completeNow = FALSE; - return TRUE; - } else if ( ((TQKeyEvent *)event)->key() != Key_End ) { - d->completeNow = TRUE; - d->completeAt = d->ed->cursorPosition(); - } - if ( isAccepted ) - ( (TQKeyEvent*)event )->accept(); - else - ( (TQKeyEvent*)event )->ignore(); - } else if ( event->type() == TQEvent::KeyRelease ) { - keyReleaseEvent( (TQKeyEvent *)event ); - return ((TQKeyEvent *)event)->isAccepted(); - } else if ( event->type() == TQEvent::FocusIn ) { - focusInEvent( (TQFocusEvent *)event ); - } else if ( event->type() == TQEvent::FocusOut ) { - focusOutEvent( (TQFocusEvent *)event ); - } else if ( d->useCompletion && d->completeNow ) { - d->completeNow = FALSE; - if ( !d->ed->text().isNull() && - d->ed->cursorPosition() > d->completeAt && - d->ed->cursorPosition() == (int)d->ed->text().length() ) { - TQString ct( d->ed->text() ); - int i = completionIndex( ct, currentItem() ); - if ( i > -1 ) { - TQString it = text( i ); - d->ed->validateAndSet( it, ct.length(), - ct.length(), it.length() ); - d->current = i; - // ### sets current item without emitting signals. This is to - // make sure the right item is current if you change current with - // wheel/up/down. While typing current is not valid anyway. Fix properly - // in 4.0. - } - } - } - } else if ( d->usingListBox() && ( object == d->listBox() || - object == d->listBox()->viewport() )) { - TQMouseEvent *e = (TQMouseEvent*)event; - switch( event->type() ) { - case TQEvent::MouseMove: - if ( !d->mouseWasInsidePopup ) { - TQPoint pos = e->pos(); - if ( d->listBox()->rect().contains( pos ) ) - d->mouseWasInsidePopup = TRUE; - // Check if arrow button should toggle - if ( d->arrowPressed ) { - TQPoint comboPos; - comboPos = mapFromGlobal( d->listBox()->mapToGlobal(pos) ); - TQRect arrowRect = - style().querySubControlMetrics( TQStyle::CC_ComboBox, this, - TQStyle::SC_ComboBoxArrow); - arrowRect = TQStyle::visualRect(arrowRect, this); - if ( arrowRect.contains( comboPos ) ) { - if ( !d->arrowDown ) { - d->arrowDown = TRUE; - repaint( FALSE ); - } - } else { - if ( d->arrowDown ) { - d->arrowDown = FALSE; - repaint( FALSE ); - } - } - } - } else if ((e->state() & ( RightButton | LeftButton | MidButton ) ) == 0 && - style().styleHint(TQStyle::SH_ComboBox_ListMouseTracking, this)) { - TQWidget *mouseW = TQApplication::widgetAt( e->globalPos(), TRUE ); - if ( mouseW == d->listBox()->viewport() ) { //### - TQMouseEvent m( TQEvent::MouseMove, e->pos(), e->globalPos(), - LeftButton, LeftButton ); - TQApplication::sendEvent( object, &m ); //### Evil - return TRUE; - } - } - - break; - case TQEvent::MouseButtonRelease: - if ( d->listBox()->rect().contains( e->pos() ) ) { - TQMouseEvent tmp( TQEvent::MouseButtonDblClick, - e->pos(), e->button(), e->state() ) ; - // will hide popup - TQApplication::sendEvent( object, &tmp ); - return TRUE; - } else { - if ( d->mouseWasInsidePopup ) { - popDownListBox(); - } else { - d->arrowPressed = FALSE; - if ( d->arrowDown ) { - d->arrowDown = FALSE; - repaint( FALSE ); - } - } - } - break; - case TQEvent::MouseButtonDblClick: - case TQEvent::MouseButtonPress: - if ( !d->listBox()->rect().contains( e->pos() ) ) { - TQPoint globalPos = d->listBox()->mapToGlobal(e->pos()); - if ( TQApplication::widgetAt( globalPos, TRUE ) == this ) { - d->discardNextMousePress = TRUE; - // avoid popping up again - } - popDownListBox(); - return TRUE; - } - break; - case TQEvent::KeyPress: - switch( ((TQKeyEvent *)event)->key() ) { - case Key_Up: - case Key_Down: - if ( !(((TQKeyEvent *)event)->state() & AltButton) ) - break; - case Key_F4: - case Key_Escape: - if ( d->poppedUp ) { - popDownListBox(); - return TRUE; - } - break; - case Key_Enter: - case Key_Return: - // work around TQDialog's enter handling - return FALSE; - default: - break; - } - break; - case TQEvent::Hide: - popDownListBox(); - break; - default: - break; - } - } else if ( (!d->usingListBox() || style().styleHint(TQStyle::SH_ComboBox_Popup, this)) && - object == d->popup() ) { - TQMouseEvent *e = (TQMouseEvent*)event; - switch ( event->type() ) { - case TQEvent::MouseButtonRelease: - if ( d->shortClick ) { - TQMouseEvent tmp( TQEvent::MouseMove, - e->pos(), e->button(), e->state() ) ; - // highlight item, but don't pop down: - TQApplication::sendEvent( object, &tmp ); - return TRUE; - } - break; - case TQEvent::MouseButtonDblClick: - case TQEvent::MouseButtonPress: - if ( !d->popup()->rect().contains( e->pos() ) ) { - d->poppedUp = FALSE; - d->arrowDown = FALSE; - // remove filter, event will take down popup: - d->popup()->removeEventFilter( this ); - // ### uglehack! - // call internalHighlight so the highlighed signal - // will be emitted at least as often as necessary. - // it may be called more often than necessary - internalHighlight( d->current ); - } - break; - case TQEvent::Hide: - d->poppedUp = FALSE; - break; - default: - break; - } - } - return TQWidget::eventFilter( object, event ); -} - - -/*! - Returns the index of the first item \e after \a startingAt of - which \a prefix is a case-insensitive prefix. Returns -1 if no - items start with \a prefix. -*/ - -int TQComboBox::completionIndex( const TQString & prefix, - int startingAt = 0 ) const -{ - int start = startingAt; - if ( start < 0 || start >= count() ) - start = 0; - if ( start >= count() ) - return -1; - TQString match = prefix.lower(); - if ( match.length() < 1 ) - return start; - - TQString current; - int i = start; - do { - current = text( i ).lower(); - if ( current.startsWith( match ) ) - return i; - i++; - if ( i == count() ) - i = 0; - } while ( i != start ); - return -1; -} - - -int TQComboBox::sizeLimit() const -{ - return d ? d->sizeLimit : INT_MAX; -} - -void TQComboBox::setSizeLimit( int lines ) -{ - d->sizeLimit = lines; -} - - -int TQComboBox::maxCount() const -{ - return d ? d->maxCount : INT_MAX; -} - -void TQComboBox::setMaxCount( int count ) -{ - int l = this->count(); - while( --l > count ) - removeItem( l ); - d->maxCount = count; -} - -TQComboBox::Policy TQComboBox::insertionPolicy() const -{ - return d->p; -} - -void TQComboBox::setInsertionPolicy( Policy policy ) -{ - d->p = policy; -} - - - -/*! - Internal slot to keep the line editor up to date. -*/ - -void TQComboBox::returnPressed() -{ - TQString s( d->ed->text() ); - - if ( s.isEmpty() ) - return; - - int c = 0; - bool doInsert = TRUE; - if ( !d->duplicatesEnabled ) { - for ( int i = 0; i < count(); ++i ) { - if ( s == text( i ) ) { - doInsert = FALSE; - c = i; - break; - } - } - } - - if ( doInsert ) { - if ( insertionPolicy() != NoInsertion ) { - int cnt = count(); - while ( cnt >= d->maxCount ) { - removeItem( --cnt ); - } - } - - switch ( insertionPolicy() ) { - case AtCurrent: - if (count() == 0) - insertItem(s); - else if ( s != text( currentItem() ) ) - changeItem( s, currentItem() ); - emit activated( currentItem() ); - emit activated( s ); - return; - case NoInsertion: - emit activated( s ); - return; - case AtTop: - c = 0; - break; - case AtBottom: - c = count(); - break; - case BeforeCurrent: - c = currentItem(); - break; - case AfterCurrent: - c = count() == 0 ? 0 : currentItem() + 1; - break; - } - insertItem( s, c ); - } - - setCurrentItem( c ); - emit activated( c ); - emit activated( s ); -} - - -/*! \reimp -*/ - -void TQComboBox::setEnabled( bool enable ) -{ - if ( !enable ) { - if ( d->usingListBox() ) { - popDownListBox(); - } else { - d->popup()->removeEventFilter( this ); - d->popup()->close(); - d->poppedUp = FALSE; - } - } - TQWidget::setEnabled( enable ); -} - - - -/*! - Applies the validator \a v to the combobox so that only text which - is valid according to \a v is accepted. - - This function does nothing if the combobox is not editable. - - \sa validator() clearValidator() TQValidator -*/ - -void TQComboBox::setValidator( const TQValidator * v ) -{ - if ( d && d->ed ) - d->ed->setValidator( v ); -} - - -/*! - Returns the validator which constrains editing for this combobox - if there is one; otherwise returns 0. - - \sa setValidator() clearValidator() TQValidator -*/ - -const TQValidator * TQComboBox::validator() const -{ - return d && d->ed ? d->ed->validator() : 0; -} - - -/*! - This slot is equivalent to setValidator( 0 ). -*/ - -void TQComboBox::clearValidator() -{ - if ( d && d->ed ) - d->ed->setValidator( 0 ); -} - - -/*! - Sets the combobox to use \a newListBox instead of the current list - box or popup. As a side effect, it clears the combobox of its - current contents. - - \warning TQComboBox assumes that newListBox->text(n) returns - non-null for 0 \<= n \< newListbox->count(). This assumption is - necessary because of the line edit in TQComboBox. -*/ - -void TQComboBox::setListBox( TQListBox * newListBox ) -{ - clear(); - - if ( d->usingListBox() ) { - delete d->listBox(); - } else { - delete d->popup(); - d->setPopupMenu(0, FALSE); - } - - newListBox->reparent( this, WType_Popup, TQPoint(0,0), FALSE ); - d->setListBox( newListBox ); - d->listBox()->setFont( font() ); - d->listBox()->setPalette( palette() ); - d->listBox()->setVScrollBarMode(TQScrollView::AlwaysOff); - d->listBox()->setHScrollBarMode(TQScrollView::AlwaysOff); - d->listBox()->setFrameStyle( TQFrame::Box | TQFrame::Plain ); - d->listBox()->setLineWidth( 1 ); - d->listBox()->resize( 100, 10 ); - - connect( d->listBox(), TQ_SIGNAL(selected(int)), - TQ_SLOT(internalActivate(int)) ); - connect( d->listBox(), TQ_SIGNAL(highlighted(int)), - TQ_SLOT(internalHighlight(int))); -} - - -/*! - Returns the current list box, or 0 if there is no list box. - (TQComboBox can use TQPopupMenu instead of TQListBox.) Provided to - match setListBox(). - - \sa setListBox() -*/ - -TQListBox * TQComboBox::listBox() const -{ - return d && d->usingListBox() ? d->listBox() : 0; -} - -/*! - Returns the line edit, or 0 if there is no line edit. - - Only editable listboxes have a line editor. -*/ -TQLineEdit* TQComboBox::lineEdit() const -{ - return d->ed; -} - - - -/*! - Clears the line edit without changing the combobox's contents. - Does nothing if the combobox isn't editable. - - This is particularly useful when using a combobox as a line edit - with history. For example you can connect the combobox's - activated() signal to clearEdit() in order to present the user - with a new, empty line as soon as Enter is pressed. - - \sa setEditText() -*/ - -void TQComboBox::clearEdit() -{ - if ( d && d->ed ) - d->ed->clear(); -} - - -/*! - Sets the text in the line edit to \a newText without changing the - combobox's contents. Does nothing if the combobox isn't editable. - - This is useful e.g. for providing a good starting point for the - user's editing and entering the change in the combobox only when - the user presses Enter. - - \sa clearEdit() insertItem() -*/ - -void TQComboBox::setEditText( const TQString &newText ) -{ - if ( d && d->ed ) { - d->updateLinedGeometry(); - d->ed->setText( newText ); - } -} - -void TQComboBox::setAutoCompletion( bool enable ) -{ - d->useCompletion = enable; - d->completeNow = FALSE; -} - - -bool TQComboBox::autoCompletion() const -{ - return d->useCompletion; -} - -/*!\reimp - */ -void TQComboBox::styleChange( TQStyle& s ) -{ - d->sizeHint = TQSize(); // invalidate size hint... - if ( d->ed ) - d->updateLinedGeometry(); - TQWidget::styleChange( s ); -} - -bool TQComboBox::editable() const -{ - return d->ed != 0; -} - -void TQComboBox::setEditable( bool y ) -{ - if ( y == editable() ) - return; - if ( y ) { - if ( !d->usingListBox() ) - setUpListBox(); - setUpLineEdit(); - d->ed->show(); - if ( currentItem() ) - setEditText( currentText() ); - } else { - delete d->ed; - d->ed = 0; - } - - setFocusPolicy( StrongFocus ); - updateGeometry(); - update(); -} - - -void TQComboBox::setUpListBox() -{ - d->setListBox( new TQListBox( this, "in-combo", WType_Popup ) ); - d->listBox()->setFont( font() ); - d->listBox()->setPalette( palette() ); - d->listBox()->setVScrollBarMode( TQListBox::AlwaysOff ); - d->listBox()->setHScrollBarMode( TQListBox::AlwaysOff ); - d->listBox()->setFrameStyle( TQFrame::Box | TQFrame::Plain ); - d->listBox()->setLineWidth( 1 ); - d->listBox()->resize( 100, 10 ); - - connect( d->listBox(), TQ_SIGNAL(selected(int)), - TQ_SLOT(internalActivate(int)) ); - connect( d->listBox(), TQ_SIGNAL(highlighted(int)), - TQ_SLOT(internalHighlight(int))); -} - - -void TQComboBox::setUpLineEdit() -{ - if ( !d->ed ) - setLineEdit( new TQLineEdit( this, "combo edit" ) ); -} - -/*! - Sets the line edit to use \a edit instead of the current line edit. -*/ - -void TQComboBox::setLineEdit( TQLineEdit *edit ) -{ - if ( !edit ) { -#if defined(QT_CHECK_NULL) - Q_ASSERT( edit != 0 ); -#endif - return; - } - - edit->setText( currentText() ); - delete d->ed; - d->ed = edit; - - if ( edit->parent() != this ) - edit->reparent( this, TQPoint(0,0), FALSE ); - - connect (edit, TQ_SIGNAL( textChanged(const TQString&) ), - this, TQ_SIGNAL( textChanged(const TQString&) ) ); - connect( edit, TQ_SIGNAL(returnPressed()), TQ_SLOT(returnPressed()) ); - - edit->setFrame( FALSE ); - d->updateLinedGeometry(); - edit->installEventFilter( this ); - setFocusProxy( edit ); - setFocusPolicy( StrongFocus ); - setInputMethodEnabled( TRUE ); - - if ( !d->usingListBox() ) - setUpListBox(); - - if ( isVisible() ) - edit->show(); - - updateGeometry(); - update(); -} - -/*! - \reimp -*/ -void TQComboBox::hide() -{ - TQWidget::hide(); - - if (listBox()) - listBox()->hide(); - else if (d->popup()) - d->popup()->hide(); -} - -#endif // TQT_NO_COMBOBOX |