summaryrefslogtreecommitdiffstats
path: root/kdecore/kcompletion.h
diff options
context:
space:
mode:
Diffstat (limited to 'kdecore/kcompletion.h')
-rw-r--r--kdecore/kcompletion.h1010
1 files changed, 1010 insertions, 0 deletions
diff --git a/kdecore/kcompletion.h b/kdecore/kcompletion.h
new file mode 100644
index 000000000..af4d5ee32
--- /dev/null
+++ b/kdecore/kcompletion.h
@@ -0,0 +1,1010 @@
+/* This file is part of the KDE libraries
+ Copyright (C) 1999,2000 Carsten Pfeiffer <pfeiffer@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License 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 KCOMPLETION_H
+#define KCOMPLETION_H
+
+#include <qmap.h>
+#include <qptrlist.h>
+#include <qobject.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qguardedptr.h>
+
+#include "kdelibs_export.h"
+#include <kglobalsettings.h>
+#include <ksortablevaluelist.h>
+#include <kshortcut.h>
+
+class KCompTreeNode;
+class KCompletionPrivate;
+class KCompletionBasePrivate;
+class KCompletionMatchesWrapper;
+class KCompletionMatches;
+class QPopupMenu;
+
+/**
+ * @short A generic class for completing QStrings
+ *
+ * This class offers easy use of "auto-completion", "manual-completion" or
+ * "shell completion" on QString objects. A common use is completing filenames
+ * or URLs (see KURLCompletion()).
+ * But it is not limited to URL-completion -- everything should be completable!
+ * The user should be able to complete email-addresses, telephone-numbers,
+ * commands, SQL queries, ...
+ * Every time your program knows what the user can type into an edit-field, you
+ * should offer completion. With KCompletion, this is very easy, and if you are
+ * using a line edit widget ( KLineEdit), it is even more easy.
+ * Basically, you tell a KCompletion object what strings should be completable
+ * and whenever completion should be invoked, you call makeCompletion().
+ * KLineEdit and (an editable) KComboBox even do this automatically for you.
+ *
+ * KCompletion offers the completed string via the signal match() and
+ * all matching strings (when the result is ambiguous) via the method
+ * allMatches().
+ *
+ * Notice: auto-completion, shell completion and manual completion work
+ * slightly differently:
+ *
+ * @li auto-completion always returns a complete item as match.
+ * When more than one matching items are available, it will deliver just
+ * the first (depending on sorting order) item. Iterating over all matches
+ * is possible via nextMatch() and previousMatch().
+ *
+ * @li popup-completion works in the same way, the only difference being that
+ * the completed items are not put into the edit-widget, but into a
+ * separate popup-box.
+ *
+ * @li manual completion works the same way as auto-completion, the
+ * subtle difference is, that it isn't invoked automatically while the user
+ * is typing, but only when the user presses a special key. The difference
+ * of manual and auto-completion is therefore only visible in UI classes,
+ * KCompletion needs to know whether to deliver partial matches
+ * (shell completion) or whole matches (auto/manual completion), therefore
+ * KGlobalSettings::CompletionMan and
+ * KGlobalSettings::CompletionAuto have the exact same effect in
+ * KCompletion.
+ *
+ * @li shell completion works like how shells complete filenames:
+ * when multiple matches are available, the longest possible string of all
+ * matches is returned (i.e. only a partial item).
+ * Iterating over all matching items (complete, not partial) is possible
+ * via nextMatch() and previousMatch().
+ *
+ * You don't have to worry much about that though, KCompletion handles
+ * that for you, according to the setting setCompletionMode().
+ * The default setting is globally configured by the user and read
+ * from KGlobalSettings::completionMode().
+ *
+ * A short example:
+ * \code
+ * KCompletion completion;
+ * completion.setOrder( KCompletion::Sorted );
+ * completion.addItem( "pfeiffer@kde.org" );
+ * completion.addItem( "coolo@kde.org" );
+ * completion.addItem( "carpdjih@sp.zrz.tu-berlin.de" );
+ * completion.addItem( "carp@cs.tu-berlin.de" );
+ *
+ * cout << completion.makeCompletion( "ca" ).latin1() << endl;
+ * \endcode
+ *
+ * In shell-completion-mode, this will be "carp"; in auto-completion-
+ * mode it will be "carp\@cs.tu-berlin.de", as that is alphabetically
+ * smaller.
+ * If setOrder was set to Insertion, "carpdjih\@sp.zrz.tu-berlin.de"
+ * would be completed in auto-completion-mode, as that was inserted before
+ * "carp\@cs.tu-berlin.de".
+ *
+ * You can dynamically update the completable items by removing and adding them
+ * whenever you want.
+ * For advanced usage, you could even use multiple KCompletion objects. E.g.
+ * imagine an editor like kwrite with multiple open files. You could store
+ * items of each file in a different KCompletion object, so that you know (and
+ * tell the user) where a completion comes from.
+ *
+ * Note: KCompletion does not work with strings that contain 0x0 characters
+ * (unicode nul), as this is used internally as a delimiter.
+ *
+ * You may inherit from KCompletion and override makeCompletion() in
+ * special cases (like reading directories/urls and then supplying the
+ * contents to KCompletion, as KURLCompletion does), but generally, this is
+ * not necessary.
+ *
+ *
+ * @author Carsten Pfeiffer <pfeiffer@kde.org>
+ */
+class KDECORE_EXPORT KCompletion : public QObject
+{
+ Q_ENUMS( CompOrder )
+ Q_PROPERTY( CompOrder order READ order WRITE setOrder )
+ Q_PROPERTY( bool ignoreCase READ ignoreCase WRITE setIgnoreCase )
+ Q_PROPERTY( QStringList items READ items WRITE setItems )
+ Q_OBJECT
+
+public:
+ /**
+ * Constants that represent the order in which KCompletion performs
+ * completion-lookups.
+ */
+ enum CompOrder { Sorted, ///< Use alphabetically sorted order
+ Insertion, ///< Use order of insertion
+ Weighted ///< Use weighted order
+ };
+
+ /**
+ * Constructor, nothing special here :)
+ */
+ KCompletion();
+
+ // FIXME: copy constructor, assignment operator...
+
+ /**
+ * Destructor, nothing special here, either.
+ */
+ virtual ~KCompletion();
+
+ /**
+ * Attempts to find an item in the list of available completions,
+ * that begins with @p string. Will either return the first matching item
+ * (if there is more than one match) or QString::null, if no match was
+ * found.
+ *
+ * In the latter case, a sound will be issued, depending on
+ * isSoundsEnabled().
+ * If a match was found, it will also be emitted via the signal
+ * match().
+ *
+ * If this is called twice or more often with the same string while no
+ * items were added or removed in the meantime, all available completions
+ * will be emitted via the signal #matches().
+ * This happens only in shell-completion-mode.
+ *
+ * @param string the string to complete
+ * @return the matching item, or QString::null if there is no matching
+ * item.
+ * @see slotMakeCompletion
+ * @see substringCompletion
+ */
+ virtual QString makeCompletion( const QString& string );
+
+ /**
+ * Returns a list of all completion items that contain the given @p string.
+ * @param string the string to complete
+ * @return a list of items which all contain @p text as a substring,
+ * i.e. not necessarily at the beginning.
+ *
+ * @see makeCompletion
+ */
+ QStringList substringCompletion( const QString& string ) const;
+
+ /**
+ * Returns the next item from the matching-items-list.
+ * When reaching the beginning, the list is rotated so it will return the
+ * last match and a sound is issued (depending on isSoundsEnabled()).
+ * @return the next item from the matching-items-list.
+ * When there is no match, QString::null is returned and
+ * a sound is be issued.
+ * @see slotPreviousMatch
+ */
+ QString previousMatch();
+
+ /**
+ * Returns the next item from the matching-items-list.
+ * When reaching the last item, the list is rotated, so it will return
+ * the first match and a sound is issued (depending on
+ * isSoundsEnabled()).
+ * @return the next item from the matching-items-list. When there is no
+ * match, QString::null is returned and a sound is issued
+ * @see slotNextMatch
+ */
+ QString nextMatch();
+
+ /**
+ * Returns the last match. Might be useful if you need to check whether
+ * a completion is different from the last one.
+ * @return the last match. QString::null is returned when there is no
+ * last match.
+ */
+ virtual const QString& lastMatch() const { return myLastMatch; }
+
+ /**
+ * Returns a list of all items inserted into KCompletion. This is useful
+ * if you need to save the state of a KCompletion object and restore it
+ * later.
+ *
+ * Important note: when order() == Weighted, then every item in the
+ * stringlist has its weight appended, delimited by a colon. E.g. an item
+ * "www.kde.org" might look like "www.kde.org:4", where 4 is the weight.
+ *
+ * This is necessary so that you can save the items along with its
+ * weighting on disk and load them back with setItems(), restoring its
+ * weight as well. If you really don't want the appended weightings, call
+ * setOrder( KCompletion::Insertion )
+ * before calling items().
+ *
+ * @return a list of all items
+ * @see setItems
+ */
+ QStringList items() const;
+
+ /**
+ * Returns true when the completion object contains no entries.
+ */
+ bool isEmpty() const;
+
+ /**
+ * Sets the completion mode to Auto/Manual, Shell or None.
+ * If you don't set the mode explicitly, the global default value
+ * KGlobalSettings::completionMode() is used.
+ * KGlobalSettings::CompletionNone disables completion.
+ * @param mode the completion mode
+ * @see completionMode
+ * @see KGlobalSettings::completionMode
+ */
+ virtual void setCompletionMode( KGlobalSettings::Completion mode );
+
+ /**
+ * Return the current completion mode.
+ * May be different from KGlobalSettings::completionMode(), if you
+ * explicitly called setCompletionMode().
+ * @return the current completion mode
+ * @see setCompletionMode
+ */
+ KGlobalSettings::Completion completionMode() const {
+ return myCompletionMode;
+ }
+
+ /**
+ * KCompletion offers three different ways in which it offers its items:
+ * @li in the order of insertion
+ * @li sorted alphabetically
+ * @li weighted
+ *
+ * Choosing weighted makes KCompletion perform an implicit weighting based
+ * on how often an item is inserted. Imagine a web browser with a location
+ * bar, where the user enters URLs. The more often a URL is entered, the
+ * higher priority it gets.
+ *
+ * Note: Setting the order to sorted only affects new inserted items,
+ * already existing items will stay in the current order. So you probably
+ * want to call setOrder( Sorted ) before inserting items, when you want
+ * everything sorted.
+ *
+ * Default is insertion order.
+ * @param order the new order
+ * @see order
+ */
+ virtual void setOrder( CompOrder order );
+
+ /**
+ * Returns the completion order.
+ * @return the current completion order.
+ * @see setOrder
+ */
+ CompOrder order() const { return myOrder; }
+
+ /**
+ * Setting this to true makes KCompletion behave case insensitively.
+ * E.g. makeCompletion( "CA" ); might return "carp\@cs.tu-berlin.de".
+ * Default is false (case sensitive).
+ * @param ignoreCase true to ignore the case
+ * @see ignoreCase
+ */
+ virtual void setIgnoreCase( bool ignoreCase );
+
+ /**
+ * Return whether KCompletion acts case insensitively or not.
+ * Default is false (case sensitive).
+ * @return true if the case will be ignored
+ * @see setIgnoreCase
+ */
+ bool ignoreCase() const { return myIgnoreCase; }
+
+ /**
+ * Returns a list of all items matching the last completed string.
+ * Might take some time, when you have LOTS of items.
+ * @return a list of all matches for the last completed string.
+ * @see substringCompletion
+ */
+ QStringList allMatches();
+
+ /**
+ * Returns a list of all items matching @p string.
+ * @param string the string to match
+ * @return the list of all matches
+ */
+ QStringList allMatches( const QString& string );
+
+ /**
+ * Returns a list of all items matching the last completed string.
+ * Might take some time, when you have LOTS of items.
+ * The matches are returned as KCompletionMatches, which also
+ * keeps the weight of the matches, allowing
+ * you to modify some matches or merge them with matches
+ * from another call to allWeightedMatches(), and sort the matches
+ * after that in order to have the matches ordered correctly.
+ *
+ * @return a list of all completion matches
+ * @see substringCompletion
+ */
+ KCompletionMatches allWeightedMatches();
+
+ /**
+ * Returns a list of all items matching @p string.
+ * @param string the string to match
+ * @return a list of all matches
+ */
+ KCompletionMatches allWeightedMatches( const QString& string );
+
+ /**
+ * Enables/disables playing a sound when
+ * @li makeCompletion() can't find a match
+ * @li there is a partial completion (= multiple matches in
+ * Shell-completion mode)
+ * @li nextMatch() or previousMatch() hit the last possible
+ * match -> rotation
+ *
+ * For playing the sounds, KNotifyClient() is used.
+ *
+ * @param enable true to enable sounds
+ * @see isSoundsEnabled
+ */
+ virtual void setEnableSounds( bool enable ) { myBeep = enable; }
+
+ /**
+ * Tells you whether KCompletion will play sounds on certain occasions.
+ * Default is enabled.
+ * @return true if sounds are enabled
+ * @see enableSounds
+ * @see disableSounds
+ */
+ bool isSoundsEnabled() const { return myBeep; }
+
+ /**
+ * Returns true when more than one match is found.
+ * @return true if there are more than one match
+ * @see multipleMatches
+ */
+ bool hasMultipleMatches() const { return myHasMultipleMatches; }
+
+#ifndef KDE_NO_COMPAT
+ /**
+ * @deprecated
+ * @see setEnableSounds
+ */
+ void enableSounds() { myBeep = true; }
+
+ /**
+ * @deprecated
+ * @see setEnableSounds
+ */
+ void disableSounds() { myBeep = false; }
+#endif
+
+public slots:
+ /**
+ * Attempts to complete "string" and emits the completion via match().
+ * Same as makeCompletion() (just as a slot).
+ * @param string the string to complete
+ * @see makeCompletion
+ */
+ void slotMakeCompletion( const QString& string ) {
+ (void) makeCompletion( string );
+ }
+
+ /**
+ * Searches the previous matching item and emits it via match().
+ * Same as previousMatch() (just as a slot).
+ * @see previousMatch
+ */
+ void slotPreviousMatch() {
+ (void) previousMatch();
+ }
+
+ /**
+ * Searches the next matching item and emits it via match().
+ * Same as nextMatch() (just as a slot).
+ * @see nextMatch
+ */
+ void slotNextMatch() {
+ (void) nextMatch();
+ }
+
+ // FIXME ###: KDE4: unify the nomenclature. We have insertItems, addItem,
+ // setItems...
+ /**
+ * Inserts @p items into the list of possible completions.
+ * Does the same as setItems(), but does not call clear() before.
+ * @param items the items to insert
+ */
+ void insertItems( const QStringList& items );
+
+ /**
+ * Sets the list of items available for completion. Removes all previous
+ * items.
+ *
+ * Notice: when order() == Weighted, then the weighting is looked up for
+ * every item in the stringlist. Every item should have ":number" appended,
+ * where number is an unsigned integer, specifying the weighting.
+ *
+ * If you don't like this, call
+ * setOrder( KCompletion::Insertion )
+ * before calling setItems().
+ *
+ * @param list the list of items that are available for completion
+ * @see items
+ */
+ virtual void setItems( const QStringList& list);
+
+ /**
+ * Adds an item to the list of available completions.
+ * Resets the current item-state ( previousMatch() and nextMatch()
+ * won't work anymore).
+ * @param item the item to add
+ */
+ void addItem( const QString& item);
+
+ /**
+ * Adds an item to the list of available completions.
+ * Resets the current item-state ( previousMatch() and nextMatch()
+ * won't work anymore).
+ *
+ * Sets the weighting of the item to @p weight or adds it to the current
+ * weighting if the item is already available. The weight has to be greater
+ * than 1 to take effect (default weight is 1).
+ * @param item the item to add
+ * @param weight the weight of the item, default is 1
+ */
+ void addItem( const QString& item, uint weight );
+
+ /**
+ * Removes an item from the list of available completions.
+ * Resets the current item-state ( previousMatch() and nextMatch()
+ * won't work anymore).
+ * @param item the item to remove
+ */
+ void removeItem( const QString& item);
+
+ /**
+ * Removes all inserted items.
+ */
+ virtual void clear();
+
+
+signals:
+ /**
+ * The matching item. Will be emitted by makeCompletion(),
+ * previousMatch() or nextMatch(). May be QString::null if there
+ * is no matching item.
+ * @param item the match, or QString::null if there is none
+ */
+ void match( const QString& item);
+
+ /**
+ * All matching items. Will be emitted by makeCompletion() in shell-
+ * completion-mode, when the same string is passed to makeCompletion twice
+ * or more often.
+ * @param matchlist the list of matches
+ */
+ void matches( const QStringList& matchlist);
+
+ /**
+ * This signal is emitted, when calling makeCompletion() and more than
+ * one matching item is found.
+ * @see hasMultipleMatches
+ */
+ void multipleMatches();
+
+protected:
+ /**
+ * This method is called after a completion is found and before the
+ * matching string is emitted. You can override this method to modify the
+ * string that will be emitted.
+ * This is necessary e.g. in KURLCompletion(), where files with spaces
+ * in their names are shown escaped ("filename\ with\ spaces"), but stored
+ * unescaped inside KCompletion.
+ * Never delete that pointer!
+ *
+ * Default implementation does nothing.
+ * @param match the match to process
+ * @see postProcessMatches
+ */
+ virtual void postProcessMatch( QString *match ) const { Q_UNUSED(match) }
+
+ /**
+ * This method is called before a list of all available completions is
+ * emitted via #matches. You can override this method to modify the
+ * found items before match() or #matches are emitted.
+ * Never delete that pointer!
+ *
+ * Default implementation does nothing.
+ * @param matches the matches to process
+ * @see postProcessMatch
+ */
+ virtual void postProcessMatches( QStringList * matches ) const { Q_UNUSED(matches)}
+
+ /**
+ * This method is called before a list of all available completions is
+ * emitted via #matches. You can override this method to modify the
+ * found items before #match() or #matches() are emitted.
+ * Never delete that pointer!
+ *
+ * Default implementation does nothing.
+ * @param matches the matches to process
+ * @see postProcessMatch
+ */
+ virtual void postProcessMatches( KCompletionMatches * matches ) const {Q_UNUSED(matches)}
+
+private:
+ void addWeightedItem( const QString& );
+ QString findCompletion( const QString& string );
+ void findAllCompletions( const QString&,
+ KCompletionMatchesWrapper *matches,
+ bool& hasMultipleMatches ) const;
+
+ void extractStringsFromNode( const KCompTreeNode *,
+ const QString& beginning,
+ KCompletionMatchesWrapper *matches,
+ bool addWeight = false ) const;
+ void extractStringsFromNodeCI( const KCompTreeNode *,
+ const QString& beginning,
+ const QString& restString,
+ KCompletionMatchesWrapper *matches) const;
+
+ enum BeepMode { NoMatch, PartialMatch, Rotation };
+ void doBeep( BeepMode ) const;
+
+ KGlobalSettings::Completion myCompletionMode;
+
+ CompOrder myOrder;
+ QString myLastString;
+ QString myLastMatch;
+ QString myCurrentMatch;
+ KCompTreeNode * myTreeRoot;
+ QStringList myRotations;
+ bool myBeep;
+ bool myIgnoreCase;
+ bool myHasMultipleMatches;
+ uint myRotationIndex;
+
+
+protected:
+ virtual void virtual_hook( int id, void* data );
+private:
+ KCompletionPrivate *d;
+};
+
+// some more helper stuff
+typedef KSortableValueList<QString> KCompletionMatchesList;
+class KCompletionMatchesPrivate;
+
+/**
+ * This structure is returned by KCompletion::allWeightedMatches .
+ * It also keeps the weight of the matches, allowing
+ * you to modify some matches or merge them with matches
+ * from another call to allWeightedMatches(), and sort the matches
+ * after that in order to have the matches ordered correctly
+ *
+ * Example (a simplified example of what Konqueror's completion does):
+ * \code
+ * KCompletionMatches matches = completion->allWeightedMatches( location );
+ * if( !location.startsWith( "www." ))
+ matches += completion->allWeightedmatches( "www." + location" );
+ * matches.removeDuplicates();
+ * QStringList list = matches.list();
+ * \endcode
+ *
+ * @short List for keeping matches returned from KCompletion
+ */
+class KDECORE_EXPORT KCompletionMatches : public KCompletionMatchesList
+{
+public:
+ KCompletionMatches( bool sort );
+ /**
+ * @internal
+ */
+ KCompletionMatches( const KCompletionMatchesWrapper& matches );
+ ~KCompletionMatches();
+ /**
+ * Removes duplicate matches. Needed only when you merged several matches
+ * results and there's a possibility of duplicates.
+ */
+ void removeDuplicates();
+ /**
+ * Returns the matches as a QStringList.
+ * @param sort if false, the matches won't be sorted before the conversion,
+ * use only if you're sure the sorting is not needed
+ * @return the list of matches
+ */
+ QStringList list( bool sort = true ) const;
+ /**
+ * If sorting() returns false, the matches aren't sorted by their weight,
+ * even if true is passed to list().
+ * @return true if the matches won't be sorted
+ */
+ bool sorting() const {
+ return _sorting;
+ }
+private:
+ bool _sorting;
+ KCompletionMatchesPrivate* d;
+};
+
+/**
+ * An abstract base class for adding a completion feature
+ * into widgets.
+ *
+ * This is a convenience class that provides the basic functions
+ * needed to add text completion support into widgets. All that
+ * is required is an implementation for the pure virtual function
+ * setCompletedText. Refer to KLineEdit or KComboBox
+ * to see how easily such support can be added using this as a base
+ * class.
+ *
+ * @short An abstract class for adding text completion support to widgets.
+ * @author Dawit Alemayehu <adawit@kde.org>
+ */
+class KDECORE_EXPORT KCompletionBase
+{
+public:
+ /**
+ * Constants that represent the items whose short-cut
+ * key-binding is programmable. The default key-bindings
+ * for these items are defined in KStdAccel.
+ */
+ enum KeyBindingType {
+ /**
+ * Text completion (by default Ctrl-E).
+ */
+ TextCompletion,
+ /**
+ * Switch to previous completion (by default Ctrl-Up).
+ */
+ PrevCompletionMatch,
+ /**
+ * Switch to next completion (by default Ctrl-Down).
+ */
+ NextCompletionMatch,
+ /**
+ * Substring completion (by default Ctrl-T).
+ */
+ SubstringCompletion
+ };
+
+
+ // Map for the key binding types mentioned above.
+ typedef QMap<KeyBindingType, KShortcut> KeyBindingMap;
+
+ /**
+ * Default constructor.
+ */
+ KCompletionBase();
+
+ /**
+ * Destructor.
+ */
+ virtual ~KCompletionBase();
+
+ /**
+ * Returns a pointer to the current completion object.
+ *
+ * If the completion object does not exist, it is automatically created and
+ * by default handles all the completion signals internally unless @p hsig
+ * is set to false. It is also automatically destroyed when the destructor
+ * is called. You can change this default behavior using the
+ * @ref setAutoDeleteCompletionObject and @ref setHandleSignals member
+ * functions.
+ *
+ * See also @ref compObj.
+ *
+ * @param hsig if true, handles completion signals internally.
+ * @return a pointer the completion object.
+ */
+ KCompletion* completionObject( bool hsig = true );
+
+ /**
+ * Sets up the completion object to be used.
+ *
+ * This method assigns the completion object and sets it up to automatically
+ * handle the completion and rotation signals internally. You should use
+ * this function if you want to share one completion object among your
+ * widgets or need to use a customized completion object.
+ *
+ * The object assigned through this method is not deleted when this object's
+ * destructor is invoked unless you explicitly call @ref setAutoDeleteCompletionObject
+ * after calling this method. Be sure to set the bool argument to false, if
+ * you want to handle the completion signals yourself.
+ *
+ * @param compObj a KCompletion() or a derived child object.
+ * @param hsig if true, handles completion signals internally.
+ */
+ virtual void setCompletionObject( KCompletion* compObj, bool hsig = true );
+
+ /**
+ * Enables this object to handle completion and rotation
+ * events internally.
+ *
+ * This function simply assigns a boolean value that
+ * indicates whether it should handle rotation and
+ * completion events or not. Note that this does not
+ * stop the object from emitting signals when these
+ * events occur.
+ *
+ * @param handle if true, handle completion & rotation internally.
+ */
+ virtual void setHandleSignals( bool handle );
+
+ /**
+ * Returns true if the completion object is deleted
+ * upon this widget's destruction.
+ *
+ * See setCompletionObject() and enableCompletion()
+ * for details.
+ *
+ * @return true if the completion object will be deleted
+ * automatically
+ */
+ bool isCompletionObjectAutoDeleted() const {
+ return m_delegate ? m_delegate->isCompletionObjectAutoDeleted() : m_bAutoDelCompObj;
+ }
+
+ /**
+ * Sets the completion object when this widget's destructor
+ * is called.
+ *
+ * If the argument is set to true, the completion object
+ * is deleted when this widget's destructor is called.
+ *
+ * @param autoDelete if true, delete completion object on destruction.
+ */
+ void setAutoDeleteCompletionObject( bool autoDelete ) {
+ if ( m_delegate )
+ m_delegate->setAutoDeleteCompletionObject( autoDelete );
+ else
+ m_bAutoDelCompObj = autoDelete;
+ }
+
+ /**
+ * Sets the widget's ability to emit text completion and
+ * rotation signals.
+ *
+ * Invoking this function with @p enable set to @p false will
+ * cause the completion & rotation signals not to be emitted.
+ * However, unlike setting the completion object to @p NULL
+ * using setCompletionObject, disabling the emition of
+ * the signals through this method does not affect the current
+ * completion object.
+ *
+ * There is no need to invoke this function by default. When a
+ * completion object is created through completionObject or
+ * setCompletionObject, these signals are set to emit
+ * automatically. Also note that disabling this signals will not
+ * necessarily interfere with the objects ability to handle these
+ * events internally. See setHandleSignals.
+ *
+ * @param enable if false, disables the emition of completion & rotation signals.
+ */
+ void setEnableSignals( bool enable ) {
+ if ( m_delegate )
+ m_delegate->setEnableSignals( enable );
+ else
+ m_bEmitSignals = enable;
+ }
+
+ /**
+ * Returns true if the object handles the signals.
+ *
+ * @return true if this signals are handled internally.
+ */
+ bool handleSignals() const { return m_delegate ? m_delegate->handleSignals() : m_bHandleSignals; }
+
+ /**
+ * Returns true if the object emits the signals.
+ *
+ * @return true if signals are emitted
+ */
+ bool emitSignals() const { return m_delegate ? m_delegate->emitSignals() : m_bEmitSignals; }
+
+ /**
+ * Sets the type of completion to be used.
+ *
+ * The completion modes supported are those defined in
+ * KGlobalSettings(). See below.
+ *
+ * @param mode Completion type:
+ * @li CompletionNone: Disables completion feature.
+ * @li CompletionAuto: Attempts to find a match &
+ * fills-in the remaining text.
+ * @li CompletionMan: Acts the same as the above
+ * except the action has to be
+ * manually triggered through
+ * pre-defined completion key.
+ * @li CompletionShell: Mimics the completion feature
+ * found in typical *nix shell
+ * environments.
+ * @li CompletionPopup: Shows all available completions at once,
+ * in a listbox popping up.
+ */
+ virtual void setCompletionMode( KGlobalSettings::Completion mode );
+
+ /**
+ * Returns the current completion mode.
+ *
+ * The return values are of type KGlobalSettings::Completion.
+ * See setCompletionMode() for details.
+ *
+ * @return the completion mode.
+ */
+ KGlobalSettings::Completion completionMode() const {
+ return m_delegate ? m_delegate->completionMode() : m_iCompletionMode;
+ }
+
+ /**
+ * Sets the key-binding to be used for manual text
+ * completion, text rotation in a history list as
+ * well as a completion list.
+ *
+ *
+ * When the keys set by this function are pressed, a
+ * signal defined by the inheriting widget will be activated.
+ * If the default value or 0 is specified by the second
+ * parameter, then the key-binding as defined in the global
+ * setting should be used. This method returns false value
+ * for @p key is negative or the supplied key-binding conflicts
+ * with the ones set for one of the other features.
+ *
+ * NOTE: To use a modifier key (Shift, Ctrl, Alt) as part of
+ * the key-binding simply simply @p sum up the values of the
+ * modifier and the actual key. For example, to use CTRL+E as
+ * a key binding for one of the items, you would simply supply
+ * @p "Qt::CtrlButton + Qt::Key_E" as the second argument to this
+ * function.
+ *
+ * @param item the feature whose key-binding needs to be set:
+ * @li TextCompletion the manual completion key-binding.
+ * @li PrevCompletionMatch the previous match key for multiple completion.
+ * @li NextCompletionMatch the next match key for for multiple completion.
+ * @li SubstringCompletion the key for substring completion
+ * @param key key-binding used to rotate down in a list.
+ * @return true if key-binding can successfully be set.
+ * @see getKeyBinding
+ */
+ bool setKeyBinding( KeyBindingType item , const KShortcut& key );
+
+ /**
+ * Returns the key-binding used for the specified item.
+ *
+ * This methods returns the key-binding used to activate
+ * the feature feature given by @p item. If the binding
+ * contains modifier key(s), the SUM of the modifier key
+ * and the actual key code are returned.
+ *
+ * @param item the item to check
+ * @return the key-binding used for the feature given by @p item.
+ * @see setKeyBinding
+ */
+ const KShortcut& getKeyBinding( KeyBindingType item ) const {
+ return m_delegate ? m_delegate->getKeyBinding( item ) : m_keyMap[ item ];
+ }
+
+ /**
+ * Sets this object to use global values for key-bindings.
+ *
+ * This method changes the values of the key bindings for
+ * rotation and completion features to the default values
+ * provided in KGlobalSettings.
+ *
+ * NOTE: By default inheriting widgets should uses the
+ * global key-bindings so that there will be no need to
+ * call this method.
+ */
+ void useGlobalKeyBindings();
+
+ /**
+ * A pure virtual function that must be implemented by
+ * all inheriting classes.
+ *
+ * This function is intended to allow external completion
+ * implementations to set completed text appropriately. It
+ * is mostly relevant when the completion mode is set to
+ * CompletionAuto and CompletionManual modes. See
+ * KCompletionBase::setCompletedText.
+ * Does nothing in CompletionPopup mode, as all available
+ * matches will be shown in the popup.
+ *
+ * @param text the completed text to be set in the widget.
+ */
+ virtual void setCompletedText( const QString& text ) = 0;
+
+ /**
+ * A pure virtual function that must be implemented by
+ * all inheriting classes.
+ * @param items the list of completed items
+ */
+ virtual void setCompletedItems( const QStringList& items ) = 0;
+
+ /**
+ * Returns a pointer to the completion object.
+ *
+ * This method is only different from completionObject()
+ * in that it does not create a new KCompletion object even if
+ * the internal pointer is @p NULL. Use this method to get the
+ * pointer to a completion object when inheriting so that you
+ * won't inadvertently create it!!
+ *
+ * @return the completion object or NULL if one does not exist.
+ */
+ KCompletion* compObj() const { return m_delegate ? m_delegate->compObj() : (KCompletion*) m_pCompObj; }
+
+protected:
+ /**
+ * Returns a key-binding map.
+ *
+ * This method is the same as getKeyBinding() except it
+ * returns the whole keymap containing the key-bindings.
+ *
+ * @return the key-binding used for the feature given by @p item.
+ */
+ KeyBindingMap getKeyBindings() const { return m_delegate ? m_delegate->getKeyBindings() : m_keyMap; }
+
+ /**
+ * Sets or removes the delegation object. If a delegation object is
+ * set, all function calls will be forwarded to the delegation object.
+ * @param delegate the delegation object, or 0 to remove it
+ */
+ void setDelegate( KCompletionBase *delegate );
+
+ /**
+ * Returns the delegation object.
+ * @return the delegation object, or 0 if there is none
+ * @see setDelegate()
+ */
+ KCompletionBase *delegate() const { return m_delegate; }
+
+private:
+ // This method simply sets the autodelete boolean for
+ // the completion object, the emit signals and handle
+ // signals internally flags to the provided values.
+ void setup( bool, bool, bool );
+
+ // Flag that determined whether the completion object
+ // should be deleted when this object is destroyed.
+ bool m_bAutoDelCompObj;
+ // Determines whether this widget handles completion signals
+ // internally or not
+ bool m_bHandleSignals;
+ // Determines whether this widget fires rotation signals
+ bool m_bEmitSignals;
+ // Stores the completion mode locally.
+ KGlobalSettings::Completion m_iCompletionMode;
+ // Pointer to Completion object.
+ QGuardedPtr<KCompletion> m_pCompObj;
+ // Keybindings
+ KeyBindingMap m_keyMap;
+ // we may act as a proxy to another KCompletionBase object
+ KCompletionBase *m_delegate;
+
+ // BCI
+protected:
+ virtual void virtual_hook( int id, void* data );
+private:
+ KCompletionBasePrivate *d;
+};
+
+#endif // KCOMPLETION_H