summaryrefslogtreecommitdiffstats
path: root/kmymoney2/dialogs/tdeselectdatabasedlg.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kmymoney2/dialogs/tdeselectdatabasedlg.cpp')
-rw-r--r--kmymoney2/dialogs/tdeselectdatabasedlg.cpp232
1 files changed, 232 insertions, 0 deletions
diff --git a/kmymoney2/dialogs/tdeselectdatabasedlg.cpp b/kmymoney2/dialogs/tdeselectdatabasedlg.cpp
new file mode 100644
index 0000000..607abbc
--- /dev/null
+++ b/kmymoney2/dialogs/tdeselectdatabasedlg.cpp
@@ -0,0 +1,232 @@
+/***************************************************************************
+ kselectdatabasedlg.cpp
+ -------------------
+ copyright : (C) 2005 by Tony Bloomfield
+ author : Tony Bloomfield
+ email : tonybloom@users.sourceforge.net
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include <unistd.h>
+#include <sys/types.h>
+#include <pwd.h>
+
+// ----------------------------------------------------------------------------
+// QT Includes
+
+#include <tqlayout.h>
+#include <tqpushbutton.h>
+#include <tqapplication.h>
+#include <tqsqldatabase.h>
+#include <tqfiledialog.h>
+#include <tqstatusbar.h>
+#include <tqcheckbox.h>
+#include <tqcolor.h>
+
+// ----------------------------------------------------------------------------
+// KDE Includes
+
+#include <kapplication.h>
+#include <kurlrequester.h>
+#include <ktextbrowser.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+
+// ----------------------------------------------------------------------------
+// Project Includes
+
+#include "kselectdatabasedlg.h"
+
+TDESelectDatabaseDlg::TDESelectDatabaseDlg(TQWidget *parent, const char *name)
+ : TDESelectDatabaseDlgDecl(parent, name) {
+ listDrivers->clear();
+ // list drivers supported by KMM
+ TQMap<TQString, TQString> map = m_map.driverMap();
+ // list drivers installed on system
+ TQStringList list = TQSqlDatabase::drivers();
+ if (list.count() == 0) {
+ KMessageBox::error (0, i18n("There are no TQt SQL drivers installed in your system.\n"
+ "Please consult documentation for your distro, or visit the TQt web site (www.trolltech.com)"
+ " and search for SQL drivers."),
+ "");
+ setError();
+ } else {
+ TQStringList::Iterator it = list.begin();
+ while(it != list.end()) {
+ TQString dname = *it;
+ if (map.keys().contains(dname)) { // only display if driver is supported
+ dname = dname + " - " + map[dname];
+ listDrivers->insertItem (dname);
+ }
+ it++;
+ }
+ textDbName->setText ("KMyMoney");
+ textHostName->setText ("localhost");
+ textUserName->setText("");
+ struct passwd * pwd = getpwuid(geteuid());
+ if (pwd != 0)
+ textUserName->setText (TQString(pwd->pw_name));
+ textPassword->setText ("");
+ m_requiredFields = new kMandatoryFieldGroup(TQT_TQOBJECT(this));
+ m_requiredFields->setOkButton(buttonOK);
+ m_requiredFields->add(listDrivers);
+ m_requiredFields->add(textDbName);
+ connect (listDrivers, TQT_SIGNAL(clicked(TQListBoxItem *)),
+ this, TQT_SLOT(slotDriverSelected(TQListBoxItem *)));
+ connect (buttonSQL, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotGenerateSQL()));
+ connect (buttonOK, TQT_SIGNAL(clicked()), this, TQT_SLOT(accept()));
+ checkPreLoad->setChecked(false);
+ buttonSQL->setEnabled(true);
+ }
+ connect (buttonHelp, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotHelp()));
+ // ensure a driver gets selected; pre-select if only one
+ listDrivers->clearSelection();
+ if (listDrivers->count() == 1) {
+ listDrivers->setSelected(0, true);
+ slotDriverSelected(listDrivers->item(0));
+ }
+}
+
+TDESelectDatabaseDlg::TDESelectDatabaseDlg(KURL openURL, TQWidget *parent, const char *name)
+ : TDESelectDatabaseDlgDecl(parent, name) {
+ // here we are re-opening a database from a URL
+ // probably taken from the last-used or recent file list
+ listDrivers->clear();
+ // check that the SQL driver is still available
+ TQString driverName = openURL.queryItem("driver");
+ // list drivers installed on system
+ TQStringList list = TQSqlDatabase::drivers();
+ // list drivers supported by KMM
+ TQMap<TQString, TQString> map = m_map.driverMap();
+ if (!list.contains(driverName)) {
+ KMessageBox::error (0, i18n("TQt SQL driver %1 is no longer installed on your system").arg(driverName),
+ "");
+ setError();
+ } else if (!map.contains(driverName)) {
+ KMessageBox::error (0, i18n("TQt SQL driver %1 is not suported").arg(driverName),
+ "");
+ setError();
+ } else {
+ // fill in the fixed data from the URL
+ listDrivers->insertItem (TQString(driverName + " - " + map[driverName]));
+ listDrivers->setSelected(0,true);
+ TQString dbName = openURL.path().right(openURL.path().length() - 1); // remove separator slash
+ textDbName->setText (dbName);
+ textHostName->setText (openURL.host());
+ textUserName->setText(openURL.user());
+ // disable all but the password field, coz that's why we're here
+ textDbName->setEnabled(false);
+ listDrivers->setEnabled(false);
+ textHostName->setEnabled(false);
+ textUserName->setEnabled(false);
+ textPassword->setEnabled(true);
+ textPassword->setFocus();
+ buttonSQL->setEnabled(false);
+ // set password as required
+ m_requiredFields = new kMandatoryFieldGroup(TQT_TQOBJECT(this));
+ m_requiredFields->add(textPassword);
+ m_requiredFields->setOkButton(buttonOK);
+
+ connect (buttonOK, TQT_SIGNAL(clicked()), this, TQT_SLOT(accept()));
+ checkPreLoad->setChecked(false);
+ }
+ connect (buttonHelp, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotHelp()));
+
+}
+
+TDESelectDatabaseDlg::~TDESelectDatabaseDlg() {
+ if (m_requiredFields != 0) delete m_requiredFields;
+}
+
+void TDESelectDatabaseDlg::setMode (int openMode) {
+ m_mode = openMode;
+ checkPreLoad->setEnabled (openMode == IO_ReadWrite);
+}
+
+const KURL TDESelectDatabaseDlg::selectedURL() {
+ KURL url;
+ url.setProtocol("sql");
+ url.setUser(textUserName->text());
+ url.setPass(textPassword->text());
+ url.setHost(textHostName->text());
+ url.setPath("/" + textDbName->text());
+ TQString qs = TQString("driver=%1")
+ .arg(listDrivers->currentText().section (' ', 0, 0));
+ if (checkPreLoad->isChecked()) qs.append("&options=loadAll");
+ if (!textPassword->text().isEmpty()) qs.append("&secure=yes");
+ url.setQuery(qs);
+ return (url);
+}
+
+void TDESelectDatabaseDlg::slotDriverSelected (TQListBoxItem *driver) {
+ databaseTypeE dbType = m_map.driverToType(driver->text().section(' ', 0, 0));
+ if (!m_map.isTested(dbType)) {
+ int rc = KMessageBox::warningContinueCancel (0,
+ i18n("TQt SQL driver %1 has not been fully tested in a KMyMoney environment. Please make sure you have adequate backups of your data. Please report any problems to the developer mailing list at kmymoney2-developer@lists.sourceforge.net")
+ .arg(driver->text()),
+ "");
+ if (rc == KMessageBox::Cancel) {
+ listDrivers->clearSelection();
+ return;
+ }
+ }
+
+ if (dbType == Sqlite3){
+ TQString dbName = TQFileDialog::getOpenFileName(
+ "",
+ i18n("SQLite files (*.sql);; All files (*.*)"),
+ this,
+ "",
+ i18n("Select SQLite file"));
+ if (dbName.isNull()) {
+ listDrivers->setSelected(driver, false);
+ return;
+ } else {
+ textDbName->setText(dbName);
+ }
+ // sql databases do not react to host/user/password; file system permissions must be used
+ textHostName->setEnabled (false);
+ textUserName->setEnabled (false);
+ textPassword->setEnabled(false);
+ } else {
+ textUserName->setEnabled (true); // but not host
+ textHostName->setEnabled (true);
+ textPassword->setEnabled(true);
+ }
+}
+
+void TDESelectDatabaseDlg::slotGenerateSQL () {
+ TQString fileName = TQFileDialog::getSaveFileName(
+ "",
+ i18n("All files (*.*)"),
+ this,
+ "",
+ i18n("Select output file"));
+ if (fileName == "") return;
+ TQFile out(fileName);
+ if (!out.open(IO_WriteOnly)) return;
+ TQTextStream s(&out);
+ MyMoneyDbDef db;
+ s << db.generateSQL(listDrivers->currentText().section (' ', 0, 0));
+ out.close();
+}
+
+void TDESelectDatabaseDlg::slotHelp(void) {
+ kapp->invokeHelp("details.database.selectdatabase");
+}
+
+void TDESelectDatabaseDlg::setError() {
+ buttonOK->setEnabled(false);
+ buttonSQL->setEnabled(false);
+ m_requiredFields = 0;
+}
+
+#include "kselectdatabasedlg.moc"