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