kexi

kexiactionselectiondialog.cpp
1/* This file is part of the KDE project
2 Copyright (C) 2005-2006 Jaroslaw Staniek <js@iidea.pl>
3
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public
6 License as published by the Free Software Foundation; either
7 version 2 of the License, or (at your option) any later version.
8
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Library General Public License for more details.
13
14 You should have received a copy of the GNU Library General Public License
15 along with this library; see the file COPYING.LIB. If not, write to
16 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
18*/
19
20#include "kexiactionselectiondialog.h"
21#include "kexiactionselectiondialog_p.h"
22
23#include <keximainwindow.h>
24#include <kexipartitem.h>
25#include <kexiproject.h>
26#include <kexipartinfo.h>
27#include <kexipart.h>
28#include <kexiactioncategories.h>
29
30#include <tdelistview.h>
31#include <tdeaction.h>
32#include <kiconloader.h>
33#include <kdebug.h>
34#include <kstdguiitem.h>
35#include <kpushbutton.h>
36
37#include <tqbitmap.h>
38#include <tqlabel.h>
39#include <tqheader.h>
40#include <tqvbox.h>
41#include <tqtooltip.h>
42#include <tqwidgetstack.h>
43
44#include <widget/utils/tdelistviewitemtemplate.h>
45#include <widget/kexibrowser.h>
46#include <widget/kexibrowseritem.h>
47#include <kexiutils/utils.h>
48
49typedef TDEListViewItemTemplate<TQString> ActionSelectorDialogListItemBase;
50
51class ActionSelectorDialogListItem : public ActionSelectorDialogListItemBase
52{
53public:
54 ActionSelectorDialogListItem(const TQString& data, TQListView *parent, TQString label1)
55 : ActionSelectorDialogListItemBase(data, parent, label1)
56 , fifoSorting(true)
57 {
58 m_sortKey.sprintf("%2.2d", parent->childCount());
59 }
60
61 ActionSelectorDialogListItem(const TQString& data, TQListViewItem *parent, TQString label1)
62 : ActionSelectorDialogListItemBase(data, parent, label1)
63 , fifoSorting(true)
64 {
65 m_sortKey.sprintf("%2.2d", parent->childCount());
66 }
67
68 virtual TQString key( int column, bool ascending ) const
69 {
70 return fifoSorting ? m_sortKey : ActionSelectorDialogListItemBase::key(column, ascending);
71 }
72
73 bool fifoSorting : 1;
74
75protected:
76 TQString m_sortKey;
77};
78
79//---------------------------------------
80
81ActionsListViewBase::ActionsListViewBase(TQWidget* parent)
82 : TDEListView(parent)
83{
84 setResizeMode(TQListView::AllColumns);
85 addColumn("");
86 header()->hide();
87 setColumnWidthMode(0, TQListView::Maximum);
88 setAllColumnsShowFocus(true);
89 setTooltipColumn(0);
90}
91
92ActionsListViewBase::~ActionsListViewBase()
93{
94}
95
96TQListViewItem *ActionsListViewBase::itemForAction(const TQString& actionName)
97{
98 for (TQListViewItemIterator it(this); it.current(); ++it) {
99 ActionSelectorDialogListItem* item = dynamic_cast<ActionSelectorDialogListItem*>(it.current());
100 if (item && item->data == actionName)
101 return item;
102 }
103 return 0;
104}
105
106void ActionsListViewBase::selectAction(const TQString& actionName)
107{
108 TQListViewItem *item = itemForAction(actionName);
109 if (item) {
110 setSelected(item, true);
111 ensureItemVisible(firstChild());
112 ensureItemVisible(selectedItem());
113 }
114}
115
116//---------------------------------------
117
118TDEActionsListViewBase::TDEActionsListViewBase(TQWidget* parent, KexiMainWindow* mainWin)
119 : ActionsListViewBase(parent)
120 , m_mainWin(mainWin)
121{
122}
123
124TDEActionsListViewBase::~TDEActionsListViewBase() {}
125
126void TDEActionsListViewBase::init()
127{
128 setSorting(0);
129 const TQPixmap noIcon( KexiUtils::emptyIcon(TDEIcon::Small) );
130 TDEActionPtrList sharedActions( m_mainWin->allActions() );
131 const Kexi::ActionCategories *acat = Kexi::actionCategories();
132 foreach (TDEActionPtrList::ConstIterator, it, sharedActions) {
133// kdDebug() << (*it)->name() << " " << (*it)->text() << endl;
136 const int actionCategories = acat->actionCategories((*it)->name());
137 if (actionCategories==-1) {
138 kexipluginswarn << "TDEActionsListViewBase(): no category declared for action \""
139 << (*it)->name() << "\"! Fix this!" << endl;
140 continue;
141 }
142 if (!isActionVisible((*it)->name(), actionCategories))
143 continue;
144 ActionSelectorDialogListItem *pitem = new ActionSelectorDialogListItem((*it)->name(),
145 this, (*it)->toolTip().isEmpty() ? (*it)->text().replace("&", "") : (*it)->toolTip() );
146 pitem->fifoSorting = false; //alpha sort
147 pitem->setPixmap( 0, (*it)->iconSet( TDEIcon::Small, 16 ).pixmap( TQIconSet::Small, TQIconSet::Active ) );
148 if (!pitem->pixmap(0) || pitem->pixmap(0)->isNull())
149 pitem->setPixmap( 0, noIcon );
150 }
151}
152
153//---------------------------------------
154
156class TDEActionsListView : public TDEActionsListViewBase
157{
158public:
159 TDEActionsListView(TQWidget* parent, KexiMainWindow* mainWin)
160 : TDEActionsListViewBase(parent, mainWin)
161 {
162 }
163 virtual ~TDEActionsListView() {}
164
165 virtual bool isActionVisible(const char* actionName, int actionCategories) const {
166 Q_UNUSED(actionName);
168 }
169};
170
172class CurrentFormActionsListView : public TDEActionsListViewBase
173{
174public:
175 CurrentFormActionsListView(TQWidget* parent, KexiMainWindow* mainWin)
176 : TDEActionsListViewBase(parent, mainWin)
177 {
178 }
179 virtual ~CurrentFormActionsListView() {}
180
181 virtual bool isActionVisible(const char* actionName, int actionCategories) const {
183 && Kexi::actionCategories()->actionSupportsObjectType(actionName, KexiPart::FormObjectType);
184 }
185};
186
188class ActionCategoriesListView : public ActionsListViewBase
189{
190public:
191 ActionCategoriesListView(TQWidget* parent) //, KexiProject& project)
192 : ActionsListViewBase(parent)
193 {
194 TQListViewItem *item = new ActionSelectorDialogListItem("noaction", this, i18n("No action") );
195 const TQPixmap noIcon( KexiUtils::emptyIcon(TDEIcon::Small) );
196 item->setPixmap(0, noIcon);
197 item = new ActionSelectorDialogListItem("tdeaction", this, i18n("Application actions") );
198 item->setPixmap(0, SmallIcon("form_action"));
199
200 KexiPart::PartInfoList *pl = Kexi::partManager().partInfoList();
201 for (KexiPart::Info *info = pl->first(); info; info = pl->next()) {
202 KexiPart::Part *part = Kexi::partManager().part(info);
203 if (!info->isVisibleInNavigator() || !part)
204 continue;
205 item = new KexiBrowserItem(this, info);
206 item->setText(0, part->instanceCaption());
207 }
208 TQListViewItem *formItem = itemForAction("form");
209 if (formItem) {
210 item = new ActionSelectorDialogListItem("currentForm", formItem,
211 i18n("Current form's actions", "Current"));
212 }
213 adjustColumn(0);
214 setMinimumWidth( columnWidth(0) + 6 );
215 }
216
217 ~ActionCategoriesListView()
218 {
219 }
220
222 virtual TQListViewItem *itemForAction(const TQString& actionName)
223 {
224 for (TQListViewItemIterator it(this); it.current(); ++it) {
225 //simple case
226 ActionSelectorDialogListItem* item = dynamic_cast<ActionSelectorDialogListItem*>(it.current());
227 if (item) {
228 if (item->data == actionName)
229 return it.current();
230 continue;
231 }
232 KexiBrowserItem* bitem = dynamic_cast<KexiBrowserItem*>(it.current());
233 if (bitem) {
234 if (bitem->info()->objectName() == actionName)
235 return it.current();
236 }
237 }
238 return 0;
239 }
240};
241
243class ActionToExecuteListView : public ActionsListViewBase
244{
245 public:
246 ActionToExecuteListView(TQWidget* parent)
247 : ActionsListViewBase(parent)
248 {
249 }
250
251 ~ActionToExecuteListView()
252 {
253 }
254
256 void showActionsForMimeType(const TQString& mimeType) {
257 if (m_currentMimeType == mimeType)
258 return;
259 m_currentMimeType = mimeType;
260 clear();
261 KexiPart::Part *part = Kexi::partManager().partForMimeType( m_currentMimeType );
262 if (!part)
263 return;
264 int supportedViewModes = part->supportedViewModes();
265 ActionSelectorDialogListItem *item;
266 const TQPixmap noIcon( KexiUtils::emptyIcon(TDEIcon::Small) );
267 if (supportedViewModes & Kexi::DataViewMode) {
268 item = new ActionSelectorDialogListItem("open", this, i18n("Open in Data View"));
269 item->setPixmap(0, SmallIcon("document-open"));
270 }
271 if (part->info()->isExecuteSupported()) {
272 item = new ActionSelectorDialogListItem("execute", this, i18n("Execute"));
273 item->setPixmap(0, SmallIcon("media-playback-start"));
274 }
275 if (part->info()->isPrintingSupported()) {
276 ActionSelectorDialogListItem *printItem = new ActionSelectorDialogListItem(
277 "print", this, i18n("Print"));
278 printItem->setPixmap(0, SmallIcon("document-print"));
279 TDEAction *a = KStdAction::printPreview(0, 0, 0);
280 item = new ActionSelectorDialogListItem("printPreview", printItem,
281 a->text().replace("&", "").replace("...", ""));
282 item->setPixmap(0, SmallIcon(a->icon()));
283 delete a;
284 item = new ActionSelectorDialogListItem("pageSetup", printItem, i18n("Show Page Setup"));
285 item->setPixmap(0, noIcon);
286 setOpen(printItem, true);
287 printItem->setExpandable(false);
288 }
289 if (part->info()->isDataExportSupported()) {
290 ActionSelectorDialogListItem *exportItem = new ActionSelectorDialogListItem(
291 "exportToCSV", this,
292 i18n("Note: use multiple rows if needed", "Export to File\nAs Data Table"));
293 exportItem->setMultiLinesEnabled(true);
294 exportItem->setPixmap(0, SmallIcon("table"));
295 item = new ActionSelectorDialogListItem("copyToClipboardAsCSV",
296 exportItem,
297 i18n("Note: use multiple rows if needed", "Copy to Clipboard\nAs Data Table"));
298 item->setPixmap(0, SmallIcon("table"));
299 item->setMultiLinesEnabled(true);
300 setOpen(exportItem, true);
301 exportItem->setExpandable(false);
302 }
303 item = new ActionSelectorDialogListItem("new", this, i18n("Create New Object"));
304 item->setPixmap(0, SmallIcon("document-new"));
305 if (supportedViewModes & Kexi::DesignViewMode) {
306 item = new ActionSelectorDialogListItem("design", this, i18n("Open in Design View"));
307 item->setPixmap(0, SmallIcon("edit"));
308 }
309 if (supportedViewModes & Kexi::TextViewMode) {
310 item = new ActionSelectorDialogListItem("editText", this, i18n("Open in Text View"));
311 item->setPixmap(0, noIcon);
312 }
313 item = new ActionSelectorDialogListItem("close", this, i18n("Close View"));
314 item->setPixmap(0, SmallIcon("window-close"));
315 updateWidth();
316 }
317
318 void updateWidth()
319 {
320 adjustColumn(0);
321 setMinimumWidth( columnWidth(0) );
322 }
323
324 TQString m_currentMimeType;
325};
326
327//-------------------------------------
328
330class KexiActionSelectionDialog::KexiActionSelectionDialogPrivate
331{
332public:
333 KexiActionSelectionDialogPrivate()
334 : tdeactionPageWidget(0), tdeactionListView(0), objectsListView(0)
335 , currentFormActionsPageWidget(0)
336 , currentFormActionsListView(0)
337 , secondAnd3rdColumnMainWidget(0)
338 , hideActionToExecuteListView(false)
339 {
340 }
341
342 void raiseWidget(TQWidget *w)
343 {
344 secondAnd3rdColumnStack->raiseWidget( w );
345 selectActionToBeExecutedLbl->setBuddy(w);
346 }
347
348 void updateSelectActionToBeExecutedMessage(const TQString& actionType)
349 {
350 TQString msg;
351 if (actionType=="noaction")
352 msg = TQString();
353 // hardcoded, but it's not that bad
354 else if (actionType=="macro")
355 msg = i18n("&Select macro to be executed after clicking \"%1\" button:").arg(actionWidgetName);
356 else if (actionType=="script")
357 msg = i18n("&Select script to be executed after clicking \"%1\" button:").arg(actionWidgetName);
358 //default: table/query/form/report...
359 else
360 msg = i18n("&Select object to be opened after clicking \"%1\" button:").arg(actionWidgetName);
361 selectActionToBeExecutedLbl->setText(msg);
362 }
363
364 // changes 3rd column visibility
365 void setActionToExecuteSectionVisible(bool visible, bool force = false)
366 {
367 if (!force && hideActionToExecuteListView != visible)
368 return;
369 hideActionToExecuteListView = !visible;
370 actionToExecuteListView->hide();
371 actionToExecuteLbl->hide();
372 actionToExecuteListView->show();
373 actionToExecuteLbl->show();
374 }
375
376 KexiMainWindow* mainWin;
377 TQString actionWidgetName;
378 ActionCategoriesListView* actionCategoriesListView;
379 TQWidget *tdeactionPageWidget;
380 TDEActionsListView* tdeactionListView;
381 KexiBrowser* objectsListView;
382 TQWidget *currentFormActionsPageWidget;
383 CurrentFormActionsListView* currentFormActionsListView;
384 TQWidget *emptyWidget;
385 TQLabel* selectActionToBeExecutedLbl;
386 ActionToExecuteListView* actionToExecuteListView;
387 TQLabel *actionToExecuteLbl;
388 TQWidget *secondAnd3rdColumnMainWidget;
389 TQGridLayout *glyr;
390 TQGridLayout *secondAnd3rdColumnGrLyr;
391 TQWidgetStack *secondAnd3rdColumnStack, *secondColumnStack;
392 bool hideActionToExecuteListView;
393};
394
395//-------------------------------------
396
397KexiActionSelectionDialog::KexiActionSelectionDialog(KexiMainWindow* mainWin, TQWidget *parent,
398 const KexiFormEventAction::ActionData& action, const TQCString& actionWidgetName)
399 : KDialogBase(parent, "actionSelectorDialog", true, i18n("Assigning Action to Command Button"),
400 KDialogBase::Ok | KDialogBase::Cancel )
401 , d( new KexiActionSelectionDialogPrivate() )
402{
403 d->mainWin = mainWin;
404 d->actionWidgetName = actionWidgetName;
405 setButtonOK( KGuiItem(i18n("Assign action", "&Assign"), "button_ok", i18n("Assign action")) );
406
407 TQWidget *mainWidget = new TQWidget( this );
408 mainWidget->setSizePolicy(TQSizePolicy::Minimum, TQSizePolicy::Minimum);
409 setMainWidget(mainWidget);
410
411/* lbl 1
412 +------------+ +-------------------------------+
413 | | | [a] |
414 | 1st column | | +----------- + +------------+ |
415 | | | | 2nd column | | 3rd column | |
416 | | | + + + + |
417 | | | +------------+ +------------+ |
418 +------------+ +-------------------------------+
419 \______________________________________________/
420 glyr
421 [a]- TQWidgetStack *secondAnd3rdColumnStack,
422 - for displaying TDEActions, the stack contains d->tdeactionPageWidget TQWidget
423 - for displaying objects, the stack contains secondAnd3rdColumnMainWidget TQWidget and TQGridLayout *secondAnd3rdColumnGrLyr
424 - tdeactionPageWidget contains only a TQVBoxLayout and label+tdeactionListView
425*/
426 d->glyr = new TQGridLayout(mainWidget, 2, 2, KDialog::marginHint(), KDialog::spacingHint());
427 d->glyr->setRowStretch(1, 1);
428
429 // 1st column: action types
430 d->actionCategoriesListView = new ActionCategoriesListView(mainWidget);
431 d->actionCategoriesListView->setSizePolicy(TQSizePolicy::Fixed, TQSizePolicy::Minimum);
432 d->glyr->addWidget(d->actionCategoriesListView, 1, 0);
433 connect( d->actionCategoriesListView, TQ_SIGNAL(selectionChanged(TQListViewItem*)),
434 this, TQ_SLOT(slotActionCategorySelected(TQListViewItem*)));
435
436 TQLabel *lbl = new TQLabel(d->actionCategoriesListView, i18n("Action category:"), mainWidget);
437 lbl->setMinimumHeight(lbl->fontMetrics().height()*2);
438 lbl->setSizePolicy(TQSizePolicy::Fixed, TQSizePolicy::Fixed);
439 lbl->setAlignment(TQt::AlignTop|TQt::AlignLeft|TQt::WordBreak);
440 d->glyr->addWidget(lbl, 0, 0, TQt::AlignTop|TQt::AlignLeft);
441
442 // widget stack for 2nd and 3rd column
443 d->secondAnd3rdColumnStack = new TQWidgetStack(mainWidget);
444 d->secondAnd3rdColumnStack->setSizePolicy(TQSizePolicy::Minimum, TQSizePolicy::Minimum);
445 d->glyr->addMultiCellWidget(d->secondAnd3rdColumnStack, 0, 1, 1, 1);//, TQt::AlignTop|TQt::AlignLeft);
446
447 d->secondAnd3rdColumnMainWidget = new TQWidget(d->secondAnd3rdColumnStack);
448 d->secondAnd3rdColumnMainWidget->setSizePolicy(TQSizePolicy::Minimum, TQSizePolicy::Minimum);
449 d->secondAnd3rdColumnGrLyr = new TQGridLayout(d->secondAnd3rdColumnMainWidget, 2, 2, 0, KDialog::spacingHint());
450 d->secondAnd3rdColumnGrLyr->setRowStretch(1, 2);
451 d->secondAnd3rdColumnStack->addWidget(d->secondAnd3rdColumnMainWidget);
452
453 // 2nd column: list of actions/objects
454 d->objectsListView = new KexiBrowser(d->secondAnd3rdColumnMainWidget, d->mainWin, 0/*features*/);
455 d->secondAnd3rdColumnGrLyr->addWidget(d->objectsListView, 1, 0);
456 connect(d->objectsListView, TQ_SIGNAL(selectionChanged(KexiPart::Item*)),
457 this, TQ_SLOT(slotItemForOpeningOrExecutingSelected(KexiPart::Item*)));
458
459 d->selectActionToBeExecutedLbl = new TQLabel(d->secondAnd3rdColumnMainWidget);
460 d->selectActionToBeExecutedLbl->setSizePolicy(TQSizePolicy::Minimum, TQSizePolicy::Fixed);
461 d->selectActionToBeExecutedLbl->setAlignment(TQt::AlignTop|TQt::AlignLeft|TQt::WordBreak);
462 d->selectActionToBeExecutedLbl->setMinimumHeight(d->selectActionToBeExecutedLbl->fontMetrics().height()*2);
463 d->secondAnd3rdColumnGrLyr->addWidget(d->selectActionToBeExecutedLbl, 0, 0, TQt::AlignTop|TQt::AlignLeft);
464
465 d->emptyWidget = new TQWidget(d->secondAnd3rdColumnStack);
466 d->secondAnd3rdColumnStack->addWidget(d->emptyWidget);
467
468 // 3rd column: actions to execute
469 d->actionToExecuteListView = new ActionToExecuteListView(d->secondAnd3rdColumnMainWidget);
470 d->actionToExecuteListView->installEventFilter(this); //to be able to disable painting
471 d->actionToExecuteListView->viewport()->installEventFilter(this); //to be able to disable painting
472 d->actionToExecuteListView->setSizePolicy(TQSizePolicy::Fixed, TQSizePolicy::Minimum);
473 connect(d->actionToExecuteListView, TQ_SIGNAL(executed(TQListViewItem*)),
474 this, TQ_SLOT(slotActionToExecuteItemExecuted(TQListViewItem*)));
475 connect(d->actionToExecuteListView, TQ_SIGNAL(selectionChanged(TQListViewItem*)),
476 this, TQ_SLOT(slotActionToExecuteItemSelected(TQListViewItem*)));
477 d->secondAnd3rdColumnGrLyr->addWidget(d->actionToExecuteListView, 1, 1);
478
479 d->actionToExecuteLbl = new TQLabel(d->actionToExecuteListView,
480 i18n("Action to execute:"), d->secondAnd3rdColumnMainWidget);
481 d->actionToExecuteLbl->installEventFilter(this); //to be able to disable painting
482 d->actionToExecuteLbl->setSizePolicy(TQSizePolicy::Minimum, TQSizePolicy::Fixed);
483 d->actionToExecuteLbl->setAlignment(TQt::AlignTop|TQt::AlignLeft|TQt::WordBreak);
484 d->secondAnd3rdColumnGrLyr->addWidget(d->actionToExecuteLbl, 0, 1, TQt::AlignTop|TQt::AlignLeft);
485
486 // temporary show all sections to avoid resizing the dialog in the future
487 d->actionCategoriesListView->selectAction("table");
488 d->setActionToExecuteSectionVisible(true);
489 adjustSize();
490 resize(TQMAX(700, width()), TQMAX(450, height()));
491 d->actionToExecuteListView->updateWidth();
492
493 bool ok;
494 TQString actionType, actionArg;
495 KexiPart::Info* partInfo = action.decodeString(actionType, actionArg, ok);
496 if (ok) {
497 d->actionCategoriesListView->selectAction(actionType);
498 if (actionType=="tdeaction") {
499 d->tdeactionListView->selectAction(actionArg);
500 d->tdeactionListView->setFocus();
501 }
502 else if (actionType=="currentForm") {
503 d->currentFormActionsListView->selectAction(actionArg);
504 d->currentFormActionsListView->setFocus();
505 }
506 else if (partInfo
507 && Kexi::partManager().part(partInfo)) // We use the Part Manager
508 // to determine whether the Kexi-plugin is installed and whether we like to show
509 // it in our list of actions.
510 {
511 KexiPart::Item *item = d->mainWin->project()->item(partInfo, actionArg);
512 if (d->objectsListView && item) {
513 d->objectsListView->selectItem(*item);
514 TQString actionOption( action.option );
515 if (actionOption.isEmpty())
516 actionOption = "open"; // for backward compatibility
517 d->actionToExecuteListView->selectAction(actionOption);
518 d->objectsListView->setFocus();
519 }
520 }
521 }
522 else {//invalid assignment or 'noaction'
523 d->actionCategoriesListView->selectAction("noaction");
524 d->actionCategoriesListView->setFocus();
525 }
526}
527
528KexiActionSelectionDialog::~KexiActionSelectionDialog()
529{
530 delete d;
531}
532
533void KexiActionSelectionDialog::slotTDEActionItemExecuted(TQListViewItem*)
534{
535 accept();
536}
537
538void KexiActionSelectionDialog::slotTDEActionItemSelected(TQListViewItem*)
539{
540 d->setActionToExecuteSectionVisible(false);
541 updateOKButtonStatus();
542}
543
544void KexiActionSelectionDialog::slotCurrentFormActionItemExecuted(TQListViewItem*)
545{
546 accept();
547}
548
549void KexiActionSelectionDialog::slotCurrentFormActionItemSelected(TQListViewItem*)
550{
551 d->setActionToExecuteSectionVisible(false);
552 updateOKButtonStatus();
553}
554
555void KexiActionSelectionDialog::slotItemForOpeningOrExecutingSelected(KexiPart::Item* item)
556{
557 d->setActionToExecuteSectionVisible(item);
558}
559
560void KexiActionSelectionDialog::slotActionToExecuteItemExecuted(TQListViewItem* item)
561{
562 if (!item)
563 return;
564 ActionSelectorDialogListItemBase *listItem = dynamic_cast<ActionSelectorDialogListItemBase*>(item);
565 if (listItem && !listItem->data.isEmpty())
566 accept();
567}
568
569void KexiActionSelectionDialog::slotActionToExecuteItemSelected(TQListViewItem*)
570{
571 updateOKButtonStatus();
572}
573
574void KexiActionSelectionDialog::slotActionCategorySelected(TQListViewItem* item)
575{
576 ActionSelectorDialogListItem *simpleItem = dynamic_cast<ActionSelectorDialogListItem*>(item);
577 // simple case: part-less item, e.g. tdeaction:
578 if (simpleItem) {
579 d->updateSelectActionToBeExecutedMessage(simpleItem->data);
580 TQString selectActionToBeExecutedMsg(
581 i18n("&Select action to be executed after clicking \"%1\" button:")); // msg for a label
582 if (simpleItem->data == "tdeaction") {
583 if (!d->tdeactionPageWidget) {
584 //create lbl+list view with a vlayout
585 d->tdeactionPageWidget = new TQWidget();
586 d->tdeactionPageWidget->setSizePolicy(TQSizePolicy::Minimum, TQSizePolicy::Minimum);
587 TQVBoxLayout *vlyr = new TQVBoxLayout(d->tdeactionPageWidget, 0, KDialog::spacingHint());
588 d->tdeactionListView = new TDEActionsListView(d->tdeactionPageWidget, d->mainWin);
589 d->tdeactionListView->init();
590 TQLabel *lbl = new TQLabel(d->tdeactionListView, selectActionToBeExecutedMsg.arg(d->actionWidgetName),
591 d->tdeactionPageWidget);
592 lbl->setAlignment(TQt::AlignTop|TQt::AlignLeft|TQt::WordBreak);
593 lbl->setMinimumHeight(lbl->fontMetrics().height()*2);
594 vlyr->addWidget(lbl);
595 vlyr->addWidget(d->tdeactionListView);
596 d->secondAnd3rdColumnStack->addWidget(d->tdeactionPageWidget);
597 connect(d->tdeactionListView, TQ_SIGNAL(executed(TQListViewItem*)),
598 this, TQ_SLOT(slotTDEActionItemExecuted(TQListViewItem*)));
599 connect( d->tdeactionListView, TQ_SIGNAL(selectionChanged(TQListViewItem*)),
600 this, TQ_SLOT(slotTDEActionItemSelected(TQListViewItem*)));
601 }
602 d->setActionToExecuteSectionVisible(false);
603 d->raiseWidget(d->tdeactionPageWidget);
604 slotTDEActionItemSelected(d->tdeactionListView->selectedItem()); //to refresh column #3
605 }
606 else if (simpleItem->data == "currentForm") {
607 if (!d->currentFormActionsPageWidget) {
608 //create lbl+list view with a vlayout
609 d->currentFormActionsPageWidget = new TQWidget();
610 d->currentFormActionsPageWidget->setSizePolicy(TQSizePolicy::Minimum, TQSizePolicy::Minimum);
611 TQVBoxLayout *vlyr = new TQVBoxLayout(d->currentFormActionsPageWidget, 0, KDialog::spacingHint());
612 d->currentFormActionsListView = new CurrentFormActionsListView(
613 d->currentFormActionsPageWidget, d->mainWin);
614 d->currentFormActionsListView->init();
615 TQLabel *lbl = new TQLabel(d->currentFormActionsListView,
616 selectActionToBeExecutedMsg.arg(d->actionWidgetName), d->currentFormActionsPageWidget);
617 lbl->setAlignment(TQt::AlignTop|TQt::AlignLeft|TQt::WordBreak);
618 lbl->setMinimumHeight(lbl->fontMetrics().height()*2);
619 vlyr->addWidget(lbl);
620 vlyr->addWidget(d->currentFormActionsListView);
621 d->secondAnd3rdColumnStack->addWidget(d->currentFormActionsPageWidget);
622 connect(d->currentFormActionsListView, TQ_SIGNAL(executed(TQListViewItem*)),
623 this, TQ_SLOT(slotCurrentFormActionItemExecuted(TQListViewItem*)));
624 connect( d->currentFormActionsListView, TQ_SIGNAL(selectionChanged(TQListViewItem*)),
625 this, TQ_SLOT(slotCurrentFormActionItemSelected(TQListViewItem*)));
626 }
627 d->setActionToExecuteSectionVisible(false);
628 d->raiseWidget(d->currentFormActionsPageWidget);
629 slotCurrentFormActionItemSelected(d->currentFormActionsListView->selectedItem()); //to refresh column #3
630 }
631 else if (simpleItem->data == "noaction") {
632 d->raiseWidget(d->emptyWidget);
633 d->objectsListView->clearSelection();
634 //hide column #3
635 d->setActionToExecuteSectionVisible(false);
636 }
637 d->actionCategoriesListView->update();
638 updateOKButtonStatus();
639 return;
640 }
641 // other case
642 KexiBrowserItem* browserItem = dynamic_cast<KexiBrowserItem*>(item);
643 if (browserItem) {
644 d->updateSelectActionToBeExecutedMessage(browserItem->info()->objectName());
645 if (d->objectsListView->itemsMimeType().latin1()!=browserItem->info()->mimeType()) {
646 d->objectsListView->setProject(d->mainWin->project(), browserItem->info()->mimeType());
647 d->actionToExecuteListView->showActionsForMimeType( browserItem->info()->mimeType() );
648 d->setActionToExecuteSectionVisible(false);
649 }
650 if (d->secondAnd3rdColumnStack->visibleWidget()!=d->secondAnd3rdColumnMainWidget) {
651 d->raiseWidget( d->secondAnd3rdColumnMainWidget );
652 d->objectsListView->clearSelection();
653 d->setActionToExecuteSectionVisible(false, true);
654 }
655 else
656 d->raiseWidget( d->secondAnd3rdColumnMainWidget );
657 }
658 d->actionCategoriesListView->update();
659 updateOKButtonStatus();
660}
661
663{
664 return d->mainWin;
665}
666
668{
670 ActionSelectorDialogListItem *simpleItem = dynamic_cast<ActionSelectorDialogListItem*>(
671 d->actionCategoriesListView->selectedItem());
672 // simple case: part-less item, e.g. tdeaction:
673 if (simpleItem) {
674 if (simpleItem->data == "tdeaction") {
675 if (d->tdeactionListView->selectedItem()) {
676 data.string = TQString("tdeaction:")
677 + dynamic_cast<ActionSelectorDialogListItem*>( d->tdeactionListView->selectedItem() )->data;
678 return data;
679 }
680 }
681 else if (simpleItem->data == "currentForm") {
682 if (d->currentFormActionsListView->selectedItem()) {
683 data.string = TQString("currentForm:")
684 + dynamic_cast<ActionSelectorDialogListItem*>(
685 d->currentFormActionsListView->selectedItem() )->data;
686 return data;
687 }
688 }
689 }
690 KexiBrowserItem* browserItem = dynamic_cast<KexiBrowserItem*>( d->actionCategoriesListView->selectedItem() );
691 if (browserItem) {
692 ActionSelectorDialogListItem *actionToExecute = dynamic_cast<ActionSelectorDialogListItem*>(
693 d->actionToExecuteListView->selectedItem());
694 if (d->objectsListView && actionToExecute && !actionToExecute->data.isEmpty()) {
695 KexiPart::Item* partItem = d->objectsListView->selectedPartItem();
696 KexiPart::Info* partInfo = partItem ? Kexi::partManager().infoForMimeType( partItem->mimeType() ) : 0;
697 if (partInfo) {
698 // opening or executing: table:name, query:name, form:name, macro:name, script:name, etc.
699 data.string = TQString("%1:%2").arg(partInfo->objectName()).arg(partItem->name());
700 data.option = actionToExecute->data;
701 return data;
702 }
703 }
704 }
705 return data; // No Action
706}
707
708void KexiActionSelectionDialog::updateOKButtonStatus()
709{
710 TQPushButton *btn = actionButton(Ok);
711 ActionSelectorDialogListItem *simpleItem = dynamic_cast<ActionSelectorDialogListItem*>(
712 d->actionCategoriesListView->selectedItem());
713 btn->setEnabled( (simpleItem && simpleItem->data == "noaction") || !currentAction().isEmpty() );
714}
715
716bool KexiActionSelectionDialog::eventFilter(TQObject *o, TQEvent *e)
717{
718 if (d->hideActionToExecuteListView)
719 return true;
720 return KDialogBase::eventFilter(o, e);
721}
722
723#include "kexiactionselectiondialog.moc"
724#include "kexiactionselectiondialog_p.moc"
KexiFormEventAction::ActionData currentAction() const
List view item for the navigator widget (KexiBrowser) Used for creating group items as well as object...
KexiPart::Info * info() const
The Main Kexi navigator widget.
Definition kexibrowser.h:52
A structure used in currentActionName().
KexiPart::Info * decodeString(TQString &actionType, TQString &actionArg, bool &ok) const
TQString string
action string with prefix, like "tdeaction:edit_copy" or "table:<tableName>"
Kexi's main window interface This interface is implemented by KexiMainWindowImpl class.
Information about a Kexi Part (plugin).
bool isDataExportSupported() const
TQCString mimeType() const
bool isPrintingSupported() const
TQString objectName() const
bool isExecuteSupported() const
Information about a single object that can be instantiated using Kexi Part.
Part * partForMimeType(const TQString &mimeTypt)
Info * infoForMimeType(const TQString &mimeType)
PartInfoList * partInfoList()
int supportedViewModes() const
Definition kexipart.h:98
TQString instanceCaption() const
Definition kexipart.cpp:415
bool actionSupportsObjectType(const char *name, KexiPart::ObjectTypes objectType) const
int actionCategories(const char *name) const
TQListViewItem class with ability for storing additional data member.
KEXIUTILS_EXPORT TQPixmap emptyIcon(TDEIcon::Group iconGroup)
KEXICORE_EXPORT ActionCategories * actionCategories()
KEXICORE_EXPORT KexiPart::Manager & partManager()
shared part manager
Definition kexi.cpp:97
@ TextViewMode
Also known as SQL View Mode.
Definition kexi.h:48