kexi

KexiConnSelector.cpp

00001 /* This file is part of the KDE project
00002    Copyright (C) 2003,2005 Jaroslaw Staniek <js@iidea.pl>
00003 
00004    This program is free software; you can redistribute it and/or
00005    modify it under the terms of the GNU Library General Public
00006    License as published by the Free Software Foundation; either
00007    version 2 of the License, or (at your option) any later version.
00008 
00009    This program is distributed in the hope that it will be useful,
00010    but WITHOUT ANY WARRANTY; without even the implied warranty of
00011    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012    Library General Public License for more details.
00013 
00014    You should have received a copy of the GNU Library General Public License
00015    along with this program; see the file COPYING.  If not, write to
00016    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00017  * Boston, MA 02110-1301, USA.
00018  */
00019 
00020 #include "KexiConnSelector.h"
00021 
00022 #include <kexidb/drivermanager.h>
00023 #include <kexidb/connectiondata.h>
00024 
00025 #include <kexi.h>
00026 #include "KexiConnSelectorBase.h"
00027 //#include "KexiOpenExistingFile.h"
00028 #include "KexiPrjTypeSelector.h"
00029 #include <widget/kexidbconnectionwidget.h>
00030 
00031 #include <kapplication.h>
00032 #include <kiconloader.h>
00033 #include <kmimetype.h>
00034 #include <klocale.h>
00035 #include <kdebug.h>
00036 #include <kconfig.h>
00037 #include <kurlcombobox.h>
00038 #include <ktoolbar.h>
00039 #include <kpopupmenu.h>
00040 #include <ktoolbarbutton.h>
00041 #include <kactionclasses.h>
00042 
00043 #include <qlabel.h>
00044 #include <qpushbutton.h>
00045 #include <qlayout.h>
00046 #include <qcheckbox.h>
00047 #include <qtooltip.h>
00048 #include <qtextedit.h>
00049 #include <qgroupbox.h>
00050 #include <qwidgetstack.h>
00051 #include <qbuttongroup.h>
00052 
00053 ConnectionDataLVItem::ConnectionDataLVItem(KexiDB::ConnectionData *data, 
00054     const KexiDB::Driver::Info& info, QListView *list)
00055     : QListViewItem(list)
00056     , m_data(data)
00057 {
00058     update(info);
00059 }
00060 
00061 ConnectionDataLVItem::~ConnectionDataLVItem() 
00062 {
00063 }
00064 
00065 void ConnectionDataLVItem::update(const KexiDB::Driver::Info& info)
00066 {
00067     setText(0, m_data->caption+"  ");
00068     const QString &sfile = i18n("File");
00069     QString drvname = info.caption.isEmpty() ? m_data->driverName : info.caption;
00070     if (info.fileBased)
00071         setText(1, sfile + " ("+drvname+")  " );
00072     else
00073         setText(1, drvname+"  " );
00074     setText(2, (info.fileBased ? (QString("<")+sfile.lower()+">") : m_data->serverInfoString(true))+"  " );
00075 }
00076 
00077 /*================================================================*/
00078 
00080 class KexiConnSelectorWidgetPrivate
00081 {
00082 public:
00083     KexiConnSelectorWidgetPrivate()
00084     : conn_sel_shown(false)
00085     , file_sel_shown(false)
00086     , confirmOverwrites(true)
00087     {
00088     }
00089     
00090     QWidget* openExistingWidget;
00091     KexiPrjTypeSelector* prjTypeSelector;
00092     QString startDirOrVariable;
00093     QWidgetStack *stack;
00094     QGuardedPtr<KexiDBConnectionSet> conn_set;
00095     KexiDB::DriverManager manager;
00096     bool conn_sel_shown;
00097     bool file_sel_shown;
00098     bool confirmOverwrites;
00099 };
00100 
00101 /*================================================================*/
00102 
00103 KexiConnSelectorWidget::KexiConnSelectorWidget( KexiDBConnectionSet& conn_set, 
00104     const QString& startDirOrVariable, QWidget* parent, const char* name )
00105     : QWidget( parent, name )
00106     ,d(new KexiConnSelectorWidgetPrivate())
00107 {
00108     d->conn_set = &conn_set;
00109     d->startDirOrVariable = startDirOrVariable;
00110     QString none, iconname = KMimeType::mimeType( KexiDB::Driver::defaultFileBasedDriverMimeType() )->icon(none,0);
00111     const QPixmap &icon = KGlobal::iconLoader()->loadIcon( iconname, KIcon::Desktop );
00112     setIcon( icon );
00113 
00114     QVBoxLayout* globalLyr = new QVBoxLayout( this );
00115 
00116     //create header with radio buttons
00117     d->openExistingWidget = new QWidget(this, "openExistingWidget");
00118     QVBoxLayout* openExistingWidgetLyr = new QVBoxLayout( d->openExistingWidget );
00119 //  QLabel* lbl = new QLabel(i18n("<b>Select existing Kexi project to open:</b>"), openExistingWidget);
00120 //  openExistingWidgetLyr->addWidget( lbl );
00121     d->prjTypeSelector = new KexiPrjTypeSelector( d->openExistingWidget );
00122     connect(d->prjTypeSelector->buttonGroup,SIGNAL(clicked(int)),this,SLOT(slotPrjTypeSelected(int)));
00123     openExistingWidgetLyr->addWidget( d->prjTypeSelector );
00124     openExistingWidgetLyr->addSpacing( KDialogBase::spacingHint() );
00125     QFrame* line = new QFrame( d->openExistingWidget, "line" );
00126     line->setFrameShape( QFrame::HLine );
00127     line->setFrameShadow( QFrame::Sunken );
00128     openExistingWidgetLyr->addWidget( line );
00129     globalLyr->addWidget(d->openExistingWidget);
00130 
00131     d->stack = new QWidgetStack(this, "stack");
00132     globalLyr->addWidget(d->stack);
00133 
00134 //  m_file = new KexiOpenExistingFile( this, "KexiOpenExistingFile");
00135 //  m_file->btn_advanced->setIconSet( SmallIconSet("1downarrow") );
00136     m_fileDlg = 0;
00137         
00138 //  addWidget(m_file);
00139 //  connect(m_file->btn_advanced,SIGNAL(clicked()),this,SLOT(showAdvancedConn()));
00140 
00141     m_remote = new KexiConnSelectorBase(d->stack, "conn_sel");
00142     m_remote->icon->setPixmap( DesktopIcon("network") );
00143     m_remote->icon->setFixedSize( m_remote->icon->pixmap()->size() );
00144 //  m_remote->btn_back->setIconSet( SmallIconSet("1uparrow") );
00145     connect(m_remote->btn_add, SIGNAL(clicked()), this, SLOT(slotRemoteAddBtnClicked()));
00146     connect(m_remote->btn_edit, SIGNAL(clicked()), this, SLOT(slotRemoteEditBtnClicked()));
00147     connect(m_remote->btn_remove, SIGNAL(clicked()), this, SLOT(slotRemoteRemoveBtnClicked()));
00148     QToolTip::add(m_remote->btn_add, i18n("Add a new database connection"));
00149     QToolTip::add(m_remote->btn_edit, i18n("Edit selected database connection"));
00150     QToolTip::add(m_remote->btn_remove, i18n("Remove selected database connections"));
00151     d->stack->addWidget(m_remote);
00152     if (m_remote->layout())
00153         m_remote->layout()->setMargin(0);
00154 //  connect(m_remote->btn_back,SIGNAL(clicked()),this,SLOT(showSimpleConn()));
00155     connect(m_remote->list,SIGNAL(doubleClicked(QListViewItem*)),
00156         this,SLOT(slotConnectionItemExecuted(QListViewItem*)));
00157     connect(m_remote->list,SIGNAL(returnPressed(QListViewItem*)),
00158         this,SLOT(slotConnectionItemExecuted(QListViewItem*)));
00159     connect(m_remote->list,SIGNAL(selectionChanged()),
00160         this,SLOT(slotConnectionSelectionChanged()));
00161 }
00162 
00163 KexiConnSelectorWidget::~KexiConnSelectorWidget()
00164 {
00165     delete d;
00166 }
00167 
00168 /*void KexiConnSelectorWidget::disconnectShowSimpleConnButton()
00169 {
00170     m_remote->btn_back->disconnect(this,SLOT(showSimpleConn()));
00171 }*/
00172 
00173 void KexiConnSelectorWidget::showAdvancedConn()
00174 {
00175     slotPrjTypeSelected(2);
00176     d->prjTypeSelector->buttonGroup->setButton(2);
00177 }
00178 
00179 //void KexiConnSelectorWidget::showAdvancedConn()
00180 void KexiConnSelectorWidget::slotPrjTypeSelected(int id)
00181 {
00182 #ifdef KEXI_SERVER_SUPPORT
00183     if (id==1) {//file-based prj type
00184         showSimpleConn();
00185     }
00186     else if (id==2) {//server-based prj type
00187         if (!d->conn_sel_shown) {
00188             d->conn_sel_shown=true;
00189         
00190             //show connections (on demand):
00191             for (KexiDB::ConnectionData::ListIterator it(d->conn_set->list()); it.current(); ++it) {
00192                 addConnectionData( it.current() );
00193     //          else {
00194     //this error should be more verbose:
00195     //              kdWarning() << "KexiConnSelector::KexiConnSelector(): no driver found for '" << it.current()->driverName << "'!" << endl;
00196     //          }
00197             }
00198             if (m_remote->list->firstChild()) {
00199                 m_remote->list->setSelected(m_remote->list->firstChild(),true);
00200             }
00201             m_remote->descriptionEdit->setPaletteBackgroundColor(palette().active().background());
00202             m_remote->descGroupBox->layout()->setMargin(2);
00203             m_remote->list->setFocus();
00204             slotConnectionSelectionChanged();
00205         }
00206         d->stack->raiseWidget(m_remote);
00207     }
00208 #else
00209     showSimpleConn(); //safe
00210 #endif
00211 }
00212 
00213 ConnectionDataLVItem* KexiConnSelectorWidget::addConnectionData( KexiDB::ConnectionData* data )
00214 {
00215     const KexiDB::Driver::Info info( d->manager.driverInfo(data->driverName) );
00216 //  if (!info.name.isEmpty()) {
00217     return new ConnectionDataLVItem(data, info, m_remote->list);
00218 //  }
00219 }
00220 
00221 void KexiConnSelectorWidget::showSimpleConn()
00222 {
00223     d->prjTypeSelector->buttonGroup->setButton(1);
00224     if (!d->file_sel_shown) {
00225         d->file_sel_shown=true;
00226         m_fileDlg = new KexiStartupFileDialog( d->startDirOrVariable, KexiStartupFileDialog::Opening,
00227             d->stack, "openExistingFileDlg");
00228         m_fileDlg->setConfirmOverwrites( d->confirmOverwrites );
00229 //      static_cast<QVBoxLayout*>(m_file->layout())->insertWidget( 2, m_fileDlg );
00230         d->stack->addWidget(m_fileDlg);
00231 
00232         for (QWidget *w = parentWidget(true);w;w=w->parentWidget(true)) {
00233             if (w->isDialog()) {
00234 //#ifndef Q_WS_WIN
00235                 connect(m_fileDlg,SIGNAL(rejected()),static_cast<QDialog*>(w),SLOT(reject()));
00236 //#endif
00237 //              connect(m_fileDlg,SIGNAL(cancelled()),static_cast<QDialog*>(w),SLOT(reject()));
00238                 break;
00239             }
00240         }
00241     }
00242     d->stack->raiseWidget(m_fileDlg);
00243 #ifndef KEXI_SERVER_SUPPORT
00244 /*  m_file->spacer->hide();
00245     m_file->label->hide();
00246     m_file->btn_advanced->hide();
00247     m_file->label->parentWidget()->hide();*/
00248 
00249 #endif
00250 }
00251 
00252 int KexiConnSelectorWidget::selectedConnectionType() const
00253 {
00254     return (d->stack->visibleWidget()==m_fileDlg) ? FileBased : ServerBased;
00255 }
00256 
00257 /*ConnectionDataLVItem* KexiConnSelectorWidget::selectedConnectionDataItem() const
00258 {
00259     if (selectedConnectionType()!=KexiConnSelectorWidget::ServerBased)
00260         return 0;
00261     ConnectionDataLVItem *item = 0; // = static_cast<ConnectionDataLVItem*>(m_remote->list->selectedItem());
00262     for (QListViewItemIterator it(m_remote->list); it.current(); ++it) {
00263         if (it.current()->isSelected()) {
00264             if (item)
00265                 return 0; //multiple
00266             item = static_cast<ConnectionDataLVItem*>(it.current());
00267         }
00268     }
00269     return item;
00270 }*/
00271 
00272 KexiDB::ConnectionData* KexiConnSelectorWidget::selectedConnectionData() const
00273 {
00274     ConnectionDataLVItem *item = static_cast<ConnectionDataLVItem*>(m_remote->list->selectedItem()); //ConnectionDataItem();
00275     if (!item)
00276         return 0;
00277     return item->data();
00278 }
00279 
00280 QString KexiConnSelectorWidget::selectedFileName()
00281 {
00282     if (selectedConnectionType()!=KexiConnSelectorWidget::FileBased)
00283         return QString::null;
00284     return m_fileDlg->currentFileName();
00285 }
00286 
00287 void KexiConnSelectorWidget::setSelectedFileName(const QString& fileName)
00288 {
00289     if (selectedConnectionType()!=KexiConnSelectorWidget::FileBased)
00290         return;
00291     return m_fileDlg->setSelection(fileName);
00292 }
00293 
00294 void KexiConnSelectorWidget::slotConnectionItemExecuted(QListViewItem *item)
00295 {
00296     emit connectionItemExecuted(static_cast<ConnectionDataLVItem*>(item));
00297 }
00298 
00299 void KexiConnSelectorWidget::slotConnectionSelectionChanged()
00300 {
00301     ConnectionDataLVItem* item = static_cast<ConnectionDataLVItem*>(m_remote->list->selectedItem());
00302     //update buttons availability
00303 /*  ConnectionDataLVItem *singleItem = 0;
00304     bool multi = false;
00305     for (QListViewItemIterator it(m_remote->list); it.current(); ++it) {
00306         if (it.current()->isSelected()) {
00307             if (singleItem) {
00308                 singleItem = 0;
00309                 multi = true;
00310                 break;
00311             }
00312             else
00313                 singleItem = static_cast<ConnectionDataLVItem*>(it.current());
00314         }
00315     }*/
00316     m_remote->btn_edit->setEnabled(item);
00317     m_remote->btn_remove->setEnabled(item);
00318     m_remote->descriptionEdit->setText(item ? item->data()->description : QString::null);
00319     emit connectionItemHighlighted(item);
00320 }
00321 
00322 QListView* KexiConnSelectorWidget::connectionsList() const
00323 {
00324     return m_remote->list;
00325 }
00326 
00327 void KexiConnSelectorWidget::setFocus()
00328 {
00329     QWidget::setFocus();
00330     if (d->stack->visibleWidget()==m_fileDlg)
00331         m_fileDlg->setFocus(); //m_fileDlg->locationWidget()->setFocus();
00332     else
00333         m_remote->list->setFocus();
00334 }
00335 
00336 void KexiConnSelectorWidget::hideHelpers()
00337 {
00338     d->openExistingWidget->hide();
00339 
00340 /*  m_file->lbl->hide();
00341     m_file->line->hide();
00342     m_file->spacer->hide();
00343     m_file->label->hide();
00344     m_remote->label->hide();
00345     m_remote->label_back->hide();
00346     m_remote->btn_back->hide();
00347     m_remote->icon->hide();*/
00348 }
00349 
00350 void KexiConnSelectorWidget::setConfirmOverwrites(bool set)
00351 {
00352     d->confirmOverwrites = set;
00353     if (m_fileDlg)
00354         m_fileDlg->setConfirmOverwrites( d->confirmOverwrites );
00355 }
00356 
00357 bool KexiConnSelectorWidget::confirmOverwrites() const
00358 {
00359     return d->confirmOverwrites;
00360 }
00361 
00362 /*static QString msgUnfinished() { 
00363     return i18n("To define or change a connection, use command line options or click on .kexis file. "
00364         "You can find example .kexis file at <a href=\"%1\">here</a>.").arg("") //temporary, please do not change for 0.8!
00365         + "\nhttp://www.kexi-project.org/resources/testdb.kexis"; */
00366 //      .arg("http://websvn.kde.org/*checkout*/branches/kexi/0.9/koffice/kexi/tests/startup/testdb.kexis");
00367 //}
00368 
00369 void KexiConnSelectorWidget::slotRemoteAddBtnClicked()
00370 {
00371     KexiDB::ConnectionData data;
00372     KexiDBConnectionDialog dlg(data, QString::null,
00373         KGuiItem(i18n("&Add"), "button_ok", i18n("Add database connection")) );
00374     dlg.setCaption(i18n("Add New Database Connection"));
00375     if (QDialog::Accepted!=dlg.exec())
00376         return;
00377 
00378     //store this conn. data
00379     KexiDB::ConnectionData *newData = new KexiDB::ConnectionData(*dlg.currentProjectData().connectionData());
00380     if (!d->conn_set->addConnectionData(newData)) {
00382         delete newData;
00383         return;
00384     }
00385 
00386     ConnectionDataLVItem* item = addConnectionData(newData);
00387 //  m_remote->list->clearSelection();
00388     m_remote->list->setSelected(item, true);
00389     slotConnectionSelectionChanged();
00390 }
00391 
00392 void KexiConnSelectorWidget::slotRemoteEditBtnClicked()
00393 {
00394     ConnectionDataLVItem* item = static_cast<ConnectionDataLVItem*>(m_remote->list->selectedItem());
00395     if (!item)
00396         return;
00397     KexiDBConnectionDialog dlg(*item->data(), QString::null,
00398         KGuiItem(i18n("&Save"), "filesave", i18n("Save changes made to this database connection")) );
00399     dlg.setCaption(i18n("Edit Database Connection"));
00400     if (QDialog::Accepted!=dlg.exec())
00401         return;
00402 
00403     KexiDB::ConnectionData *newData = new KexiDB::ConnectionData( *dlg.currentProjectData().connectionData() );
00404     if (!d->conn_set->saveConnectionData(item->data(), newData)) {
00406         delete newData;
00407         return;
00408     }
00409     const KexiDB::Driver::Info info( d->manager.driverInfo(item->data()->driverName) );
00410     item->update(info);
00411     slotConnectionSelectionChanged(); //to update descr. edit
00412 }
00413 
00414 void KexiConnSelectorWidget::slotRemoteRemoveBtnClicked()
00415 {
00416     ConnectionDataLVItem* item = static_cast<ConnectionDataLVItem*>(m_remote->list->selectedItem());
00417     if (!item)
00418         return;
00419     if (KMessageBox::Continue!=KMessageBox::warningContinueCancel(0, 
00420         i18n("Do you want to remove database connection \"%1\" from the list of available connections?")
00421         .arg(item->data()->serverInfoString(true)), QString::null, KStdGuiItem::del(), QString::null, 
00422         KMessageBox::Notify|KMessageBox::Dangerous))
00423         return;
00424 
00425     QListViewItem* nextItem = item->itemBelow();
00426     if (!nextItem)
00427         nextItem = item->itemAbove();
00428     if (!d->conn_set->removeConnectionData(item->data()))
00429         return;
00430 
00431     m_remote->list->removeItem(item);
00432     if (nextItem)
00433         m_remote->list->setSelected(nextItem, true);
00434     slotConnectionSelectionChanged();
00435 }
00436 
00437 void KexiConnSelectorWidget::hideConnectonIcon()
00438 {
00439     m_remote->icon->setFixedWidth(0);
00440     m_remote->icon->setPixmap(QPixmap());
00441 }
00442 
00443 #include "KexiConnSelector.moc"
KDE Home | KDE Accessibility Home | Description of Access Keys