kexi

kexidbconnectionwidget.cpp

00001 /* This file is part of the KDE project
00002    Copyright (C) 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 "kexidbconnectionwidget.h"
00021 #include "kexidbconnectionwidgetdetailsbase.h"
00022 
00023 #include <kexi.h>
00024 #include <kexiguimsghandler.h>
00025 #include <kexidb/connection.h>
00026 #include <kexidb/utils.h>
00027 #include "kexidbdrivercombobox.h"
00028 
00029 #include <kdebug.h>
00030 #include <kiconloader.h>
00031 #include <klineedit.h>
00032 #include <knuminput.h>
00033 #include <kpassdlg.h>
00034 #include <kurlrequester.h>
00035 #include <ktextedit.h>
00036 #include <kprogress.h>
00037 
00038 #include <qlabel.h>
00039 #include <qcheckbox.h>
00040 #include <qbuttongroup.h>
00041 #include <qwidgetstack.h>
00042 #include <qlayout.h>
00043 #include <qvbox.h>
00044 #include <qtooltip.h>
00045 #include <qwhatsthis.h>
00046 #include <qthread.h>
00047 #include <qradiobutton.h>
00048 
00050 #define NO_LOAD_DB_LIST
00051 
00052 // @internal
00053 class KexiDBConnectionWidget::Private
00054 {
00055     public:
00056         Private()
00057          : connectionOnly(false)
00058         {
00059         }
00060 
00061         KPushButton *btnSaveChanges, *btnTestConnection;
00062         bool connectionOnly : 1;
00063 };
00064 
00065 //---------
00066 
00067 KexiDBConnectionWidget::KexiDBConnectionWidget( QWidget* parent,  const char* name )
00068  : KexiDBConnectionWidgetBase( parent, name )
00069  , d(new Private())
00070 {
00071     iconLabel->setPixmap(DesktopIcon("network"));
00072 
00073     QVBoxLayout *driversComboLyr = new QVBoxLayout(frmEngine);
00074     m_driversCombo = new KexiDBDriverComboBox(Kexi::driverManager().driversInfo(), false,
00075         frmEngine, "drivers combo");
00076     lblEngine->setBuddy( m_driversCombo );
00077     lblEngine->setFocusProxy( m_driversCombo );
00078     driversComboLyr->addWidget( m_driversCombo );
00079 
00080 #ifdef NO_LOAD_DB_LIST
00081     btnLoadDBList->hide();
00082 #endif
00083     btnLoadDBList->setIconSet(SmallIconSet("reload"));
00084     QToolTip::add(btnLoadDBList, i18n("Load database list from the server"));
00085     QWhatsThis::add(btnLoadDBList, 
00086         i18n("Loads database list from the server, so you can select one using the \"Name\" combo box."));
00087 
00088     QHBoxLayout *hbox = new QHBoxLayout(frmBottom);
00089     hbox->addStretch(2);
00090     d->btnSaveChanges = new KPushButton(KGuiItem(i18n("Save Changes"), "filesave", 
00091         i18n("Save all changes made to this connection information"),
00092         i18n("Save all changes made to this connection information. You can later reuse this information.")), 
00093         frmBottom, "savechanges");
00094     hbox->addWidget( d->btnSaveChanges );
00095     hbox->addSpacing( KDialogBase::spacingHint() );
00096     QWidget::setTabOrder(titleEdit, d->btnSaveChanges);
00097     d->btnSaveChanges->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed );
00098 
00099     d->btnTestConnection = new KPushButton(KGuiItem(i18n("&Test Connection"), "", 
00100         i18n("Test database connection"), 
00101         i18n("Tests database connection. You can ensure that valid connection information is provided.")), 
00102         frmBottom, "testConnection");
00103     hbox->addWidget( d->btnTestConnection );
00104     QWidget::setTabOrder(d->btnSaveChanges, d->btnTestConnection);
00105     d->btnTestConnection->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed );
00106 
00107     connect( locationBGrp, SIGNAL(clicked(int)), this, SLOT(slotLocationBGrpClicked(int)) );
00108     connect( chkPortDefault, SIGNAL(toggled(bool)), this , SLOT(slotCBToggled(bool)) );
00109     connect( btnLoadDBList, SIGNAL(clicked()), this, SIGNAL(loadDBList()) );
00110     connect( d->btnSaveChanges, SIGNAL(clicked()), this, SIGNAL(saveChanges()) );
00111 }
00112 
00113 KexiDBConnectionWidget::~KexiDBConnectionWidget()
00114 {
00115     delete d;
00116 }
00117 
00118 bool KexiDBConnectionWidget::connectionOnly() const
00119 { return d->connectionOnly; }
00120 
00121 void KexiDBConnectionWidget::setDataInternal(const KexiProjectData& data, bool connectionOnly, 
00122     const QString& shortcutFileName)
00123 {
00124     m_data = data;
00125     d->connectionOnly = connectionOnly;
00126 
00127     if (d->connectionOnly) {
00128         nameLabel->hide();
00129         nameCombo->hide();
00130         btnLoadDBList->hide();
00131         dbGroupBox->setTitle(i18n("Database Connection"));
00132     }
00133     else {
00134         nameLabel->show();
00135         nameCombo->show();
00136 #ifndef NO_LOAD_DB_LIST
00137         btnLoadDBList->show();
00138 #endif
00139         nameCombo->setCurrentText(m_data.databaseName());
00140         dbGroupBox->setTitle(i18n("Database"));
00141     }
00143     m_driversCombo->setDriverName(m_data.connectionData()->driverName);
00144     hostEdit->setText(m_data.connectionData()->hostName);
00145     locationBGrp->setButton( m_data.connectionData()->hostName.isEmpty() ? 0 : 1 );
00146     slotLocationBGrpClicked( locationBGrp->selectedId() );
00147     if (m_data.connectionData()->port!=0) {
00148         chkPortDefault->setChecked(false);
00149         customPortEdit->setValue(m_data.connectionData()->port);
00150     }
00151     else {
00152         chkPortDefault->setChecked(true);
00153 /* @todo default port # instead of 0 */
00154         customPortEdit->setValue(0);
00155     }
00156     userEdit->setText(m_data.connectionData()->userName);
00157     passwordEdit->setText(m_data.connectionData()->password);
00158     if (d->connectionOnly)
00159         titleEdit->setText(m_data.connectionData()->caption);
00160     else
00161         titleEdit->setText(m_data.caption());
00162 
00163     if (shortcutFileName.isEmpty()) {
00164         d->btnSaveChanges->hide();
00165 //      chkSavePassword->hide();
00166     }
00167     else {
00168         if (!QFileInfo(shortcutFileName).isWritable()) {
00169             d->btnSaveChanges->setEnabled(false);
00170         }
00171     }
00172 //  chkSavePassword->setChecked(!m_data.connectionData()->password.isEmpty());
00173     chkSavePassword->setChecked(m_data.connectionData()->savePassword);
00174     adjustSize();
00175 }
00176 
00177 void KexiDBConnectionWidget::setData(const KexiProjectData& data, const QString& shortcutFileName)
00178 {
00179     setDataInternal(data, false , shortcutFileName);
00180 }
00181 
00182 void KexiDBConnectionWidget::setData(const KexiDB::ConnectionData& data, const QString& shortcutFileName)
00183 {
00184     KexiProjectData pdata(data);
00185     setDataInternal(pdata, true /*connectionOnly*/, shortcutFileName);
00186 }
00187 
00188 KPushButton* KexiDBConnectionWidget::saveChangesButton() const
00189 {
00190     return d->btnSaveChanges;
00191 }
00192 
00193 KPushButton* KexiDBConnectionWidget::testConnectionButton() const
00194 {
00195     return d->btnTestConnection;
00196 }
00197 
00198 KexiProjectData KexiDBConnectionWidget::data()
00199 {
00200     return m_data;
00201 }
00202 
00203 void KexiDBConnectionWidget::slotLocationBGrpClicked(int id)
00204 {
00205     if (id != 0 && id != 1) //only support local/remove radio buttons
00206         return;
00207     hostLbl->setEnabled(id==1);
00208     hostEdit->setEnabled(id==1);
00209 }
00210 
00211 void KexiDBConnectionWidget::slotCBToggled(bool on)
00212 {
00213     if (sender()==chkPortDefault) {
00214         customPortEdit->setEnabled(!on);
00215     }
00216 //  else if (sender()==chkSocketDefault) {
00217 //      customSocketEdit->setEnabled(!on);
00218 //  }
00219 }
00220 
00221 //-----------
00222 
00223 KexiDBConnectionTabWidget::KexiDBConnectionTabWidget( QWidget* parent, const char* name )
00224  : KTabWidget( parent, name )
00225 {
00226     mainWidget = new KexiDBConnectionWidget( this, "mainWidget" );
00227     mainWidget->layout()->setMargin(KDialog::marginHint());
00228     addTab( mainWidget, i18n("Parameters") );
00229 
00230 //  QVBox *page2 = new QVBox(this);
00231 //  page2->setMargin(KDialog::marginHint());
00232 //  page2->setSpacing(KDialog::spacingHint());
00233 //  QLabel *lbl = new QLabel(i18n("&Description:"), page2);
00234 //  m_descriptionEdit = new KTextEdit(page2);
00235 //  lbl->setBuddy(m_descriptionEdit);
00236     detailsWidget = new KexiDBConnectionWidgetDetailsBase(this, "detailsWidget");
00237     addTab( detailsWidget, i18n("Details") );
00238 
00239     connect( mainWidget->testConnectionButton(), SIGNAL(clicked()), this, SLOT(slotTestConnection()) );
00240 }
00241 
00242 KexiDBConnectionTabWidget::~KexiDBConnectionTabWidget()
00243 {
00244 }
00245 
00246 void KexiDBConnectionTabWidget::setData(const KexiProjectData& data, const QString& shortcutFileName)
00247 {
00248     mainWidget->setData( data, shortcutFileName );
00249     detailsWidget->chkUseSocket->setChecked( data.constConnectionData()->useLocalSocketFile );
00250     detailsWidget->customSocketEdit->setURL( data.constConnectionData()->localSocketFileName );
00251     detailsWidget->customSocketEdit->setEnabled( detailsWidget->chkUseSocket->isChecked() );
00252     detailsWidget->chkSocketDefault->setChecked( data.constConnectionData()->localSocketFileName.isEmpty() );
00253     detailsWidget->chkSocketDefault->setEnabled( detailsWidget->chkUseSocket->isChecked() );
00254     detailsWidget->descriptionEdit->setText( data.description() );
00255 }
00256 
00257 void KexiDBConnectionTabWidget::setData(const KexiDB::ConnectionData& data, 
00258     const QString& shortcutFileName)
00259 {
00260     mainWidget->setData( data, shortcutFileName );
00261     detailsWidget->chkUseSocket->setChecked( data.useLocalSocketFile );
00262     detailsWidget->customSocketEdit->setURL( data.localSocketFileName );
00263     detailsWidget->customSocketEdit->setEnabled( detailsWidget->chkUseSocket->isChecked() );
00264     detailsWidget->chkSocketDefault->setChecked( data.localSocketFileName.isEmpty() );
00265     detailsWidget->chkSocketDefault->setEnabled( detailsWidget->chkUseSocket->isChecked() );
00266     detailsWidget->descriptionEdit->setText( data.description );
00267 }
00268 
00269 KexiProjectData KexiDBConnectionTabWidget::currentProjectData()
00270 {
00271     KexiProjectData data;
00272 
00274 
00275     // collect data from the form's fields
00276 //  if (d->isDatabaseShortcut) {
00277         if (mainWidget->connectionOnly()) {
00278             data.connectionData()->caption = mainWidget->titleEdit->text();
00279             data.setCaption( QString::null );
00280             data.connectionData()->description = detailsWidget->descriptionEdit->text();
00281             data.setDatabaseName( QString::null );
00282         }
00283         else {
00284             data.connectionData()->caption = QString::null; /* connection name is not specified... */
00285             data.setCaption( mainWidget->titleEdit->text() );
00286             data.setDescription( detailsWidget->descriptionEdit->text() );
00287             data.setDatabaseName( mainWidget->nameCombo->currentText() );
00288         }
00289 //  }
00290 /*  else {
00291         data.setCaption( QString::null );
00292         data.connectionData()->connName = config.readEntry("caption");
00293         data.setDescription( QString::null );
00294         data.connectionData()->description = config.readEntry("comment");
00295         data.setDatabaseName( QString::null );
00296     }*/
00297     data.connectionData()->driverName = mainWidget->driversCombo()->selectedDriverName();
00298 
00299 /*  if (data.connectionData()->driverName.isEmpty()) {
00300         //ERR: "No valid "engine" field specified for %1 section" group
00301         return false;
00302     }*/
00303     data.connectionData()->hostName = 
00304         (mainWidget->remotehostRBtn->isChecked()/*remote*/) ? mainWidget->hostEdit->text()
00305         : QString::null;
00306     data.connectionData()->port = mainWidget->chkPortDefault->isChecked() 
00307         ? 0 : mainWidget->customPortEdit->value();
00308     data.connectionData()->localSocketFileName = detailsWidget->chkSocketDefault->isChecked() 
00309         ? QString::null : detailsWidget->customSocketEdit->url();
00310     data.connectionData()->useLocalSocketFile = detailsWidget->chkUseSocket->isChecked();
00311 //UNSAFE!!!!
00312     data.connectionData()->userName = mainWidget->userEdit->text();
00313     data.connectionData()->password = mainWidget->passwordEdit->text();
00314     data.connectionData()->savePassword = mainWidget->chkSavePassword->isChecked();
00315 /* @todo add "options=", eg. as string list? */
00316     return data;
00317 }
00318 
00319 bool KexiDBConnectionTabWidget::savePasswordOptionSelected() const
00320 {
00321     return mainWidget->chkSavePassword->isChecked();
00322 }
00323 
00324 
00325 
00326 
00327 void KexiDBConnectionTabWidget::slotTestConnection()
00328 {
00329     KexiGUIMessageHandler msgHandler;
00330     KexiDB::connectionTestDialog(this, *currentProjectData().connectionData(), 
00331         msgHandler);
00332 }
00333 
00334 //--------
00335 
00337 
00338 KexiDBConnectionDialog::KexiDBConnectionDialog(const KexiProjectData& data, 
00339     const QString& shortcutFileName, const KGuiItem& acceptButtonGuiItem)
00340  : KDialogBase(0, "dlg", true, i18n("Open Database"), 
00341     KDialogBase::User1|KDialogBase::Cancel|KDialogBase::Help,
00342     KDialogBase::User1, false, 
00343     acceptButtonGuiItem.text().isEmpty() 
00344         ? KGuiItem(i18n("&Open"), "fileopen", i18n("Open Database Connection")) 
00345         : acceptButtonGuiItem
00346     )
00347 {
00348     tabWidget = new KexiDBConnectionTabWidget(this, "tabWidget");
00349     tabWidget->setData(data, shortcutFileName);
00350     init();
00351 }
00352 
00353 KexiDBConnectionDialog::KexiDBConnectionDialog(const KexiDB::ConnectionData& data, 
00354     const QString& shortcutFileName, const KGuiItem& acceptButtonGuiItem)
00355  : KDialogBase(0, "dlg", true, i18n("Connect to a Database Server"), 
00356     KDialogBase::User1|KDialogBase::Cancel|KDialogBase::Help,
00357     KDialogBase::User1, false, 
00358     acceptButtonGuiItem.text().isEmpty() 
00359         ? KGuiItem(i18n("&Open"), "fileopen", i18n("Open Database Connection"))
00360         : acceptButtonGuiItem
00361     )
00362 {
00363     tabWidget = new KexiDBConnectionTabWidget(this, "tabWidget");
00364     tabWidget->setData(data, shortcutFileName);
00365     init();
00366 }
00367 
00368 KexiDBConnectionDialog::~KexiDBConnectionDialog()
00369 {
00370 }
00371 
00372 void KexiDBConnectionDialog::init()
00373 {
00374     connect( this, SIGNAL(user1Clicked()), this, SLOT(accept()));
00375     setMainWidget(tabWidget);
00376     connect(tabWidget->mainWidget, SIGNAL(saveChanges()), this, SIGNAL(saveChanges()));
00377     connect(tabWidget, SIGNAL(testConnection()), this, SIGNAL(testConnection()));
00378 
00379     adjustSize();
00380     resize(width(), tabWidget->height());
00381     if (tabWidget->mainWidget->connectionOnly())
00382         tabWidget->mainWidget->driversCombo()->setFocus();
00383     else if (tabWidget->mainWidget->nameCombo->currentText().isEmpty())
00384         tabWidget->mainWidget->nameCombo->setFocus();
00385     else if (tabWidget->mainWidget->userEdit->text().isEmpty())
00386         tabWidget->mainWidget->userEdit->setFocus();
00387     else if (tabWidget->mainWidget->passwordEdit->text().isEmpty())
00388         tabWidget->mainWidget->passwordEdit->setFocus();
00389     else //back
00390         tabWidget->mainWidget->nameCombo->setFocus();
00391 }
00392 
00393 KexiProjectData KexiDBConnectionDialog::currentProjectData()
00394 { return tabWidget->currentProjectData(); }
00395 
00396 bool KexiDBConnectionDialog::savePasswordOptionSelected() const
00397 { return tabWidget->savePasswordOptionSelected(); }
00398 
00399 KexiDBConnectionWidget* KexiDBConnectionDialog::mainWidget() const
00400 { return tabWidget->mainWidget; }
00401 
00402 KexiDBConnectionWidgetDetailsBase* KexiDBConnectionDialog::detailsWidget() const
00403 { return tabWidget->detailsWidget; }
00404 
00405 #include "kexidbconnectionwidget.moc"
00406 
KDE Home | KDE Accessibility Home | Description of Access Keys