00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
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
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;
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)
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
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
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
00359 else
00360 msg = i18n("&Select object to be opened after clicking \"%1\" button:").arg(actionWidgetName);
00361 selectActionToBeExecutedLbl->setText(msg);
00362 }
00363
00364
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
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426 d->glyr = new QGridLayout(mainWidget, 2, 2, KDialog::marginHint(), KDialog::spacingHint());
00427 d->glyr->setRowStretch(1, 1);
00428
00429
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
00443 d->secondAnd3rdColumnStack = new QWidgetStack(mainWidget);
00444 d->secondAnd3rdColumnStack->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
00445 d->glyr->addMultiCellWidget(d->secondAnd3rdColumnStack, 0, 1, 1, 1);
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
00454 d->objectsListView = new KexiBrowser(d->secondAnd3rdColumnMainWidget, d->mainWin, 0);
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
00469 d->actionToExecuteListView = new ActionToExecuteListView(d->secondAnd3rdColumnMainWidget);
00470 d->actionToExecuteListView->installEventFilter(this);
00471 d->actionToExecuteListView->viewport()->installEventFilter(this);
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);
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
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))
00508
00509
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";
00517 d->actionToExecuteListView->selectAction(actionOption);
00518 d->objectsListView->setFocus();
00519 }
00520 }
00521 }
00522 else {
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
00578 if (simpleItem) {
00579 d->updateSelectActionToBeExecutedMessage(simpleItem->data);
00580 QString selectActionToBeExecutedMsg(
00581 i18n("&Select action to be executed after clicking \"%1\" button:"));
00582 if (simpleItem->data == "kaction") {
00583 if (!d->kactionPageWidget) {
00584
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());
00605 }
00606 else if (simpleItem->data == "currentForm") {
00607 if (!d->currentFormActionsPageWidget) {
00608
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());
00630 }
00631 else if (simpleItem->data == "noaction") {
00632 d->raiseWidget(d->emptyWidget);
00633 d->objectsListView->clearSelection();
00634
00635 d->setActionToExecuteSectionVisible(false);
00636 }
00637 d->actionCategoriesListView->update();
00638 updateOKButtonStatus();
00639 return;
00640 }
00641
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
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
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;
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"