kexi

kexiactionselectiondialog.cpp

00001 /* This file is part of the KDE project
00002    Copyright (C) 2005-2006 Jaroslaw Staniek <js@iidea.pl>
00003 
00004    This library is free software; you can redistribute it and/or
00005    modify it under the terms of the GNU Library General Public
00006    License as published by the Free Software Foundation; either
00007    version 2 of the License, or (at your option) any later version.
00008 
00009    This library is distributed in the hope that it will be useful,
00010    but WITHOUT ANY WARRANTY; without even the implied warranty of
00011    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012    Library General Public License for more details.
00013 
00014    You should have received a copy of the GNU Library General Public License
00015    along with this library; see the file COPYING.LIB.  If not, write to
00016    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00017  * Boston, MA 02110-1301, USA.
00018 */
00019 
00020 #include "kexiactionselectiondialog.h"
00021 #include "kexiactionselectiondialog_p.h"
00022 
00023 #include <keximainwindow.h>
00024 #include <kexipartitem.h>
00025 #include <kexiproject.h>
00026 #include <kexipartinfo.h>
00027 #include <kexipart.h>
00028 #include <kexiactioncategories.h>
00029 
00030 #include <klistview.h>
00031 #include <kaction.h>
00032 #include <kiconloader.h>
00033 #include <kdebug.h>
00034 #include <kstdguiitem.h>
00035 #include <kpushbutton.h>
00036 
00037 #include <qbitmap.h>
00038 #include <qlabel.h>
00039 #include <qheader.h>
00040 #include <qvbox.h>
00041 #include <qtooltip.h>
00042 #include <qwidgetstack.h>
00043 
00044 #include <widget/utils/klistviewitemtemplate.h>
00045 #include <widget/kexibrowser.h>
00046 #include <widget/kexibrowseritem.h>
00047 #include <kexiutils/utils.h>
00048 
00049 typedef KListViewItemTemplate<QString> ActionSelectorDialogListItemBase;
00050 
00051 class ActionSelectorDialogListItem : public ActionSelectorDialogListItemBase
00052 {
00053 public:
00054     ActionSelectorDialogListItem(const QString& data, QListView *parent, QString label1)
00055      : ActionSelectorDialogListItemBase(data, parent, label1)
00056      , fifoSorting(true)
00057     {
00058         m_sortKey.sprintf("%2.2d", parent->childCount());
00059     }
00060 
00061     ActionSelectorDialogListItem(const QString& data, QListViewItem *parent, QString label1)
00062      : ActionSelectorDialogListItemBase(data, parent, label1)
00063      , fifoSorting(true)
00064     {
00065         m_sortKey.sprintf("%2.2d", parent->childCount());
00066     }
00067 
00068     virtual QString key( int column, bool ascending ) const
00069     {
00070         return fifoSorting ? m_sortKey : ActionSelectorDialogListItemBase::key(column, ascending);
00071     }
00072 
00073     bool fifoSorting : 1;
00074 
00075 protected:
00076     QString m_sortKey;
00077 };
00078 
00079 //---------------------------------------
00080 
00081 ActionsListViewBase::ActionsListViewBase(QWidget* parent)
00082  : KListView(parent)
00083 {
00084     setResizeMode(QListView::AllColumns);
00085     addColumn("");
00086     header()->hide();
00087     setColumnWidthMode(0, QListView::Maximum);
00088     setAllColumnsShowFocus(true);
00089     setTooltipColumn(0);
00090 }
00091 
00092 ActionsListViewBase::~ActionsListViewBase()
00093 {
00094 }
00095 
00096 QListViewItem *ActionsListViewBase::itemForAction(const QString& actionName)
00097 {
00098     for (QListViewItemIterator it(this); it.current(); ++it) {
00099         ActionSelectorDialogListItem* item = dynamic_cast<ActionSelectorDialogListItem*>(it.current());
00100         if (item && item->data == actionName)
00101             return item;
00102     }
00103     return 0;
00104 }
00105 
00106 void ActionsListViewBase::selectAction(const QString& actionName)
00107 {
00108     QListViewItem *item = itemForAction(actionName);
00109     if (item) {
00110         setSelected(item, true);
00111         ensureItemVisible(firstChild());
00112         ensureItemVisible(selectedItem());
00113     }
00114 }
00115 
00116 //---------------------------------------
00117 
00118 KActionsListViewBase::KActionsListViewBase(QWidget* parent, KexiMainWindow* mainWin)
00119     : ActionsListViewBase(parent)
00120     , m_mainWin(mainWin)
00121 {
00122 }
00123 
00124 KActionsListViewBase::~KActionsListViewBase() {}
00125 
00126 void KActionsListViewBase::init()
00127 {
00128     setSorting(0);
00129     const QPixmap noIcon( KexiUtils::emptyIcon(KIcon::Small) );
00130     KActionPtrList sharedActions( m_mainWin->allActions() );
00131     const Kexi::ActionCategories *acat = Kexi::actionCategories();
00132     foreach (KActionPtrList::ConstIterator, it, sharedActions) {
00133 //          kdDebug() << (*it)->name() << " " << (*it)->text() << endl;
00136         const int actionCategories = acat->actionCategories((*it)->name());
00137         if (actionCategories==-1) {
00138             kexipluginswarn << "KActionsListViewBase(): no category declared for action \"" 
00139                 << (*it)->name() << "\"! Fix this!" << endl;
00140             continue;
00141         }
00142         if (!isActionVisible((*it)->name(), actionCategories))
00143             continue;
00144         ActionSelectorDialogListItem *pitem = new ActionSelectorDialogListItem((*it)->name(), 
00145             this, (*it)->toolTip().isEmpty() ? (*it)->text().replace("&", "") : (*it)->toolTip() );
00146         pitem->fifoSorting = false; //alpha sort
00147         pitem->setPixmap( 0, (*it)->iconSet( KIcon::Small, 16 ).pixmap( QIconSet::Small, QIconSet::Active ) );
00148         if (!pitem->pixmap(0) || pitem->pixmap(0)->isNull())
00149             pitem->setPixmap( 0, noIcon );
00150     }
00151 }
00152 
00153 //---------------------------------------
00154 
00156 class KActionsListView : public KActionsListViewBase
00157 {
00158 public:
00159     KActionsListView(QWidget* parent, KexiMainWindow* mainWin)
00160         : KActionsListViewBase(parent, mainWin)
00161     {
00162     }
00163     virtual ~KActionsListView() {}
00164 
00165     virtual bool isActionVisible(const char* actionName, int actionCategories) const {
00166         Q_UNUSED(actionName);
00167         return actionCategories & Kexi::GlobalActionCategory;
00168     }
00169 };
00170 
00172 class CurrentFormActionsListView : public KActionsListViewBase
00173 {
00174 public:
00175     CurrentFormActionsListView(QWidget* parent, KexiMainWindow* mainWin)
00176         : KActionsListViewBase(parent, mainWin)
00177     {
00178     }
00179     virtual ~CurrentFormActionsListView() {}
00180 
00181     virtual bool isActionVisible(const char* actionName, int actionCategories) const {
00182         return actionCategories & Kexi::WindowActionCategory
00183                 && Kexi::actionCategories()->actionSupportsObjectType(actionName, KexiPart::FormObjectType);
00184     }
00185 };
00186 
00188 class ActionCategoriesListView : public ActionsListViewBase
00189 {
00190 public:
00191     ActionCategoriesListView(QWidget* parent) //, KexiProject& project)
00192      : ActionsListViewBase(parent)
00193     {
00194         QListViewItem *item = new ActionSelectorDialogListItem("noaction", this, i18n("No action") );
00195         const QPixmap noIcon( KexiUtils::emptyIcon(KIcon::Small) );
00196         item->setPixmap(0, noIcon);
00197         item = new ActionSelectorDialogListItem("kaction", this, i18n("Application actions") );
00198         item->setPixmap(0, SmallIcon("form_action"));
00199 
00200         KexiPart::PartInfoList *pl = Kexi::partManager().partInfoList();
00201         for (KexiPart::Info *info = pl->first(); info; info = pl->next()) {
00202             KexiPart::Part *part = Kexi::partManager().part(info);
00203             if (!info->isVisibleInNavigator() || !part)
00204                 continue;
00205             item = new KexiBrowserItem(this, info);
00206             item->setText(0, part->instanceCaption());
00207         }
00208         QListViewItem *formItem = itemForAction("form");
00209         if (formItem) {
00210             item = new ActionSelectorDialogListItem("currentForm", formItem, 
00211                 i18n("Current form's actions", "Current"));
00212         }
00213         adjustColumn(0);
00214         setMinimumWidth( columnWidth(0) + 6 );
00215     }
00216 
00217     ~ActionCategoriesListView()
00218     {
00219     }
00220 
00222     virtual QListViewItem *itemForAction(const QString& actionName)
00223     {
00224         for (QListViewItemIterator it(this); it.current(); ++it) {
00225             //simple case
00226             ActionSelectorDialogListItem* item = dynamic_cast<ActionSelectorDialogListItem*>(it.current());
00227             if (item) {
00228                 if (item->data == actionName)
00229                     return it.current();
00230                 continue;
00231             }
00232             KexiBrowserItem* bitem = dynamic_cast<KexiBrowserItem*>(it.current());
00233             if (bitem) {
00234                 if (bitem->info()->objectName() == actionName)
00235                     return it.current();
00236             }
00237         }
00238         return 0;
00239     }
00240 };
00241 
00243 class ActionToExecuteListView : public ActionsListViewBase
00244 {
00245     public:
00246         ActionToExecuteListView(QWidget* parent)
00247          : ActionsListViewBase(parent)
00248         {
00249         }
00250 
00251         ~ActionToExecuteListView()
00252         {
00253         }
00254 
00256         void showActionsForMimeType(const QString& mimeType) {
00257             if (m_currentMimeType == mimeType)
00258                 return;
00259             m_currentMimeType = mimeType;
00260             clear();
00261             KexiPart::Part *part = Kexi::partManager().partForMimeType( m_currentMimeType );
00262             if (!part)
00263                 return;
00264             int supportedViewModes = part->supportedViewModes();
00265             ActionSelectorDialogListItem *item;
00266             const QPixmap noIcon( KexiUtils::emptyIcon(KIcon::Small) );
00267             if (supportedViewModes & Kexi::DataViewMode) {
00268                 item = new ActionSelectorDialogListItem("open", this, i18n("Open in Data View"));
00269                 item->setPixmap(0, SmallIcon("fileopen"));
00270             }
00271             if (part->info()->isExecuteSupported()) {
00272                 item = new ActionSelectorDialogListItem("execute", this, i18n("Execute"));
00273                 item->setPixmap(0, SmallIcon("player_play"));
00274             }
00275             if (part->info()->isPrintingSupported()) {
00276                 ActionSelectorDialogListItem *printItem = new ActionSelectorDialogListItem(
00277                     "print", this, i18n("Print"));
00278                 printItem->setPixmap(0, SmallIcon("fileprint"));
00279                 KAction *a = KStdAction::printPreview(0, 0, 0);
00280                 item = new ActionSelectorDialogListItem("printPreview", printItem, 
00281                     a->text().replace("&", "").replace("...", ""));
00282                 item->setPixmap(0, SmallIcon(a->icon()));
00283                 delete a;
00284                 item = new ActionSelectorDialogListItem("pageSetup", printItem, i18n("Show Page Setup"));
00285                 item->setPixmap(0, noIcon);
00286                 setOpen(printItem, true);
00287                 printItem->setExpandable(false);
00288             }
00289             if (part->info()->isDataExportSupported()) {
00290                 ActionSelectorDialogListItem *exportItem = new ActionSelectorDialogListItem(
00291                     "exportToCSV", this, 
00292                     i18n("Note: use multiple rows if needed", "Export to File\nAs Data Table"));
00293                 exportItem->setMultiLinesEnabled(true);
00294                 exportItem->setPixmap(0, SmallIcon("table"));
00295                 item = new ActionSelectorDialogListItem("copyToClipboardAsCSV", 
00296                     exportItem, 
00297                     i18n("Note: use multiple rows if needed", "Copy to Clipboard\nAs Data Table"));
00298                 item->setPixmap(0, SmallIcon("table"));
00299                 item->setMultiLinesEnabled(true);
00300                 setOpen(exportItem, true);
00301                 exportItem->setExpandable(false);
00302             }
00303             item = new ActionSelectorDialogListItem("new", this, i18n("Create New Object"));
00304             item->setPixmap(0, SmallIcon("filenew"));
00305             if (supportedViewModes & Kexi::DesignViewMode) {
00306                 item = new ActionSelectorDialogListItem("design", this, i18n("Open in Design View"));
00307                 item->setPixmap(0, SmallIcon("edit"));
00308             }
00309             if (supportedViewModes & Kexi::TextViewMode) {
00310                 item = new ActionSelectorDialogListItem("editText", this, i18n("Open in Text View"));
00311                 item->setPixmap(0, noIcon);
00312             }
00313             item = new ActionSelectorDialogListItem("close", this, i18n("Close View"));
00314             item->setPixmap(0, SmallIcon("fileclose"));
00315             updateWidth();
00316         }
00317 
00318         void updateWidth()
00319         {
00320             adjustColumn(0);
00321             setMinimumWidth( columnWidth(0) );
00322         }
00323 
00324         QString m_currentMimeType;
00325 };
00326 
00327 //-------------------------------------
00328 
00330 class KexiActionSelectionDialog::KexiActionSelectionDialogPrivate
00331 {
00332 public:
00333     KexiActionSelectionDialogPrivate() 
00334         : kactionPageWidget(0), kactionListView(0), objectsListView(0)
00335         , currentFormActionsPageWidget(0)
00336         , currentFormActionsListView(0)
00337         , secondAnd3rdColumnMainWidget(0)
00338         , hideActionToExecuteListView(false)
00339     {
00340     }
00341 
00342     void raiseWidget(QWidget *w)
00343     {
00344         secondAnd3rdColumnStack->raiseWidget( w );
00345         selectActionToBeExecutedLbl->setBuddy(w);
00346     }
00347 
00348     void updateSelectActionToBeExecutedMessage(const QString& actionType)
00349     {
00350         QString msg;
00351         if (actionType=="noaction")
00352             msg = QString::null;
00353         // hardcoded, but it's not that bad
00354         else if (actionType=="macro")
00355             msg = i18n("&Select macro to be executed after clicking \"%1\" button:").arg(actionWidgetName);
00356         else if (actionType=="script")
00357             msg = i18n("&Select script to be executed after clicking \"%1\" button:").arg(actionWidgetName);
00358         //default: table/query/form/report...
00359         else
00360             msg = i18n("&Select object to be opened after clicking \"%1\" button:").arg(actionWidgetName);
00361         selectActionToBeExecutedLbl->setText(msg);
00362     }
00363 
00364     // changes 3rd column visibility
00365     void setActionToExecuteSectionVisible(bool visible, bool force = false)
00366     {
00367         if (!force && hideActionToExecuteListView != visible)
00368             return;
00369         hideActionToExecuteListView = !visible;
00370         actionToExecuteListView->hide();
00371         actionToExecuteLbl->hide();
00372         actionToExecuteListView->show();
00373         actionToExecuteLbl->show();
00374     }
00375 
00376     KexiMainWindow* mainWin;
00377     QString actionWidgetName;
00378     ActionCategoriesListView* actionCategoriesListView; 
00379     QWidget *kactionPageWidget;
00380     KActionsListView* kactionListView;  
00381     KexiBrowser* objectsListView; 
00382     QWidget *currentFormActionsPageWidget; 
00383     CurrentFormActionsListView* currentFormActionsListView; 
00384     QWidget *emptyWidget;
00385     QLabel* selectActionToBeExecutedLbl;
00386     ActionToExecuteListView* actionToExecuteListView;
00387     QLabel *actionToExecuteLbl;
00388     QWidget *secondAnd3rdColumnMainWidget;
00389     QGridLayout *glyr;
00390     QGridLayout *secondAnd3rdColumnGrLyr;
00391     QWidgetStack *secondAnd3rdColumnStack, *secondColumnStack;
00392     bool hideActionToExecuteListView;
00393 };
00394 
00395 //-------------------------------------
00396 
00397 KexiActionSelectionDialog::KexiActionSelectionDialog(KexiMainWindow* mainWin, QWidget *parent, 
00398     const KexiFormEventAction::ActionData& action, const QCString& actionWidgetName)
00399     : KDialogBase(parent, "actionSelectorDialog", true, i18n("Assigning Action to Command Button"), 
00400         KDialogBase::Ok | KDialogBase::Cancel )
00401     , d( new KexiActionSelectionDialogPrivate() )
00402 {
00403     d->mainWin = mainWin;
00404     d->actionWidgetName = actionWidgetName;
00405     setButtonOK( KGuiItem(i18n("Assign action", "&Assign"), "button_ok", i18n("Assign action")) );
00406 
00407     QWidget *mainWidget = new QWidget( this );
00408     mainWidget->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
00409     setMainWidget(mainWidget);
00410 
00411 /*    lbl 1
00412    +------------+ +-------------------------------+
00413    |            | |              [a]              |
00414    | 1st column | | +----------- + +------------+ |
00415    |            | | | 2nd column | | 3rd column | |
00416    |            | | +            + +            + |
00417    |            | | +------------+ +------------+ |
00418    +------------+ +-------------------------------+
00419    \______________________________________________/
00420                         glyr
00421   [a]- QWidgetStack *secondAnd3rdColumnStack, 
00422     - for displaying KActions, the stack contains d->kactionPageWidget QWidget
00423     - for displaying objects, the stack contains secondAnd3rdColumnMainWidget QWidget and QGridLayout *secondAnd3rdColumnGrLyr
00424      - kactionPageWidget contains only a QVBoxLayout and label+kactionListView
00425 */
00426     d->glyr = new QGridLayout(mainWidget, 2, 2, KDialog::marginHint(), KDialog::spacingHint());
00427     d->glyr->setRowStretch(1, 1);
00428 
00429     // 1st column: action types
00430     d->actionCategoriesListView = new ActionCategoriesListView(mainWidget);
00431     d->actionCategoriesListView->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum);
00432     d->glyr->addWidget(d->actionCategoriesListView, 1, 0);
00433     connect( d->actionCategoriesListView, SIGNAL(selectionChanged(QListViewItem*)), 
00434         this, SLOT(slotActionCategorySelected(QListViewItem*)));
00435 
00436     QLabel *lbl = new QLabel(d->actionCategoriesListView, i18n("Action category:"), mainWidget);
00437     lbl->setMinimumHeight(lbl->fontMetrics().height()*2);
00438     lbl->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
00439     lbl->setAlignment(Qt::AlignTop|Qt::AlignLeft|Qt::WordBreak);
00440     d->glyr->addWidget(lbl, 0, 0, Qt::AlignTop|Qt::AlignLeft);
00441     
00442     // widget stack for 2nd and 3rd column
00443     d->secondAnd3rdColumnStack = new QWidgetStack(mainWidget);
00444     d->secondAnd3rdColumnStack->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
00445     d->glyr->addMultiCellWidget(d->secondAnd3rdColumnStack, 0, 1, 1, 1);//, Qt::AlignTop|Qt::AlignLeft);
00446 
00447     d->secondAnd3rdColumnMainWidget = new QWidget(d->secondAnd3rdColumnStack);
00448     d->secondAnd3rdColumnMainWidget->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
00449     d->secondAnd3rdColumnGrLyr = new QGridLayout(d->secondAnd3rdColumnMainWidget, 2, 2, 0, KDialog::spacingHint());
00450     d->secondAnd3rdColumnGrLyr->setRowStretch(1, 2);
00451     d->secondAnd3rdColumnStack->addWidget(d->secondAnd3rdColumnMainWidget);
00452 
00453     // 2nd column: list of actions/objects
00454     d->objectsListView = new KexiBrowser(d->secondAnd3rdColumnMainWidget, d->mainWin, 0/*features*/);
00455     d->secondAnd3rdColumnGrLyr->addWidget(d->objectsListView, 1, 0);
00456     connect(d->objectsListView, SIGNAL(selectionChanged(KexiPart::Item*)),
00457         this, SLOT(slotItemForOpeningOrExecutingSelected(KexiPart::Item*)));
00458 
00459     d->selectActionToBeExecutedLbl = new QLabel(d->secondAnd3rdColumnMainWidget);
00460     d->selectActionToBeExecutedLbl->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
00461     d->selectActionToBeExecutedLbl->setAlignment(Qt::AlignTop|Qt::AlignLeft|Qt::WordBreak);
00462     d->selectActionToBeExecutedLbl->setMinimumHeight(d->selectActionToBeExecutedLbl->fontMetrics().height()*2);
00463     d->secondAnd3rdColumnGrLyr->addWidget(d->selectActionToBeExecutedLbl, 0, 0, Qt::AlignTop|Qt::AlignLeft);
00464 
00465     d->emptyWidget = new QWidget(d->secondAnd3rdColumnStack);
00466     d->secondAnd3rdColumnStack->addWidget(d->emptyWidget);
00467 
00468     // 3rd column: actions to execute
00469     d->actionToExecuteListView = new ActionToExecuteListView(d->secondAnd3rdColumnMainWidget);
00470     d->actionToExecuteListView->installEventFilter(this); //to be able to disable painting
00471     d->actionToExecuteListView->viewport()->installEventFilter(this); //to be able to disable painting
00472     d->actionToExecuteListView->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum);
00473     connect(d->actionToExecuteListView, SIGNAL(executed(QListViewItem*)),
00474         this, SLOT(slotActionToExecuteItemExecuted(QListViewItem*)));
00475     connect(d->actionToExecuteListView, SIGNAL(selectionChanged(QListViewItem*)),
00476         this, SLOT(slotActionToExecuteItemSelected(QListViewItem*)));
00477     d->secondAnd3rdColumnGrLyr->addWidget(d->actionToExecuteListView, 1, 1);
00478 
00479     d->actionToExecuteLbl = new QLabel(d->actionToExecuteListView, 
00480         i18n("Action to execute:"), d->secondAnd3rdColumnMainWidget);
00481     d->actionToExecuteLbl->installEventFilter(this); //to be able to disable painting
00482     d->actionToExecuteLbl->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
00483     d->actionToExecuteLbl->setAlignment(Qt::AlignTop|Qt::AlignLeft|Qt::WordBreak);
00484     d->secondAnd3rdColumnGrLyr->addWidget(d->actionToExecuteLbl, 0, 1, Qt::AlignTop|Qt::AlignLeft);
00485 
00486     // temporary show all sections to avoid resizing the dialog in the future
00487     d->actionCategoriesListView->selectAction("table");
00488     d->setActionToExecuteSectionVisible(true);
00489     adjustSize();
00490     resize(QMAX(700, width()), QMAX(450, height()));
00491     d->actionToExecuteListView->updateWidth();
00492 
00493     bool ok;
00494     QString actionType, actionArg;
00495     KexiPart::Info* partInfo = action.decodeString(actionType, actionArg, ok);
00496     if (ok) {
00497         d->actionCategoriesListView->selectAction(actionType);
00498         if (actionType=="kaction") {
00499             d->kactionListView->selectAction(actionArg);
00500             d->kactionListView->setFocus();
00501         }
00502         else if (actionType=="currentForm") {
00503             d->currentFormActionsListView->selectAction(actionArg);
00504             d->currentFormActionsListView->setFocus();
00505         }
00506         else if (partInfo
00507             && Kexi::partManager().part(partInfo)) // We use the Part Manager
00508             // to determine whether the Kexi-plugin is installed and whether we like to show 
00509             // it in our list of actions.
00510         {
00511             KexiPart::Item *item = d->mainWin->project()->item(partInfo, actionArg);
00512             if (d->objectsListView && item) {
00513                 d->objectsListView->selectItem(*item);
00514                 QString actionOption( action.option );
00515                 if (actionOption.isEmpty())
00516                     actionOption = "open"; // for backward compatibility
00517                 d->actionToExecuteListView->selectAction(actionOption);
00518                 d->objectsListView->setFocus();
00519             }
00520         }
00521     }
00522     else {//invalid assignment or 'noaction'
00523         d->actionCategoriesListView->selectAction("noaction");
00524         d->actionCategoriesListView->setFocus();
00525     }
00526 }
00527 
00528 KexiActionSelectionDialog::~KexiActionSelectionDialog()
00529 {
00530     delete d;
00531 }
00532 
00533 void KexiActionSelectionDialog::slotKActionItemExecuted(QListViewItem*)
00534 {
00535     accept();
00536 }
00537 
00538 void KexiActionSelectionDialog::slotKActionItemSelected(QListViewItem*)
00539 {
00540     d->setActionToExecuteSectionVisible(false);
00541     updateOKButtonStatus();
00542 }
00543 
00544 void KexiActionSelectionDialog::slotCurrentFormActionItemExecuted(QListViewItem*)
00545 {
00546     accept();
00547 }
00548 
00549 void KexiActionSelectionDialog::slotCurrentFormActionItemSelected(QListViewItem*)
00550 {
00551     d->setActionToExecuteSectionVisible(false);
00552     updateOKButtonStatus();
00553 }
00554 
00555 void KexiActionSelectionDialog::slotItemForOpeningOrExecutingSelected(KexiPart::Item* item)
00556 {
00557     d->setActionToExecuteSectionVisible(item);
00558 }
00559 
00560 void KexiActionSelectionDialog::slotActionToExecuteItemExecuted(QListViewItem* item)
00561 {
00562     if (!item)
00563         return;
00564     ActionSelectorDialogListItemBase *listItem = dynamic_cast<ActionSelectorDialogListItemBase*>(item);
00565     if (listItem && !listItem->data.isEmpty())
00566         accept();
00567 }
00568 
00569 void KexiActionSelectionDialog::slotActionToExecuteItemSelected(QListViewItem*)
00570 {
00571     updateOKButtonStatus();
00572 }
00573 
00574 void KexiActionSelectionDialog::slotActionCategorySelected(QListViewItem* item)
00575 {
00576     ActionSelectorDialogListItem *simpleItem = dynamic_cast<ActionSelectorDialogListItem*>(item);
00577     // simple case: part-less item, e.g. kaction:
00578     if (simpleItem) {
00579         d->updateSelectActionToBeExecutedMessage(simpleItem->data);
00580         QString selectActionToBeExecutedMsg(
00581             i18n("&Select action to be executed after clicking \"%1\" button:")); // msg for a label
00582         if (simpleItem->data == "kaction") {
00583             if (!d->kactionPageWidget) {
00584                 //create lbl+list view with a vlayout
00585                 d->kactionPageWidget = new QWidget();
00586                 d->kactionPageWidget->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
00587                 QVBoxLayout *vlyr = new QVBoxLayout(d->kactionPageWidget, 0, KDialog::spacingHint());
00588                 d->kactionListView = new KActionsListView(d->kactionPageWidget, d->mainWin);
00589                 d->kactionListView->init();
00590                 QLabel *lbl = new QLabel(d->kactionListView, selectActionToBeExecutedMsg.arg(d->actionWidgetName),
00591                     d->kactionPageWidget);
00592                 lbl->setAlignment(Qt::AlignTop|Qt::AlignLeft|Qt::WordBreak);
00593                 lbl->setMinimumHeight(lbl->fontMetrics().height()*2);
00594                 vlyr->addWidget(lbl);
00595                 vlyr->addWidget(d->kactionListView);
00596                 d->secondAnd3rdColumnStack->addWidget(d->kactionPageWidget);
00597                 connect(d->kactionListView, SIGNAL(executed(QListViewItem*)),
00598                     this, SLOT(slotKActionItemExecuted(QListViewItem*)));
00599                 connect( d->kactionListView, SIGNAL(selectionChanged(QListViewItem*)), 
00600                     this, SLOT(slotKActionItemSelected(QListViewItem*)));
00601             }
00602             d->setActionToExecuteSectionVisible(false);
00603             d->raiseWidget(d->kactionPageWidget);
00604             slotKActionItemSelected(d->kactionListView->selectedItem()); //to refresh column #3
00605         }
00606         else if (simpleItem->data == "currentForm") {
00607             if (!d->currentFormActionsPageWidget) {
00608                 //create lbl+list view with a vlayout
00609                 d->currentFormActionsPageWidget = new QWidget();
00610                 d->currentFormActionsPageWidget->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
00611                 QVBoxLayout *vlyr = new QVBoxLayout(d->currentFormActionsPageWidget, 0, KDialog::spacingHint());
00612                 d->currentFormActionsListView = new CurrentFormActionsListView(
00613                     d->currentFormActionsPageWidget, d->mainWin);
00614                 d->currentFormActionsListView->init();
00615                 QLabel *lbl = new QLabel(d->currentFormActionsListView, 
00616                     selectActionToBeExecutedMsg.arg(d->actionWidgetName), d->currentFormActionsPageWidget);
00617                 lbl->setAlignment(Qt::AlignTop|Qt::AlignLeft|Qt::WordBreak);
00618                 lbl->setMinimumHeight(lbl->fontMetrics().height()*2);
00619                 vlyr->addWidget(lbl);
00620                 vlyr->addWidget(d->currentFormActionsListView);
00621                 d->secondAnd3rdColumnStack->addWidget(d->currentFormActionsPageWidget);
00622                 connect(d->currentFormActionsListView, SIGNAL(executed(QListViewItem*)),
00623                     this, SLOT(slotCurrentFormActionItemExecuted(QListViewItem*)));
00624                 connect( d->currentFormActionsListView, SIGNAL(selectionChanged(QListViewItem*)), 
00625                     this, SLOT(slotCurrentFormActionItemSelected(QListViewItem*)));
00626             }
00627             d->setActionToExecuteSectionVisible(false);
00628             d->raiseWidget(d->currentFormActionsPageWidget);
00629             slotCurrentFormActionItemSelected(d->currentFormActionsListView->selectedItem()); //to refresh column #3
00630         }
00631         else if (simpleItem->data == "noaction") {
00632             d->raiseWidget(d->emptyWidget);
00633             d->objectsListView->clearSelection();
00634             //hide column #3
00635             d->setActionToExecuteSectionVisible(false);
00636         }
00637         d->actionCategoriesListView->update();
00638         updateOKButtonStatus();
00639         return;
00640     }
00641     // other case
00642     KexiBrowserItem* browserItem = dynamic_cast<KexiBrowserItem*>(item);
00643     if (browserItem) {
00644         d->updateSelectActionToBeExecutedMessage(browserItem->info()->objectName());
00645         if (d->objectsListView->itemsMimeType().latin1()!=browserItem->info()->mimeType()) {
00646             d->objectsListView->setProject(d->mainWin->project(), browserItem->info()->mimeType());
00647             d->actionToExecuteListView->showActionsForMimeType( browserItem->info()->mimeType() );
00648             d->setActionToExecuteSectionVisible(false);
00649         }
00650         if (d->secondAnd3rdColumnStack->visibleWidget()!=d->secondAnd3rdColumnMainWidget) {
00651             d->raiseWidget( d->secondAnd3rdColumnMainWidget );
00652             d->objectsListView->clearSelection();
00653             d->setActionToExecuteSectionVisible(false, true);
00654         }
00655         else
00656             d->raiseWidget( d->secondAnd3rdColumnMainWidget );
00657     }
00658     d->actionCategoriesListView->update();
00659     updateOKButtonStatus();
00660 }
00661 
00662 KexiMainWindow* KexiActionSelectionDialog::mainWin() const
00663 {
00664     return d->mainWin;
00665 }
00666 
00667 KexiFormEventAction::ActionData KexiActionSelectionDialog::currentAction() const
00668 {
00669     KexiFormEventAction::ActionData data;
00670     ActionSelectorDialogListItem *simpleItem = dynamic_cast<ActionSelectorDialogListItem*>(
00671         d->actionCategoriesListView->selectedItem());
00672     // simple case: part-less item, e.g. kaction:
00673     if (simpleItem) {
00674         if (simpleItem->data == "kaction") {
00675             if (d->kactionListView->selectedItem()) {
00676                 data.string = QString("kaction:")
00677                     + dynamic_cast<ActionSelectorDialogListItem*>( d->kactionListView->selectedItem() )->data;
00678                 return data;
00679             }
00680         }
00681         else if (simpleItem->data == "currentForm") {
00682             if (d->currentFormActionsListView->selectedItem()) {
00683                 data.string = QString("currentForm:")
00684                     + dynamic_cast<ActionSelectorDialogListItem*>( 
00685                         d->currentFormActionsListView->selectedItem() )->data;
00686                 return data;
00687             }
00688         }
00689     }
00690     KexiBrowserItem* browserItem = dynamic_cast<KexiBrowserItem*>( d->actionCategoriesListView->selectedItem() );
00691     if (browserItem) {
00692         ActionSelectorDialogListItem *actionToExecute = dynamic_cast<ActionSelectorDialogListItem*>(
00693             d->actionToExecuteListView->selectedItem());
00694         if (d->objectsListView && actionToExecute && !actionToExecute->data.isEmpty()) {
00695             KexiPart::Item* partItem = d->objectsListView->selectedPartItem();
00696             KexiPart::Info* partInfo = partItem ? Kexi::partManager().infoForMimeType( partItem->mimeType() ) : 0;
00697             if (partInfo) {
00698                 // opening or executing: table:name, query:name, form:name, macro:name, script:name, etc.
00699                 data.string = QString("%1:%2").arg(partInfo->objectName()).arg(partItem->name());
00700                 data.option = actionToExecute->data;
00701                 return data;
00702             }
00703         }
00704     }
00705     return data; // No Action
00706 }
00707 
00708 void KexiActionSelectionDialog::updateOKButtonStatus()
00709 {
00710     QPushButton *btn = actionButton(Ok);
00711     ActionSelectorDialogListItem *simpleItem = dynamic_cast<ActionSelectorDialogListItem*>(
00712         d->actionCategoriesListView->selectedItem());
00713     btn->setEnabled( (simpleItem && simpleItem->data == "noaction") || !currentAction().isEmpty() );
00714 }
00715 
00716 bool KexiActionSelectionDialog::eventFilter(QObject *o, QEvent *e)
00717 {
00718     if (d->hideActionToExecuteListView)
00719         return true;
00720     return KDialogBase::eventFilter(o, e);
00721 }
00722 
00723 #include "kexiactionselectiondialog.moc"
00724 #include "kexiactionselectiondialog_p.moc"
KDE Home | KDE Accessibility Home | Description of Access Keys