summaryrefslogtreecommitdiffstats
path: root/kexi/plugins/forms/kexiformeventhandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kexi/plugins/forms/kexiformeventhandler.cpp')
-rw-r--r--kexi/plugins/forms/kexiformeventhandler.cpp188
1 files changed, 188 insertions, 0 deletions
diff --git a/kexi/plugins/forms/kexiformeventhandler.cpp b/kexi/plugins/forms/kexiformeventhandler.cpp
new file mode 100644
index 00000000..01bca201
--- /dev/null
+++ b/kexi/plugins/forms/kexiformeventhandler.cpp
@@ -0,0 +1,188 @@
+/* This file is part of the KDE project
+ Copyright (C) 2005-2006 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.
+*/
+
+#include "kexiformeventhandler.h"
+
+#include <qwidget.h>
+#include <qobjectlist.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+
+#include <tableview/kexitableitem.h>
+#include <tableview/kexitableviewdata.h>
+#include <kexidb/queryschema.h>
+#include <keximainwindow.h>
+#include <kexidialogbase.h>
+#include <kexipart.h>
+#include <kexipartinfo.h>
+#include <kexipartitem.h>
+
+KexiFormEventAction::ActionData::ActionData()
+{
+}
+
+bool KexiFormEventAction::ActionData::isEmpty() const
+{
+ return string.isEmpty();
+}
+
+KexiPart::Info* KexiFormEventAction::ActionData::decodeString(
+ QString& actionType, QString& actionArg, bool& ok) const
+{
+ const int idx = string.find(':');
+ ok = false;
+ if (idx==-1)
+ return 0;
+ const QString _actionType = string.left(idx);
+ const QString _actionArg = string.mid(idx+1);
+ if (_actionType.isEmpty() || _actionArg.isEmpty())
+ return 0;
+ KexiPart::Info *info = 0;
+ if (_actionType!="kaction" && _actionType!="currentForm") {
+ info = Kexi::partManager().infoForMimeType( QString("kexi/%1").arg(_actionType) );
+ if (!info)
+ return 0;
+ }
+ actionType = _actionType;
+ actionArg = _actionArg;
+ ok = true;
+ return info;
+}
+
+//-------------------------------------
+
+KexiFormEventAction::KexiFormEventAction(KexiMainWindow *mainWin, QObject* parent,
+ const QString& actionName, const QString& objectName, const QString& actionOption)
+ : KAction(parent), m_mainWin(mainWin), m_actionName(actionName), m_objectName(objectName)
+ , m_actionOption(actionOption)
+{
+}
+
+KexiFormEventAction::~KexiFormEventAction()
+{
+}
+
+void KexiFormEventAction::activate()
+{
+ KexiProject* project = m_mainWin->project();
+ if (!project)
+ return;
+ KexiPart::Part* part = Kexi::partManager().partForMimeType(
+ QString("kexi/%1").arg(m_actionName) );
+ if (!part)
+ return;
+ KexiPart::Item* item = project->item( part->info(), m_objectName );
+ if (!item)
+ return;
+ bool actionCancelled = false;
+ if (m_actionOption.isEmpty()) { // backward compatibility (good defaults)
+ if (part->info()->isExecuteSupported())
+ part->execute(item, parent());
+ else
+ m_mainWin->openObject(item, Kexi::DataViewMode, actionCancelled);
+ }
+ else {
+//! @todo react on failure...
+ if (m_actionOption == "open")
+ m_mainWin->openObject(item, Kexi::DataViewMode, actionCancelled);
+ else if (m_actionOption == "execute")
+ part->execute(item, parent());
+ else if (m_actionOption == "print") {
+ if (part->info()->isPrintingSupported())
+ m_mainWin->printItem(item);
+ }
+ else if (m_actionOption == "printPreview") {
+ if (part->info()->isPrintingSupported())
+ m_mainWin->printPreviewForItem(item);
+ }
+ else if (m_actionOption == "pageSetup") {
+ if (part->info()->isPrintingSupported())
+ m_mainWin->showPageSetupForItem(item);
+ }
+ else if (m_actionOption == "exportToCSV"
+ || m_actionOption == "copyToClipboardAsCSV")
+ {
+ if (part->info()->isDataExportSupported())
+ m_mainWin->executeCustomActionForObject(item, m_actionOption);
+ }
+ else if (m_actionOption == "new")
+ m_mainWin->newObject( part->info(), actionCancelled );
+ else if (m_actionOption == "design")
+ m_mainWin->openObject(item, Kexi::DesignViewMode, actionCancelled);
+ else if (m_actionOption == "editText")
+ m_mainWin->openObject(item, Kexi::TextViewMode, actionCancelled);
+ else if (m_actionOption == "close") {
+ tristate res = m_mainWin->closeObject(item);
+ if (~res)
+ actionCancelled = true;
+ }
+ }
+}
+
+//------------------------------------------
+
+KexiFormEventHandler::KexiFormEventHandler()
+ : m_mainWidget(0)
+{
+}
+
+KexiFormEventHandler::~KexiFormEventHandler()
+{
+}
+
+void KexiFormEventHandler::setMainWidgetForEventHandling(KexiMainWindow *mainWin, QWidget* mainWidget)
+{
+ m_mainWidget = mainWidget;
+ if (!m_mainWidget)
+ return;
+
+ //find widgets whose will work as data items
+//! @todo look for other widgets too
+ QObjectList *l = m_mainWidget->queryList( "KexiPushButton" );
+ QObjectListIt it( *l );
+ QObject *obj;
+ for ( ; (obj = it.current()) != 0; ++it ) {
+ bool ok;
+ KexiFormEventAction::ActionData data;
+ data.string = obj->property("onClickAction").toString();
+ data.option = obj->property("onClickActionOption").toString();
+ if (data.isEmpty())
+ continue;
+
+ QString actionType, actionArg;
+ KexiPart::Info* partInfo = data.decodeString(actionType, actionArg, ok);
+ if (!ok)
+ continue;
+ if (actionType=="kaction" || actionType=="currentForm") {
+ KAction *action = mainWin->actionCollection()->action( actionArg.latin1() );
+ if (!action)
+ continue;
+ QObject::disconnect( obj, SIGNAL(clicked()), action, SLOT(activate()) ); //safety
+ QObject::connect( obj, SIGNAL(clicked()), action, SLOT(activate()) );
+ }
+ else if (partInfo) { //'open or execute' action
+ KexiFormEventAction* action = new KexiFormEventAction(mainWin, obj, actionType, actionArg,
+ data.option);
+ QObject::disconnect( obj, SIGNAL(clicked()), action, SLOT(activate()) );
+ QObject::connect( obj, SIGNAL(clicked()), action, SLOT(activate()) );
+ }
+ }
+ delete l;
+}