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
00050 #define NO_LOAD_DB_LIST
00051
00052
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
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
00166 }
00167 else {
00168 if (!QFileInfo(shortcutFileName).isWritable()) {
00169 d->btnSaveChanges->setEnabled(false);
00170 }
00171 }
00172
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 , 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)
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
00217
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
00231
00232
00233
00234
00235
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
00276
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;
00285 data.setCaption( mainWidget->titleEdit->text() );
00286 data.setDescription( detailsWidget->descriptionEdit->text() );
00287 data.setDatabaseName( mainWidget->nameCombo->currentText() );
00288 }
00289
00290
00291
00292
00293
00294
00295
00296
00297 data.connectionData()->driverName = mainWidget->driversCombo()->selectedDriverName();
00298
00299
00300
00301
00302
00303 data.connectionData()->hostName =
00304 (mainWidget->remotehostRBtn->isChecked()) ? 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
00312 data.connectionData()->userName = mainWidget->userEdit->text();
00313 data.connectionData()->password = mainWidget->passwordEdit->text();
00314 data.connectionData()->savePassword = mainWidget->chkSavePassword->isChecked();
00315
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
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