summaryrefslogtreecommitdiffstats
path: root/kexi/plugins/macros/kexiactions/navigateaction.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kexi/plugins/macros/kexiactions/navigateaction.cpp')
-rw-r--r--kexi/plugins/macros/kexiactions/navigateaction.cpp158
1 files changed, 158 insertions, 0 deletions
diff --git a/kexi/plugins/macros/kexiactions/navigateaction.cpp b/kexi/plugins/macros/kexiactions/navigateaction.cpp
new file mode 100644
index 000000000..d3fe551ce
--- /dev/null
+++ b/kexi/plugins/macros/kexiactions/navigateaction.cpp
@@ -0,0 +1,158 @@
+/***************************************************************************
+ * This file is part of the KDE project
+ * copyright (C) 2006 by Sebastian Sauer (mail@dipe.org)
+ * copyright (C) 2006 by Bernd Steindorff (bernd@itii.de)
+ * copyright (C) 2006 by Sascha Kupper (kusato@kfnv.de)
+ *
+ * This program 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 program 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 program; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ ***************************************************************************/
+
+#include "navigateaction.h"
+
+#include <core/kexi.h>
+#include <core/kexiproject.h>
+#include <core/kexipartmanager.h>
+#include <core/kexipartinfo.h>
+#include <core/kexipart.h>
+#include <core/keximainwindow.h>
+#include <core/kexidialogbase.h>
+
+#include <widget/kexidataawareview.h>
+#include <widget/tableview/kexidataawareobjectiface.h>
+
+#include <klocale.h>
+#include <kdebug.h>
+
+using namespace KexiMacro;
+
+namespace KexiMacro {
+
+ template<class ACTIONIMPL>
+ class NavigateVariable : public KexiVariable<ACTIONIMPL>
+ {
+ public:
+ NavigateVariable(ACTIONIMPL* actionimpl)
+ : KexiVariable<ACTIONIMPL>(actionimpl, "record", i18n("Record"))
+ {
+ QStringList list;
+ list << "first" << "previous" << "next" << "last" << "goto";
+ this->appendChild( KSharedPtr<KoMacro::Variable>( new KoMacro::Variable(list, "@list") ) );
+
+ /*TODO should this actions belong to navigate? maybe it would be more wise to have
+ such kind of functionality in an own e.g. "Modify" action to outline, that
+ we are manipulating the database that way... */
+ //"add" << "save" << "delete" << "query" << "execute" << "cancel" << "reload"
+
+ this->setVariant( list[0] );
+ }
+ };
+
+}
+
+NavigateAction::NavigateAction()
+ : KexiAction("navigate", i18n("Navigate"))
+{
+ KoMacro::Variable* navvar = new NavigateVariable<NavigateAction>(this);
+ setVariable(KSharedPtr<KoMacro::Variable>( navvar ));
+
+ KoMacro::Variable* rowvar = new KexiVariable<NavigateAction>(this, "rownr", i18n("Row"));
+ rowvar->setVariant(0);
+ setVariable(KSharedPtr<KoMacro::Variable>(rowvar));
+
+ KoMacro::Variable* colvar = new KexiVariable<NavigateAction>(this, "colnr", i18n("Column"));
+ colvar->setVariant(0);
+ setVariable(KSharedPtr<KoMacro::Variable>(colvar));
+}
+
+NavigateAction::~NavigateAction()
+{
+}
+
+bool NavigateAction::notifyUpdated(KSharedPtr<KoMacro::MacroItem> macroitem, const QString& name)
+{
+ kdDebug()<<"NavigateAction::notifyUpdated() name="<<name<<" macroitem.action="<<(macroitem->action() ? macroitem->action()->name() : "NOACTION")<<endl;
+ KSharedPtr<KoMacro::Variable> variable = macroitem->variable(name, false);
+ if(! variable) {
+ kdWarning()<<"NavigateAction::notifyUpdated() No such variable="<<name<<" in macroitem."<<endl;
+ return false;
+ }
+
+ variable->clearChildren();
+ if(name == "goto") {
+ const int rownr = macroitem->variant("rownr", true).toInt(); // e.g. "macro" or "script"
+ const int colnr = macroitem->variant("colnr", true).toInt(); // e.g. "macro1" or "macro2" if objectvalue above is "macro"
+
+ macroitem->variable("rownr", true)->setChildren(
+ KoMacro::Variable::List() << KSharedPtr<KoMacro::Variable>(new KoMacro::Variable(rownr)) );
+ macroitem->variable("colnr", true)->setChildren(
+ KoMacro::Variable::List() << KSharedPtr<KoMacro::Variable>(new KoMacro::Variable(colnr)) );
+ }
+
+ return true;
+}
+
+void NavigateAction::activate(KSharedPtr<KoMacro::Context> context)
+{
+ KexiDialogBase* dialog = dynamic_cast<KexiDialogBase*>( mainWin()->activeWindow() );
+ if(! dialog) {
+ throw KoMacro::Exception(i18n("No window active."));
+ }
+
+ KexiViewBase* view = dialog->selectedView();
+ if(! view) {
+ throw KoMacro::Exception(i18n("No view selected for \"%1\".").arg(dialog->caption()));
+ }
+
+ KexiDataAwareView* dbview = dynamic_cast<KexiDataAwareView*>( view );
+ KexiDataAwareObjectInterface* dbobj = dbview ? dbview->dataAwareObject() : 0;
+ if(! dbview) {
+ throw KoMacro::Exception(i18n("The view for \"%1\" could not handle data.").arg(dialog->caption()));
+ }
+
+ const QString record = context->variable("record")->variant().toString();
+ if(record == "previous") {
+ dbobj->selectPrevRow();
+ }
+ else if(record == "next") {
+ dbobj->selectNextRow();
+ }
+ else if(record == "first") {
+ dbobj->selectFirstRow();
+ }
+ else if(record == "last") {
+ dbobj->selectLastRow();
+ }
+ else if(record == "goto") {
+ int rownr = context->variable("rownr")->variant().toInt() - 1;
+ int colnr = context->variable("colnr")->variant().toInt() - 1;
+ dbobj->setCursorPosition(rownr >= 0 ? rownr : dbobj->currentRow(), colnr >= 0 ? colnr : dbobj->currentColumn());
+ }
+ else {
+ /*
+ virtual void selectNextPage(); //!< page down action
+ virtual void selectPrevPage(); //!< page up action
+ void deleteAllRows();
+ void deleteCurrentRow();
+ void deleteAndStartEditCurrentCell();
+ void startEditOrToggleValue();
+ bool acceptRowEdit();
+ void cancelRowEdit();
+ void sortAscending();
+ void sortDescending();
+ */
+ throw KoMacro::Exception(i18n("Unknown record \"%1\" in view for \"%2\".").arg(record).arg(dialog->caption()));
+ }
+}
+
+//#include "navigateaction.moc"