summaryrefslogtreecommitdiffstats
path: root/kexi/core/kexiactionproxy.h
diff options
context:
space:
mode:
Diffstat (limited to 'kexi/core/kexiactionproxy.h')
-rw-r--r--kexi/core/kexiactionproxy.h190
1 files changed, 190 insertions, 0 deletions
diff --git a/kexi/core/kexiactionproxy.h b/kexi/core/kexiactionproxy.h
new file mode 100644
index 00000000..63093d29
--- /dev/null
+++ b/kexi/core/kexiactionproxy.h
@@ -0,0 +1,190 @@
+/* This file is part of the KDE project
+ Copyright (C) 2003-2004 Jaroslaw Staniek <js@iidea.pl>
+
+ 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 KEXIACTIONPROXY_H
+#define KEXIACTIONPROXY_H
+
+#include <qguardedptr.h>
+#include <qasciidict.h>
+#include <qobject.h>
+#include <qpair.h>
+#include <qptrlist.h>
+
+#include <kaction.h>
+
+#include "kexiproject.h"
+#include "kexisharedactionhost.h"
+
+class QSignal;
+class KAction;
+class KXMLGUIClient;
+class KAction_setEnabled_Helper;
+class KexiActionProxy;
+
+//! Abstract helper class used to connect shared actions from outside of shared-action-aware object.
+/*! Methods like KexiActionProxy::plugSharedAction() are not public, but
+ sometimes there's need for plugging an object that implements KexiActionProxy interface
+ from outside.
+
+ Reimplement KexiSharedActionConnector: do all needed connections in the constructor.
+
+ For example, with KexiQueryDesignerSQLEditor class we're using KTextEdit
+ (or KTextEditor::View) that's not shared-action-aware. So it's needed to conenct
+ e.g. "edit_undo" shared action to undo() slot, and so on. It is impelmented in more
+ generic way by implementing KTextEdit_SharedActionConnector class,
+ so the conenction can be reused many times by just allocating KTextEdit_SharedActionConnector
+ object for any KTextEditor when required (not only within KexiQueryDesignerSQLEditor).
+*/
+//TODO add method for setAvailable()
+class KEXICORE_EXPORT KexiSharedActionConnector
+{
+ public:
+ /* Connects shared actions offered by \a proxy to \a obj. */
+ KexiSharedActionConnector(KexiActionProxy* proxy, QObject *obj);
+ ~KexiSharedActionConnector();
+
+ protected:
+ void plugSharedAction(const char *action_name, const char *slot);
+
+ void plugSharedActionToExternalGUI(const char *action_name, KXMLGUIClient *client);
+
+ void plugSharedActionsToExternalGUI(
+ const QValueList<QCString>& action_names, KXMLGUIClient *client);
+
+ KexiActionProxy* m_proxy;
+ QObject *m_object;
+};
+
+//! An interface that acts as proxy for shared actions within the application.
+/*!
+ For example, edit->copy action can be reused to copy different types of items.
+ Availability and meaning of given action depends on the context, while
+ the context changes e.g. when another window is activated.
+ This class is mostly used by subclassing in KexiDialogBase or KexiDockBase
+ - you can subclass in a similar way.
+*/
+
+class KEXICORE_EXPORT KexiActionProxy
+{
+ public:
+ /*! Constructs action proxy for object \a receiver, using \a host.
+ If \a host is NULL, KexiSharedActionHost::defaultHost() is used.
+ (you must be sure that it's true) -- it is casted to QObject and assigned as the receiver.*/
+ KexiActionProxy(QObject *receiver , KexiSharedActionHost *host = 0 );
+ virtual ~KexiActionProxy();
+
+ /*! Activates action named \a action_name for this proxy. If the action is executed
+ (accepted), true is returned. */
+ bool activateSharedAction(const char *action_name, bool alsoCheckInChildren = true);
+
+ /*! Sets host to \a host; rerely used. */
+ void setSharedActionHost(KexiSharedActionHost& host) { m_host = &host; }
+
+ /*! \return true, if action named \a action_name is enabled within the proxy.
+ False is returned either if the action is not available or is not supported.
+ \ sa isSupported() */
+ bool isAvailable(const char* action_name, bool alsoCheckInChildren = true) const;
+
+ /*! \return true, if action named \a action_name is supported by the proxy. */
+ bool isSupported(const char* action_name) const;
+
+ protected:
+ /*! Plugs shared action named \a action_name to slot \a slot in \a receiver.
+ \a Receiver is usually a child of _this_ widget. */
+ void plugSharedAction(const char *action_name, QObject* receiver, const char *slot);
+
+ void unplugSharedAction(const char *action_name);
+
+ /*! Typical version of plugAction() method -- plugs action named \a action_name
+ to slot \a slot in _this_ widget. */
+ inline void plugSharedAction(const char *action_name, const char *slot) {
+ plugSharedAction(action_name, m_receiver, slot);
+ }
+
+ /*! Plugs action named \a action_name to a widget \a w, so the action is visible on this widget
+ as an item. \a w will typically be a menu, popup menu or a toolbar.
+ Does nothing if no action found, so generally this is safer than just caling e.g.
+ <code> action("myaction")->plug(myPopup); </code>
+ \return index of inserted item, or -1 if there is not action with name \a action_name.
+ \sa action(), KAction::plug(QWidget*, int) */
+ int plugSharedAction(const char *action_name, QWidget* w);
+
+ void plugSharedActionToExternalGUI(const char *action_name, KXMLGUIClient *client);
+
+ void plugSharedActionsToExternalGUI(
+ const QValueList<QCString>& action_names, KXMLGUIClient *client);
+
+ /*! Unplugs action named \a action_name from a widget \a w.
+ \sa plugSharedAction(const char *action_name, QWidget* w) */
+ void unplugSharedAction(const char *action_name, QWidget* w);
+
+ /*! Like above, but creates alternative action as a copy of \a action_name,
+ with \a alternativeText set. When this action is activated, just original action
+ specified by \a action_name is activated. The aternative action has autmatically set name as:
+ action_name + "_alt".
+ \return newly created action or 0 if \a action_name not found. */
+ KAction* plugSharedAction(const char *action_name, const QString& alternativeText, QWidget* w);
+
+ /*! \return action named with \a name or NULL if there is no such action. */
+ virtual KAction* sharedAction(const char* action_name);
+
+ inline QObject *receiver() const { return m_receiver; }
+
+ virtual void setAvailable(const char* action_name, bool set);
+
+ /*! Adds \a child of this proxy. Children will receive activateSharedAction() event,
+ If activateSharedAction() "event" is not consumed by the main proxy,
+ we start to iterate over proxy children (in unspecified order) to and call
+ activateSharedAction() on every child until one of them accept the "event".
+
+ If proxy child is destroyed, it is automatically detached from its parent proxy.
+ Parent proxy is 0 by default. This pointer is properly cleared when parent proxy is destroyed. */
+ void addActionProxyChild( KexiActionProxy* child );
+
+ void takeActionProxyChild( KexiActionProxy* child );
+
+ KexiSharedActionHost *m_host;
+ QGuardedPtr<QObject> m_receiver;
+ QAsciiDict< QPair<QSignal*,bool> > m_signals;
+
+ QPtrList<KexiActionProxy> m_sharedActionChildren;
+
+ QPtrList<KAction> m_alternativeActions;
+
+ KexiActionProxy* m_actionProxyParent;
+
+ QObject m_signal_parent; //!< it's just to have common parent for owned signals
+
+ //! For internal use by plugSharedActionToExternalGUI()
+ KAction_setEnabled_Helper *m_KAction_setEnabled_helper;
+
+ public:
+ //! For internal use by addActionProxyChild(). \a parent can be 0.
+ void setActionProxyParent_internal( KexiActionProxy* parent );
+
+ //! @internal
+ KexiActionProxy *m_focusedChild;
+
+ friend class KexiSharedActionHost;
+ friend class KAction_setEnabled_Helper;
+ friend class KexiSharedActionConnector;
+};
+
+#endif
+