You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kmymoney/kmymoney2/dialogs/kselectdatabasedlg.cpp

233 lines
8.3 KiB

/***************************************************************************
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"
KSelectDatabaseDlg::KSelectDatabaseDlg(TQWidget *parent, const char *name)
: KSelectDatabaseDlgDecl(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));
}
}
KSelectDatabaseDlg::KSelectDatabaseDlg(KURL openURL, TQWidget *parent, const char *name)
: KSelectDatabaseDlgDecl(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").tqarg(driverName),
"");
setError();
} else if (!map.contains(driverName)) {
KMessageBox::error (0, i18n("TQt SQL driver %1 is not suported").tqarg(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()));
}
KSelectDatabaseDlg::~KSelectDatabaseDlg() {
if (m_requiredFields != 0) delete m_requiredFields;
}
void KSelectDatabaseDlg::setMode (int openMode) {
m_mode = openMode;
checkPreLoad->setEnabled (openMode == IO_ReadWrite);
}
const KURL KSelectDatabaseDlg::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")
.tqarg(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 KSelectDatabaseDlg::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")
.tqarg(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 KSelectDatabaseDlg::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 KSelectDatabaseDlg::slotHelp(void) {
kapp->invokeHelp("details.database.selectdatabase");
}
void KSelectDatabaseDlg::setError() {
buttonOK->setEnabled(false);
buttonSQL->setEnabled(false);
m_requiredFields = 0;
}
#include "kselectdatabasedlg.moc"