00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
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
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
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
00167 }
00168 else {
00169 if (!QFileInfo(shortcutFileName).isWritable()) {
00170 d->btnSaveChanges->setEnabled(false);
00171 }
00172 }
00173
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 , 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)
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
00218
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
00232
00233
00234
00235
00236
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
00277
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;
00286 data.setCaption( mainWidget->titleEdit->text() );
00287 data.setDescription( detailsWidget->descriptionEdit->text() );
00288 data.setDatabaseName( mainWidget->nameCombo->currentText() );
00289 }
00290
00291
00292
00293
00294
00295
00296
00297
00298 data.connectionData()->driverName = mainWidget->driversCombo()->selectedDriverName();
00299
00300
00301
00302
00303
00304 data.connectionData()->hostName =
00305 (mainWidget->remotehostRBtn->isChecked()) ? 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
00313 data.connectionData()->userName = mainWidget->userEdit->text();
00314 data.connectionData()->password = mainWidget->passwordEdit->text();
00315 data.connectionData()->savePassword = mainWidget->chkSavePassword->isChecked();
00316
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
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