summaryrefslogtreecommitdiffstats
path: root/tdecore/tdeaccelbase.h
diff options
context:
space:
mode:
Diffstat (limited to 'tdecore/tdeaccelbase.h')
-rw-r--r--tdecore/tdeaccelbase.h282
1 files changed, 282 insertions, 0 deletions
diff --git a/tdecore/tdeaccelbase.h b/tdecore/tdeaccelbase.h
new file mode 100644
index 000000000..3d7180c4f
--- /dev/null
+++ b/tdecore/tdeaccelbase.h
@@ -0,0 +1,282 @@
+/* This file is part of the KDE libraries
+ Copyright (C) 2001 Ellis Whitehead <ellis@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 _KACCELBASE_H
+#define _KACCELBASE_H
+
+#include <tqmap.h>
+#include <tqptrvector.h>
+#include <tqstring.h>
+#include <tqvaluevector.h>
+#include <tqvaluelist.h>
+
+#include "kaccelaction.h"
+#include "kkeyserver.h"
+
+class TQPopupMenu;
+class TQWidget;
+
+//----------------------------------------------------
+
+/**
+ * @internal
+ * Handle keyboard accelerators.
+ *
+ * Allow an user to configure
+ * key bindings through application configuration files or through the
+ * KKeyChooser GUI.
+ *
+ * A TDEAccel contains a list of accelerator items. Each accelerator item
+ * consists of an action name and a keyboard code combined with modifiers
+ * (Shift, Ctrl and Alt.)
+ *
+ * For example, "Ctrl+P" could be a shortcut for printing a document. The key
+ * codes are listed in ckey.h. "Print" could be the action name for printing.
+ * The action name identifies the key binding in configuration files and the
+ * KKeyChooser GUI.
+ *
+ * When pressed, an accelerator key calls the slot to which it has been
+ * connected. Accelerator items can be connected so that a key will activate
+ * two different slots.
+ *
+ * A TDEAccel object handles key events sent to its parent widget and to all
+ * children of this parent widget.
+ *
+ * Key binding reconfiguration during run time can be prevented by specifying
+ * that an accelerator item is not configurable when it is inserted. A special
+ * group of non-configurable key bindings are known as the
+ * standard accelerators.
+ *
+ * The standard accelerators appear repeatedly in applications for
+ * standard document actions such as printing and saving. Convenience methods are
+ * available to insert and connect these accelerators which are configurable on
+ * a desktop-wide basis.
+ *
+ * It is possible for a user to choose to have no key associated with
+ * an action.
+ *
+ * The translated first argument for insertItem() is used only
+ * in the configuration dialog.
+ *\code
+ * TDEAccel *a = new TDEAccel( myWindow );
+ * // Insert an action "Scroll Up" which is associated with the "Up" key:
+ * a->insertItem( i18n("Scroll Up"), "Scroll Up", "Up" );
+ * // Insert an action "Scroll Down" which is not associated with any key:
+ * a->insertItem( i18n("Scroll Down"), "Scroll Down", 0);
+ * a->connectItem( "Scroll up", myWindow, TQT_SLOT( scrollUp() ) );
+ * // a->insertStdItem( TDEStdAccel::Print ); //not necessary, since it
+ * // is done automatially with the
+ * // connect below!
+ * a->connectItem(TDEStdAccel::Print, myWindow, TQT_SLOT( printDoc() ) );
+ *
+ * a->readSettings();
+ *\endcode
+ *
+ * If a shortcut has a menu entry as well, you could insert them like
+ * this. The example is again the TDEStdAccel::Print from above.
+ *
+ * \code
+ * int id;
+ * id = popup->insertItem("&Print",this, TQT_SLOT(printDoc()));
+ * a->changeMenuAccel(popup, id, TDEStdAccel::Print );
+ * \endcode
+ *
+ * If you want a somewhat "exotic" name for your standard print action, like
+ * id = popup->insertItem(i18n("Print &Document"),this, TQT_SLOT(printDoc()));
+ * it might be a good idea to insert the standard action before as
+ * a->insertStdItem( TDEStdAccel::Print, i18n("Print Document") )
+ * as well, so that the user can easily find the corresponding function.
+ *
+ * This technique works for other actions as well. Your "scroll up" function
+ * in a menu could be done with
+ *
+ * \code
+ * id = popup->insertItem(i18n"Scroll &up",this, TQT_SLOT(scrollUp()));
+ * a->changeMenuAccel(popup, id, "Scroll Up" );
+ * \endcode
+ *
+ * Please keep the order right: First insert all functions in the
+ * acceleratior, then call a -> readSettings() and @em then build your
+ * menu structure.
+ *
+ * @short Configurable key binding support.
+ */
+
+class TDECORE_EXPORT TDEAccelBase
+{
+ public:
+ /** Initialization mode of the TDEAccelBase, used in constructor. */
+ enum Init { QT_KEYS = 0x00, NATIVE_KEYS = 0x01 };
+
+ /** Enum for kinds of signals which may be emitted. */
+ enum Signal { KEYCODE_CHANGED };
+
+ /** Constructor. @p fInitCode should be a bitwise OR of
+ * values from the Init enum.
+ */
+ TDEAccelBase( int fInitCode );
+ virtual ~TDEAccelBase();
+
+ /** Returns number of actions in this handler. */
+ uint actionCount() const;
+ /** Returns a list of all the actions in this handler. */
+ TDEAccelActions& actions();
+ /** Returns whether this accelerator handler is enabled or not. */
+ bool isEnabled() const;
+
+ /** Returns a pointer to the TDEAccelAction named @p sAction. */
+ TDEAccelAction* actionPtr( const TQString& sAction );
+ /** Const version of the above. */
+ const TDEAccelAction* actionPtr( const TQString& sAction ) const;
+ /** Returns a pointer to the TDEAccelAction associated with
+ * the key @p key. This function takes into account the
+ * key mapping defined in the constructor.
+ *
+ * May return 0 if no (or more than one)
+ * action is associated with the key.
+ */
+ TDEAccelAction* actionPtr( const KKey& key );
+ /** Basically the same as above, except a KKeyServer::Key
+ * already has a key mapping defined (either NATIVE_KEYS or not).
+ */
+ TDEAccelAction* actionPtr( const KKeyServer::Key& key );
+
+ /** Returns the name of the configuration group these
+ * accelerators are stored in. The default is "Shortcuts".
+ */
+ const TQString& configGroup() const { return m_sConfigGroup; }
+ /** Set the group (in the configuration file) for storing
+ * accelerators.
+ */
+ void setConfigGroup( const TQString& group );
+ void setConfigGlobal( bool global );
+ /** Enables or disables the accelerator.
+ * @param bEnabled determines whether the accelerator should be enabled or
+ * disabled.
+ */
+ virtual void setEnabled( bool bEnabled ) = 0;
+ /** Returns whether autoupdate is enabled for these accelerators. */
+ bool getAutoUpdate() { return m_bAutoUpdate; }
+ /** Enables (or disables) autoupdate for these accelerators.
+ * @return the value of autoupdate before the call.
+ */
+ bool setAutoUpdate( bool bAuto );
+
+// Procedures for manipulating Actions.
+ //void clearActions();
+
+ TDEAccelAction* insert( const TQString& sName, const TQString& sDesc );
+ TDEAccelAction* insert(
+ const TQString& sAction, const TQString& sDesc, const TQString& sHelp,
+ const TDEShortcut& rgCutDefaults3, const TDEShortcut& rgCutDefaults4,
+ const TQObject* pObjSlot, const char* psMethodSlot,
+ bool bConfigurable = true, bool bEnabled = true );
+ bool remove( const TQString& sAction );
+ bool setActionSlot( const TQString& sAction, const TQObject* pObjSlot, const char* psMethodSlot );
+
+ bool updateConnections();
+
+ bool setShortcut( const TQString& sAction, const TDEShortcut& cut );
+
+// Modify individual Action sub-items
+ bool setActionEnabled( const TQString& sAction, bool bEnable );
+
+ /**
+ * Read all key associations from @p config, or (if @p config
+ * is zero) from the application's configuration file
+ * TDEGlobal::config().
+ *
+ * The group in which the configuration is stored can be
+ * set with setConfigGroup().
+ */
+ void readSettings( TDEConfigBase* pConfig = 0 );
+
+ /**
+ * Write the current configurable associations to @p config,
+ * or (if @p config is zero) to the application's
+ * configuration file.
+ */
+ void writeSettings( TDEConfigBase* pConfig = 0 ) const;
+
+ TQPopupMenu* createPopupMenu( TQWidget* pParent, const KKeySequence& );
+
+ // Protected methods
+ protected:
+ void slotRemoveAction( TDEAccelAction* );
+
+ struct X;
+
+ /** Constructs a list of keys to be connected, sorted highest priority first.
+ * @param rgKeys constructed list of keys
+ */
+ void createKeyList( TQValueVector<struct X>& rgKeys );
+ bool insertConnection( TDEAccelAction* );
+ bool removeConnection( TDEAccelAction* );
+
+ /** Emits a signal.
+ * @param signal signal to be emitted
+ */
+ virtual bool emitSignal( Signal signal ) = 0;
+ /** Defines a key which activates the accelerator and executes the action
+ * @param action action to be executed when key is pressed
+ * @param key key which causes the action to be executed
+ */
+ virtual bool connectKey( TDEAccelAction& action, const KKeyServer::Key& key ) = 0;
+ /** Defines a key which activates the accelerator
+ * @param key key which causes the action to be executed
+ */
+ virtual bool connectKey( const KKeyServer::Key& key) = 0;
+ /** Removes the key from accelerator so it no longer executes the action
+ */
+ virtual bool disconnectKey( TDEAccelAction&, const KKeyServer::Key& ) = 0;
+ /** Removes the key from accelerator
+ */
+ virtual bool disconnectKey( const KKeyServer::Key& ) = 0;
+
+ protected:
+ virtual bool isEnabledInternal() const;
+ struct ActionInfo
+ {
+ TDEAccelAction* pAction;
+ uint iSeq, iVariation;
+ //ActionInfo* pInfoNext; // nil if only one action uses this key.
+
+ ActionInfo() { pAction = 0; iSeq = 0xffff; iVariation = 0xffff; }
+ ActionInfo( TDEAccelAction* _pAction, uint _iSeq, uint _iVariation )
+ { pAction = _pAction; iSeq = _iSeq; iVariation = _iVariation; }
+ };
+ typedef TQMap<KKeyServer::Key, ActionInfo> KKeyToActionMap;
+
+ TDEAccelActions m_rgActions;
+ KKeyToActionMap m_mapKeyToAction;
+ TQValueList<TDEAccelAction*> m_rgActionsNonUnique;
+ bool m_bNativeKeys; // Use native key codes instead of Qt codes
+ bool m_bEnabled;
+ bool m_bConfigIsGlobal;
+ TQString m_sConfigGroup;
+ bool m_bAutoUpdate;
+ TDEAccelAction* mtemp_pActionRemoving;
+
+ private:
+ TDEAccelBase& operator =( const TDEAccelBase& );
+
+ friend class TDEAccelActions;
+};
+
+#endif // _KACCELBASE_H