|
|
|
/* This file is part of the KDE libraries
|
|
|
|
|
|
|
|
Copyright (c) 2000,2001 Dawit Alemayehu <adawit@kde.org>
|
|
|
|
Copyright (c) 2000,2001 Carsten Pfeiffer <pfeiffer@kde.org>
|
|
|
|
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
|
|
modify it under the terms of the GNU Lesser 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
|
|
|
|
Lesser General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU Lesser 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 _KCOMBOBOX_H
|
|
|
|
#define _KCOMBOBOX_H
|
|
|
|
|
|
|
|
#include <tqlineedit.h>
|
|
|
|
#include <tqcombobox.h>
|
|
|
|
#include <tqvbox.h>
|
|
|
|
#include <tqlabel.h>
|
|
|
|
#include <tqlayout.h>
|
|
|
|
#include <tqtoolbutton.h>
|
|
|
|
#include <tqheader.h>
|
|
|
|
|
|
|
|
#include <kcompletion.h>
|
|
|
|
#include <kdialogbase.h>
|
|
|
|
#include <klistview.h>
|
|
|
|
|
|
|
|
class TQListBoxItem;
|
|
|
|
class TQPopupMenu;
|
|
|
|
class TQLineEdit;
|
|
|
|
|
|
|
|
class KCompletionBox;
|
|
|
|
class KURL;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @short An enhanced combo box.
|
|
|
|
*
|
|
|
|
* A combined button, line-edit and a popup list widget.
|
|
|
|
*
|
|
|
|
* \b Detail \n
|
|
|
|
*
|
|
|
|
* This widget inherits from TQComboBox and implements the following
|
|
|
|
* additional functionalities: a completion object that provides both automatic
|
|
|
|
* and manual text completion as well as text rotation features, configurable
|
|
|
|
* key-bindings to activate these features, and a popup-menu item that can be
|
|
|
|
* used to allow the user to change the text completion mode on the fly.
|
|
|
|
*
|
|
|
|
* To support these new features KComboBox emits a few additional signals
|
|
|
|
* such as completion( const TQString& ) and textRotation( KeyBindgingType ).
|
|
|
|
* The completion signal can be connected to a slot that will assist the user in
|
|
|
|
* filling out the remaining text while the rotation signal can be used to traverse
|
|
|
|
* through all possible matches whenever text completion results in multiple matches.
|
|
|
|
* Additionally, a returnPressed() and a returnPressed( const TQString& )
|
|
|
|
* signals are emitted when the user presses the Enter/Return key.
|
|
|
|
*
|
|
|
|
* KCombobox by default creates a completion object when you invoke the
|
|
|
|
* completionObject( bool ) member function for the first time or
|
|
|
|
* explicitly use setCompletionObject( KCompletion*, bool ) to assign your
|
|
|
|
* own completion object. Additionally, to make this widget more functional,
|
|
|
|
* KComboBox will by default handle text rotation and completion events
|
|
|
|
* internally whenever a completion object is created through either one of the
|
|
|
|
* methods mentioned above. If you do not need this functionality, simply use
|
|
|
|
* @p setHandleSignals(bool) or alternatively set the boolean parameter in the
|
|
|
|
* @p setCompletionObject call to false.
|
|
|
|
*
|
|
|
|
* Beware: The completion object can be deleted on you, especially if a call
|
|
|
|
* such as setEditable(false) is made. Store the pointer at your own risk,
|
|
|
|
* and consider using TQGuardedPtr<KCompletion>.
|
|
|
|
*
|
|
|
|
* The default key-bindings for completion and rotation is determined from the
|
|
|
|
* global settings in KStdAccel. These values, however, can be overridden
|
|
|
|
* locally by invoking KCompletionBase::setKeyBinding(). The values can
|
|
|
|
* easily be reverted back to the default setting, by simply calling
|
|
|
|
* useGlobalSettings(). An alternate method would be to default individual
|
|
|
|
* key-bindings by usning setKeyBinding() with the default second argument.
|
|
|
|
*
|
|
|
|
* A non-editable combobox only has one completion mode, @p CompletionAuto.
|
|
|
|
* Unlike an editable combobox the CompletionAuto mode, works by matching
|
|
|
|
* any typed key with the first letter of entries in the combobox. Please note
|
|
|
|
* that if you call setEditable( false ) to change an editable combobox to a
|
|
|
|
* non-editable one, the text completion object associated with the combobox will
|
|
|
|
* no longer exist unless you created the completion object yourself and assigned
|
|
|
|
* it to this widget or you called setAutoDeleteCompletionObject( false ). In other
|
|
|
|
* words do not do the following:
|
|
|
|
*
|
|
|
|
* \code
|
|
|
|
* KComboBox* combo = new KCompletionBox(true, this, "mywidget");
|
|
|
|
* KCompletion* comp = combo->completionObject();
|
|
|
|
* combo->setEditable( false );
|
|
|
|
* comp->clear(); // CRASH: completion object does not exist anymore.
|
|
|
|
* \endcode
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* A read-only KComboBox will have the same background color as a
|
|
|
|
* disabled KComboBox, but its foreground color will be the one used for
|
|
|
|
* the read-write mode. This differs from QComboBox's implementation
|
|
|
|
* and is done to give visual distinction between the three different modes:
|
|
|
|
* disabled, read-only, and read-write.
|
|
|
|
*
|
|
|
|
* \b Usage \n
|
|
|
|
*
|
|
|
|
* To enable the basic completion feature:
|
|
|
|
*
|
|
|
|
* \code
|
|
|
|
* KComboBox *combo = new KComboBox( true, this, "mywidget" );
|
|
|
|
* KCompletion *comp = combo->completionObject();
|
|
|
|
* // Connect to the return pressed signal - optional
|
|
|
|
* connect(combo,TQT_SIGNAL(returnPressed(const TQString&)),comp,TQT_SLOT(addItem(const TQString&)));
|
|
|
|
*
|
|
|
|
* // Provide the to be completed strings. Note that those are separate from the combo's
|
|
|
|
* // contents.
|
|
|
|
* comp->insertItems( someQStringList );
|
|
|
|
* \endcode
|
|
|
|
*
|
|
|
|
* To use your own completion object:
|
|
|
|
*
|
|
|
|
* \code
|
|
|
|
* KComboBox *combo = new KComboBox( this,"mywidget" );
|
|
|
|
* KURLCompletion *comp = new KURLCompletion();
|
|
|
|
* combo->setCompletionObject( comp );
|
|
|
|
* // Connect to the return pressed signal - optional
|
|
|
|
* connect(combo,TQT_SIGNAL(returnPressed(const TQString&)),comp,TQT_SLOT(addItem(const TQString&)));
|
|
|
|
* \endcode
|
|
|
|
*
|
|
|
|
* Note that you have to either delete the allocated completion object
|
|
|
|
* when you don't need it anymore, or call
|
|
|
|
* setAutoDeleteCompletionObject( true );
|
|
|
|
*
|
|
|
|
* Miscellaneous function calls:
|
|
|
|
*
|
|
|
|
* \code
|
|
|
|
* // Tell the widget not to handle completion and rotation
|
|
|
|
* combo->setHandleSignals( false );
|
|
|
|
* // Set your own completion key for manual completions.
|
|
|
|
* combo->setKeyBinding( KCompletionBase::TextCompletion, Qt::End );
|
|
|
|
* // Hide the context (popup) menu
|
|
|
|
* combo->setContextMenuEnabled( false );
|
|
|
|
* \endcode
|
|
|
|
*
|
|
|
|
* @author Dawit Alemayehu <adawit@kde.org>
|
|
|
|
*/
|
|
|
|
class KDEUI_EXPORT KComboBox : public TQComboBox, public KCompletionBase
|
|
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
Q_PROPERTY( bool autoCompletion READ autoCompletion WRITE setAutoCompletion )
|
|
|
|
Q_PROPERTY( bool contextMenuEnabled READ isContextMenuEnabled WRITE setContextMenuEnabled )
|
|
|
|
Q_PROPERTY( bool urlDropsEnabled READ isURLDropsEnabled WRITE setURLDropsEnabled )
|
|
|
|
Q_PROPERTY( bool trapReturnKey READ trapReturnKey WRITE setTrapReturnKey )
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Constructs a read-only or rather select-only combo box with a
|
|
|
|
* parent object and a name.
|
|
|
|
*
|
|
|
|
* @param parent The parent object of this widget
|
|
|
|
* @param name The name of this widget
|
|
|
|
*/
|
|
|
|
KComboBox( TQWidget *parent=0, const char *name=0 );
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Constructs a "read-write" or "read-only" combo box depending on
|
|
|
|
* the value of the first argument( @p rw ) with a parent, a
|
|
|
|
* name.
|
|
|
|
*
|
|
|
|
* @param rw When @p true, widget will be editable.
|
|
|
|
* @param parent The parent object of this widget.
|
|
|
|
* @param name The name of this widget.
|
|
|
|
*/
|
|
|
|
KComboBox( bool rw, TQWidget *parent=0, const char *name=0 );
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Destructor.
|
|
|
|
*/
|
|
|
|
virtual ~KComboBox();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets @p url into the edit field of the combobox. It uses
|
|
|
|
* KURL::prettyURL() so that the url is properly decoded for
|
|
|
|
* displaying.
|
|
|
|
*/
|
|
|
|
void setEditURL( const KURL& url );
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Inserts @p url at position @p index into the combobox. The item will
|
|
|
|
* be appended if @p index is negative. KURL::prettyURL() is used
|
|
|
|
* so that the url is properly decoded for displaying.
|
|
|
|
*/
|
|
|
|
void insertURL( const KURL& url, int index = -1 );
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Inserts @p url with the pixmap &p pixmap at position @p index into
|
|
|
|
* the combobox. The item will be appended if @p index is negative.
|
|
|
|
* KURL::prettyURL() is used so that the url is properly decoded
|
|
|
|
* for displaying.
|
|
|
|
*/
|
|
|
|
void insertURL( const TQPixmap& pixmap, const KURL& url, int index = -1 );
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Replaces the item at position @p index with @p url.
|
|
|
|
* KURL::prettyURL() is used so that the url is properly decoded
|
|
|
|
* for displaying.
|
|
|
|
*/
|
|
|
|
void changeURL( const KURL& url, int index );
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Replaces the item at position @p index with @p url and pixmap @p pixmap.
|
|
|
|
* KURL::prettyURL() is used so that the url is properly decoded
|
|
|
|
* for displaying.
|
|
|
|
*/
|
|
|
|
void changeURL( const TQPixmap& pixmap, const KURL& url, int index );
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the current cursor position.
|
|
|
|
*
|
|
|
|
* This method always returns a -1 if the combo-box is @em not
|
|
|
|
* editable (read-write).
|
|
|
|
*
|
|
|
|
* @return Current cursor position.
|
|
|
|
*/
|
|
|
|
int cursorPosition() const { return ( lineEdit() ) ? lineEdit()->cursorPosition() : -1; }
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Re-implemented from TQComboBox.
|
|
|
|
*
|
|
|
|
* If @p true, the completion mode will be set to automatic.
|
|
|
|
* Otherwise, it is defaulted to the global setting. This
|
|
|
|
* method has been replaced by the more comprehensive
|
|
|
|
* setCompletionMode().
|
|
|
|
*
|
|
|
|
* @param autocomplete Flag to enable/disable automatic completion mode.
|
|
|
|
*/
|
|
|
|
virtual void setAutoCompletion( bool autocomplete );
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Re-implemented from TQComboBox.
|
|
|
|
*
|
|
|
|
* Returns @p true if the current completion mode is set
|
|
|
|
* to automatic. See its more comprehensive replacement
|
|
|
|
* completionMode().
|
|
|
|
*
|
|
|
|
* @return @p true when completion mode is automatic.
|
|
|
|
*/
|
|
|
|
bool autoCompletion() const {
|
|
|
|
return completionMode() == KGlobalSettings::CompletionAuto;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Enables or disable the popup (context) menu.
|
|
|
|
*
|
|
|
|
* This method only works if this widget is editable, i.e.
|
|
|
|
* read-write and allows you to enable/disable the context
|
|
|
|
* menu. It does nothing if invoked for a none-editable
|
|
|
|
* combo-box. Note that by default the mode changer item
|
|
|
|
* is made visiable whenever the context menu is enabled.
|
|
|
|
* Use hideModechanger() if you want to hide this
|
|
|
|
* item. Also by default, the context menu is created if
|
|
|
|
* this widget is editable. Call this function with the
|
|
|
|
* argument set to false to disable the popup menu.
|
|
|
|
*
|
|
|
|
* @param showMenu If @p true, show the context menu.
|
|
|
|
*/
|
|
|
|
virtual void setContextMenuEnabled( bool showMenu );
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns @p true when the context menu is enabled.
|
|
|
|
*/
|
|
|
|
bool isContextMenuEnabled() const { return m_bEnableMenu; }
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Enables/Disables handling of URL drops. If enabled and the user
|
|
|
|
* drops an URL, the decoded URL will be inserted. Otherwise the default
|
|
|
|
* behavior of TQComboBox is used, which inserts the encoded URL.
|
|
|
|
*
|
|
|
|
* @param enable If @p true, insert decoded URLs
|
|
|
|
*/
|
|
|
|
void setURLDropsEnabled( bool enable );
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns @p true when decoded URL drops are enabled
|
|
|
|
*/
|
|
|
|
bool isURLDropsEnabled() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Convenience method which iterates over all items and checks if
|
|
|
|
* any of them is equal to @p text.
|
|
|
|
*
|
|
|
|
* If @p text is an empty string, @p false
|
|
|
|
* is returned.
|
|
|
|
*
|
|
|
|
* @return @p true if an item with the string @p text is in the combobox.
|
|
|
|
*/
|
|
|
|
bool contains( const TQString& text ) const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* By default, KComboBox recognizes Key_Return and Key_Enter
|
|
|
|
* and emits the returnPressed() signals, but it also lets the
|
|
|
|
* event pass, for example causing a dialog's default-button to
|
|
|
|
* be called.
|
|
|
|
*
|
|
|
|
* Call this method with @p trap equal to true to make KComboBox
|
|
|
|
* stop these events. The signals will still be emitted of course.
|
|
|
|
*
|
|
|
|
* Only affects read-writable comboboxes.
|
|
|
|
*
|
|
|
|
* @see setTrapReturnKey()
|
|
|
|
*/
|
|
|
|
void setTrapReturnKey( bool trap );
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return @p true if keyevents of Key_Return or Key_Enter will
|
|
|
|
* be stopped or if they will be propagated.
|
|
|
|
*
|
|
|
|
* @see setTrapReturnKey ()
|
|
|
|
*/
|
|
|
|
bool trapReturnKey() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Re-implemented for internal reasons. API not affected.
|
|
|
|
*/
|
|
|
|
virtual bool eventFilter( TQObject *, TQEvent * );
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @returns the completion-box, that is used in completion mode
|
|
|
|
* KGlobalSettings::CompletionPopup and KGlobalSettings::CompletionPopupAuto.
|
|
|
|
* This method will create a completion-box by calling
|
|
|
|
* KLineEdit::completionBox, if none is there, yet.
|
|
|
|
*
|
|
|
|
* @param create Set this to false if you don't want the box to be created
|
|
|
|
* i.e. to test if it is available.
|
|
|
|
*/
|
|
|
|
KCompletionBox * completionBox( bool create = true );
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Re-implemented for internal reasons. API remains unaffected.
|
|
|
|
* NOTE: Only editable comboboxes can have a line editor. As such
|
|
|
|
* any attempt to assign a line-edit to a non-editable combobox will
|
|
|
|
* simply be ignored.
|
|
|
|
*/
|
|
|
|
virtual void setLineEdit( TQLineEdit * );
|
|
|
|
|
|
|
|
signals:
|
|
|
|
/**
|
|
|
|
* Emitted when the user presses the Enter key.
|
|
|
|
*
|
|
|
|
* Note that this signal is only emitted when the widget is editable.
|
|
|
|
*/
|
|
|
|
void returnPressed();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Emitted when the user presses the Enter key.
|
|
|
|
*
|
|
|
|
* The argument is the current text being edited. This signal is just like
|
|
|
|
* returnPressed() except it contains the current text as its argument.
|
|
|
|
*
|
|
|
|
* Note that this signal is only emitted when the
|
|
|
|
* widget is editable.
|
|
|
|
*/
|
|
|
|
void returnPressed( const TQString& );
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Emitted when the completion key is pressed.
|
|
|
|
*
|
|
|
|
* The argument is the current text being edited.
|
|
|
|
*
|
|
|
|
* Note that this signal is @em not available when the widget is non-editable
|
|
|
|
* or the completion mode is set to @p KGlobalSettings::CompletionNone.
|
|
|
|
*/
|
|
|
|
void completion( const TQString& );
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Emitted when the shortcut for substring completion is pressed.
|
|
|
|
*/
|
|
|
|
void substringCompletion( const TQString& );
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Emitted when the text rotation key-bindings are pressed.
|
|
|
|
*
|
|
|
|
* The argument indicates which key-binding was pressed. In this
|
|
|
|
* case this can be either one of four values: @p PrevCompletionMatch,
|
|
|
|
* @p NextCompletionMatch, @p RotateUp or @p RotateDown. See
|
|
|
|
* @p setKeyBinding() for details.
|
|
|
|
*
|
|
|
|
* Note that this signal is @em NOT emitted if the completion
|
|
|
|
* mode is set to CompletionNone.
|
|
|
|
*/
|
|
|
|
void textRotation( KCompletionBase::KeyBindingType );
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Emitted whenever the completion mode is changed by the user
|
|
|
|
* through the context menu.
|
|
|
|
*/
|
|
|
|
void completionModeChanged( KGlobalSettings::Completion );
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Emitted before the context menu is displayed.
|
|
|
|
*
|
|
|
|
* The signal allows you to add your own entries into the context menu.
|
|
|
|
* Note that you MUST NOT store the pointer to the TQPopupMenu since it is
|
|
|
|
* created and deleted on demand. Otherwise, you can crash your app.
|
|
|
|
*
|
|
|
|
* @param p the context menu about to be displayed
|
|
|
|
*/
|
|
|
|
void aboutToShowContextMenu( TQPopupMenu * p );
|
|
|
|
|
|
|
|
public slots:
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Iterates through all possible matches of the completed text
|
|
|
|
* or the history list.
|
|
|
|
*
|
|
|
|
* Depending on the value of the argument, this function either
|
|
|
|
* iterates through the history list of this widget or the all
|
|
|
|
* possible matches in whenever multiple matches result from a
|
|
|
|
* text completion request. Note that the all-possible-match
|
|
|
|
* iteration will not work if there are no previous matches, i.e.
|
|
|
|
* no text has been completed and the *nix shell history list
|
|
|
|
* rotation is only available if the insertion policy for this
|
|
|
|
* widget is set either @p QComobBox::AtTop or @p TQComboBox::AtBottom.
|
|
|
|
* For other insertion modes whatever has been typed by the user
|
|
|
|
* when the rotation event was initiated will be lost.
|
|
|
|
*
|
|
|
|
* @param type The key-binding invoked.
|
|
|
|
*/
|
|
|
|
void rotateText( KCompletionBase::KeyBindingType type );
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets the completed text in the line-edit appropriately.
|
|
|
|
*
|
|
|
|
* This function is a re-implementation of @p setCompletedText.
|
|
|
|
*/
|
|
|
|
virtual void setCompletedText( const TQString& );
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets @p items into the completion-box if completionMode() is
|
|
|
|
* CompletionPopup. The popup will be shown immediately.
|
|
|
|
*/
|
|
|
|
void setCompletedItems( const TQStringList& items );
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Selects the first item that matches @p item. If there is no such item,
|
|
|
|
* it is inserted at position @p index if @p insert is true. Otherwise,
|
|
|
|
* no item is selected.
|
|
|
|
*/
|
|
|
|
void setCurrentItem( const TQString& item, bool insert = false, int index = -1 );
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Simply calls QComboBox' implementation. Only here to not become
|
|
|
|
* shadowed.
|
|
|
|
*/
|
|
|
|
void setCurrentItem(int index) { TQComboBox::setCurrentItem(index); }
|
|
|
|
|
|
|
|
protected slots:
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @deprecated
|
|
|
|
*/
|
|
|
|
virtual void itemSelected( TQListBoxItem* ) {}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Completes text according to the completion mode.
|
|
|
|
*
|
|
|
|
* Note: this method is @p not invoked if the completion mode is
|
|
|
|
* set to CompletionNone. Also if the mode is set to @p CompletionShell
|
|
|
|
* and multiple matches are found, this method will complete the
|
|
|
|
* text to the first match with a beep to inidicate that there are
|
|
|
|
* more matches. Then any successive completion key event iterates
|
|
|
|
* through the remaining matches. This way the rotation functionality
|
|
|
|
* is left to iterate through the list as usual.
|
|
|
|
*/
|
|
|
|
virtual void makeCompletion( const TQString& );
|
|
|
|
|
|
|
|
protected:
|
|
|
|
/*
|
|
|
|
* This function simply sets the lineedit text and
|
|
|
|
* highlights the text appropriately if the boolean
|
|
|
|
* value is set to true.
|
|
|
|
*
|
|
|
|
* @param
|
|
|
|
* @param
|
|
|
|
*/
|
|
|
|
virtual void setCompletedText( const TQString& /* */, bool /*marked*/ );
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Reimplemented for internal reasons, the API is not affected.
|
|
|
|
*/
|
|
|
|
virtual void create( WId = 0, bool initializeWindow = true,
|
|
|
|
bool destroyOldWindow = true );
|
|
|
|
|
|
|
|
virtual void wheelEvent( TQWheelEvent *ev );
|
|
|
|
|
|
|
|
private slots:
|
|
|
|
void lineEditDeleted();
|
|
|
|
|
|
|
|
private:
|
|
|
|
/**
|
|
|
|
* Initializes the variables upon construction.
|
|
|
|
*/
|
|
|
|
void init();
|
|
|
|
bool m_bEnableMenu; // ### BCI: unused, remove in KDE4
|
|
|
|
bool m_trapReturnKey; // ### BCI: unused, remove in KDE4
|
|
|
|
|
|
|
|
protected:
|
|
|
|
virtual void virtual_hook( int id, void* data );
|
|
|
|
|
|
|
|
private:
|
|
|
|
class KComboBoxPrivate;
|
|
|
|
KComboBoxPrivate* const d;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
class KPixmapProvider;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @short A combobox for offering a history and completion
|
|
|
|
*
|
|
|
|
* A combobox which implements a history like a unix shell. You can navigate
|
|
|
|
* through all the items by using the Up or Down arrows (configurable of
|
|
|
|
* course). Additionally, weighted completion is available. So you should
|
|
|
|
* load and save the completion list to preserve the weighting between
|
|
|
|
* sessions.
|
|
|
|
*
|
|
|
|
* KHistoryCombo obeys the HISTCONTROL environment variable to determine
|
|
|
|
* whether duplicates in the history should be tolerated in
|
|
|
|
* addToHistory() or not. During construction of KHistoryCombo,
|
|
|
|
* duplicates will be disabled when HISTCONTROL is set to "ignoredups" or
|
|
|
|
* "ignoreboth". Otherwise, duplicates are enabled by default.
|
|
|
|
*
|
|
|
|
* @author Carsten Pfeiffer <pfeiffer@kde.org>
|
|
|
|
*/
|
|
|
|
class KDEUI_EXPORT KHistoryCombo : public KComboBox
|
|
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
Q_PROPERTY( TQStringList historyItems READ historyItems WRITE setHistoryItems )
|
|
|
|
|
|
|
|
public:
|
|
|
|
/**
|
|
|
|
* Constructs a "read-write" combobox. A read-only history combobox
|
|
|
|
* doesn't make much sense, so it is only available as read-write.
|
|
|
|
* Completion will be used automatically for the items in the combo.
|
|
|
|
*
|
|
|
|
* The insertion-policy is set to NoInsertion, you have to add the items
|
|
|
|
* yourself via the slot addToHistory. If you want every item added,
|
|
|
|
* use
|
|
|
|
*
|
|
|
|
* \code
|
|
|
|
* connect( combo, TQT_SIGNAL( activated( const TQString& )),
|
|
|
|
* combo, TQT_SLOT( addToHistory( const TQString& )));
|
|
|
|
* \endcode
|
|
|
|
*
|
|
|
|
* Use TQComboBox::setMaxCount() to limit the history.
|
|
|
|
*
|
|
|
|
* @p parent the parent object of this widget.
|
|
|
|
* @p name the name of this widget.
|
|
|
|
*/
|
|
|
|
KHistoryCombo( TQWidget *parent = 0L, const char *name = 0L );
|
|
|
|
|
|
|
|
// ### merge these two constructors
|
|
|
|
/**
|
|
|
|
* Same as the previous constructor, but additionally has the option
|
|
|
|
* to specify whether you want to let KHistoryCombo handle completion
|
|
|
|
* or not. If set to @p true, KHistoryCombo will sync the completion to the
|
|
|
|
* contents of the combobox.
|
|
|
|
*/
|
|
|
|
KHistoryCombo( bool useCompletion,
|
|
|
|
TQWidget *parent = 0L, const char *name = 0L );
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Destructs the combo, the completion-object and the pixmap-provider
|
|
|
|
*/
|
|
|
|
~KHistoryCombo();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Inserts @p items into the combobox. @p items might get
|
|
|
|
* truncated if it is longer than maxCount()
|
|
|
|
*
|
|
|
|
* @see historyItems
|
|
|
|
*/
|
|
|
|
inline void setHistoryItems( TQStringList items ) {
|
|
|
|
setHistoryItems(items, false);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Inserts @p items into the combobox. @p items might get
|
|
|
|
* truncated if it is longer than maxCount()
|
|
|
|
*
|
|
|
|
* Set @p setCompletionList to true, if you don't have a list of
|
|
|
|
* completions. This tells KHistoryCombo to use all the items for the
|
|
|
|
* completion object as well.
|
|
|
|
* You won't have the benefit of weighted completion though, so normally
|
|
|
|
* you should do something like
|
|
|
|
* \code
|
|
|
|
* KConfig *config = kapp->config();
|
|
|
|
* TQStringList list;
|
|
|
|
*
|
|
|
|
* // load the history and completion list after creating the history combo
|
|
|
|
* list = config->readListEntry( "Completion list" );
|
|
|
|
* combo->completionObject()->setItems( list );
|
|
|
|
* list = config->readListEntry( "History list" );
|
|
|
|
* combo->setHistoryItems( list );
|
|
|
|
*
|
|
|
|
* [...]
|
|
|
|
*
|
|
|
|
* // save the history and completion list when the history combo is
|
|
|
|
* // destroyed
|
|
|
|
* list = combo->completionObject()->items()
|
|
|
|
* config->writeEntry( "Completion list", list );
|
|
|
|
* list = combo->historyItems();
|
|
|
|
* config->writeEntry( "History list", list );
|
|
|
|
* \endcode
|
|
|
|
*
|
|
|
|
* Be sure to use different names for saving with KConfig if you have more
|
|
|
|
* than one KHistoryCombo.
|
|
|
|
*
|
|
|
|
* Note: When @p setCompletionList is true, the items are inserted into the
|
|
|
|
* KCompletion object with mode KCompletion::Insertion and the mode is set
|
|
|
|
* to KCompletion::Weighted afterwards.
|
|
|
|
*
|
|
|
|
* @see historyItems
|
|
|
|
* @see KComboBox::completionObject
|
|
|
|
* @see KCompletion::setItems
|
|
|
|
* @see KCompletion::items
|
|
|
|
*/
|
|
|
|
void setHistoryItems( TQStringList items, bool setCompletionList );
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the list of history items. Empty, when this is not a read-write
|
|
|
|
* combobox.
|
|
|
|
*
|
|
|
|
* @see setHistoryItems
|
|
|
|
*/
|
|
|
|
TQStringList historyItems() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Removes all items named @p item.
|
|
|
|
*
|
|
|
|
* @return @p true if at least one item was removed.
|
|
|
|
*
|
|
|
|
* @see addToHistory
|
|
|
|
*/
|
|
|
|
bool removeFromHistory( const TQString& item );
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets a pixmap provider, so that items in the combobox can have a pixmap.
|
|
|
|
* KPixmapProvider is just an abstract class with the one pure virtual
|
|
|
|
* method KPixmapProvider::pixmapFor(). This method is called whenever
|
|
|
|
* an item is added to the KHistoryComboBox. Implement it to return your
|
|
|
|
* own custom pixmaps, or use the KURLPixmapProvider from libkio,
|
|
|
|
* which uses KMimeType::pixmapForURL to resolve icons.
|
|
|
|
*
|
|
|
|
* Set @p prov to 0L if you want to disable pixmaps. Default no pixmaps.
|
|
|
|
*
|
|
|
|
* @see pixmapProvider
|
|
|
|
*/
|
|
|
|
void setPixmapProvider( KPixmapProvider *prov );
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @returns the current pixmap provider.
|
|
|
|
* @see setPixmapProvider
|
|
|
|
* @see KPixmapProvider
|
|
|
|
*/
|
|
|
|
KPixmapProvider * pixmapProvider() const { return myPixProvider; }
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Resets the current position of the up/down history. Call this
|
|
|
|
* when you manually call setCurrentItem() or clearEdit().
|
|
|
|
*/
|
|
|
|
void reset() { slotReset(); }
|
|
|
|
|
|
|
|
/**
|
|
|
|
* When enabling it you have to connect to "removed" signal and save changes
|
|
|
|
*/
|
|
|
|
void setHistoryEditorEnabled( bool enable );
|
|
|
|
bool isHistoryEditorEnabled() const;
|
|
|
|
|
|
|
|
public slots:
|
|
|
|
/**
|
|
|
|
* Adds an item to the end of the history list and to the completion list.
|
|
|
|
* If maxCount() is reached, the first item of the list will be
|
|
|
|
* removed.
|
|
|
|
*
|
|
|
|
* If the last inserted item is the same as @p item, it will not be
|
|
|
|
* inserted again.
|
|
|
|
*
|
|
|
|
* If duplicatesEnabled() is false, any equal existing item will be
|
|
|
|
* removed before @p item is added.
|
|
|
|
*
|
|
|
|
* Note: By using this method and not the Q and KComboBox insertItem()
|
|
|
|
* methods, you make sure that the combobox stays in sync with the
|
|
|
|
* completion. It would be annoying if completion would give an item
|
|
|
|
* not in the combobox, and vice versa.
|
|
|
|
*
|
|
|
|
* @see removeFromHistory
|
|
|
|
* @see TQComboBox::setDuplicatesEnabled
|
|
|
|
*/
|
|
|
|
void addToHistory( const TQString& item );
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Clears the history and the completion list.
|
|
|
|
*/
|
|
|
|
void clearHistory();
|
|
|
|
|
|
|
|
signals:
|
|
|
|
/**
|
|
|
|
* Emitted when the history was cleared by the entry in the popup menu.
|
|
|
|
*/
|
|
|
|
void cleared();
|
|
|
|
|
|
|
|
void removed( const TQString& item );
|
|
|
|
|
|
|
|
protected:
|
|
|
|
/**
|
|
|
|
* Handling key-events, the shortcuts to rotate the items.
|
|
|
|
*/
|
|
|
|
virtual void keyPressEvent( TQKeyEvent * );
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Handling wheel-events, to rotate the items.
|
|
|
|
*/
|
|
|
|
virtual void wheelEvent( TQWheelEvent *ev );
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Inserts @p items into the combo, honoring pixmapProvider()
|
|
|
|
* Does not update the completionObject.
|
|
|
|
*
|
|
|
|
* Note: duplicatesEnabled() is not honored here.
|
|
|
|
*
|
|
|
|
* Called from setHistoryItems() and setPixmapProvider()
|
|
|
|
*/
|
|
|
|
void insertItems( const TQStringList& items );
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @returns if we can modify the completion object or not.
|
|
|
|
*/
|
|
|
|
bool useCompletion() const { return compObj(); }
|
|
|
|
|
|
|
|
private slots:
|
|
|
|
/**
|
|
|
|
* Resets the iterate index to -1
|
|
|
|
*/
|
|
|
|
void slotReset();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Called from the popupmenu,
|
|
|
|
* calls clearHistory() and emits cleared()
|
|
|
|
*/
|
|
|
|
void slotClear();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Called from the popupmenu,
|
|
|
|
*/
|
|
|
|
void slotEdit();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Appends our own context menu entry.
|
|
|
|
*/
|
|
|
|
void addContextMenuItems( TQPopupMenu* );
|
|
|
|
|
|
|
|
void slotRemoveFromHistory( const TQString & );
|
|
|
|
|
|
|
|
private:
|
|
|
|
void init( bool useCompletion );
|
|
|
|
void rotateUp();
|
|
|
|
void rotateDown();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The current position (index) in the combobox, used for Up and Down
|
|
|
|
*/
|
|
|
|
int myIterateIndex;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The text typed before Up or Down was pressed.
|
|
|
|
*/
|
|
|
|
TQString myText;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Indicates that the user at least once rotated Up through the entire list
|
|
|
|
* Needed to allow going back after rotation.
|
|
|
|
*/
|
|
|
|
bool myRotated;
|
|
|
|
KPixmapProvider *myPixProvider;
|
|
|
|
|
|
|
|
protected:
|
|
|
|
virtual void virtual_hook( int id, void* data );
|
|
|
|
private:
|
|
|
|
class KHistoryComboPrivate;
|
|
|
|
KHistoryComboPrivate* const d;
|
|
|
|
};
|
|
|
|
|
|
|
|
class KDEUI_EXPORT KHistoryComboEditor : public KDialogBase
|
|
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
public:
|
|
|
|
KHistoryComboEditor( const TQStringList& entries, TQWidget *parent = 0L );
|
|
|
|
~KHistoryComboEditor();
|
|
|
|
|
|
|
|
signals:
|
|
|
|
void removeFromHistory( const TQString& );
|
|
|
|
|
|
|
|
protected slots:
|
|
|
|
virtual void slotUser1(); // User1 is "Delete Entry" button
|
|
|
|
void slotSelectionChanged( TQListViewItem * item );
|
|
|
|
|
|
|
|
protected:
|
|
|
|
virtual void virtual_hook( int id, void* data );
|
|
|
|
|
|
|
|
private:
|
|
|
|
KListView *m_pListView;
|
|
|
|
|
|
|
|
class KHistoryComboEditorPrivate;
|
|
|
|
KHistoryComboEditorPrivate* const d;
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|