kexi

kexibrowser.cpp

00001 /* This file is part of the KDE project
00002    Copyright (C) 2002, 2003 Lucijan Busch <lucijan@gmx.at>
00003    Copyright (C) 2003-2006 Jaroslaw Staniek <js@iidea.pl>
00004 
00005    This library is free software; you can redistribute it and/or
00006    modify it under the terms of the GNU Library General Public
00007    License as published by the Free Software Foundation; either
00008    version 2 of the License, or (at your option) any later version.
00009 
00010    This library is distributed in the hope that it will be useful,
00011    but WITHOUT ANY WARRANTY; without even the implied warranty of
00012    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013    Library General Public License for more details.
00014 
00015    You should have received a copy of the GNU Library General Public License
00016    along with this library; see the file COPYING.LIB.  If not, write to
00017    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00018  * Boston, MA 02110-1301, USA.
00019 */
00020 
00021 #include "kexibrowser.h"
00022 #include "kexibrowser_p.h"
00023 #include "kexibrowseritem.h"
00024 
00025 #include <qheader.h>
00026 #include <qpoint.h>
00027 #include <qpixmapcache.h>
00028 #include <qtoolbutton.h>
00029 #include <qtooltip.h>
00030 #include <qwhatsthis.h>
00031 
00032 #include <kapplication.h>
00033 #include <kiconloader.h>
00034 #include <kdebug.h>
00035 #include <klocale.h>
00036 #include <kpopupmenu.h>
00037 #include <klistview.h>
00038 #include <kmessagebox.h>
00039 #include <klineedit.h>
00040 #include <kimageeffect.h>
00041 #include <kconfig.h>
00042 
00043 #include <kexi.h>
00044 #include <kexipart.h>
00045 #include <kexipartinfo.h>
00046 #include <kexipartitem.h>
00047 #include <kexiproject.h>
00048 #include <kexidialogbase.h>
00049 #include <keximainwindow.h>
00050 #include <kexiutils/identifier.h>
00051 #include <widget/utils/kexiflowlayout.h>
00052 #include <widget/kexismalltoolbutton.h>
00053 
00054 /*
00055 class KexiBrowserView : public QWidget
00056 {
00057     KexiBrowserView*(
00058 };
00059 
00060 KexiBrowserView::KexiBrowserView(KexiMainWindow *mainWin)
00061  : QWidget(mainWin, "KexiBrowserView")
00062 {
00063     QVBoxLayout *lyr = new QVBoxLayout(this);
00064     KexiFlowLayout *buttons_flyr = new KexiFlowLayout(lyr);
00065     m_browser = KexiBrowser(this, mainWin);
00066     lyr->addWidget(m_browser);
00067     setFocusProxy(m_browser);
00068 }*/
00069 
00070 KexiBrowser::KexiBrowser(KexiMainWindow *mainWin)
00071  : QWidget(mainWin, "KexiBrowser")
00072  , m_mainWin(mainWin)
00073  , m_actions( new KActionCollection(this) )
00074  , m_baseItems(199, false)
00075  , m_normalItems(199)
00076  , m_prevSelectedPart(0)
00077  , m_singleClick(false)
00078 // , m_nameEndsWithAsterisk(false)
00079  , m_readOnly(false)
00080 // , m_enableExecuteArea(true)
00081 {
00082     QVBoxLayout *lyr = new QVBoxLayout(this);
00083     KexiFlowLayout *buttons_flyr = new KexiFlowLayout(lyr);
00084 //  buttons_flyr->addSpacing(4);
00085 
00086     m_list = new KexiBrowserListView(this);
00087     lyr->addWidget(m_list);
00088     m_list->installEventFilter(this);
00089 
00090     m_list->renameLineEdit()->installEventFilter(this);
00091     connect( kapp, SIGNAL( settingsChanged(int) ), SLOT( slotSettingsChanged(int) ) );
00092     slotSettingsChanged(0);
00093 
00094     // actions
00095     m_deleteAction = new KAction(i18n("&Delete"), "editdelete", 0/*Key_Delete*/, 
00096         this, SLOT(slotRemove()), m_actions, "edit_delete");
00098     m_deleteAction->setToolTip(i18n("&Delete").replace("&",""));
00099     m_renameAction = new KAction(i18n("&Rename"), "", 0, 
00100         this, SLOT(slotRename()), m_actions, "edit_rename");
00101 #ifdef KEXI_SHOW_UNIMPLEMENTED
00102 //todo  plugSharedAction("edit_cut",SLOT(slotCut()));
00103 //todo  plugSharedAction("edit_copy",SLOT(slotCopy()));
00104 //todo  plugSharedAction("edit_paste",SLOT(slotPaste()));
00105 #endif
00106     
00107     setCaption(i18n("Project Navigator"));
00108     setIcon(*mainWin->icon());
00109 
00110     m_list->header()->hide();
00111     m_list->addColumn("");
00112     m_list->setShowToolTips(true);
00113     m_list->setRootIsDecorated(true);
00114     m_list->setSorting(0);
00115     m_list->sort();
00116     m_list->setAllColumnsShowFocus(true);
00117     m_list->setTooltipColumn(0);
00118     m_list->renameLineEdit()->setValidator( new KexiUtils::IdentifierValidator(this) );
00119     m_list->setResizeMode(QListView::LastColumn);
00120 
00121     connect(m_list, SIGNAL(contextMenu(KListView *, QListViewItem *, const QPoint &)),
00122         this, SLOT(slotContextMenu(KListView*, QListViewItem *, const QPoint&)));
00123     connect(m_list, SIGNAL(selectionChanged(QListViewItem*)), this,
00124         SLOT(slotSelectionChanged(QListViewItem*)));
00125     
00126     KConfig *config = kapp->config();
00127     config->setGroup("MainWindow");
00128     if (config->readBoolEntry("SingleClickOpensItem", false)) {
00129         connect(m_list, SIGNAL(executed(QListViewItem*)), this,
00130             SLOT(slotExecuteItem(QListViewItem*)));
00131     }
00132     else {
00133         connect(m_list, SIGNAL(doubleClicked(QListViewItem*)), this,
00134             SLOT(slotExecuteItem(QListViewItem*)));
00135         m_list->enableExecuteArea = false;
00136     }
00137 
00138     //init popups
00139     m_itemPopup = new KPopupMenu(this, "itemPopup");
00140     m_itemPopupTitle_id = m_itemPopup->insertTitle("");
00141     m_openAction = new KAction(i18n("&Open"), "fileopen", 0/*Key_Enter conflict!*/, this, 
00142         SLOT(slotOpenObject()), this, "open_object");
00143     m_openAction->setToolTip(i18n("Open object"));
00144     m_openAction->setWhatsThis(i18n("Opens object selected in the list"));
00145     m_openAction->plug(m_itemPopup);
00146     m_openAction_id = m_itemPopup->idAt(m_itemPopup->count()-1);
00147 //  m_openAction->plug(m_toolbar);
00148     KexiSmallToolButton *btn = new KexiSmallToolButton(this, m_openAction);
00149     buttons_flyr->add(btn);
00150 
00151     m_designAction = new KAction(i18n("&Design"), "edit", 0/*CTRL + Key_Enter conflict!*/, this, 
00152         SLOT(slotDesignObject()), this, "design_object");
00153     m_designAction->setToolTip(i18n("Design object"));
00154     m_designAction->setWhatsThis(i18n("Starts designing of the object selected in the list"));
00155     m_designAction->plug(m_itemPopup);
00156     m_designAction_id = m_itemPopup->idAt(m_itemPopup->count()-1);
00157 //  m_designAction->plug(m_toolbar);
00158     btn = new KexiSmallToolButton(this, m_designAction);
00159     buttons_flyr->add(btn);
00160 
00161     m_editTextAction = new KAction(i18n("Open in &Text View"), "", 0, this, 
00162         SLOT(slotEditTextObject()), this, "editText_object");
00163     m_editTextAction->setToolTip(i18n("Open object in text view"));
00164     m_editTextAction->setWhatsThis(i18n("Opens selected object in the list in text view"));
00165     m_editTextAction->plug(m_itemPopup);
00166     m_editTextAction_id = m_itemPopup->idAt(m_itemPopup->count()-1);
00167 
00168     m_newObjectAction = new KAction("", "filenew", 0, this, SLOT(slotNewObject()), this, "new_object");
00169     m_newObjectAction->plug(m_itemPopup);
00170 //  m_newObjectToolbarAction = new KAction("", 0, this, SLOT(slotNewObject()), this, "new_object");
00171 //  m_toolbar->insertSeparator();
00172 //  m_newObjectToolbarAction->plug(m_toolbar);
00173     m_newObjectToolButton = new KexiSmallToolButton(this, "", QIconSet(), "new_object");
00174     m_newObjectPopup = new KPopupMenu(this, "newObjectPopup");
00175     connect(m_newObjectPopup, SIGNAL(aboutToShow()), this, SLOT(slotNewObjectPopupAboutToShow()));
00176 //  KexiPart::Part* part = Kexi::partManager().part("kexi/table");
00177 //  m_newObjectPopup->insertItem( SmallIconSet(part->info()->createItemIcon()), part->instanceName() );
00178     m_newObjectToolButton->setPopup(m_newObjectPopup);
00179     m_newObjectToolButton->setPopupDelay(QApplication::startDragTime());
00180     connect(m_newObjectToolButton, SIGNAL(clicked()), this, SLOT(slotNewObject()));
00181     buttons_flyr->add(m_newObjectToolButton);
00182 
00183     m_deleteObjectToolButton = new KexiSmallToolButton(this, m_deleteAction);
00184     m_deleteObjectToolButton->setTextLabel("");
00185     buttons_flyr->add(m_deleteObjectToolButton);
00186 
00187     m_itemPopup->insertSeparator();
00188 
00189 #ifdef KEXI_SHOW_UNIMPLEMENTED
00190 //todo  plugSharedAction("edit_cut", m_itemPopup);
00191 //todo  plugSharedAction("edit_copy", m_itemPopup);
00192     m_itemPopup->insertSeparator();
00193 #endif
00194 
00195     m_executeAction = new KAction(i18n("Execute"), "player_play", 0, this,
00196         SLOT(slotExecuteObject()), this, "data_execute");
00197     m_executeAction->plug(m_itemPopup);
00198     m_executeAction_id = m_itemPopup->idAt(m_itemPopup->count()-1);
00199 
00200     m_exportActionMenu = new KActionMenu(i18n("Export"));
00201     m_dataExportAction = new KAction(i18n("Export->To File as Data &Table... ", "To &File as Data Table..."), 
00202         "table", 0, this, SLOT(slotExportAsDataTable()), this, "exportAsDataTable");
00203     m_dataExportAction->setWhatsThis(
00204         i18n("Exports data from the currently selected table or query data to a file."));
00205     m_exportActionMenu->insert( m_dataExportAction );
00206     m_exportActionMenu->plug(m_itemPopup);
00207     m_exportActionMenu_id = m_exportActionMenu->menuId(0);
00208     m_itemPopup->insertSeparator();
00209     m_exportActionMenu_id_sep = m_itemPopup->idAt(m_itemPopup->count()-1);
00210 
00211     m_printAction = new KAction(i18n("&Print..."), "fileprint", 0, this, 
00212         SLOT(slotPrintItem()), this, "printItem");
00213     m_printAction->setWhatsThis(
00214         i18n("Prints data from the currently selected table or query."));
00215     m_printAction->plug(m_itemPopup);
00216     m_printAction_id = m_itemPopup->idAt(m_itemPopup->count()-1);
00217     m_pageSetupAction = new KAction(i18n("Page Setup..."), "", 0, this, 
00218         SLOT(slotPageSetupForItem()), this, "pageSetupForItem");
00219     m_pageSetupAction->setWhatsThis(
00220         i18n("Shows page setup for printing the active table or query."));
00221     m_pageSetupAction->plug(m_itemPopup);
00222     m_pageSetupAction_id = m_itemPopup->idAt(m_itemPopup->count()-1);
00223     m_itemPopup->insertSeparator();
00224     m_pageSetupAction_id_sep = m_itemPopup->idAt(m_itemPopup->count()-1);
00225 
00226 
00227     m_renameAction->plug(m_itemPopup);
00228 //  plugSharedAction("edit_edititem", i18n("&Rename"), m_itemPopup);
00229 //  m_renameObjectAction = new KAction(i18n("&Rename"), 0, Key_F2, this, 
00230 //      SLOT(slotRename()), this, "rename_object");
00231 //  m_renameObjectAction->plug(m_itemPopup);
00232     m_deleteAction->plug(m_itemPopup);
00233 //  plugSharedAction("edit_delete", m_itemPopup);
00234 
00235     m_partPopup = new KPopupMenu(this, "partPopup");
00236     m_partPopupTitle_id = m_partPopup->insertTitle("");
00237     m_newObjectAction->plug(m_partPopup);
00238 #ifdef KEXI_SHOW_UNIMPLEMENTED
00239     m_partPopup->insertSeparator();
00240     plugSharedAction("edit_paste", m_partPopup);
00241 #endif
00242 }
00243 
00244 KexiBrowser::~KexiBrowser()
00245 {
00246 }
00247 
00248 void
00249 KexiBrowser::addGroup(KexiPart::Info& info)
00250 {
00251     if(!info.isVisibleInNavigator())
00252         return;
00253 
00254     KexiBrowserItem *item = new KexiBrowserItem(m_list, &info);
00255     m_baseItems.insert(info.mimeType().lower(), item);
00256 
00257 //  kdDebug() << "KexiBrowser::addGroup()" << endl;
00258 }
00259 
00260 void
00261 KexiBrowser::addItem(KexiPart::Item& item)
00262 {
00263     //part object for this item
00264     KexiBrowserItem *parent = item.mimeType().isEmpty() ? 0 : m_baseItems.find(item.mimeType().lower());
00265     if (!parent) //TODO: add "Other" part group for that
00266         return;
00267 //  kdDebug() << "KexiBrowser::addItem() found parent:" << parent << endl;
00268     
00269     KexiBrowserItem *bitem = new KexiBrowserItem(parent, parent->info(), &item);
00270     m_normalItems.insert(item.identifier(), bitem);
00271 }
00272 
00273 void 
00274 KexiBrowser::slotRemoveItem(const KexiPart::Item &item)
00275 {
00276     KexiBrowserItem *to_remove=m_normalItems.take(item.identifier());
00277     if (!to_remove)
00278         return;
00279 
00280     KexiBrowserItem *it = static_cast<KexiBrowserItem*>(m_list->selectedItem());
00281     
00282     QListViewItem *new_item_to_select = 0;
00283     if (it==to_remove) {//compute item to select if current one will be removed
00284         new_item_to_select = it->itemBelow();//nearest item to select
00285         if (!new_item_to_select || new_item_to_select->parent()!=it->parent()) {
00286             new_item_to_select = it->itemAbove();
00287         }
00288     }
00289     delete to_remove;
00290 
00291     if (new_item_to_select)
00292         m_list->setSelected(new_item_to_select, true);
00293 }
00294 
00295 void
00296 KexiBrowser::slotContextMenu(KListView* /*list*/, QListViewItem *item, const QPoint &pos)
00297 {
00298     if(!item)
00299         return;
00300     KexiBrowserItem *bit = static_cast<KexiBrowserItem*>(item);
00301     KPopupMenu *pm;
00302     if (bit->item()) {
00303         pm = m_itemPopup;
00304         //update popup title
00305         QString title_text = bit->text(0).stripWhiteSpace();
00306         KexiBrowserItem *par_it = static_cast<KexiBrowserItem*>(bit->parent());
00307         KexiPart::Part* par_part = 0;
00308         if (par_it && par_it->info() && ((par_part = Kexi::partManager().part(par_it->info()))) && !par_part->instanceCaption().isEmpty()) {
00309             //add part type name
00310             title_text +=  (" : " + par_part->instanceCaption());
00311         }
00312         pm->changeTitle(m_itemPopupTitle_id, *bit->pixmap(0), title_text);
00313     }
00314     else {
00315         pm = m_partPopup;
00316         QString title_text = bit->text(0).stripWhiteSpace();
00317         pm->changeTitle(m_partPopupTitle_id, *bit->pixmap(0), title_text);
00318 /*      KexiPart::Part* part = Kexi::partManager().part(bit->info());
00319         if (part)
00320             m_newObjectAction->setText(i18n("&Create Object: %1...").arg( part->instanceName() ));
00321         else
00322             m_newObjectAction->setText(i18n("&Create Object..."));
00323         m_newObjectAction->setIconSet( SmallIconSet(bit->info()->itemIcon()) );*/
00324         m_list->setCurrentItem(item);
00325         m_list->repaintItem(item);
00326     }
00327     pm->exec(pos);
00328 }
00329 
00330 void
00331 KexiBrowser::slotExecuteItem(QListViewItem *vitem)
00332 {
00333 //  kdDebug() << "KexiBrowser::slotExecuteItem()" << endl;
00334     KexiBrowserItem *it = static_cast<KexiBrowserItem*>(vitem);
00335     if (!it)
00336         return;
00337     if (!it->item() && !m_singleClick /*annoying when in single click mode*/) {
00338         m_list->setOpen( vitem, !vitem->isOpen() );
00339         return;
00340     }
00341     emit openOrActivateItem( it->item(), Kexi::DataViewMode );
00342 }
00343 
00344 void
00345 KexiBrowser::slotSelectionChanged(QListViewItem* i)
00346 {
00347     KexiBrowserItem *it = static_cast<KexiBrowserItem*>(i);
00348     if (!it)
00349         return;
00350     KexiPart::Part* part = Kexi::partManager().part(it->info());
00351     if (!part) {
00352         it = static_cast<KexiBrowserItem*>(it->parent());
00353         if (it) {
00354             part = Kexi::partManager().part(it->info());
00355         }
00356     }
00357 
00358     const bool gotitem = it && it->item();
00359     //bool gotgroup = it && !it->item();
00360 //TODO: also check if the item is not read only
00361     m_deleteAction->setEnabled(gotitem && !m_readOnly);
00362     m_deleteObjectToolButton->setEnabled(gotitem && !m_readOnly);
00363 #ifdef KEXI_SHOW_UNIMPLEMENTED
00364 //todo  setAvailable("edit_cut",gotitem);
00365 //todo  setAvailable("edit_copy",gotitem);
00366 //todo  setAvailable("edit_edititem",gotitem);
00367 #endif
00368 
00369     m_openAction->setEnabled(gotitem && part && (part->supportedViewModes() & Kexi::DataViewMode));
00370     m_designAction->setEnabled(gotitem && part && (part->supportedViewModes() & Kexi::DesignViewMode));
00371     m_editTextAction->setEnabled(gotitem && part && (part->supportedViewModes() & Kexi::TextViewMode));
00372 
00373     m_itemPopup->setItemVisible(m_openAction_id, m_openAction->isEnabled());
00374     m_itemPopup->setItemVisible(m_designAction_id, m_designAction->isEnabled());
00375     m_itemPopup->setItemVisible(m_editTextAction_id, part && m_editTextAction->isEnabled());
00376     m_itemPopup->setItemVisible(m_executeAction_id, gotitem && it->info()->isExecuteSupported());
00377     m_itemPopup->setItemVisible(m_exportActionMenu_id, gotitem && it->info()->isDataExportSupported());
00378     m_itemPopup->setItemVisible(m_exportActionMenu_id_sep, gotitem && it->info()->isDataExportSupported());
00379     m_itemPopup->setItemVisible(m_printAction_id, gotitem && it->info()->isPrintingSupported());
00380     m_itemPopup->setItemVisible(m_pageSetupAction_id, gotitem && it->info()->isPrintingSupported());
00381     m_itemPopup->setItemVisible(m_pageSetupAction_id_sep, gotitem && it->info()->isPrintingSupported());
00382 
00383     if (m_prevSelectedPart != part) {
00384         m_prevSelectedPart = part;
00385         if (part) {
00386             m_newObjectAction->setText(i18n("&Create Object: %1...").arg( part->instanceCaption() ));
00387             m_newObjectAction->setIcon( part->info()->createItemIcon() );
00388 //          m_newObjectToolbarAction->setIcon( part->info()->createItemIcon() );
00389 //          m_newObjectToolbarAction->setText(m_newObjectAction->text());
00390             m_newObjectToolButton->setIconSet( part->info()->createItemIcon() );
00391             QToolTip::add(m_newObjectToolButton, 
00392                 i18n("Create object: %1").arg( part->instanceCaption().lower() ));
00393             QWhatsThis::add(m_newObjectToolButton, 
00394                 i18n("Creates a new object: %1").arg( part->instanceCaption().lower() ));
00395         } else {
00396             m_newObjectAction->setText(i18n("&Create Object..."));
00397 //          m_newObjectToolbarAction->setIconSet( SmallIconSet("filenew") );
00398 //          m_newObjectToolbarAction->setText(m_newObjectAction->text());
00399             m_newObjectToolButton->setIconSet( "filenew" );
00400             QToolTip::add(m_newObjectToolButton, i18n("Create object"));
00401             QWhatsThis::add(m_newObjectToolButton, i18n("Creates a new object"));
00402         }
00403     }
00404     emit selectionChanged(it ? it->item() : 0);
00405 }
00406 
00407 void KexiBrowser::installEventFilter ( const QObject * filterObj )
00408 {
00409     if (!filterObj)
00410         return;
00411     m_list->installEventFilter ( filterObj );
00412     QWidget::installEventFilter ( filterObj );
00413 }
00414 
00415 bool KexiBrowser::eventFilter ( QObject *o, QEvent * e )
00416 {
00417     if (o==m_list && e->type()==QEvent::Resize) {
00418         kdDebug() << "resize!" << endl;
00419     }
00420     if (o==m_list->renameLineEdit()) {
00421         if (e->type()==QEvent::Hide) 
00422             itemRenameDone();
00423     }
00424     else if (e->type()==QEvent::KeyPress) {
00425         QKeyEvent *ke = static_cast<QKeyEvent*>(e);
00426         if (ke->key()==Qt::Key_Enter || ke->key()==Qt::Key_Return) {
00427             if (0==(ke->state() & (Qt::ShiftButton|Qt::ControlButton|Qt::AltButton))) {
00428                 QListViewItem *it = m_list->selectedItem();
00429                 if (it)
00430                     slotExecuteItem(it);
00431             }
00432             else if (Qt::ControlButton==(ke->state() & (Qt::ShiftButton|Qt::ControlButton|Qt::AltButton))) {
00433                 slotDesignObject();
00434             }
00435         }
00436     }
00437     else if (e->type()==QEvent::AccelOverride) {
00438         QKeyEvent *ke = static_cast<QKeyEvent*>(e);
00439         //override delete action
00440         if (ke->key()==Key_Delete && ke->state()==NoButton) {
00441             slotRemove();
00442             ke->accept();
00443             return true;
00444         }
00445         if (ke->key()==Key_F2 && ke->state()==NoButton) {
00446             slotRename();
00447             ke->accept();
00448             return true;
00449         }
00450 /*      else if (ke->key()==Key_Enter || ke->key()==Key_Return) {
00451             if (ke->state()==ControlButton) {
00452                 slotDesignObject();
00453             }
00454             else if (ke->state()==0 && !m_list->renameLineEdit()->isVisible()) {
00455                 QListViewItem *it = m_list->selectedItem();
00456                 if (it)
00457                     slotExecuteItem(it);
00458             }
00459             ke->accept();
00460             return true;
00461         }*/
00462     }
00463     return false;
00464 }
00465 
00466 void KexiBrowser::slotRemove()
00467 {
00468     if (!m_deleteAction->isEnabled())
00469         return;
00470     KexiBrowserItem *it = static_cast<KexiBrowserItem*>(m_list->selectedItem());
00471     if (!it || !it->item())
00472         return;
00473     emit removeItem( it->item() );
00474 }
00475 
00476 void KexiBrowser::slotNewObject()
00477 {
00478     KexiBrowserItem *it = static_cast<KexiBrowserItem*>(m_list->selectedItem());
00479     if (!it || !it->info())
00480         return;
00481     emit newItem( it->info() );
00482 }
00483 
00484 void KexiBrowser::slotOpenObject()
00485 {
00486     KexiBrowserItem *it = static_cast<KexiBrowserItem*>(m_list->selectedItem());
00487     if (!it || !it->item())
00488         return;
00489     emit openItem( it->item(), Kexi::DataViewMode );
00490 }
00491 
00492 void KexiBrowser::slotDesignObject()
00493 {
00494     KexiBrowserItem *it = static_cast<KexiBrowserItem*>(m_list->selectedItem());
00495     if (!it || !it->item())
00496         return;
00497     emit openItem( it->item(), Kexi::DesignViewMode );
00498 }
00499 
00500 void KexiBrowser::slotEditTextObject()
00501 {
00502     KexiBrowserItem *it = static_cast<KexiBrowserItem*>(m_list->selectedItem());
00503     if (!it || !it->item())
00504         return;
00505     emit openItem( it->item(), Kexi::TextViewMode );
00506 }
00507 
00508 void KexiBrowser::slotCut()
00509 {
00510 //  KEXI_UNFINISHED_SHARED_ACTION("edit_cut");
00511     //TODO
00512 }
00513 
00514 void KexiBrowser::slotCopy()
00515 {
00516 //  KEXI_UNFINISHED_SHARED_ACTION("edit_copy");
00517     //TODO
00518 }
00519 
00520 void KexiBrowser::slotPaste()
00521 {
00522 //  KEXI_UNFINISHED_SHARED_ACTION("edit_paste");
00523     //TODO
00524 }
00525 
00526 void KexiBrowser::slotRename()
00527 {
00528     KexiBrowserItem *it = static_cast<KexiBrowserItem*>(m_list->selectedItem());
00529     if (it)
00530         m_list->rename(it, 0);
00531 }
00532 
00533 void KexiBrowser::itemRenameDone()
00534 {
00535     KexiBrowserItem *it = static_cast<KexiBrowserItem*>(m_list->selectedItem());
00536     if (!it)
00537         return;
00538     QString txt = it->text(0).stripWhiteSpace();
00539     bool ok = it->item()->name().lower()!=txt.lower(); //the new name must be different
00540     if (ok) {
00541         /* TODO */
00542         emit renameItem(it->item(), txt, ok);
00543     }
00544     if (!ok) {
00545         txt = it->item()->name(); //revert
00546     }
00547     //"modified" flag has been removed before editing: readd it
00548     if (m_list->nameEndsWithAsterisk) {
00549         txt += "*";
00550         m_list->nameEndsWithAsterisk = false;
00551     }
00552     it->setText(0, txt);
00553     it->parent()->sort();
00554     setFocus();
00555 }
00556 
00557 void KexiBrowser::setFocus()
00558 {
00559     if (!m_list->selectedItem() && m_list->firstChild())//select first
00560         m_list->setSelected(m_list->firstChild(), true);
00561     m_list->setFocus();
00562 }
00563 
00564 void KexiBrowser::updateItemName( KexiPart::Item& item, bool dirty )
00565 {
00566     KexiBrowserItem *bitem = m_normalItems[item.identifier()];
00567     if (!bitem)
00568         return;
00569     bitem->setText( 0, item.name() + (dirty ? "*" : "") );
00570 }
00571 
00572 void KexiBrowser::slotSettingsChanged(int)
00573 {
00574     m_singleClick = KGlobalSettings::singleClick();
00575 }
00576 
00577 void KexiBrowser::highlightItem(KexiPart::Item& item)
00578 {
00579     KexiBrowserItem *bitem = m_normalItems[item.identifier()];
00580     if (!bitem)
00581         return;
00582     m_list->setSelected(bitem, true);
00583     m_list->ensureItemVisible(bitem);
00584     m_list->setCurrentItem(bitem);
00585 }
00586 
00587 void KexiBrowser::slotNewObjectPopupAboutToShow()
00588 {
00589     if (m_newObjectPopup->count()==0) {
00590         //preload items
00591         KexiPart::PartInfoList *list = Kexi::partManager().partInfoList(); //this list is properly sorted
00592         for (KexiPart::PartInfoListIterator it(*list); it.current(); ++it) {
00593             //add an item to "New object" toolbar popup 
00594             KAction *action = m_mainWin->actionCollection()->action( 
00595                 KexiPart::nameForCreateAction(*it.current()) );
00596             if (action) {
00597                 action->plug(m_newObjectPopup);
00598             }
00599             else {
00601             }
00602         }
00603     }
00604 }
00605 
00606 void KexiBrowser::slotExecuteObject()
00607 {
00608     KexiPart::Item* item = selectedPartItem();
00609     if (item)
00610         emit executeItem( item );
00611 }
00612 
00613 void KexiBrowser::slotExportAsDataTable()
00614 {
00615     KexiPart::Item* item = selectedPartItem();
00616     if (item)
00617         emit exportItemAsDataTable( item );
00618 }
00619 
00620 KexiPart::Item* KexiBrowser::selectedPartItem() const
00621 {
00622     KexiBrowserItem *it = static_cast<KexiBrowserItem*>(m_list->selectedItem());
00623     return it ? it->item() : 0;
00624 }
00625 
00626 bool KexiBrowser::actionEnabled(const QCString& actionName) const
00627 {
00628     if (actionName=="project_export_data_table")
00629         return m_itemPopup->isItemVisible(m_exportActionMenu_id);
00630     kdWarning() << "KexiBrowser::actionEnabled() no such action: " << actionName << endl;
00631     return false;
00632 }
00633 
00634 void KexiBrowser::slotPrintItem()
00635 {
00636     KexiPart::Item* item = selectedPartItem();
00637     if (item)
00638         emit printItem( item );
00639 }
00640 
00641 void KexiBrowser::slotPageSetupForItem()
00642 {
00643     KexiPart::Item* item = selectedPartItem();
00644     if (item)
00645         emit pageSetupForItem( item );
00646 }
00647 
00648 
00649 void KexiBrowser::setReadOnly(bool set)
00650 {
00651     m_readOnly = set;
00652     m_deleteAction->setEnabled(!m_readOnly);
00653     m_renameAction->setEnabled(!m_readOnly);
00654     m_newObjectAction->setEnabled(!m_readOnly);
00655     m_newObjectPopup->setEnabled(!m_readOnly);
00656     m_newObjectToolButton->setEnabled(!m_readOnly);
00657 }
00658 
00659 bool KexiBrowser::isReadOnly() const
00660 {
00661     return m_readOnly;
00662 }
00663 
00664 void KexiBrowser::clear()
00665 {
00666     m_list->clear();
00667 }
00668 
00669 //--------------------------------------------
00670 KexiBrowserListView::KexiBrowserListView(QWidget *parent)
00671  : KListView(parent, "KexiBrowserListView")
00672  , nameEndsWithAsterisk(false)
00673  , enableExecuteArea(true)
00674 {
00675 }
00676 
00677 KexiBrowserListView::~KexiBrowserListView()
00678 {
00679 }
00680 
00681 void KexiBrowserListView::rename(QListViewItem *item, int c)
00682 {
00683     if (renameLineEdit()->isVisible())
00684         return;
00685     KexiBrowserItem *it = static_cast<KexiBrowserItem*>(item);
00686     if (it->item() && c==0) {
00687         //only edit 1st column for items, not item groups
00688 //TODO: also check it this item is not read-only
00689 //      item->setText(0, item->text(0).mid(1,item->text(0).length()-2));
00690         //remove "modified" flag for editing
00691         nameEndsWithAsterisk = item->text(0).endsWith("*");
00692         if (nameEndsWithAsterisk)
00693             item->setText(0, item->text(0).left(item->text(0).length()-1));
00694         KListView::rename(item, c);
00695         adjustColumn(0);
00696     }
00697 }
00698 
00699 bool KexiBrowserListView::isExecuteArea( const QPoint& point )
00700 {
00701     return enableExecuteArea && KListView::isExecuteArea(point);
00702 }
00703 
00704 #include "kexibrowser.moc"
00705 #include "kexibrowser_p.moc"
KDE Home | KDE Accessibility Home | Description of Access Keys