diff options
author | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-01-20 01:29:50 +0000 |
---|---|---|
committer | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-01-20 01:29:50 +0000 |
commit | 8362bf63dea22bbf6736609b0f49c152f975eb63 (patch) | |
tree | 0eea3928e39e50fae91d4e68b21b1e6cbae25604 /kexi/migration/importwizard.cpp | |
download | koffice-8362bf63dea22bbf6736609b0f49c152f975eb63.tar.gz koffice-8362bf63dea22bbf6736609b0f49c152f975eb63.zip |
Added old abandoned KDE3 version of koffice
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/koffice@1077364 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kexi/migration/importwizard.cpp')
-rw-r--r-- | kexi/migration/importwizard.cpp | 1031 |
1 files changed, 1031 insertions, 0 deletions
diff --git a/kexi/migration/importwizard.cpp b/kexi/migration/importwizard.cpp new file mode 100644 index 00000000..dda3d200 --- /dev/null +++ b/kexi/migration/importwizard.cpp @@ -0,0 +1,1031 @@ +/* This file is part of the KDE project + Copyright (C) 2004 Adam Pigg <adam@piggz.co.uk> + Copyright (C) 2004-2006 Jaroslaw Staniek <js@iidea.pl> + Copyright (C) 2005 Martin Ellis <martin.ellis@kdemail.net> + + This library 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 library 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 library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. +*/ + +#include "importwizard.h" +#include "keximigrate.h" +#include "importoptionsdlg.h" + +#include <qlabel.h> +#include <qlayout.h> +#include <qvbuttongroup.h> +#include <qradiobutton.h> +#include <qcheckbox.h> + +#include <kcombobox.h> +#include <kmessagebox.h> +#include <kpushbutton.h> +#include <kdebug.h> +#include <klineedit.h> +#include <kiconloader.h> +#include <kbuttonbox.h> + +#include <kexidb/drivermanager.h> +#include <kexidb/driver.h> +#include <kexidb/connectiondata.h> +#include <kexidb/utils.h> +#include <core/kexidbconnectionset.h> +#include <core/kexi.h> +#include <KexiConnSelector.h> +#include <KexiProjectSelector.h> +#include <KexiOpenExistingFile.h> +#include <KexiDBTitlePage.h> +#include <kexiutils/utils.h> +#include <kexidbdrivercombobox.h> +#include <kexitextmsghandler.h> +#include <widget/kexicharencodingcombobox.h> +#include <widget/kexiprjtypeselector.h> + + +using namespace KexiMigration; + +//=========================================================== +// +ImportWizard::ImportWizard(QWidget *parent, QMap<QString,QString>* args) + : KWizard(parent) + , m_args(args) +{ + setCaption(i18n("Import Database")); + setIcon(DesktopIcon("database_import")); + m_prjSet = 0; + m_fileBasedDstWasPresented = false; + m_setupFileBasedSrcNeeded = true; + m_importExecuted = false; + m_srcTypeCombo = 0; + + setMinimumSize(400, 400); + parseArguments(); + setupIntro(); +// setupSrcType(); + setupSrcConn(); + setupSrcDB(); + setupDstType(); + setupDstTitle(); + setupDst(); + setupImportType(); + setupImporting(); + setupFinish(); + + connect(this, SIGNAL(selected(const QString &)), this, SLOT(pageSelected(const QString &))); + connect(this, SIGNAL(helpClicked()), this, SLOT(helpClicked())); + + if (m_predefinedConnectionData) { + // setup wizard for predefined server source + m_srcConn->showAdvancedConn(); + setAppropriate( m_srcConnPage, false ); + setAppropriate( m_srcDBPage, false ); + } + else if (!m_predefinedDatabaseName.isEmpty()) { + // setup wizard for predefined source + // (used when external project type was opened in Kexi, e.g. mdb file) +// MigrateManager manager; +// QString driverName = manager.driverForMimeType( m_predefinedMimeType ); +// m_srcTypeCombo->setCurrentText( driverName ); + +// showPage( m_srcConnPage ); + m_srcConn->showSimpleConn(); + m_srcConn->setSelectedFileName(m_predefinedDatabaseName); + + //disable all prev pages except "welcome" page + for (int i=0; i<indexOf(m_dstTypePage); i++) { + if (page(i)!=m_introPage) + setAppropriate( page(i), false ); + } + } + + m_sourceDBEncoding = QString::fromLatin1(KGlobal::locale()->encoding()); //default +} + +//=========================================================== +// +ImportWizard::~ImportWizard() +{ + delete m_prjSet; +} + +//=========================================================== +// +void ImportWizard::parseArguments() +{ + m_predefinedConnectionData = 0; + if (!m_args) + return; + if (!(*m_args)["databaseName"].isEmpty() && !(*m_args)["mimeType"].isEmpty()) { + m_predefinedDatabaseName = (*m_args)["databaseName"]; + m_predefinedMimeType = (*m_args)["mimeType"]; + if (m_args->contains("connectionData")) { + m_predefinedConnectionData = new KexiDB::ConnectionData(); + KexiDB::fromMap( + KexiUtils::deserializeMap((*m_args)["connectionData"]), *m_predefinedConnectionData + ); + } + } + m_args->clear(); +} + +//=========================================================== +// +void ImportWizard::setupIntro() +{ + m_introPage = new QWidget(this); + QVBoxLayout *vbox = new QVBoxLayout(m_introPage, KDialog::marginHint()); + + QLabel *lblIntro = new QLabel(m_introPage); + lblIntro->setAlignment( Qt::AlignTop | Qt::AlignLeft | Qt::WordBreak ); + QString msg; + if (m_predefinedConnectionData) { //predefined import: server source + msg = i18n("<qt>Database Importing wizard is about to import \"%1\" database " + "<nobr>(connection %2)</nobr> into a Kexi database.</qt>") + .arg(m_predefinedDatabaseName).arg(m_predefinedConnectionData->serverInfoString()); + } + else if (!m_predefinedDatabaseName.isEmpty()) { //predefined import: file source +//! @todo this message is currently ok for files only + KMimeType::Ptr mimeTypePtr = KMimeType::mimeType(m_predefinedMimeType); + msg = i18n("<qt>Database Importing wizard is about to import <nobr>\"%1\"</nobr> file " + "of type \"%2\" into a Kexi database.</qt>") + .arg(QDir::convertSeparators(m_predefinedDatabaseName)).arg(mimeTypePtr->comment()); + } + else { + msg = i18n("Database Importing wizard allows you to import an existing database " + "into a Kexi database."); + } + lblIntro->setText(msg+"\n\n" + +i18n("Click \"Next\" button to continue or \"Cancel\" button to exit this wizard.")); + vbox->addWidget( lblIntro ); + addPage(m_introPage, i18n("Welcome to the Database Importing Wizard")); +} + +//=========================================================== +// +/* +void ImportWizard::setupSrcType() +{ + m_srcTypePage = new QWidget(this); + +//! @todo Would be good if KexiDBDriverComboBox worked for migration drivers + QVBoxLayout *vbox = new QVBoxLayout(m_srcTypePage, KDialog::marginHint()); + + QHBoxLayout *hbox = new QHBoxLayout(vbox); + QLabel *lbl = new QLabel(i18n("Source database type:")+" ", m_srcTypePage); + hbox->addWidget(lbl); + + m_srcTypeCombo = new KComboBox(m_srcTypePage); + hbox->addWidget(m_srcTypeCombo); + hbox->addStretch(1); + vbox->addStretch(1); + lbl->setBuddy(m_srcTypeCombo); + + MigrateManager manager; + QStringList names = manager.driverNames(); + + m_srcTypeCombo->insertStringList(names); + addPage(m_srcTypePage, i18n("Select Source Database Type")); +} +*/ +//=========================================================== +// +void ImportWizard::setupSrcConn() +{ + m_srcConnPage = new QWidget(this); + QVBoxLayout *vbox = new QVBoxLayout(m_srcConnPage, KDialog::marginHint()); + + m_srcConn = new KexiConnSelectorWidget(Kexi::connset(), + ":ProjectMigrationSourceDir", m_srcConnPage, "m_srcConnSelector"); + + m_srcConn->hideConnectonIcon(); + m_srcConn->showSimpleConn(); + + QStringList excludedFilters; +//! @todo remove when support for kexi files as source prj is added in migration + excludedFilters += KexiDB::Driver::defaultFileBasedDriverMimeType(); + excludedFilters += "application/x-kexiproject-shortcut"; + excludedFilters += "application/x-kexi-connectiondata"; + m_srcConn->m_fileDlg->setExcludedFilters(excludedFilters); + +// m_srcConn->hideHelpers(); + vbox->addWidget(m_srcConn); + addPage(m_srcConnPage, i18n("Select Location for Source Database")); +} + +//=========================================================== +// +void ImportWizard::setupSrcDB() +{ +// arrivesrcdbPage creates widgets on that page + m_srcDBPage = new QWidget(this); + m_srcDBName = NULL; + addPage(m_srcDBPage, i18n("Select Source Database")); +} + +//=========================================================== +// +void ImportWizard::setupDstType() +{ + m_dstTypePage = new QWidget(this); + + KexiDB::DriverManager manager; + KexiDB::Driver::InfoMap drvs = manager.driversInfo(); + + QVBoxLayout *vbox = new QVBoxLayout(m_dstTypePage, KDialog::marginHint()); + + QHBoxLayout *hbox = new QHBoxLayout(vbox); + QLabel *lbl = new QLabel(i18n("Destination database type:")+" ", m_dstTypePage); + lbl->setAlignment(Qt::AlignAuto|Qt::AlignTop); + hbox->addWidget(lbl); + + m_dstPrjTypeSelector = new KexiPrjTypeSelector(m_dstTypePage); + hbox->addWidget(m_dstPrjTypeSelector); + m_dstPrjTypeSelector->option_file->setText(i18n("Database project stored in a file")); + m_dstPrjTypeSelector->option_server->setText(i18n("Database project stored on a server")); + + QVBoxLayout *frame_server_vbox = new QVBoxLayout(m_dstPrjTypeSelector->frame_server, KDialog::spacingHint()); + m_dstServerTypeCombo = new KexiDBDriverComboBox(m_dstPrjTypeSelector->frame_server, drvs, + KexiDBDriverComboBox::ShowServerDrivers); + frame_server_vbox->addWidget(m_dstServerTypeCombo); + hbox->addStretch(1); + vbox->addStretch(1); + lbl->setBuddy(m_dstServerTypeCombo); + +//! @todo hardcoded: find a way to preselect default engine item + //m_dstTypeCombo->setCurrentText("SQLite3"); + addPage(m_dstTypePage, i18n("Select Destination Database Type")); +} + +//=========================================================== +// +void ImportWizard::setupDstTitle() +{ + m_dstTitlePage = new KexiDBTitlePage(i18n("Destination project's caption:"), + this, "KexiDBTitlePage"); + m_dstTitlePage->layout()->setMargin( KDialog::marginHint() ); + m_dstTitlePage->updateGeometry(); + m_dstNewDBNameLineEdit = m_dstTitlePage->le_caption; + addPage(m_dstTitlePage, i18n("Select Destination Database Project's Caption")); +} + +//=========================================================== +// +void ImportWizard::setupDst() +{ + m_dstPage = new QWidget(this); + QVBoxLayout *vbox = new QVBoxLayout(m_dstPage, KDialog::marginHint()); + + m_dstConn = new KexiConnSelectorWidget(Kexi::connset(), + ":ProjectMigrationDestinationDir", m_dstPage, "m_dstConnSelector"); + m_dstConn->hideHelpers(); + //me: Can't connect m_dstConn->m_fileDlg here, it doesn't exist yet + //connect(this, SLOT(next()), m_dstConn->m_fileDlg, SIGNAL(accepted())); + + vbox->addWidget( m_dstConn ); + connect(m_dstConn,SIGNAL(connectionItemExecuted(ConnectionDataLVItem*)), + this,SLOT(next())); + +// m_dstConn->hideHelpers(); + m_dstConn->showSimpleConn(); + //anyway, db files will be _saved_ + m_dstConn->m_fileDlg->setMode( KexiStartupFileDialog::SavingFileBasedDB ); +// m_dstConn->hideHelpers(); +// m_dstConn->m_file->btn_advanced->hide(); +// m_dstConn->m_file->label->hide(); +// m_dstConn->m_file->lbl->hide(); + //m_dstConn->m_file->spacer7->hide(); + + + //js dstNewDBName = new KLineEdit(dstControls); + // dstNewDBName->setText(i18n("Enter new database name here")); + addPage(m_dstPage, i18n("Select Location for Destination Database")); +} + +//=========================================================== +// +void ImportWizard::setupImportType() +{ + m_importTypePage = new QWidget(this); + QVBoxLayout *vbox = new QVBoxLayout(m_importTypePage, KDialog::marginHint()); + m_importTypeButtonGroup = new QVButtonGroup(m_importTypePage); + m_importTypeButtonGroup->setLineWidth(0); + vbox->addWidget( m_importTypeButtonGroup ); + + (void)new QRadioButton(i18n("Structure and data"), m_importTypeButtonGroup); + (void)new QRadioButton(i18n("Structure only"), m_importTypeButtonGroup); + + m_importTypeButtonGroup->setExclusive( true ); + m_importTypeButtonGroup->setButton( 0 ); + addPage(m_importTypePage, i18n("Select Type of Import")); +} + +//=========================================================== +// +void ImportWizard::setupImporting() +{ + m_importingPage = new QWidget(this); + m_importingPage->hide(); + QVBoxLayout *vbox = new QVBoxLayout(m_importingPage, KDialog::marginHint()); + m_lblImportingTxt = new QLabel(m_importingPage); + m_lblImportingTxt->setAlignment( Qt::AlignTop | Qt::AlignLeft | Qt::WordBreak ); + + m_lblImportingErrTxt = new QLabel(m_importingPage); + m_lblImportingErrTxt->setAlignment( Qt::AlignTop | Qt::AlignLeft | Qt::WordBreak ); + + m_progressBar = new KProgress(100, m_importingPage); + m_progressBar->hide(); + + vbox->addWidget( m_lblImportingTxt ); + vbox->addWidget( m_lblImportingErrTxt ); + vbox->addStretch(1); + + KButtonBox *optionsBox = new KButtonBox(m_importingPage); + vbox->addWidget( optionsBox ); + m_importOptionsButton = optionsBox->addButton(i18n("Advanced Options"), this, SLOT(slotOptionsButtonClicked())); + m_importOptionsButton->setIconSet(SmallIconSet("configure")); + optionsBox->addStretch(1); + + vbox->addWidget( m_progressBar ); + + vbox->addStretch(2); + + m_importingPage->show(); + + addPage(m_importingPage, i18n("Importing")); +} + +//=========================================================== +// +void ImportWizard::setupFinish() +{ + m_finishPage = new QWidget(this); + m_finishPage->hide(); + QVBoxLayout *vbox = new QVBoxLayout(m_finishPage, KDialog::marginHint()); + m_finishLbl = new QLabel(m_finishPage); + m_finishLbl->setAlignment( Qt::AlignTop | Qt::AlignLeft | Qt::WordBreak ); + + vbox->addWidget( m_finishLbl ); + m_openImportedProjectCheckBox = new QCheckBox(i18n("Open imported project"), + m_finishPage, "openImportedProjectCheckBox"); + m_openImportedProjectCheckBox->setChecked(true); + vbox->addSpacing( KDialog::spacingHint() ); + vbox->addWidget( m_openImportedProjectCheckBox ); + vbox->addStretch(1); + + addPage(m_finishPage, i18n("Success")); +} + +//=========================================================== +// +bool ImportWizard::checkUserInput() +{ + QString finishtxt; + + if (m_dstNewDBNameLineEdit->text().isEmpty()) + { + finishtxt = finishtxt + "<br>" + i18n("No new database name was entered."); + } + + Kexi::ObjectStatus result; + KexiMigrate* sourceDriver = prepareImport(result); + if (sourceDriver && sourceDriver->isSourceAndDestinationDataSourceTheSame()) + { + finishtxt = finishtxt + "<br>" + i18n("Source database is the same as destination."); + } + + if (! finishtxt.isNull()) + { + finishtxt = "<qt>" + i18n("Following problems were found with the data you entered:") + + "<br>" + finishtxt + "<br><br>" + + i18n("Please click 'Back' button and correct these errors."); + m_lblImportingErrTxt->setText(finishtxt); + } + + return finishtxt.isNull(); +} + +void ImportWizard::arriveSrcConnPage() +{ + m_srcConnPage->hide(); + +// checkIfSrcTypeFileBased(m_srcTypeCombo->currentText()); +// if (fileBasedSrcSelected()) { +//moved m_srcConn->showSimpleConn(); + /*! @todo KexiStartupFileDialog needs "open file" and "open server" modes + in addition to just "open" */ + if (m_setupFileBasedSrcNeeded) { + m_setupFileBasedSrcNeeded = false; + QStringList additionalMimeTypes; + /* moved + if (m_srcTypeCombo->currentText().contains("Access")) { + //! @todo tmp: hardcoded! + additionalMimeTypes << "application/x-msaccess"; + }*/ + m_srcConn->m_fileDlg->setMode(KexiStartupFileDialog::Opening); + m_srcConn->m_fileDlg->setAdditionalFilters(additionalMimeTypes); +/*moved if (m_srcTypeCombo->currentText().contains("Access")) { + //! @todo tmp: hardcoded! + #ifdef Q_WS_WIN + m_srcConn->m_fileDlg->setSelectedFilter("*.mdb"); + #else + m_srcConn->m_fileDlg->setFilter("*.mdb"); + #endif + }*/ + //m_srcConn->m_file->label->hide(); + //m_srcConn->m_file->btn_advanced->hide(); + //m_srcConn->m_file->label->parentWidget()->hide(); + } +// } else { +// m_srcConn->showAdvancedConn(); +// } + /*! @todo Support different file extensions based on MigrationDriver */ + m_srcConnPage->show(); +} + +void ImportWizard::arriveSrcDBPage() +{ + if (fileBasedSrcSelected()) { + //! @todo Back button doesn't work after selecting a file to import + //moved showPage(m_dstTypePage); + } + else if (!m_srcDBName) { + m_srcDBPage->hide(); + kdDebug() << "Looks like we need a project selector widget!" << endl; + + KexiDB::ConnectionData* condata = m_srcConn->selectedConnectionData(); + if(condata) { + m_prjSet = new KexiProjectSet(*condata); + QVBoxLayout *vbox = new QVBoxLayout(m_srcDBPage, KDialog::marginHint()); + m_srcDBName = new KexiProjectSelectorWidget(m_srcDBPage, + "KexiMigrationProjectSelector", m_prjSet); + vbox->addWidget( m_srcDBName ); + m_srcDBName->label->setText(i18n("Select source database you wish to import:")); + } + m_srcDBPage->show(); + } +} + +void ImportWizard::arriveDstTitlePage() +{ + if(fileBasedSrcSelected()) { + QString suggestedDBName( QFileInfo(m_srcConn->selectedFileName()).fileName() ); + const QFileInfo fi( suggestedDBName ); + suggestedDBName = suggestedDBName.left(suggestedDBName.length() + - (fi.extension().length() ? (fi.extension().length()+1) : 0)); + m_dstNewDBNameLineEdit->setText( suggestedDBName ); + } else { + if (m_predefinedConnectionData) { + // server source db is predefined + m_dstNewDBNameLineEdit->setText( m_predefinedDatabaseName ); + } + else { + if (!m_srcDBName || !m_srcDBName->selectedProjectData()) { + back(); //todo! + return; + } + m_dstNewDBNameLineEdit->setText( m_srcDBName->selectedProjectData()->databaseName() ); + } + } +} + +void ImportWizard::arriveDstPage() +{ + m_dstPage->hide(); + +// checkIfDstTypeFileBased(m_dstTypeCombo->currentText()); + if(fileBasedDstSelected()) { + m_dstConn->showSimpleConn(); + m_dstConn->m_fileDlg->setMode( KexiStartupFileDialog::SavingFileBasedDB ); + if (!m_fileBasedDstWasPresented) { + //without extension - it will be added automatically + m_dstConn->m_fileDlg->setLocationText(m_dstNewDBNameLineEdit->text()); + } + m_fileBasedDstWasPresented = true; + } else { + m_dstConn->showAdvancedConn(); + } + m_dstPage->show(); +} + +void ImportWizard::arriveImportingPage() { +// checkIfDstTypeFileBased(m_dstTypeCombo->currentText()); +/*moved if (m_fileBasedDstWasPresented) { + if (!m_dstConn->m_fileDlg->checkFileName()) { + back(); + return; + } + }*/ + m_importingPage->hide(); + if (checkUserInput()) { + setNextEnabled(m_importingPage, true); + } + else { + setNextEnabled(m_importingPage, false); + } + + m_lblImportingTxt->setText(i18n( + "All required information has now " + "been gathered. Click \"Next\" button to start importing.\n\n" + "Depending on size of the database this may take some time." + /*"Note: You may be asked for extra " + "information such as field types if " + "the wizard could not automatically " + "determine this for you."*/)); + +//todo + + //temp. hack for MS Access driver only +//! @todo for other databases we will need KexiMigration::Conenction +//! and KexiMigration::Driver classes + bool showOptions = false; + if (fileBasedSrcSelected()) { + Kexi::ObjectStatus result; + KexiMigrate* sourceDriver = prepareImport(result); + if (sourceDriver) { + showOptions = !result.error() + && sourceDriver->propertyValue( "source_database_has_nonunicode_encoding" ).toBool(); + KexiMigration::Data *data = sourceDriver->data(); + sourceDriver->setData( 0 ); + delete data; + } + } + if (showOptions) + m_importOptionsButton->show(); + else + m_importOptionsButton->hide(); + + m_importingPage->show(); +} + +void ImportWizard::arriveFinishPage() { +// backButton()->hide(); +// cancelButton()->setEnabled(false); +// m_finishLbl->setText( m_successText.arg(m_dstNewDBNameLineEdit->text()) ); +} + +bool ImportWizard::fileBasedSrcSelected() const +{ + if (m_predefinedConnectionData) + return false; + +// kdDebug() << (m_srcConn->selectedConnectionType()==KexiConnSelectorWidget::FileBased) << endl; + return m_srcConn->selectedConnectionType()==KexiConnSelectorWidget::FileBased; +} + +bool ImportWizard::fileBasedDstSelected() const +{ +// QString dstType(m_dstServerTypeCombo->currentText()); + + return m_dstPrjTypeSelector->buttonGroup->selectedId() == 1; + +/* if ((dstType == "PostgreSQL") || (dstType == "MySQL")) { + return false; + } else { + return true; + }*/ +} + + +void ImportWizard::progressUpdated(int percent) { + m_progressBar->setProgress(percent); + KApplication::kApplication()->processEvents(); +} + +//=========================================================== +// +QString ImportWizard::driverNameForSelectedSource() +{ + if (fileBasedSrcSelected()) { + KMimeType::Ptr ptr = KMimeType::findByFileContent( m_srcConn->selectedFileName() ); + if (!ptr || ptr.data()->name()=="application/octet-stream" || ptr.data()->name()=="text/plain") { + //try by URL: + ptr = KMimeType::findByURL( m_srcConn->selectedFileName() ); + } + return ptr ? m_migrateManager.driverForMimeType( ptr.data()->name() ) : QString::null; + } + + //server-based + if (m_predefinedConnectionData) { + return m_predefinedConnectionData->driverName; + } + + return m_srcConn->selectedConnectionData() + ? m_srcConn->selectedConnectionData()->driverName : QString::null; +} + +//=========================================================== +// +void ImportWizard::accept() +{ + /*moved + backButton()->setEnabled(false); + finishButton()->setEnabled(false); +// cancelButton()->setEnabled(false); + acceptImport(); + backButton()->setEnabled(true); + finishButton()->setEnabled(true); +// cancelButton()->setEnabled(true); +*/ + if (m_args) { + if ((!fileBasedDstSelected() && !m_args->contains("destinationConnectionShortcut")) + || !m_openImportedProjectCheckBox->isChecked()) + { + //do not open dest db if used didn't want it + //for server connections, destinationConnectionShortcut must be defined + m_args->remove("destinationDatabaseName"); + } + } + KWizard::accept(); +} + +KexiMigrate* ImportWizard::prepareImport(Kexi::ObjectStatus& result) +{ + KexiUtils::WaitCursor wait; + + // Start with a driver manager + KexiDB::DriverManager manager; + + kdDebug() << "Creating destination driver..." << endl; + + // Get a driver to the destination database + KexiDB::Driver *destDriver = manager.driver( + m_dstConn->selectedConnectionData() ? m_dstConn->selectedConnectionData()->driverName //server based + : KexiDB::Driver::defaultFileBasedDriverName() + // : m_dstTypeCombo->currentText() //file based + ); + if (!destDriver || manager.error()) + { + result.setStatus(&manager); + kdDebug() << "Manager error..." << endl; + manager.debugError(); +// result.setStatus(&manager); + } + + // Set up destination connection data + KexiDB::ConnectionData *cdata; + bool cdataOwned = false; + QString dbname; + if (!result.error()) + { + if (m_dstConn->selectedConnectionData()) + { + //server-based project + kdDebug() << "Server destination..." << endl; + cdata = m_dstConn->selectedConnectionData(); + dbname = m_dstNewDBNameLineEdit->text(); + } + else // if (m_dstTypeCombo->currentText().lower() == KexiDB::Driver::defaultFileBasedDriverName()) + { + //file-based project + kdDebug() << "File Destination..." << endl; + cdata = new KexiDB::ConnectionData(); + cdataOwned = true; + cdata->caption = m_dstNewDBNameLineEdit->text(); + cdata->driverName = KexiDB::Driver::defaultFileBasedDriverName(); + dbname = m_dstConn->selectedFileName(); + cdata->setFileName( dbname ); + kdDebug() << "Current file name: " << dbname << endl; + } +/* else + { + //TODO This needs a better message + //KMessageBox::error(this, + result.setStatus(i18n("No connection data is available. You did not select a destination filename."),""); + //return false; + } */ + } + + // Find a source (migration) driver name + QString sourceDriverName; + if (!result.error()) + { + sourceDriverName = driverNameForSelectedSource(); + if (sourceDriverName.isEmpty()) + result.setStatus(i18n("No appropriate migration driver found."), + m_migrateManager.possibleProblemsInfoMsg()); + } + + // Get a source (migration) driver + KexiMigrate* sourceDriver = 0; + if (!result.error()) + { + sourceDriver = m_migrateManager.driver( sourceDriverName ); + if(!sourceDriver || m_migrateManager.error()) { + kdDebug() << "Import migrate driver error..." << endl; + result.setStatus(&m_migrateManager); + } + } + + KexiUtils::removeWaitCursor(); + + // Set up source (migration) data required for connection + if (sourceDriver && !result.error()) + { + // Setup progress feedback for the GUI + if(sourceDriver->progressSupported()) { + m_progressBar->updateGeometry(); + disconnect(sourceDriver, SIGNAL(progressPercent(int)), + this, SLOT(progressUpdated(int))); + connect(sourceDriver, SIGNAL(progressPercent(int)), + this, SLOT(progressUpdated(int))); + progressUpdated(0); + } + + bool keepData; + if (m_importTypeButtonGroup->selectedId() == 0) + { + kdDebug() << "Structure and data selected" << endl; + keepData = true; + } + else if (m_importTypeButtonGroup->selectedId() == 1) + { + kdDebug() << "structure only selected" << endl; + keepData = false; + } + else + { + kdDebug() << "Neither radio button is selected (not possible?) presume keep data" << endl; + keepData = true; + } + + KexiMigration::Data* md = new KexiMigration::Data(); + // delete md->destination; + md->destination = new KexiProjectData(*cdata, dbname); + if(fileBasedSrcSelected()) { + KexiDB::ConnectionData* conn_data = new KexiDB::ConnectionData(); + conn_data->setFileName(m_srcConn->selectedFileName()); + md->source = conn_data; + md->sourceName = ""; + } + else + { + if (m_predefinedConnectionData) + md->source = m_predefinedConnectionData; + else + md->source = m_srcConn->selectedConnectionData(); + + if (!m_predefinedDatabaseName.isEmpty()) + md->sourceName = m_predefinedDatabaseName; + else + md->sourceName = m_srcDBName->selectedProjectData()->databaseName(); + //! @todo Aah, this is so C-like. Move to performImport(). + } + md->keepData = keepData; + sourceDriver->setData(md); + return sourceDriver; + } + return 0; +} + +tristate ImportWizard::import() +{ + m_importExecuted = true; + + Kexi::ObjectStatus result; + KexiMigrate* sourceDriver = prepareImport(result); + + bool acceptingNeeded = false; + + // Perform import + if (sourceDriver && !result.error()) + { + if (!m_sourceDBEncoding.isEmpty()) { + sourceDriver->setPropertyValue( "source_database_nonunicode_encoding", + QVariant(m_sourceDBEncoding.upper().replace(' ',"")) // "CP1250", not "cp 1250" + ); + } + + if (!sourceDriver->checkIfDestinationDatabaseOverwritingNeedsAccepting(&result, acceptingNeeded)) { + kdDebug() << "Abort import cause checkIfDestinationDatabaseOverwritingNeedsAccepting returned false." << endl; + return false; + } + + kdDebug() << sourceDriver->data()->destination->databaseName() << endl; + kdDebug() << "Performing import..." << endl; + } + + if (sourceDriver && !result.error() && acceptingNeeded) { // ok, the destination-db already exists... + if (KMessageBox::Yes != KMessageBox::warningYesNo(this, + "<qt>"+i18n("Database %1 already exists." + "<p>Do you want to replace it with a new one?") + .arg(sourceDriver->data()->destination->infoString()), + 0, KGuiItem(i18n("&Replace")), KGuiItem(i18n("No")))) + { + return cancelled; + } + } + + if (sourceDriver && !result.error() && sourceDriver->progressSupported()) { + m_progressBar->show(); + } + + if (sourceDriver && !result.error() && sourceDriver->performImport(&result)) + { + if (m_args) { +// if (fileBasedDstSelected()) { + m_args->insert("destinationDatabaseName", + sourceDriver->data()->destination->databaseName()); +// } + QString destinationConnectionShortcut( + Kexi::connset().fileNameForConnectionData( m_dstConn->selectedConnectionData() ) ); + if (!destinationConnectionShortcut.isEmpty()) { + m_args->insert("destinationConnectionShortcut", destinationConnectionShortcut); + } + } + setTitle(m_finishPage, i18n("Success")); + return true; + } + + if (!sourceDriver || result.error()) + { + m_progressBar->setProgress(0); + m_progressBar->hide(); + + QString msg, details; + KexiTextMessageHandler handler(msg, details); + handler.showErrorMessage(&result); + + kdDebug() << msg << "\n" << details << endl; + setTitle(m_finishPage, i18n("Failure")); + m_finishLbl->setText( + i18n("<p>Import failed.</p>%1<p>%2</p><p>You can click \"Back\" button and try again.</p>") + .arg(msg).arg(details)); + return false; + } +// delete kexi_conn; + return true; +} + +void ImportWizard::reject() +{ + KWizard::reject(); +} + +//=========================================================== +// +void ImportWizard::next() +{ + if (currentPage() == m_srcConnPage) { + if (fileBasedSrcSelected() + && /*! @todo use KURL? */!QFileInfo(m_srcConn->selectedFileName()).isFile()) { + + KMessageBox::sorry(this,i18n("Select source database filename.")); + return; + } + + if ( (! fileBasedSrcSelected()) && (! m_srcConn->selectedConnectionData()) ) { + KMessageBox::sorry(this,i18n("Select source database.")); + return; + } + + KexiMigrate* import = m_migrateManager.driver( driverNameForSelectedSource() ); + if(!import || m_migrateManager.error()) { + QString dbname; + if (fileBasedSrcSelected()) + dbname = m_srcConn->selectedFileName(); + else + dbname = m_srcConn->selectedConnectionData() + ? m_srcConn->selectedConnectionData()->serverInfoString() : QString::null; + if (!dbname.isEmpty()) + dbname = QString(" \"%1\"").arg(dbname); + KMessageBox::error(this, i18n("Could not import database%1. This type is not supported.") + .arg(dbname)); + return; + } + } + else if (currentPage() == m_dstPage) { + if (m_fileBasedDstWasPresented) { + if (fileBasedDstSelected() && !m_dstConn->m_fileDlg->checkFileName()) + return; + } + } + else if (currentPage() == m_importingPage) { + if (!m_importExecuted) { + m_importOptionsButton->hide(); + nextButton()->setEnabled(false); + finishButton()->setEnabled(false); + backButton()->setEnabled(false); + m_lblImportingTxt->setText(i18n("Importing in progress...")); + tristate res = import(); + if (true == res) { + m_finishLbl->setText( + i18n("Database has been imported into Kexi database project \"%1\".") + .arg(m_dstNewDBNameLineEdit->text()) ); + cancelButton()->setEnabled(false); + setBackEnabled(m_finishPage, false); + setFinishEnabled(m_finishPage, true); + m_openImportedProjectCheckBox->show(); + next(); + return; + } + + m_progressBar->hide(); + cancelButton()->setEnabled(true); + setBackEnabled(m_finishPage, true); + setFinishEnabled(m_finishPage, false); + m_openImportedProjectCheckBox->hide(); + if (!res) + next(); + else if (~res) { + arriveImportingPage(); + // back(); + } + m_importExecuted = false; + return; + } + } + + setAppropriate( m_srcDBPage, !fileBasedSrcSelected() && !m_predefinedConnectionData ); //skip m_srcDBPage + KWizard::next(); +} + +void ImportWizard::back() +{ + setAppropriate( m_srcDBPage, !fileBasedSrcSelected() && !m_predefinedConnectionData ); //skip m_srcDBPage + KWizard::back(); +} + +void ImportWizard::pageSelected(const QString &) +{ + if (currentPage() == m_introPage) { + } +// else if (currentPage() == m_srcTypePage) { +// } + else if (currentPage() == m_srcConnPage) { + arriveSrcConnPage(); + } + else if (currentPage() == m_srcDBPage) { + arriveSrcDBPage(); + } + else if (currentPage() == m_dstTypePage) { + } + else if (currentPage() == m_dstTitlePage) { + arriveDstTitlePage(); + } + else if (currentPage() == m_dstPage) { + arriveDstPage(); + } + else if (currentPage() == m_importingPage) { + arriveImportingPage(); + } + else if (currentPage() == m_finishPage) { + arriveFinishPage(); + } +} + +void ImportWizard::helpClicked() +{ + if (currentPage() == m_introPage) + { + KMessageBox::information(this, i18n("No help is available for this page."), i18n("Help")); + } +/* else if (currentPage() == m_srcTypePage) + { + KMessageBox::information(this, i18n("Here you can choose the type of data to import data from."), i18n("Help")); + }*/ + else if (currentPage() == m_srcConnPage) + { + KMessageBox::information(this, i18n("Here you can choose the location to import data from."), i18n("Help")); + } + else if (currentPage() == m_srcDBPage) + { + KMessageBox::information(this, i18n("Here you can choose the actual database to import data from."), i18n("Help")); + } + else if (currentPage() == m_dstTypePage) + { + KMessageBox::information(this, i18n("Here you can choose the location to save the data."), i18n("Help")); + } + else if (currentPage() == m_dstPage) + { + KMessageBox::information(this, i18n("Here you can choose the location to save the data in and the new database name."), i18n("Help")); + } + else if (currentPage() == m_finishPage || currentPage() == m_importingPage) + { + KMessageBox::information(this, i18n("No help is available for this page."), i18n("Help")); + } +} + +void ImportWizard::slotOptionsButtonClicked() +{ + OptionsDialog dlg(m_srcConn->selectedFileName(), m_sourceDBEncoding, this); + if (QDialog::Accepted != dlg.exec()) + return; + + if (m_sourceDBEncoding != dlg.encodingComboBox()->selectedEncoding()) { + m_sourceDBEncoding = dlg.encodingComboBox()->selectedEncoding(); + } +} + +#include "importwizard.moc" |