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 <widget/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     if (id==1) {//file-based prj type
00183         showSimpleConn();
00184     }
00185     else if (id==2) {//server-based prj type
00186         if (!d->conn_sel_shown) {
00187             d->conn_sel_shown=true;
00188         
00189             //show connections (on demand):
00190             for (KexiDB::ConnectionData::ListIterator it(d->conn_set->list()); it.current(); ++it) {
00191                 addConnectionData( it.current() );
00192     //          else {
00193     //this error should be more verbose:
00194     //              kdWarning() << "KexiConnSelector::KexiConnSelector(): no driver found for '" << it.current()->driverName << "'!" << endl;
00195     //          }
00196             }
00197             if (m_remote->list->firstChild()) {
00198                 m_remote->list->setSelected(m_remote->list->firstChild(),true);
00199             }
00200             m_remote->descriptionEdit->setPaletteBackgroundColor(palette().active().background());
00201             m_remote->descGroupBox->layout()->setMargin(2);
00202             m_remote->list->setFocus();
00203             slotConnectionSelectionChanged();
00204         }
00205         d->stack->raiseWidget(m_remote);
00206     }
00207 }
00208 
00209 ConnectionDataLVItem* KexiConnSelectorWidget::addConnectionData( KexiDB::ConnectionData* data )
00210 {
00211     const KexiDB::Driver::Info info( d->manager.driverInfo(data->driverName) );
00212 //  if (!info.name.isEmpty()) {
00213     return new ConnectionDataLVItem(data, info, m_remote->list);
00214 //  }
00215 }
00216 
00217 void KexiConnSelectorWidget::showSimpleConn()
00218 {
00219     d->prjTypeSelector->buttonGroup->setButton(1);
00220     if (!d->file_sel_shown) {
00221         d->file_sel_shown=true;
00222         m_fileDlg = new KexiStartupFileDialog( d->startDirOrVariable, KexiStartupFileDialog::Opening,
00223             d->stack, "openExistingFileDlg");
00224         m_fileDlg->setConfirmOverwrites( d->confirmOverwrites );
00225 //      static_cast<QVBoxLayout*>(m_file->layout())->insertWidget( 2, m_fileDlg );
00226         d->stack->addWidget(m_fileDlg);
00227 
00228         for (QWidget *w = parentWidget(true);w;w=w->parentWidget(true)) {
00229             if (w->isDialog()) {
00230 //#ifndef Q_WS_WIN
00231                 connect(m_fileDlg,SIGNAL(rejected()),static_cast<QDialog*>(w),SLOT(reject()));
00232 //#endif
00233 //              connect(m_fileDlg,SIGNAL(cancelled()),static_cast<QDialog*>(w),SLOT(reject()));
00234                 break;
00235             }
00236         }
00237     }
00238     d->stack->raiseWidget(m_fileDlg);
00239 }
00240 
00241 int KexiConnSelectorWidget::selectedConnectionType() const
00242 {
00243     return (d->stack->visibleWidget()==m_fileDlg) ? FileBased : ServerBased;
00244 }
00245 
00246 /*ConnectionDataLVItem* KexiConnSelectorWidget::selectedConnectionDataItem() const
00247 {
00248     if (selectedConnectionType()!=KexiConnSelectorWidget::ServerBased)
00249         return 0;
00250     ConnectionDataLVItem *item = 0; // = static_cast<ConnectionDataLVItem*>(m_remote->list->selectedItem());
00251     for (QListViewItemIterator it(m_remote->list); it.current(); ++it) {
00252         if (it.current()->isSelected()) {
00253             if (item)
00254                 return 0; //multiple
00255             item = static_cast<ConnectionDataLVItem*>(it.current());
00256         }
00257     }
00258     return item;
00259 }*/
00260 
00261 KexiDB::ConnectionData* KexiConnSelectorWidget::selectedConnectionData() const
00262 {
00263     ConnectionDataLVItem *item = static_cast<ConnectionDataLVItem*>(m_remote->list->selectedItem()); //ConnectionDataItem();
00264     if (!item)
00265         return 0;
00266     return item->data();
00267 }
00268 
00269 QString KexiConnSelectorWidget::selectedFileName()
00270 {
00271     if (selectedConnectionType()!=KexiConnSelectorWidget::FileBased)
00272         return QString::null;
00273     return m_fileDlg->currentFileName();
00274 }
00275 
00276 void KexiConnSelectorWidget::setSelectedFileName(const QString& fileName)
00277 {
00278     if (selectedConnectionType()!=KexiConnSelectorWidget::FileBased)
00279         return;
00280     return m_fileDlg->setSelection(fileName);
00281 }
00282 
00283 void KexiConnSelectorWidget::slotConnectionItemExecuted(QListViewItem *item)
00284 {
00285     emit connectionItemExecuted(static_cast<ConnectionDataLVItem*>(item));
00286 }
00287 
00288 void KexiConnSelectorWidget::slotConnectionSelectionChanged()
00289 {
00290     ConnectionDataLVItem* item = static_cast<ConnectionDataLVItem*>(m_remote->list->selectedItem());
00291     //update buttons availability
00292 /*  ConnectionDataLVItem *singleItem = 0;
00293     bool multi = false;
00294     for (QListViewItemIterator it(m_remote->list); it.current(); ++it) {
00295         if (it.current()->isSelected()) {
00296             if (singleItem) {
00297                 singleItem = 0;
00298                 multi = true;
00299                 break;
00300             }
00301             else
00302                 singleItem = static_cast<ConnectionDataLVItem*>(it.current());
00303         }
00304     }*/
00305     m_remote->btn_edit->setEnabled(item);
00306     m_remote->btn_remove->setEnabled(item);
00307     m_remote->descriptionEdit->setText(item ? item->data()->description : QString::null);
00308     emit connectionItemHighlighted(item);
00309 }
00310 
00311 QListView* KexiConnSelectorWidget::connectionsList() const
00312 {
00313     return m_remote->list;
00314 }
00315 
00316 void KexiConnSelectorWidget::setFocus()
00317 {
00318     QWidget::setFocus();
00319     if (d->stack->visibleWidget()==m_fileDlg)
00320         m_fileDlg->setFocus(); //m_fileDlg->locationWidget()->setFocus();
00321     else
00322         m_remote->list->setFocus();
00323 }
00324 
00325 void KexiConnSelectorWidget::hideHelpers()
00326 {
00327     d->openExistingWidget->hide();
00328 
00329 /*  m_file->lbl->hide();
00330     m_file->line->hide();
00331     m_file->spacer->hide();
00332     m_file->label->hide();
00333     m_remote->label->hide();
00334     m_remote->label_back->hide();
00335     m_remote->btn_back->hide();
00336     m_remote->icon->hide();*/
00337 }
00338 
00339 void KexiConnSelectorWidget::setConfirmOverwrites(bool set)
00340 {
00341     d->confirmOverwrites = set;
00342     if (m_fileDlg)
00343         m_fileDlg->setConfirmOverwrites( d->confirmOverwrites );
00344 }
00345 
00346 bool KexiConnSelectorWidget::confirmOverwrites() const
00347 {
00348     return d->confirmOverwrites;
00349 }
00350 
00351 /*static QString msgUnfinished() { 
00352     return i18n("To define or change a connection, use command line options or click on .kexis file. "
00353         "You can find example .kexis file at <a href=\"%1\">here</a>.").arg("") //temporary, please do not change for 0.8!
00354         + "\nhttp://www.kexi-project.org/resources/testdb.kexis"; */
00355 //      .arg("http://websvn.kde.org/*checkout*/branches/kexi/0.9/koffice/kexi/tests/startup/testdb.kexis");
00356 //}
00357 
00358 void KexiConnSelectorWidget::slotRemoteAddBtnClicked()
00359 {
00360     KexiDB::ConnectionData data;
00361     KexiDBConnectionDialog dlg(data, QString::null,
00362         KGuiItem(i18n("&Add"), "button_ok", i18n("Add database connection")) );
00363     dlg.setCaption(i18n("Add New Database Connection"));
00364     if (QDialog::Accepted!=dlg.exec())
00365         return;
00366 
00367     //store this conn. data
00368     KexiDB::ConnectionData *newData = new KexiDB::ConnectionData(*dlg.currentProjectData().connectionData());
00369     if (!d->conn_set->addConnectionData(newData)) {
00371         delete newData;
00372         return;
00373     }
00374 
00375     ConnectionDataLVItem* item = addConnectionData(newData);
00376 //  m_remote->list->clearSelection();
00377     m_remote->list->setSelected(item, true);
00378     slotConnectionSelectionChanged();
00379 }
00380 
00381 void KexiConnSelectorWidget::slotRemoteEditBtnClicked()
00382 {
00383     ConnectionDataLVItem* item = static_cast<ConnectionDataLVItem*>(m_remote->list->selectedItem());
00384     if (!item)
00385         return;
00386     KexiDBConnectionDialog dlg(*item->data(), QString::null,
00387         KGuiItem(i18n("&Save"), "filesave", i18n("Save changes made to this database connection")) );
00388     dlg.setCaption(i18n("Edit Database Connection"));
00389     if (QDialog::Accepted!=dlg.exec())
00390         return;
00391 
00392     KexiDB::ConnectionData *newData = new KexiDB::ConnectionData( *dlg.currentProjectData().connectionData() );
00393     if (!d->conn_set->saveConnectionData(item->data(), newData)) {
00395         delete newData;
00396         return;
00397     }
00398     const KexiDB::Driver::Info info( d->manager.driverInfo(item->data()->driverName) );
00399     item->update(info);
00400     slotConnectionSelectionChanged(); //to update descr. edit
00401 }
00402 
00403 void KexiConnSelectorWidget::slotRemoteRemoveBtnClicked()
00404 {
00405     ConnectionDataLVItem* item = static_cast<ConnectionDataLVItem*>(m_remote->list->selectedItem());
00406     if (!item)
00407         return;
00408     if (KMessageBox::Continue!=KMessageBox::warningContinueCancel(0, 
00409         i18n("Do you want to remove database connection \"%1\" from the list of available connections?")
00410         .arg(item->data()->serverInfoString(true)), QString::null, KStdGuiItem::del(), QString::null, 
00411         KMessageBox::Notify|KMessageBox::Dangerous))
00412         return;
00413 
00414     QListViewItem* nextItem = item->itemBelow();
00415     if (!nextItem)
00416         nextItem = item->itemAbove();
00417     if (!d->conn_set->removeConnectionData(item->data()))
00418         return;
00419 
00420     m_remote->list->removeItem(item);
00421     if (nextItem)
00422         m_remote->list->setSelected(nextItem, true);
00423     slotConnectionSelectionChanged();
00424 }
00425 
00426 void KexiConnSelectorWidget::hideConnectonIcon()
00427 {
00428     m_remote->icon->setFixedWidth(0);
00429     m_remote->icon->setPixmap(QPixmap());
00430 }
00431 
00432 #include "KexiConnSelector.moc"
KDE Home | KDE Accessibility Home | Description of Access Keys