21#include "kexibrowser.h"
22#include "kexibrowser_p.h"
23#include "kexibrowseritem.h"
27#include <tqpixmapcache.h>
28#include <tqtoolbutton.h>
30#include <tqwhatsthis.h>
32#include <tdeapplication.h>
33#include <kiconloader.h>
36#include <tdepopupmenu.h>
37#include <tdelistview.h>
38#include <tdemessagebox.h>
40#include <kimageeffect.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>
72 : TQWidget(parent,
"KexiBrowser")
74 , m_features(features)
75 , m_actions( new TDEActionCollection(this) )
76 , m_baseItems(199, false)
78 , m_prevSelectedPart(0)
79 , m_singleClick(false)
84 setCaption(i18n(
"Project Navigator"));
85 setIcon(*m_mainWin->icon());
87 TQVBoxLayout *lyr =
new TQVBoxLayout(
this);
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);
97 m_list->header()->hide();
98 m_list->addColumn(
"");
99 m_list->setShowToolTips(
true);
100 m_list->setSorting(0);
102 m_list->setAllColumnsShowFocus(
true);
103 m_list->setTooltipColumn(0);
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*)));
111 TDEConfig *config = kapp->config();
112 config->setGroup(
"MainWindow");
114 && config->readBoolEntry(
"SingleClickOpensItem",
false))
116 connect(m_list, TQ_SIGNAL(executed(TQListViewItem*)),
this,
117 TQ_SLOT(slotExecuteItem(TQListViewItem*)));
120 connect(m_list, TQ_SIGNAL(doubleClicked(TQListViewItem*)),
this,
121 TQ_SLOT(slotExecuteItem(TQListViewItem*)));
122 m_list->enableExecuteArea =
false;
126 m_openAction =
new TDEAction(i18n(
"&Open"),
"document-open", 0,
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"));
135 buttons_flyr->add(btn);
138 if (m_mainWin->userMode()) {
143 m_editTextAction = 0;
144 m_newObjectAction = 0;
145 m_newObjectPopup = 0;
148 m_deleteAction =
new TDEAction(i18n(
"&Delete"),
"edit-delete", 0,
149 this, TQ_SLOT(slotRemove()), m_actions,
"edit_delete");
151 m_deleteAction->setToolTip(i18n(
"&Delete").replace(
"&",
""));
153 m_renameAction =
new TDEAction(i18n(
"&Rename"),
"", 0,
154 this, TQ_SLOT(slotRename()), m_actions,
"edit_rename");
155#ifdef KEXI_SHOW_UNIMPLEMENTED
161 m_designAction =
new TDEAction(i18n(
"&Design"),
"edit", 0,
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"));
167 buttons_flyr->add(btn);
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"));
175 m_newObjectAction =
new TDEAction(
"",
"document-new", 0,
this, TQ_SLOT(slotNewObject()),
this,
"new_object");
178 m_newObjectPopup =
new TDEPopupMenu(
this,
"newObjectPopup");
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);
188 m_deleteObjectToolButton->setTextLabel(
"");
189 buttons_flyr->add(m_deleteObjectToolButton);
193 m_executeAction =
new TDEAction(i18n(
"Execute"),
"media-playback-start", 0,
this,
194 TQ_SLOT(slotExecuteObject()),
this,
"data_execute");
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 );
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."));
212 if (m_mainWin->userMode()) {
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);
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);
233 if (m_designAction) {
234 m_designAction->plug(m_itemPopup);
235 m_designAction_id = m_itemPopup->idAt(m_itemPopup->count()-1);
238 if (m_editTextAction) {
239 m_editTextAction->plug(m_itemPopup);
240 m_editTextAction_id = m_itemPopup->idAt(m_itemPopup->count()-1);
243 if (m_newObjectAction) {
244 m_newObjectAction->plug(m_itemPopup);
245 m_itemPopup->insertSeparator();
247#ifdef KEXI_SHOW_UNIMPLEMENTED
252 m_executeAction->plug(m_itemPopup);
253 m_executeAction_id = m_itemPopup->idAt(m_itemPopup->count()-1);
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);
260 m_printAction->plug(m_itemPopup);
261 m_printAction_id = m_itemPopup->idAt(m_itemPopup->count()-1);
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);
270 m_pageSetupAction_id_sep = -1;
274 m_renameAction->plug(m_itemPopup);
276 m_deleteAction->plug(m_itemPopup);
287KexiBrowser::~KexiBrowser()
292 TQString* partManagerErrorMessages)
296 m_list->setRootIsDecorated(m_itemsMimeType.isEmpty());
299 for (
KexiPart::Info *info = pl->first(); info; info = pl->next()) {
300 if (!info->isVisibleInNavigator())
302 if (!m_itemsMimeType.isEmpty() && info->mimeType()!=m_itemsMimeType.latin1())
319 if (m_itemsMimeType.isEmpty()) {
320 groupItem = addGroup(*info);
326 KexiPart::ItemDict *item_dict = prj->
items(info);
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())
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>";
343 partManagerErrorMessages->append( TQString(
"<li>") + msg );
344 if (!details.isEmpty())
345 partManagerErrorMessages->append(TQString(
"<br>")+details);
346 partManagerErrorMessages->append(
"</li>");
350 if (partManagerErrorMessages && !partManagerErrorMessages->isEmpty())
351 partManagerErrorMessages->append(
"</ul></p>");
356 return m_itemsMimeType;
365 m_baseItems.insert(info.
mimeType().lower(), item);
373 KexiBrowserItem *parent = item.mimeType().isEmpty() ? 0 : m_baseItems.find(item.mimeType().lower());
374 return addItem(item, parent, parent->
info());
382 KexiBrowserItem *bitem;
384 bitem =
new KexiBrowserItem(parent, info, &item);
386 bitem =
new KexiBrowserItem(m_list, info, &item);
387 m_normalItems.insert(item.identifier(), bitem);
394 KexiBrowserItem *to_remove=m_normalItems.take(item.identifier());
398 KexiBrowserItem *it =
static_cast<KexiBrowserItem*
>(m_list->selectedItem());
400 TQListViewItem *new_item_to_select = 0;
402 new_item_to_select = it->itemBelow();
403 if (!new_item_to_select || new_item_to_select->parent()!=it->parent()) {
404 new_item_to_select = it->itemAbove();
409 if (new_item_to_select)
410 m_list->setSelected(new_item_to_select,
true);
414KexiBrowser::slotContextMenu(TDEListView* , TQListViewItem *item,
const TQPoint &pos)
418 KexiBrowserItem *bit =
static_cast<KexiBrowserItem*
>(item);
419 TDEPopupMenu *pm = 0;
423 TQString title_text = bit->text(0).stripWhiteSpace();
424 KexiBrowserItem *par_it =
static_cast<KexiBrowserItem*
>(bit->parent());
425 KexiPart::Part* par_part = 0;
430 pm->changeTitle(m_itemPopupTitle_id, *bit->pixmap(0), title_text);
432 else if (m_partPopup) {
434 TQString title_text = bit->text(0).stripWhiteSpace();
435 pm->changeTitle(m_partPopupTitle_id, *bit->pixmap(0), title_text);
442 m_list->setCurrentItem(item);
443 m_list->repaintItem(item);
450KexiBrowser::slotExecuteItem(TQListViewItem *vitem)
453 KexiBrowserItem *it =
static_cast<KexiBrowserItem*
>(vitem);
456 if (!it->
item() && !m_singleClick ) {
457 m_list->setOpen( vitem, !vitem->isOpen() );
461 emit executeItem( it->
item() );
467KexiBrowser::slotSelectionChanged(TQListViewItem* i)
469 KexiBrowserItem *it =
static_cast<KexiBrowserItem*
>(i);
474 it =
static_cast<KexiBrowserItem*
>(it->parent());
480 const bool gotitem = it && it->
item();
483 if (m_deleteAction) {
484 m_deleteAction->setEnabled(gotitem && !m_readOnly);
486 m_deleteObjectToolButton->setEnabled(gotitem && !m_readOnly);
489#ifdef KEXI_SHOW_UNIMPLEMENTED
495 m_openAction->setEnabled(gotitem && part && (part->
supportedViewModes() & Kexi::DataViewMode));
497 m_designAction->setEnabled(gotitem && part && (part->
supportedViewModes() & Kexi::DesignViewMode));
498 if (m_editTextAction)
502 m_itemPopup->setItemVisible(m_openAction_id, m_openAction->isEnabled());
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());
509 if (m_exportActionMenu) {
515 if (m_pageSetupAction) {
517 if (m_pageSetupAction_id_sep!=-1)
522 if (m_prevSelectedPart != part) {
523 m_prevSelectedPart = part;
525 if (m_newObjectAction) {
526 m_newObjectAction->setText(i18n(
"&Create Object: %1...").arg( part->
instanceCaption() ));
529 m_newObjectToolButton->setIconSet( part->info()->
createItemIcon() );
530 TQToolTip::add(m_newObjectToolButton,
532 TQWhatsThis::add(m_newObjectToolButton,
533 i18n(
"Creates a new object: %1").arg( part->
instanceCaption().lower() ));
537 if (m_newObjectAction) {
538 m_newObjectAction->setText(i18n(
"&Create Object..."));
542 m_newObjectToolButton->setIconSet(
"document-new" );
543 TQToolTip::add(m_newObjectToolButton, i18n(
"Create object"));
544 TQWhatsThis::add(m_newObjectToolButton, i18n(
"Creates a new object"));
549 emit selectionChanged(it ? it->
item() : 0);
552void KexiBrowser::installEventFilter (
const TQObject * filterObj )
556 m_list->installEventFilter ( filterObj );
557 TQWidget::installEventFilter ( filterObj );
560bool KexiBrowser::eventFilter ( TQObject *o, TQEvent * e )
562 if (o==m_list && e->type()==TQEvent::Resize) {
563 kdDebug() <<
"resize!" << endl;
565 if (o==m_list->renameLineEdit()) {
566 if (e->type()==TQEvent::Hide)
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();
577 else if (TQt::ControlButton==(ke->state() & (TQt::ShiftButton|TQt::ControlButton|TQt::AltButton))) {
582 else if (e->type()==TQEvent::AccelOverride) {
583 TQKeyEvent *ke =
static_cast<TQKeyEvent*
>(e);
585 if (ke->key()==TQt::Key_Delete && ke->state()==TQt::NoButton) {
591 if (ke->key()==TQt::Key_F2 && ke->state()==TQt::NoButton) {
612void KexiBrowser::slotRemove()
614 if (!m_deleteAction || !m_deleteAction->isEnabled() || !(m_features &
Writable))
616 KexiBrowserItem *it =
static_cast<KexiBrowserItem*
>(m_list->selectedItem());
617 if (!it || !it->
item())
619 emit removeItem( it->
item() );
622void KexiBrowser::slotNewObject()
624 if (!m_newObjectAction || !(m_features &
Writable))
626 KexiBrowserItem *it =
static_cast<KexiBrowserItem*
>(m_list->selectedItem());
627 if (!it || !it->
info())
629 emit newItem( it->
info() );
632void KexiBrowser::slotOpenObject()
634 KexiBrowserItem *it =
static_cast<KexiBrowserItem*
>(m_list->selectedItem());
635 if (!it || !it->
item())
637 emit openItem( it->
item(), Kexi::DataViewMode );
640void KexiBrowser::slotDesignObject()
644 KexiBrowserItem *it =
static_cast<KexiBrowserItem*
>(m_list->selectedItem());
645 if (!it || !it->
item())
647 emit openItem( it->
item(), Kexi::DesignViewMode );
650void KexiBrowser::slotEditTextObject()
652 if (!m_editTextAction)
654 KexiBrowserItem *it =
static_cast<KexiBrowserItem*
>(m_list->selectedItem());
655 if (!it || !it->
item())
660void KexiBrowser::slotCut()
668void KexiBrowser::slotCopy()
674void KexiBrowser::slotPaste()
682void KexiBrowser::slotRename()
684 if (!m_renameAction || !(m_features &
Writable))
686 KexiBrowserItem *it =
static_cast<KexiBrowserItem*
>(m_list->selectedItem());
688 m_list->rename(it, 0);
691void KexiBrowser::itemRenameDone()
695 KexiBrowserItem *it =
static_cast<KexiBrowserItem*
>(m_list->selectedItem());
698 TQString txt = it->text(0).stripWhiteSpace();
699 bool ok = it->
item()->name().lower()!=txt.lower();
702 emit renameItem(it->
item(), txt, ok);
705 txt = it->
item()->name();
708 if (m_list->nameEndsWithAsterisk) {
710 m_list->nameEndsWithAsterisk =
false;
713 it->parent()->sort();
717void KexiBrowser::setFocus()
719 if (!m_list->selectedItem() && m_list->firstChild())
720 m_list->setSelected(m_list->firstChild(),
true);
724void KexiBrowser::updateItemName(
KexiPart::Item& item,
bool dirty )
728 KexiBrowserItem *bitem = m_normalItems[item.identifier()];
731 bitem->setText( 0, item.name() + (dirty ?
"*" :
"") );
734void KexiBrowser::slotSettingsChanged(
int)
736 m_singleClick = TDEGlobalSettings::singleClick();
741 KexiBrowserItem *bitem = m_normalItems[item.identifier()];
744 m_list->setSelected(bitem,
true);
745 m_list->ensureItemVisible(bitem);
746 m_list->setCurrentItem(bitem);
749void KexiBrowser::clearSelection()
751 m_list->clearSelection();
752 TQListViewItem *item = m_list->firstChild();
754 m_list->ensureItemVisible(item);
760 if ((m_features &
Toolbar) && m_newObjectPopup && m_newObjectPopup->count()==0) {
763 for (KexiPart::PartInfoListIterator it(*list); it.current(); ++it) {
765 TDEAction *action = m_mainWin->actionCollection()->action(
766 TQString(KexiPart::nameForCreateAction(*it.current())).ascii() );
768 action->plug(m_newObjectPopup);
777void KexiBrowser::slotExecuteObject()
779 if (!m_executeAction)
783 emit executeItem( item );
786void KexiBrowser::slotExportAsDataTable()
788 if (!m_dataExportAction)
790 KexiPart::Item* item = selectedPartItem();
792 emit exportItemAsDataTable( item );
797 KexiBrowserItem *it =
static_cast<KexiBrowserItem*
>(m_list->selectedItem());
798 return it ? it->
item() : 0;
801bool KexiBrowser::actionEnabled(
const TQCString& actionName)
const
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;
809void KexiBrowser::slotPrintItem()
813 KexiPart::Item* item = selectedPartItem();
815 emit printItem( item );
818void KexiBrowser::slotPageSetupForItem()
820 if (!m_pageSetupAction)
822 KexiPart::Item* item = selectedPartItem();
824 emit pageSetupForItem( item );
832 m_deleteAction->setEnabled(!m_readOnly);
834 m_renameAction->setEnabled(!m_readOnly);
835 if (m_newObjectAction) {
836 m_newObjectAction->setEnabled(!m_readOnly);
838 m_newObjectPopup->setEnabled(!m_readOnly);
839 m_newObjectToolButton->setEnabled(!m_readOnly);
844bool KexiBrowser::isReadOnly()
const
849void KexiBrowser::clear()
855KexiBrowserListView::KexiBrowserListView(TQWidget *parent)
856 : TDEListView(parent,
"KexiBrowserListView")
857 , nameEndsWithAsterisk(false)
858 , enableExecuteArea(true)
862KexiBrowserListView::~KexiBrowserListView()
866void KexiBrowserListView::rename(TQListViewItem *item,
int c)
868 if (renameLineEdit()->isVisible())
871 if (it->
item() && c==0) {
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);
884bool KexiBrowserListView::isExecuteArea(
const TQPoint& point )
886 return enableExecuteArea && TDEListView::isExecuteArea(point);
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
@ SingleClickOpensItemOptionEnabled
enables "SingleClickOpensItem" option
@ Writable
the browser supports actions that modify the project (e.g. delete, rename)
@ Toolbar
the browser displays
void slotNewObjectPopupAboutToShow()
KexiBrowser(TQWidget *parent, KexiMainWindow *mainWin, int features=DefaultFeatures)
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.
int supportedViewModes() const
TQString instanceCaption() const
A project's main controller.
KexiPart::ItemDict * items(KexiPart::Info *i)
Validates input for identifier name.
KEXI_DB_EXPORT void getHTMLErrorMesage(Object *obj, TQString &msg, TQString &details)
KEXICORE_EXPORT KexiPart::Manager & partManager()
shared part manager
@ TextViewMode
Also known as SQL View Mode.