summaryrefslogtreecommitdiffstats
path: root/kexi/widget/kexidbconnectionwidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kexi/widget/kexidbconnectionwidget.cpp')
-rw-r--r--kexi/widget/kexidbconnectionwidget.cpp407
1 files changed, 407 insertions, 0 deletions
diff --git a/kexi/widget/kexidbconnectionwidget.cpp b/kexi/widget/kexidbconnectionwidget.cpp
new file mode 100644
index 00000000..5b1b4538
--- /dev/null
+++ b/kexi/widget/kexidbconnectionwidget.cpp
@@ -0,0 +1,407 @@
+/* This file is part of the KDE project
+ Copyright (C) 2005 Jaroslaw Staniek <js@iidea.pl>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "kexidbconnectionwidget.h"
+#include "kexidbconnectionwidgetdetailsbase.h"
+
+#include <kexi.h>
+#include <kexiguimsghandler.h>
+#include <kexidb/connection.h>
+#include <kexidb/utils.h>
+#include "kexidbdrivercombobox.h"
+
+#include <kdebug.h>
+#include <kiconloader.h>
+#include <klineedit.h>
+#include <knuminput.h>
+#include <kpassdlg.h>
+#include <kurlrequester.h>
+#include <ktextedit.h>
+#include <kprogress.h>
+
+#include <qlabel.h>
+#include <qcheckbox.h>
+#include <qbuttongroup.h>
+#include <qwidgetstack.h>
+#include <qlayout.h>
+#include <qvbox.h>
+#include <qtooltip.h>
+#include <qwhatsthis.h>
+#include <qthread.h>
+#include <qradiobutton.h>
+
+//! Templorary hides db list
+//! @todo reenable this when implemented
+#define NO_LOAD_DB_LIST
+
+// @internal
+class KexiDBConnectionWidget::Private
+{
+ public:
+ Private()
+ : connectionOnly(false)
+ {
+ }
+
+ KPushButton *btnSaveChanges, *btnTestConnection;
+ bool connectionOnly : 1;
+};
+
+//---------
+
+KexiDBConnectionWidget::KexiDBConnectionWidget( QWidget* parent, const char* name )
+ : KexiDBConnectionWidgetBase( parent, name )
+ , d(new Private())
+{
+ iconLabel->setPixmap(DesktopIcon("network"));
+
+ QVBoxLayout *driversComboLyr = new QVBoxLayout(frmEngine);
+ m_driversCombo = new KexiDBDriverComboBox(frmEngine, Kexi::driverManager().driversInfo(),
+ KexiDBDriverComboBox::ShowServerDrivers);
+ lblEngine->setBuddy( m_driversCombo );
+ lblEngine->setFocusProxy( m_driversCombo );
+ driversComboLyr->addWidget( m_driversCombo );
+
+#ifdef NO_LOAD_DB_LIST
+ btnLoadDBList->hide();
+#endif
+ btnLoadDBList->setIconSet(SmallIconSet("reload"));
+ QToolTip::add(btnLoadDBList, i18n("Load database list from the server"));
+ QWhatsThis::add(btnLoadDBList,
+ i18n("Loads database list from the server, so you can select one using the \"Name\" combo box."));
+
+ QHBoxLayout *hbox = new QHBoxLayout(frmBottom);
+ hbox->addStretch(2);
+ d->btnSaveChanges = new KPushButton(KGuiItem(i18n("Save Changes"), "filesave",
+ i18n("Save all changes made to this connection information"),
+ i18n("Save all changes made to this connection information. You can later reuse this information.")),
+ frmBottom, "savechanges");
+ hbox->addWidget( d->btnSaveChanges );
+ hbox->addSpacing( KDialogBase::spacingHint() );
+ QWidget::setTabOrder(titleEdit, d->btnSaveChanges);
+ d->btnSaveChanges->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed );
+
+ d->btnTestConnection = new KPushButton(KGuiItem(i18n("&Test Connection"), "",
+ i18n("Test database connection"),
+ i18n("Tests database connection. You can ensure that valid connection information is provided.")),
+ frmBottom, "testConnection");
+ hbox->addWidget( d->btnTestConnection );
+ QWidget::setTabOrder(d->btnSaveChanges, d->btnTestConnection);
+ d->btnTestConnection->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed );
+
+ connect( locationBGrp, SIGNAL(clicked(int)), this, SLOT(slotLocationBGrpClicked(int)) );
+ connect( chkPortDefault, SIGNAL(toggled(bool)), this , SLOT(slotCBToggled(bool)) );
+ connect( btnLoadDBList, SIGNAL(clicked()), this, SIGNAL(loadDBList()) );
+ connect( d->btnSaveChanges, SIGNAL(clicked()), this, SIGNAL(saveChanges()) );
+}
+
+KexiDBConnectionWidget::~KexiDBConnectionWidget()
+{
+ delete d;
+}
+
+bool KexiDBConnectionWidget::connectionOnly() const
+{ return d->connectionOnly; }
+
+void KexiDBConnectionWidget::setDataInternal(const KexiProjectData& data, bool connectionOnly,
+ const QString& shortcutFileName)
+{
+ m_data = data;
+ d->connectionOnly = connectionOnly;
+
+ if (d->connectionOnly) {
+ nameLabel->hide();
+ nameCombo->hide();
+ btnLoadDBList->hide();
+ dbGroupBox->setTitle(i18n("Database Connection"));
+ }
+ else {
+ nameLabel->show();
+ nameCombo->show();
+#ifndef NO_LOAD_DB_LIST
+ btnLoadDBList->show();
+#endif
+ nameCombo->setCurrentText(m_data.databaseName());
+ dbGroupBox->setTitle(i18n("Database"));
+ }
+//! @todo what if there's no such driver name?
+ m_driversCombo->setDriverName(m_data.connectionData()->driverName);
+ hostEdit->setText(m_data.connectionData()->hostName);
+ locationBGrp->setButton( m_data.connectionData()->hostName.isEmpty() ? 0 : 1 );
+ slotLocationBGrpClicked( locationBGrp->selectedId() );
+ if (m_data.connectionData()->port!=0) {
+ chkPortDefault->setChecked(false);
+ customPortEdit->setValue(m_data.connectionData()->port);
+ }
+ else {
+ chkPortDefault->setChecked(true);
+/* @todo default port # instead of 0 */
+ customPortEdit->setValue(0);
+ }
+ userEdit->setText(m_data.connectionData()->userName);
+ passwordEdit->setText(m_data.connectionData()->password);
+ if (d->connectionOnly)
+ titleEdit->setText(m_data.connectionData()->caption);
+ else
+ titleEdit->setText(m_data.caption());
+
+ if (shortcutFileName.isEmpty()) {
+ d->btnSaveChanges->hide();
+// chkSavePassword->hide();
+ }
+ else {
+ if (!QFileInfo(shortcutFileName).isWritable()) {
+ d->btnSaveChanges->setEnabled(false);
+ }
+ }
+// chkSavePassword->setChecked(!m_data.connectionData()->password.isEmpty());
+ chkSavePassword->setChecked(m_data.connectionData()->savePassword);
+ adjustSize();
+}
+
+void KexiDBConnectionWidget::setData(const KexiProjectData& data, const QString& shortcutFileName)
+{
+ setDataInternal(data, false /*!connectionOnly*/, shortcutFileName);
+}
+
+void KexiDBConnectionWidget::setData(const KexiDB::ConnectionData& data, const QString& shortcutFileName)
+{
+ KexiProjectData pdata(data);
+ setDataInternal(pdata, true /*connectionOnly*/, shortcutFileName);
+}
+
+KPushButton* KexiDBConnectionWidget::saveChangesButton() const
+{
+ return d->btnSaveChanges;
+}
+
+KPushButton* KexiDBConnectionWidget::testConnectionButton() const
+{
+ return d->btnTestConnection;
+}
+
+KexiProjectData KexiDBConnectionWidget::data()
+{
+ return m_data;
+}
+
+void KexiDBConnectionWidget::slotLocationBGrpClicked(int id)
+{
+ if (id != 0 && id != 1) //only support local/remove radio buttons
+ return;
+ hostLbl->setEnabled(id==1);
+ hostEdit->setEnabled(id==1);
+}
+
+void KexiDBConnectionWidget::slotCBToggled(bool on)
+{
+ if (sender()==chkPortDefault) {
+ customPortEdit->setEnabled(!on);
+ }
+// else if (sender()==chkSocketDefault) {
+// customSocketEdit->setEnabled(!on);
+// }
+}
+
+//-----------
+
+KexiDBConnectionTabWidget::KexiDBConnectionTabWidget( QWidget* parent, const char* name )
+ : KTabWidget( parent, name )
+{
+ mainWidget = new KexiDBConnectionWidget( this, "mainWidget" );
+ mainWidget->layout()->setMargin(KDialog::marginHint());
+ addTab( mainWidget, i18n("Parameters") );
+
+// QVBox *page2 = new QVBox(this);
+// page2->setMargin(KDialog::marginHint());
+// page2->setSpacing(KDialog::spacingHint());
+// QLabel *lbl = new QLabel(i18n("&Description:"), page2);
+// m_descriptionEdit = new KTextEdit(page2);
+// lbl->setBuddy(m_descriptionEdit);
+ detailsWidget = new KexiDBConnectionWidgetDetailsBase(this, "detailsWidget");
+ addTab( detailsWidget, i18n("Details") );
+
+ connect( mainWidget->testConnectionButton(), SIGNAL(clicked()), this, SLOT(slotTestConnection()) );
+}
+
+KexiDBConnectionTabWidget::~KexiDBConnectionTabWidget()
+{
+}
+
+void KexiDBConnectionTabWidget::setData(const KexiProjectData& data, const QString& shortcutFileName)
+{
+ mainWidget->setData( data, shortcutFileName );
+ detailsWidget->chkUseSocket->setChecked( data.constConnectionData()->useLocalSocketFile );
+ detailsWidget->customSocketEdit->setURL( data.constConnectionData()->localSocketFileName );
+ detailsWidget->customSocketEdit->setEnabled( detailsWidget->chkUseSocket->isChecked() );
+ detailsWidget->chkSocketDefault->setChecked( data.constConnectionData()->localSocketFileName.isEmpty() );
+ detailsWidget->chkSocketDefault->setEnabled( detailsWidget->chkUseSocket->isChecked() );
+ detailsWidget->descriptionEdit->setText( data.description() );
+}
+
+void KexiDBConnectionTabWidget::setData(const KexiDB::ConnectionData& data,
+ const QString& shortcutFileName)
+{
+ mainWidget->setData( data, shortcutFileName );
+ detailsWidget->chkUseSocket->setChecked( data.useLocalSocketFile );
+ detailsWidget->customSocketEdit->setURL( data.localSocketFileName );
+ detailsWidget->customSocketEdit->setEnabled( detailsWidget->chkUseSocket->isChecked() );
+ detailsWidget->chkSocketDefault->setChecked( data.localSocketFileName.isEmpty() );
+ detailsWidget->chkSocketDefault->setEnabled( detailsWidget->chkUseSocket->isChecked() );
+ detailsWidget->descriptionEdit->setText( data.description );
+}
+
+KexiProjectData KexiDBConnectionTabWidget::currentProjectData()
+{
+ KexiProjectData data;
+
+//! @todo check if that's database of connection shortcut. Now we're assuming db shortcut only!
+
+ // collect data from the form's fields
+// if (d->isDatabaseShortcut) {
+ if (mainWidget->connectionOnly()) {
+ data.connectionData()->caption = mainWidget->titleEdit->text();
+ data.setCaption( QString::null );
+ data.connectionData()->description = detailsWidget->descriptionEdit->text();
+ data.setDatabaseName( QString::null );
+ }
+ else {
+ data.connectionData()->caption = QString::null; /* connection name is not specified... */
+ data.setCaption( mainWidget->titleEdit->text() );
+ data.setDescription( detailsWidget->descriptionEdit->text() );
+ data.setDatabaseName( mainWidget->nameCombo->currentText() );
+ }
+// }
+/* else {
+ data.setCaption( QString::null );
+ data.connectionData()->connName = config.readEntry("caption");
+ data.setDescription( QString::null );
+ data.connectionData()->description = config.readEntry("comment");
+ data.setDatabaseName( QString::null );
+ }*/
+ data.connectionData()->driverName = mainWidget->driversCombo()->selectedDriverName();
+
+/* if (data.connectionData()->driverName.isEmpty()) {
+ //ERR: "No valid "engine" field specified for %1 section" group
+ return false;
+ }*/
+ data.connectionData()->hostName =
+ (mainWidget->remotehostRBtn->isChecked()/*remote*/) ? mainWidget->hostEdit->text()
+ : QString::null;
+ data.connectionData()->port = mainWidget->chkPortDefault->isChecked()
+ ? 0 : mainWidget->customPortEdit->value();
+ data.connectionData()->localSocketFileName = detailsWidget->chkSocketDefault->isChecked()
+ ? QString::null : detailsWidget->customSocketEdit->url();
+ data.connectionData()->useLocalSocketFile = detailsWidget->chkUseSocket->isChecked();
+//UNSAFE!!!!
+ data.connectionData()->userName = mainWidget->userEdit->text();
+ data.connectionData()->password = mainWidget->passwordEdit->text();
+ data.connectionData()->savePassword = mainWidget->chkSavePassword->isChecked();
+/* @todo add "options=", eg. as string list? */
+ return data;
+}
+
+bool KexiDBConnectionTabWidget::savePasswordOptionSelected() const
+{
+ return mainWidget->chkSavePassword->isChecked();
+}
+
+
+
+
+void KexiDBConnectionTabWidget::slotTestConnection()
+{
+ KexiGUIMessageHandler msgHandler;
+ KexiDB::connectionTestDialog(this, *currentProjectData().connectionData(),
+ msgHandler);
+}
+
+//--------
+
+//! @todo set proper help ctxt ID
+
+KexiDBConnectionDialog::KexiDBConnectionDialog(const KexiProjectData& data,
+ const QString& shortcutFileName, const KGuiItem& acceptButtonGuiItem)
+ : KDialogBase(0, "dlg", true, i18n("Open Database"),
+ KDialogBase::User1|KDialogBase::Cancel|KDialogBase::Help,
+ KDialogBase::User1, false,
+ acceptButtonGuiItem.text().isEmpty()
+ ? KGuiItem(i18n("&Open"), "fileopen", i18n("Open Database Connection"))
+ : acceptButtonGuiItem
+ )
+{
+ tabWidget = new KexiDBConnectionTabWidget(this, "tabWidget");
+ tabWidget->setData(data, shortcutFileName);
+ init();
+}
+
+KexiDBConnectionDialog::KexiDBConnectionDialog(const KexiDB::ConnectionData& data,
+ const QString& shortcutFileName, const KGuiItem& acceptButtonGuiItem)
+ : KDialogBase(0, "dlg", true, i18n("Connect to a Database Server"),
+ KDialogBase::User1|KDialogBase::Cancel|KDialogBase::Help,
+ KDialogBase::User1, false,
+ acceptButtonGuiItem.text().isEmpty()
+ ? KGuiItem(i18n("&Open"), "fileopen", i18n("Open Database Connection"))
+ : acceptButtonGuiItem
+ )
+{
+ tabWidget = new KexiDBConnectionTabWidget(this, "tabWidget");
+ tabWidget->setData(data, shortcutFileName);
+ init();
+}
+
+KexiDBConnectionDialog::~KexiDBConnectionDialog()
+{
+}
+
+void KexiDBConnectionDialog::init()
+{
+ connect( this, SIGNAL(user1Clicked()), this, SLOT(accept()));
+ setMainWidget(tabWidget);
+ connect(tabWidget->mainWidget, SIGNAL(saveChanges()), this, SIGNAL(saveChanges()));
+ connect(tabWidget, SIGNAL(testConnection()), this, SIGNAL(testConnection()));
+
+ adjustSize();
+ resize(width(), tabWidget->height());
+ if (tabWidget->mainWidget->connectionOnly())
+ tabWidget->mainWidget->driversCombo()->setFocus();
+ else if (tabWidget->mainWidget->nameCombo->currentText().isEmpty())
+ tabWidget->mainWidget->nameCombo->setFocus();
+ else if (tabWidget->mainWidget->userEdit->text().isEmpty())
+ tabWidget->mainWidget->userEdit->setFocus();
+ else if (tabWidget->mainWidget->passwordEdit->text().isEmpty())
+ tabWidget->mainWidget->passwordEdit->setFocus();
+ else //back
+ tabWidget->mainWidget->nameCombo->setFocus();
+}
+
+KexiProjectData KexiDBConnectionDialog::currentProjectData()
+{ return tabWidget->currentProjectData(); }
+
+bool KexiDBConnectionDialog::savePasswordOptionSelected() const
+{ return tabWidget->savePasswordOptionSelected(); }
+
+KexiDBConnectionWidget* KexiDBConnectionDialog::mainWidget() const
+{ return tabWidget->mainWidget; }
+
+KexiDBConnectionWidgetDetailsBase* KexiDBConnectionDialog::detailsWidget() const
+{ return tabWidget->detailsWidget; }
+
+#include "kexidbconnectionwidget.moc"
+