kexi

kexibrowser.cpp
1/* This file is part of the KDE project
2 Copyright (C) 2002, 2003 Lucijan Busch <lucijan@gmx.at>
3 Copyright (C) 2003-2006 Jaroslaw Staniek <js@iidea.pl>
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details.
14
15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 * Boston, MA 02110-1301, USA.
19*/
20
21#include "kexibrowser.h"
22#include "kexibrowser_p.h"
23#include "kexibrowseritem.h"
24
25#include <tqheader.h>
26#include <tqpoint.h>
27#include <tqpixmapcache.h>
28#include <tqtoolbutton.h>
29#include <tqtooltip.h>
30#include <tqwhatsthis.h>
31
32#include <tdeapplication.h>
33#include <kiconloader.h>
34#include <kdebug.h>
35#include <tdelocale.h>
36#include <tdepopupmenu.h>
37#include <tdelistview.h>
38#include <tdemessagebox.h>
39#include <klineedit.h>
40#include <kimageeffect.h>
41#include <tdeconfig.h>
42
43#include <kexi.h>
44#include <kexipart.h>
45#include <kexipartinfo.h>
46#include <kexipartitem.h>
47#include <kexiproject.h>
48#include <kexidialogbase.h>
49#include <keximainwindow.h>
50#include <kexiutils/identifier.h>
51#include <widget/utils/kexiflowlayout.h>
52#include <widget/kexismalltoolbutton.h>
53#include <kexidb/utils.h>
54
55/*
56class KexiBrowserView : public TQWidget
57{
58 KexiBrowserView*(
59};
60
61KexiBrowserView::KexiBrowserView(KexiMainWindow *mainWin)
62 : TQWidget(mainWin, "KexiBrowserView")
63{
64 TQVBoxLayout *lyr = new TQVBoxLayout(this);
65 KexiFlowLayout *buttons_flyr = new KexiFlowLayout(lyr);
66 m_browser = KexiBrowser(this, mainWin);
67 lyr->addWidget(m_browser);
68 setFocusProxy(m_browser);
69}*/
70
71KexiBrowser::KexiBrowser(TQWidget* parent, KexiMainWindow *mainWin, int features)
72 : TQWidget(parent, "KexiBrowser")
73 , m_mainWin(mainWin)
74 , m_features(features)
75 , m_actions( new TDEActionCollection(this) )
76 , m_baseItems(199, false)
77 , m_normalItems(199)
78 , m_prevSelectedPart(0)
79 , m_singleClick(false)
80// , m_nameEndsWithAsterisk(false)
81 , m_readOnly(false)
82// , m_enableExecuteArea(true)
83{
84 setCaption(i18n("Project Navigator"));
85 setIcon(*m_mainWin->icon());
86
87 TQVBoxLayout *lyr = new TQVBoxLayout(this);
88 KexiFlowLayout *buttons_flyr = new KexiFlowLayout(lyr);
89
90 m_list = new KexiBrowserListView(this);
91 lyr->addWidget(m_list);
92 m_list->installEventFilter(this);
93 m_list->renameLineEdit()->installEventFilter(this);
94 connect( kapp, TQ_SIGNAL( settingsChanged(int) ), TQ_SLOT( slotSettingsChanged(int) ) );
95 slotSettingsChanged(0);
96
97 m_list->header()->hide();
98 m_list->addColumn("");
99 m_list->setShowToolTips(true);
100 m_list->setSorting(0);
101 m_list->sort();
102 m_list->setAllColumnsShowFocus(true);
103 m_list->setTooltipColumn(0);
104 m_list->renameLineEdit()->setValidator( new KexiUtils::IdentifierValidator(this) );
105 m_list->setResizeMode(TQListView::LastColumn);
106 connect(m_list, TQ_SIGNAL(contextMenu(TDEListView *, TQListViewItem *, const TQPoint &)),
107 this, TQ_SLOT(slotContextMenu(TDEListView*, TQListViewItem *, const TQPoint&)));
108 connect(m_list, TQ_SIGNAL(selectionChanged(TQListViewItem*)), this,
109 TQ_SLOT(slotSelectionChanged(TQListViewItem*)));
110
111 TDEConfig *config = kapp->config();
112 config->setGroup("MainWindow");
113 if ((m_features & SingleClickOpensItemOptionEnabled)
114 && config->readBoolEntry("SingleClickOpensItem", false))
115 {
116 connect(m_list, TQ_SIGNAL(executed(TQListViewItem*)), this,
117 TQ_SLOT(slotExecuteItem(TQListViewItem*)));
118 }
119 else {
120 connect(m_list, TQ_SIGNAL(doubleClicked(TQListViewItem*)), this,
121 TQ_SLOT(slotExecuteItem(TQListViewItem*)));
122 m_list->enableExecuteArea = false;
123 }
124
125 // actions
126 m_openAction = new TDEAction(i18n("&Open"), "document-open", 0/*TQt::Key_Enter conflict!*/, this,
127 TQ_SLOT(slotOpenObject()), this, "open_object");
128 m_openAction->setToolTip(i18n("Open object"));
129 m_openAction->setWhatsThis(i18n("Opens object selected in the list"));
130
131// m_openAction->plug(m_toolbar);
133 if (m_features & Toolbar) {
134 btn = new KexiSmallToolButton(this, m_openAction);
135 buttons_flyr->add(btn);
136 }
137
138 if (m_mainWin->userMode()) {
140 m_deleteAction = 0;
141 m_renameAction = 0;
142 m_designAction = 0;
143 m_editTextAction = 0;
144 m_newObjectAction = 0;
145 m_newObjectPopup = 0;
146 }
147 else {
148 m_deleteAction = new TDEAction(i18n("&Delete"), "edit-delete", 0/*TQt::Key_Delete*/,
149 this, TQ_SLOT(slotRemove()), m_actions, "edit_delete");
151 m_deleteAction->setToolTip(i18n("&Delete").replace("&",""));
152
153 m_renameAction = new TDEAction(i18n("&Rename"), "", 0,
154 this, TQ_SLOT(slotRename()), m_actions, "edit_rename");
155#ifdef KEXI_SHOW_UNIMPLEMENTED
156 //todo plugSharedAction("edit_cut",TQ_SLOT(slotCut()));
157 //todo plugSharedAction("edit_copy",TQ_SLOT(slotCopy()));
158 //todo plugSharedAction("edit_paste",TQ_SLOT(slotPaste()));
159#endif
160
161 m_designAction = new TDEAction(i18n("&Design"), "edit", 0/*TQt::CTRL + TQt::Key_Enter conflict!*/, this,
162 TQ_SLOT(slotDesignObject()), this, "design_object");
163 m_designAction->setToolTip(i18n("Design object"));
164 m_designAction->setWhatsThis(i18n("Starts designing of the object selected in the list"));
165 if (m_features & Toolbar) {
166 btn = new KexiSmallToolButton(this, m_designAction);
167 buttons_flyr->add(btn);
168 }
169
170 m_editTextAction = new TDEAction(i18n("Open in &Text View"), "", 0, this,
171 TQ_SLOT(slotEditTextObject()), this, "editText_object");
172 m_editTextAction->setToolTip(i18n("Open object in text view"));
173 m_editTextAction->setWhatsThis(i18n("Opens selected object in the list in text view"));
174
175 m_newObjectAction = new TDEAction("", "document-new", 0, this, TQ_SLOT(slotNewObject()), this, "new_object");
176 if (m_features & Toolbar) {
177 m_newObjectToolButton = new KexiSmallToolButton(this, "", TQIconSet(), "new_object");
178 m_newObjectPopup = new TDEPopupMenu(this, "newObjectPopup");
179 connect(m_newObjectPopup, TQ_SIGNAL(aboutToShow()), this, TQ_SLOT(slotNewObjectPopupAboutToShow()));
180 // KexiPart::Part* part = Kexi::partManager().part("kexi/table");
181 // m_newObjectPopup->insertItem( SmallIconSet(part->info()->createItemIcon()), part->instanceName() );
182 m_newObjectToolButton->setPopup(m_newObjectPopup);
183 m_newObjectToolButton->setPopupDelay(TQApplication::startDragTime());
184 connect(m_newObjectToolButton, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotNewObject()));
185 buttons_flyr->add(m_newObjectToolButton);
186
187 m_deleteObjectToolButton = new KexiSmallToolButton(this, m_deleteAction);
188 m_deleteObjectToolButton->setTextLabel("");
189 buttons_flyr->add(m_deleteObjectToolButton);
190 }
191 }
192
193 m_executeAction = new TDEAction(i18n("Execute"), "media-playback-start", 0, this,
194 TQ_SLOT(slotExecuteObject()), this, "data_execute");
195
196 m_exportActionMenu = new TDEActionMenu(i18n("Export"));
197 m_dataExportAction = new TDEAction(i18n("Export->To File as Data &Table... ", "To &File as Data Table..."),
198 "table", 0, this, TQ_SLOT(slotExportAsDataTable()), this, "exportAsDataTable");
199 m_dataExportAction->setWhatsThis(
200 i18n("Exports data from the currently selected table or query data to a file."));
201 m_exportActionMenu->insert( m_dataExportAction );
202
203 m_printAction = new TDEAction(i18n("&Print..."), "document-print", 0, this,
204 TQ_SLOT(slotPrintItem()), this, "printItem");
205 m_printAction->setWhatsThis(
206 i18n("Prints data from the currently selected table or query."));
207 m_pageSetupAction = new TDEAction(i18n("Page Setup..."), "", 0, this,
208 TQ_SLOT(slotPageSetupForItem()), this, "pageSetupForItem");
209 m_pageSetupAction->setWhatsThis(
210 i18n("Shows page setup for printing the active table or query."));
211
212 if (m_mainWin->userMode()) {
214 m_partPopup = 0;
215 }
216 else {
217 m_partPopup = new TDEPopupMenu(this, "partPopup");
218 m_partPopupTitle_id = m_partPopup->insertTitle("");
219 m_newObjectAction->plug(m_partPopup);
220#ifdef KEXI_SHOW_UNIMPLEMENTED
221 m_partPopup->insertSeparator();
222 plugSharedAction("edit_paste", m_partPopup);
223#endif
224 }
225
226 if (m_features & ContextMenus) {
227 //init popups
228 m_itemPopup = new TDEPopupMenu(this, "itemPopup");
229 m_itemPopupTitle_id = m_itemPopup->insertTitle("");
230 m_openAction->plug(m_itemPopup);
231 m_openAction_id = m_itemPopup->idAt(m_itemPopup->count()-1);
232
233 if (m_designAction) {
234 m_designAction->plug(m_itemPopup);
235 m_designAction_id = m_itemPopup->idAt(m_itemPopup->count()-1);
236 }
237
238 if (m_editTextAction) {
239 m_editTextAction->plug(m_itemPopup);
240 m_editTextAction_id = m_itemPopup->idAt(m_itemPopup->count()-1);
241 }
242
243 if (m_newObjectAction) {
244 m_newObjectAction->plug(m_itemPopup);
245 m_itemPopup->insertSeparator();
246 }
247#ifdef KEXI_SHOW_UNIMPLEMENTED
248 //todo plugSharedAction("edit_cut", m_itemPopup);
249 //todo plugSharedAction("edit_copy", m_itemPopup);
250 //todo m_itemPopup->insertSeparator();
251#endif
252 m_executeAction->plug(m_itemPopup);
253 m_executeAction_id = m_itemPopup->idAt(m_itemPopup->count()-1);
254
255 m_exportActionMenu->plug(m_itemPopup);
256 m_exportActionMenu_id = m_exportActionMenu->menuId(0);
257 m_itemPopup->insertSeparator();
258 m_exportActionMenu_id_sep = m_itemPopup->idAt(m_itemPopup->count()-1);
259
260 m_printAction->plug(m_itemPopup);
261 m_printAction_id = m_itemPopup->idAt(m_itemPopup->count()-1);
262
263 m_pageSetupAction->plug(m_itemPopup);
264 m_pageSetupAction_id = m_itemPopup->idAt(m_itemPopup->count()-1);
265 if (m_renameAction || m_deleteAction) {
266 m_itemPopup->insertSeparator();
267 m_pageSetupAction_id_sep = m_itemPopup->idAt(m_itemPopup->count()-1);
268 }
269 else {
270 m_pageSetupAction_id_sep = -1;
271 }
272
273 if (m_renameAction)
274 m_renameAction->plug(m_itemPopup);
275 if (m_deleteAction)
276 m_deleteAction->plug(m_itemPopup);
277 }
278 else {
279 m_itemPopup = 0;
280 }
281
282 if (!(m_features & Writable)) {
283 setReadOnly(true);
284 }
285}
286
287KexiBrowser::~KexiBrowser()
288{
289}
290
292 TQString* partManagerErrorMessages)
293{
294 clear();
295 m_itemsMimeType = itemsMimeType;
296 m_list->setRootIsDecorated(m_itemsMimeType.isEmpty());
297
298 KexiPart::PartInfoList *pl = Kexi::partManager().partInfoList();
299 for (KexiPart::Info *info = pl->first(); info; info = pl->next()) {
300 if (!info->isVisibleInNavigator())
301 continue;
302 if (!m_itemsMimeType.isEmpty() && info->mimeType()!=m_itemsMimeType.latin1())
303 continue;
304
305// kdDebug() << "KexiMainWindowImpl::initNavigator(): adding " << it->groupName() << endl;
306
307/* KexiPart::Part *p=Kexi::partManager().part(it);
308 if (!p) {
309 //TODO: js - OPTIONALLY: show error
310 continue;
311 }
312 p->createGUIClient(this);*/
313
314 //load part - we need this to have GUI merged with part's actions
317 if (p) {
318 KexiBrowserItem *groupItem = 0;
319 if (m_itemsMimeType.isEmpty()) {
320 groupItem = addGroup(*info);
321 if (!groupItem)
322 continue;
323 }
324 //lookup project's objects (part items)
326 KexiPart::ItemDict *item_dict = prj->items(info);
327 if (!item_dict)
328 continue;
329 for (KexiPart::ItemDictIterator item_it( *item_dict ); item_it.current(); ++item_it)
330 addItem(*item_it.current(), groupItem, info);
331 if (!m_itemsMimeType.isEmpty())
332 break; //the only group added, so our work is completed
333 }
334 else {
335 //add this error to the list that will be displayed later
336 TQString msg, details;
338 if (!msg.isEmpty() && partManagerErrorMessages) {
339 if (partManagerErrorMessages->isEmpty()) {
340 *partManagerErrorMessages = TQString("<qt><p>")
341 +i18n("Errors encountered during loading plugins:")+"<ul>";
342 }
343 partManagerErrorMessages->append( TQString("<li>") + msg );
344 if (!details.isEmpty())
345 partManagerErrorMessages->append(TQString("<br>")+details);
346 partManagerErrorMessages->append("</li>");
347 }
348 }
349 }
350 if (partManagerErrorMessages && !partManagerErrorMessages->isEmpty())
351 partManagerErrorMessages->append("</ul></p>");
352}
353
355{
356 return m_itemsMimeType;
357}
358
359KexiBrowserItem *KexiBrowser::addGroup(KexiPart::Info& info)
360{
361 if(!info.isVisibleInNavigator())
362 return 0;
363
364 KexiBrowserItem *item = new KexiBrowserItem(m_list, &info);
365 m_baseItems.insert(info.mimeType().lower(), item);
366 return item;
367// kdDebug() << "KexiBrowser::addGroup()" << endl;
368}
369
370KexiBrowserItem* KexiBrowser::addItem(KexiPart::Item& item)
371{
372 //part object for this item
373 KexiBrowserItem *parent = item.mimeType().isEmpty() ? 0 : m_baseItems.find(item.mimeType().lower());
374 return addItem(item, parent, parent->info());
375}
376
377KexiBrowserItem* KexiBrowser::addItem(KexiPart::Item& item, KexiBrowserItem *parent, KexiPart::Info* info)
378{
379// if (!parent) //TODO: add "Other" part group for that
380 // return 0;
381// kdDebug() << "KexiBrowser::addItem() found parent:" << parent << endl;
382 KexiBrowserItem *bitem;
383 if (parent)
384 bitem = new KexiBrowserItem(parent, info, &item);
385 else
386 bitem = new KexiBrowserItem(m_list, info, &item);
387 m_normalItems.insert(item.identifier(), bitem);
388 return bitem;
389}
390
391void
392KexiBrowser::slotRemoveItem(const KexiPart::Item &item)
393{
394 KexiBrowserItem *to_remove=m_normalItems.take(item.identifier());
395 if (!to_remove)
396 return;
397
398 KexiBrowserItem *it = static_cast<KexiBrowserItem*>(m_list->selectedItem());
399
400 TQListViewItem *new_item_to_select = 0;
401 if (it==to_remove) {//compute item to select if current one will be removed
402 new_item_to_select = it->itemBelow();//nearest item to select
403 if (!new_item_to_select || new_item_to_select->parent()!=it->parent()) {
404 new_item_to_select = it->itemAbove();
405 }
406 }
407 delete to_remove;
408
409 if (new_item_to_select)
410 m_list->setSelected(new_item_to_select, true);
411}
412
413void
414KexiBrowser::slotContextMenu(TDEListView* /*list*/, TQListViewItem *item, const TQPoint &pos)
415{
416 if(!item || !(m_features & ContextMenus))
417 return;
418 KexiBrowserItem *bit = static_cast<KexiBrowserItem*>(item);
419 TDEPopupMenu *pm = 0;
420 if (bit->item()) {
421 pm = m_itemPopup;
422 //update popup title
423 TQString title_text = bit->text(0).stripWhiteSpace();
424 KexiBrowserItem *par_it = static_cast<KexiBrowserItem*>(bit->parent());
425 KexiPart::Part* par_part = 0;
426 if (par_it && par_it->info() && ((par_part = Kexi::partManager().part(par_it->info()))) && !par_part->instanceCaption().isEmpty()) {
427 //add part type name
428 title_text += (" : " + par_part->instanceCaption());
429 }
430 pm->changeTitle(m_itemPopupTitle_id, *bit->pixmap(0), title_text);
431 }
432 else if (m_partPopup) {
433 pm = m_partPopup;
434 TQString title_text = bit->text(0).stripWhiteSpace();
435 pm->changeTitle(m_partPopupTitle_id, *bit->pixmap(0), title_text);
436/* KexiPart::Part* part = Kexi::partManager().part(bit->info());
437 if (part)
438 m_newObjectAction->setText(i18n("&Create Object: %1...").arg( part->instanceName() ));
439 else
440 m_newObjectAction->setText(i18n("&Create Object..."));
441 m_newObjectAction->setIconSet( SmallIconSet(bit->info()->itemIcon()) );*/
442 m_list->setCurrentItem(item);
443 m_list->repaintItem(item);
444 }
445 if (pm)
446 pm->exec(pos);
447}
448
449void
450KexiBrowser::slotExecuteItem(TQListViewItem *vitem)
451{
452// kdDebug() << "KexiBrowser::slotExecuteItem()" << endl;
453 KexiBrowserItem *it = static_cast<KexiBrowserItem*>(vitem);
454 if (!it)
455 return;
456 if (!it->item() && !m_singleClick /*annoying when in single click mode*/) {
457 m_list->setOpen( vitem, !vitem->isOpen() );
458 return;
459 }
460 if (it->info()->isExecuteSupported())
461 emit executeItem( it->item() );
462 else
463 emit openOrActivateItem( it->item(), Kexi::DataViewMode );
464}
465
466void
467KexiBrowser::slotSelectionChanged(TQListViewItem* i)
468{
469 KexiBrowserItem *it = static_cast<KexiBrowserItem*>(i);
470 if (!it)
471 return;
472 KexiPart::Part* part = Kexi::partManager().part(it->info());
473 if (!part) {
474 it = static_cast<KexiBrowserItem*>(it->parent());
475 if (it) {
476 part = Kexi::partManager().part(it->info());
477 }
478 }
479
480 const bool gotitem = it && it->item();
481 //bool gotgroup = it && !it->item();
482//TODO: also check if the item is not read only
483 if (m_deleteAction) {
484 m_deleteAction->setEnabled(gotitem && !m_readOnly);
485 if (m_features & Toolbar) {
486 m_deleteObjectToolButton->setEnabled(gotitem && !m_readOnly);
487 }
488 }
489#ifdef KEXI_SHOW_UNIMPLEMENTED
490//todo setAvailable("edit_cut",gotitem);
491//todo setAvailable("edit_copy",gotitem);
492//todo setAvailable("edit_edititem",gotitem);
493#endif
494
495 m_openAction->setEnabled(gotitem && part && (part->supportedViewModes() & Kexi::DataViewMode));
496 if (m_designAction)
497 m_designAction->setEnabled(gotitem && part && (part->supportedViewModes() & Kexi::DesignViewMode));
498 if (m_editTextAction)
499 m_editTextAction->setEnabled(gotitem && part && (part->supportedViewModes() & Kexi::TextViewMode));
500
501 if (m_features & ContextMenus) {
502 m_itemPopup->setItemVisible(m_openAction_id, m_openAction->isEnabled());
503 if (m_designAction)
504 m_itemPopup->setItemVisible(m_designAction_id, m_designAction->isEnabled());
505 if (m_editTextAction)
506 m_itemPopup->setItemVisible(m_editTextAction_id, part && m_editTextAction->isEnabled());
507 if (m_executeAction)
508 m_itemPopup->setItemVisible(m_executeAction_id, gotitem && it->info()->isExecuteSupported());
509 if (m_exportActionMenu) {
510 m_itemPopup->setItemVisible(m_exportActionMenu_id, gotitem && it->info()->isDataExportSupported());
511 m_itemPopup->setItemVisible(m_exportActionMenu_id_sep, gotitem && it->info()->isDataExportSupported());
512 }
513 if (m_printAction)
514 m_itemPopup->setItemVisible(m_printAction_id, gotitem && it->info()->isPrintingSupported());
515 if (m_pageSetupAction) {
516 m_itemPopup->setItemVisible(m_pageSetupAction_id, gotitem && it->info()->isPrintingSupported());
517 if (m_pageSetupAction_id_sep!=-1)
518 m_itemPopup->setItemVisible(m_pageSetupAction_id_sep, gotitem && it->info()->isPrintingSupported());
519 }
520 }
521
522 if (m_prevSelectedPart != part) {
523 m_prevSelectedPart = part;
524 if (part) {
525 if (m_newObjectAction) {
526 m_newObjectAction->setText(i18n("&Create Object: %1...").arg( part->instanceCaption() ));
527 m_newObjectAction->setIcon( part->info()->createItemIcon() );
528 if (m_features & Toolbar) {
529 m_newObjectToolButton->setIconSet( part->info()->createItemIcon() );
530 TQToolTip::add(m_newObjectToolButton,
531 i18n("Create object: %1").arg( part->instanceCaption().lower() ));
532 TQWhatsThis::add(m_newObjectToolButton,
533 i18n("Creates a new object: %1").arg( part->instanceCaption().lower() ));
534 }
535 }
536 } else {
537 if (m_newObjectAction) {
538 m_newObjectAction->setText(i18n("&Create Object..."));
539 // m_newObjectToolbarAction->setIconSet( SmallIconSet("document-new") );
540 // m_newObjectToolbarAction->setText(m_newObjectAction->text());
541 if (m_features & Toolbar) {
542 m_newObjectToolButton->setIconSet( "document-new" );
543 TQToolTip::add(m_newObjectToolButton, i18n("Create object"));
544 TQWhatsThis::add(m_newObjectToolButton, i18n("Creates a new object"));
545 }
546 }
547 }
548 }
549 emit selectionChanged(it ? it->item() : 0);
550}
551
552void KexiBrowser::installEventFilter ( const TQObject * filterObj )
553{
554 if (!filterObj)
555 return;
556 m_list->installEventFilter ( filterObj );
557 TQWidget::installEventFilter ( filterObj );
558}
559
560bool KexiBrowser::eventFilter ( TQObject *o, TQEvent * e )
561{
562 if (o==m_list && e->type()==TQEvent::Resize) {
563 kdDebug() << "resize!" << endl;
564 }
565 if (o==m_list->renameLineEdit()) {
566 if (e->type()==TQEvent::Hide)
567 itemRenameDone();
568 }
569 else if (e->type()==TQEvent::KeyPress) {
570 TQKeyEvent *ke = static_cast<TQKeyEvent*>(e);
571 if (ke->key()==TQt::Key_Enter || ke->key()==TQt::Key_Return) {
572 if (0==(ke->state() & (TQt::ShiftButton|TQt::ControlButton|TQt::AltButton))) {
573 TQListViewItem *it = m_list->selectedItem();
574 if (it)
575 slotExecuteItem(it);
576 }
577 else if (TQt::ControlButton==(ke->state() & (TQt::ShiftButton|TQt::ControlButton|TQt::AltButton))) {
578 slotDesignObject();
579 }
580 }
581 }
582 else if (e->type()==TQEvent::AccelOverride) {
583 TQKeyEvent *ke = static_cast<TQKeyEvent*>(e);
584 //override delete action
585 if (ke->key()==TQt::Key_Delete && ke->state()==TQt::NoButton) {
586 slotRemove();
587 ke->accept();
588 return true;
589 }
590 //override rename action
591 if (ke->key()==TQt::Key_F2 && ke->state()==TQt::NoButton) {
592 slotRename();
593 ke->accept();
594 return true;
595 }
596/* else if (ke->key()==TQt::Key_Enter || ke->key()==TQt::Key_Return) {
597 if (ke->state()==ControlButton) {
598 slotDesignObject();
599 }
600 else if (ke->state()==0 && !m_list->renameLineEdit()->isVisible()) {
601 TQListViewItem *it = m_list->selectedItem();
602 if (it)
603 slotExecuteItem(it);
604 }
605 ke->accept();
606 return true;
607 }*/
608 }
609 return false;
610}
611
612void KexiBrowser::slotRemove()
613{
614 if (!m_deleteAction || !m_deleteAction->isEnabled() || !(m_features & Writable))
615 return;
616 KexiBrowserItem *it = static_cast<KexiBrowserItem*>(m_list->selectedItem());
617 if (!it || !it->item())
618 return;
619 emit removeItem( it->item() );
620}
621
622void KexiBrowser::slotNewObject()
623{
624 if (!m_newObjectAction || !(m_features & Writable))
625 return;
626 KexiBrowserItem *it = static_cast<KexiBrowserItem*>(m_list->selectedItem());
627 if (!it || !it->info())
628 return;
629 emit newItem( it->info() );
630}
631
632void KexiBrowser::slotOpenObject()
633{
634 KexiBrowserItem *it = static_cast<KexiBrowserItem*>(m_list->selectedItem());
635 if (!it || !it->item())
636 return;
637 emit openItem( it->item(), Kexi::DataViewMode );
638}
639
640void KexiBrowser::slotDesignObject()
641{
642 if (!m_designAction)
643 return;
644 KexiBrowserItem *it = static_cast<KexiBrowserItem*>(m_list->selectedItem());
645 if (!it || !it->item())
646 return;
647 emit openItem( it->item(), Kexi::DesignViewMode );
648}
649
650void KexiBrowser::slotEditTextObject()
651{
652 if (!m_editTextAction)
653 return;
654 KexiBrowserItem *it = static_cast<KexiBrowserItem*>(m_list->selectedItem());
655 if (!it || !it->item())
656 return;
657 emit openItem( it->item(), Kexi::TextViewMode );
658}
659
660void KexiBrowser::slotCut()
661{
662 if (!(m_features & Writable))
663 return;
664// KEXI_UNFINISHED_SHARED_ACTION("edit_cut");
665 //TODO
666}
667
668void KexiBrowser::slotCopy()
669{
670// KEXI_UNFINISHED_SHARED_ACTION("edit_copy");
671 //TODO
672}
673
674void KexiBrowser::slotPaste()
675{
676 if (!(m_features & Writable))
677 return;
678// KEXI_UNFINISHED_SHARED_ACTION("edit_paste");
679 //TODO
680}
681
682void KexiBrowser::slotRename()
683{
684 if (!m_renameAction || !(m_features & Writable))
685 return;
686 KexiBrowserItem *it = static_cast<KexiBrowserItem*>(m_list->selectedItem());
687 if (it)
688 m_list->rename(it, 0);
689}
690
691void KexiBrowser::itemRenameDone()
692{
693 if (!(m_features & Writable))
694 return;
695 KexiBrowserItem *it = static_cast<KexiBrowserItem*>(m_list->selectedItem());
696 if (!it)
697 return;
698 TQString txt = it->text(0).stripWhiteSpace();
699 bool ok = it->item()->name().lower()!=txt.lower(); //the new name must be different
700 if (ok) {
701 /* TODO */
702 emit renameItem(it->item(), txt, ok);
703 }
704 if (!ok) {
705 txt = it->item()->name(); //revert
706 }
707 //"modified" flag has been removed before editing: readd it
708 if (m_list->nameEndsWithAsterisk) {
709 txt += "*";
710 m_list->nameEndsWithAsterisk = false;
711 }
712 it->setText(0, txt);
713 it->parent()->sort();
714 setFocus();
715}
716
717void KexiBrowser::setFocus()
718{
719 if (!m_list->selectedItem() && m_list->firstChild())//select first
720 m_list->setSelected(m_list->firstChild(), true);
721 m_list->setFocus();
722}
723
724void KexiBrowser::updateItemName( KexiPart::Item& item, bool dirty )
725{
726 if (!(m_features & Writable))
727 return;
728 KexiBrowserItem *bitem = m_normalItems[item.identifier()];
729 if (!bitem)
730 return;
731 bitem->setText( 0, item.name() + (dirty ? "*" : "") );
732}
733
734void KexiBrowser::slotSettingsChanged(int)
735{
736 m_singleClick = TDEGlobalSettings::singleClick();
737}
738
739void KexiBrowser::selectItem(KexiPart::Item& item)
740{
741 KexiBrowserItem *bitem = m_normalItems[item.identifier()];
742 if (!bitem)
743 return;
744 m_list->setSelected(bitem, true);
745 m_list->ensureItemVisible(bitem);
746 m_list->setCurrentItem(bitem);
747}
748
749void KexiBrowser::clearSelection()
750{
751 m_list->clearSelection();
752 TQListViewItem *item = m_list->firstChild();
753 if (item) {
754 m_list->ensureItemVisible(item);
755 }
756}
757
759{
760 if ((m_features & Toolbar) && m_newObjectPopup && m_newObjectPopup->count()==0) {
761 //preload items
762 KexiPart::PartInfoList *list = Kexi::partManager().partInfoList(); //this list is properly sorted
763 for (KexiPart::PartInfoListIterator it(*list); it.current(); ++it) {
764 //add an item to "New object" toolbar popup
765 TDEAction *action = m_mainWin->actionCollection()->action(
766 TQString(KexiPart::nameForCreateAction(*it.current())).ascii() );
767 if (action) {
768 action->plug(m_newObjectPopup);
769 }
770 else {
772 }
773 }
774 }
775}
776
777void KexiBrowser::slotExecuteObject()
778{
779 if (!m_executeAction)
780 return;
781 KexiPart::Item* item = selectedPartItem();
782 if (item)
783 emit executeItem( item );
784}
785
786void KexiBrowser::slotExportAsDataTable()
787{
788 if (!m_dataExportAction)
789 return;
790 KexiPart::Item* item = selectedPartItem();
791 if (item)
792 emit exportItemAsDataTable( item );
793}
794
795KexiPart::Item* KexiBrowser::selectedPartItem() const
796{
797 KexiBrowserItem *it = static_cast<KexiBrowserItem*>(m_list->selectedItem());
798 return it ? it->item() : 0;
799}
800
801bool KexiBrowser::actionEnabled(const TQCString& actionName) const
802{
803 if (actionName=="project_export_data_table" && (m_features & ContextMenus))
804 return m_itemPopup->isItemVisible(m_exportActionMenu_id);
805 kdWarning() << "KexiBrowser::actionEnabled() no such action: " << actionName << endl;
806 return false;
807}
808
809void KexiBrowser::slotPrintItem()
810{
811 if (!m_printAction)
812 return;
813 KexiPart::Item* item = selectedPartItem();
814 if (item)
815 emit printItem( item );
816}
817
818void KexiBrowser::slotPageSetupForItem()
819{
820 if (!m_pageSetupAction)
821 return;
822 KexiPart::Item* item = selectedPartItem();
823 if (item)
824 emit pageSetupForItem( item );
825}
826
827
829{
830 m_readOnly = set;
831 if (m_deleteAction)
832 m_deleteAction->setEnabled(!m_readOnly);
833 if (m_renameAction)
834 m_renameAction->setEnabled(!m_readOnly);
835 if (m_newObjectAction) {
836 m_newObjectAction->setEnabled(!m_readOnly);
837 if (m_features & Toolbar) {
838 m_newObjectPopup->setEnabled(!m_readOnly);
839 m_newObjectToolButton->setEnabled(!m_readOnly);
840 }
841 }
842}
843
844bool KexiBrowser::isReadOnly() const
845{
846 return m_readOnly;
847}
848
849void KexiBrowser::clear()
850{
851 m_list->clear();
852}
853
854//--------------------------------------------
855KexiBrowserListView::KexiBrowserListView(TQWidget *parent)
856 : TDEListView(parent, "KexiBrowserListView")
857 , nameEndsWithAsterisk(false)
858 , enableExecuteArea(true)
859{
860}
861
862KexiBrowserListView::~KexiBrowserListView()
863{
864}
865
866void KexiBrowserListView::rename(TQListViewItem *item, int c)
867{
868 if (renameLineEdit()->isVisible())
869 return;
870 KexiBrowserItem *it = static_cast<KexiBrowserItem*>(item);
871 if (it->item() && c==0) {
872 //only edit 1st column for items, not item groups
873//TODO: also check it this item is not read-only
874// item->setText(0, item->text(0).mid(1,item->text(0).length()-2));
875 //remove "modified" flag for editing
876 nameEndsWithAsterisk = item->text(0).endsWith("*");
877 if (nameEndsWithAsterisk)
878 item->setText(0, item->text(0).left(item->text(0).length()-1));
879 TDEListView::rename(item, c);
880 adjustColumn(0);
881 }
882}
883
884bool KexiBrowserListView::isExecuteArea( const TQPoint& point )
885{
886 return enableExecuteArea && TDEListView::isExecuteArea(point);
887}
888
889#include "kexibrowser.moc"
890#include "kexibrowser_p.moc"
List view item for the navigator widget (KexiBrowser) Used for creating group items as well as object...
KexiPart::Info * info() const
KexiPart::Item * item() const
void openOrActivateItem(KexiPart::Item *, int viewMode)
void setReadOnly(bool set)
void setProject(KexiProject *prj, const TQString &itemsMimeType=TQString(), TQString *partManagerErrorMessages=0)
TQString itemsMimeType() const
@ ContextMenus
the browser supports context menu
Definition kexibrowser.h:59
@ SingleClickOpensItemOptionEnabled
enables "SingleClickOpensItem" option
Definition kexibrowser.h:61
@ Writable
the browser supports actions that modify the project (e.g. delete, rename)
Definition kexibrowser.h:58
@ Toolbar
the browser displays
Definition kexibrowser.h:60
void slotNewObjectPopupAboutToShow()
KexiBrowser(TQWidget *parent, KexiMainWindow *mainWin, int features=DefaultFeatures)
a special "flow" layout
Kexi's main window interface This interface is implemented by KexiMainWindowImpl class.
Information about a Kexi Part (plugin).
TQString createItemIcon() const
bool isDataExportSupported() const
TQCString mimeType() const
bool isPrintingSupported() const
bool isExecuteSupported() const
bool isVisibleInNavigator() const
Information about a single object that can be instantiated using Kexi Part.
PartInfoList * partInfoList()
The main class for kexi frontend parts like tables, queries, forms and reports.
Definition kexipart.h:66
int supportedViewModes() const
Definition kexipart.h:98
TQString instanceCaption() const
Definition kexipart.cpp:415
A project's main controller.
Definition kexiproject.h:68
KexiPart::ItemDict * items(KexiPart::Info *i)
A small tool button with icon and optional text.
Validates input for identifier name.
Definition identifier.h:49
KEXI_DB_EXPORT void getHTMLErrorMesage(Object *obj, TQString &msg, TQString &details)
KEXICORE_EXPORT KexiPart::Manager & partManager()
shared part manager
Definition kexi.cpp:97
@ TextViewMode
Also known as SQL View Mode.
Definition kexi.h:48