diff options
Diffstat (limited to 'kexi/main/startup/KexiConnSelector.cpp')
-rw-r--r-- | kexi/main/startup/KexiConnSelector.cpp | 432 |
1 files changed, 432 insertions, 0 deletions
diff --git a/kexi/main/startup/KexiConnSelector.cpp b/kexi/main/startup/KexiConnSelector.cpp new file mode 100644 index 00000000..454f1e08 --- /dev/null +++ b/kexi/main/startup/KexiConnSelector.cpp @@ -0,0 +1,432 @@ +/* This file is part of the KDE project + Copyright (C) 2003,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 "KexiConnSelector.h" + +#include <kexidb/drivermanager.h> +#include <kexidb/connectiondata.h> + +#include <kexi.h> +#include "KexiConnSelectorBase.h" +//#include "KexiOpenExistingFile.h" +#include <widget/kexiprjtypeselector.h> +#include <widget/kexidbconnectionwidget.h> + +#include <kapplication.h> +#include <kiconloader.h> +#include <kmimetype.h> +#include <klocale.h> +#include <kdebug.h> +#include <kconfig.h> +#include <kurlcombobox.h> +#include <ktoolbar.h> +#include <kpopupmenu.h> +#include <ktoolbarbutton.h> +#include <kactionclasses.h> + +#include <qlabel.h> +#include <qpushbutton.h> +#include <qlayout.h> +#include <qcheckbox.h> +#include <qtooltip.h> +#include <qtextedit.h> +#include <qgroupbox.h> +#include <qwidgetstack.h> +#include <qbuttongroup.h> + +ConnectionDataLVItem::ConnectionDataLVItem(KexiDB::ConnectionData *data, + const KexiDB::Driver::Info& info, QListView *list) + : QListViewItem(list) + , m_data(data) +{ + update(info); +} + +ConnectionDataLVItem::~ConnectionDataLVItem() +{ +} + +void ConnectionDataLVItem::update(const KexiDB::Driver::Info& info) +{ + setText(0, m_data->caption+" "); + const QString &sfile = i18n("File"); + QString drvname = info.caption.isEmpty() ? m_data->driverName : info.caption; + if (info.fileBased) + setText(1, sfile + " ("+drvname+") " ); + else + setText(1, drvname+" " ); + setText(2, (info.fileBased ? (QString("<")+sfile.lower()+">") : m_data->serverInfoString(true))+" " ); +} + +/*================================================================*/ + +//! @internal +class KexiConnSelectorWidgetPrivate +{ +public: + KexiConnSelectorWidgetPrivate() + : conn_sel_shown(false) + , file_sel_shown(false) + , confirmOverwrites(true) + { + } + + QWidget* openExistingWidget; + KexiPrjTypeSelector* prjTypeSelector; + QString startDirOrVariable; + QWidgetStack *stack; + QGuardedPtr<KexiDBConnectionSet> conn_set; + KexiDB::DriverManager manager; + bool conn_sel_shown;//! helper + bool file_sel_shown; + bool confirmOverwrites; +}; + +/*================================================================*/ + +KexiConnSelectorWidget::KexiConnSelectorWidget( KexiDBConnectionSet& conn_set, + const QString& startDirOrVariable, QWidget* parent, const char* name ) + : QWidget( parent, name ) + ,d(new KexiConnSelectorWidgetPrivate()) +{ + d->conn_set = &conn_set; + d->startDirOrVariable = startDirOrVariable; + QString none, iconname = KMimeType::mimeType( KexiDB::Driver::defaultFileBasedDriverMimeType() )->icon(none,0); + const QPixmap &icon = KGlobal::iconLoader()->loadIcon( iconname, KIcon::Desktop ); + setIcon( icon ); + + QVBoxLayout* globalLyr = new QVBoxLayout( this ); + + //create header with radio buttons + d->openExistingWidget = new QWidget(this, "openExistingWidget"); + QVBoxLayout* openExistingWidgetLyr = new QVBoxLayout( d->openExistingWidget ); +// QLabel* lbl = new QLabel(i18n("<b>Select existing Kexi project to open:</b>"), openExistingWidget); +// openExistingWidgetLyr->addWidget( lbl ); + d->prjTypeSelector = new KexiPrjTypeSelector( d->openExistingWidget ); + connect(d->prjTypeSelector->buttonGroup,SIGNAL(clicked(int)),this,SLOT(slotPrjTypeSelected(int))); + openExistingWidgetLyr->addWidget( d->prjTypeSelector ); + openExistingWidgetLyr->addSpacing( KDialogBase::spacingHint() ); + QFrame* line = new QFrame( d->openExistingWidget, "line" ); + line->setFrameShape( QFrame::HLine ); + line->setFrameShadow( QFrame::Sunken ); + openExistingWidgetLyr->addWidget( line ); + globalLyr->addWidget(d->openExistingWidget); + + d->stack = new QWidgetStack(this, "stack"); + globalLyr->addWidget(d->stack); + +// m_file = new KexiOpenExistingFile( this, "KexiOpenExistingFile"); +// m_file->btn_advanced->setIconSet( SmallIconSet("1downarrow") ); + m_fileDlg = 0; + +// addWidget(m_file); +// connect(m_file->btn_advanced,SIGNAL(clicked()),this,SLOT(showAdvancedConn())); + + m_remote = new KexiConnSelectorBase(d->stack, "conn_sel"); + m_remote->icon->setPixmap( DesktopIcon("network") ); + m_remote->icon->setFixedSize( m_remote->icon->pixmap()->size() ); +// m_remote->btn_back->setIconSet( SmallIconSet("1uparrow") ); + connect(m_remote->btn_add, SIGNAL(clicked()), this, SLOT(slotRemoteAddBtnClicked())); + connect(m_remote->btn_edit, SIGNAL(clicked()), this, SLOT(slotRemoteEditBtnClicked())); + connect(m_remote->btn_remove, SIGNAL(clicked()), this, SLOT(slotRemoteRemoveBtnClicked())); + QToolTip::add(m_remote->btn_add, i18n("Add a new database connection")); + QToolTip::add(m_remote->btn_edit, i18n("Edit selected database connection")); + QToolTip::add(m_remote->btn_remove, i18n("Remove selected database connections")); + d->stack->addWidget(m_remote); + if (m_remote->layout()) + m_remote->layout()->setMargin(0); +// connect(m_remote->btn_back,SIGNAL(clicked()),this,SLOT(showSimpleConn())); + connect(m_remote->list,SIGNAL(doubleClicked(QListViewItem*)), + this,SLOT(slotConnectionItemExecuted(QListViewItem*))); + connect(m_remote->list,SIGNAL(returnPressed(QListViewItem*)), + this,SLOT(slotConnectionItemExecuted(QListViewItem*))); + connect(m_remote->list,SIGNAL(selectionChanged()), + this,SLOT(slotConnectionSelectionChanged())); +} + +KexiConnSelectorWidget::~KexiConnSelectorWidget() +{ + delete d; +} + +/*void KexiConnSelectorWidget::disconnectShowSimpleConnButton() +{ + m_remote->btn_back->disconnect(this,SLOT(showSimpleConn())); +}*/ + +void KexiConnSelectorWidget::showAdvancedConn() +{ + slotPrjTypeSelected(2); + d->prjTypeSelector->buttonGroup->setButton(2); +} + +//void KexiConnSelectorWidget::showAdvancedConn() +void KexiConnSelectorWidget::slotPrjTypeSelected(int id) +{ + if (id==1) {//file-based prj type + showSimpleConn(); + } + else if (id==2) {//server-based prj type + if (!d->conn_sel_shown) { + d->conn_sel_shown=true; + + //show connections (on demand): + for (KexiDB::ConnectionData::ListIterator it(d->conn_set->list()); it.current(); ++it) { + addConnectionData( it.current() ); + // else { + //this error should be more verbose: + // kdWarning() << "KexiConnSelector::KexiConnSelector(): no driver found for '" << it.current()->driverName << "'!" << endl; + // } + } + if (m_remote->list->firstChild()) { + m_remote->list->setSelected(m_remote->list->firstChild(),true); + } + m_remote->descriptionEdit->setPaletteBackgroundColor(palette().active().background()); + m_remote->descGroupBox->layout()->setMargin(2); + m_remote->list->setFocus(); + slotConnectionSelectionChanged(); + } + d->stack->raiseWidget(m_remote); + } +} + +ConnectionDataLVItem* KexiConnSelectorWidget::addConnectionData( KexiDB::ConnectionData* data ) +{ + const KexiDB::Driver::Info info( d->manager.driverInfo(data->driverName) ); +// if (!info.name.isEmpty()) { + return new ConnectionDataLVItem(data, info, m_remote->list); +// } +} + +void KexiConnSelectorWidget::showSimpleConn() +{ + d->prjTypeSelector->buttonGroup->setButton(1); + if (!d->file_sel_shown) { + d->file_sel_shown=true; + m_fileDlg = new KexiStartupFileDialog( d->startDirOrVariable, KexiStartupFileDialog::Opening, + d->stack, "openExistingFileDlg"); + m_fileDlg->setConfirmOverwrites( d->confirmOverwrites ); +// static_cast<QVBoxLayout*>(m_file->layout())->insertWidget( 2, m_fileDlg ); + d->stack->addWidget(m_fileDlg); + + for (QWidget *w = parentWidget(true);w;w=w->parentWidget(true)) { + if (w->isDialog()) { +//#ifndef Q_WS_WIN + connect(m_fileDlg,SIGNAL(rejected()),static_cast<QDialog*>(w),SLOT(reject())); +//#endif +// connect(m_fileDlg,SIGNAL(cancelled()),static_cast<QDialog*>(w),SLOT(reject())); + break; + } + } + } + d->stack->raiseWidget(m_fileDlg); +} + +int KexiConnSelectorWidget::selectedConnectionType() const +{ + return (d->stack->visibleWidget()==m_fileDlg) ? FileBased : ServerBased; +} + +/*ConnectionDataLVItem* KexiConnSelectorWidget::selectedConnectionDataItem() const +{ + if (selectedConnectionType()!=KexiConnSelectorWidget::ServerBased) + return 0; + ConnectionDataLVItem *item = 0; // = static_cast<ConnectionDataLVItem*>(m_remote->list->selectedItem()); + for (QListViewItemIterator it(m_remote->list); it.current(); ++it) { + if (it.current()->isSelected()) { + if (item) + return 0; //multiple + item = static_cast<ConnectionDataLVItem*>(it.current()); + } + } + return item; +}*/ + +KexiDB::ConnectionData* KexiConnSelectorWidget::selectedConnectionData() const +{ + ConnectionDataLVItem *item = static_cast<ConnectionDataLVItem*>(m_remote->list->selectedItem()); //ConnectionDataItem(); + if (!item) + return 0; + return item->data(); +} + +QString KexiConnSelectorWidget::selectedFileName() +{ + if (selectedConnectionType()!=KexiConnSelectorWidget::FileBased) + return QString::null; + return m_fileDlg->currentFileName(); +} + +void KexiConnSelectorWidget::setSelectedFileName(const QString& fileName) +{ + if (selectedConnectionType()!=KexiConnSelectorWidget::FileBased) + return; + return m_fileDlg->setSelection(fileName); +} + +void KexiConnSelectorWidget::slotConnectionItemExecuted(QListViewItem *item) +{ + emit connectionItemExecuted(static_cast<ConnectionDataLVItem*>(item)); +} + +void KexiConnSelectorWidget::slotConnectionSelectionChanged() +{ + ConnectionDataLVItem* item = static_cast<ConnectionDataLVItem*>(m_remote->list->selectedItem()); + //update buttons availability +/* ConnectionDataLVItem *singleItem = 0; + bool multi = false; + for (QListViewItemIterator it(m_remote->list); it.current(); ++it) { + if (it.current()->isSelected()) { + if (singleItem) { + singleItem = 0; + multi = true; + break; + } + else + singleItem = static_cast<ConnectionDataLVItem*>(it.current()); + } + }*/ + m_remote->btn_edit->setEnabled(item); + m_remote->btn_remove->setEnabled(item); + m_remote->descriptionEdit->setText(item ? item->data()->description : QString::null); + emit connectionItemHighlighted(item); +} + +QListView* KexiConnSelectorWidget::connectionsList() const +{ + return m_remote->list; +} + +void KexiConnSelectorWidget::setFocus() +{ + QWidget::setFocus(); + if (d->stack->visibleWidget()==m_fileDlg) + m_fileDlg->setFocus(); //m_fileDlg->locationWidget()->setFocus(); + else + m_remote->list->setFocus(); +} + +void KexiConnSelectorWidget::hideHelpers() +{ + d->openExistingWidget->hide(); + +/* m_file->lbl->hide(); + m_file->line->hide(); + m_file->spacer->hide(); + m_file->label->hide(); + m_remote->label->hide(); + m_remote->label_back->hide(); + m_remote->btn_back->hide(); + m_remote->icon->hide();*/ +} + +void KexiConnSelectorWidget::setConfirmOverwrites(bool set) +{ + d->confirmOverwrites = set; + if (m_fileDlg) + m_fileDlg->setConfirmOverwrites( d->confirmOverwrites ); +} + +bool KexiConnSelectorWidget::confirmOverwrites() const +{ + return d->confirmOverwrites; +} + +/*static QString msgUnfinished() { + return i18n("To define or change a connection, use command line options or click on .kexis file. " + "You can find example .kexis file at <a href=\"%1\">here</a>.").arg("") //temporary, please do not change for 0.8! + + "\nhttp://www.kexi-project.org/resources/testdb.kexis"; */ +// .arg("http://websvn.kde.org/*checkout*/branches/kexi/0.9/koffice/kexi/tests/startup/testdb.kexis"); +//} + +void KexiConnSelectorWidget::slotRemoteAddBtnClicked() +{ + KexiDB::ConnectionData data; + KexiDBConnectionDialog dlg(data, QString::null, + KGuiItem(i18n("&Add"), "button_ok", i18n("Add database connection")) ); + dlg.setCaption(i18n("Add New Database Connection")); + if (QDialog::Accepted!=dlg.exec()) + return; + + //store this conn. data + KexiDB::ConnectionData *newData = new KexiDB::ConnectionData(*dlg.currentProjectData().connectionData()); + if (!d->conn_set->addConnectionData(newData)) { + //! @todo msg? + delete newData; + return; + } + + ConnectionDataLVItem* item = addConnectionData(newData); +// m_remote->list->clearSelection(); + m_remote->list->setSelected(item, true); + slotConnectionSelectionChanged(); +} + +void KexiConnSelectorWidget::slotRemoteEditBtnClicked() +{ + ConnectionDataLVItem* item = static_cast<ConnectionDataLVItem*>(m_remote->list->selectedItem()); + if (!item) + return; + KexiDBConnectionDialog dlg(*item->data(), QString::null, + KGuiItem(i18n("&Save"), "filesave", i18n("Save changes made to this database connection")) ); + dlg.setCaption(i18n("Edit Database Connection")); + if (QDialog::Accepted!=dlg.exec()) + return; + + KexiDB::ConnectionData *newData = new KexiDB::ConnectionData( *dlg.currentProjectData().connectionData() ); + if (!d->conn_set->saveConnectionData(item->data(), newData)) { + //! @todo msg? + delete newData; + return; + } + const KexiDB::Driver::Info info( d->manager.driverInfo(item->data()->driverName) ); + item->update(info); + slotConnectionSelectionChanged(); //to update descr. edit +} + +void KexiConnSelectorWidget::slotRemoteRemoveBtnClicked() +{ + ConnectionDataLVItem* item = static_cast<ConnectionDataLVItem*>(m_remote->list->selectedItem()); + if (!item) + return; + if (KMessageBox::Continue!=KMessageBox::warningContinueCancel(0, + i18n("Do you want to remove database connection \"%1\" from the list of available connections?") + .arg(item->data()->serverInfoString(true)), QString::null, KStdGuiItem::del(), QString::null, + KMessageBox::Notify|KMessageBox::Dangerous)) + return; + + QListViewItem* nextItem = item->itemBelow(); + if (!nextItem) + nextItem = item->itemAbove(); + if (!d->conn_set->removeConnectionData(item->data())) + return; + + m_remote->list->removeItem(item); + if (nextItem) + m_remote->list->setSelected(nextItem, true); + slotConnectionSelectionChanged(); +} + +void KexiConnSelectorWidget::hideConnectonIcon() +{ + m_remote->icon->setFixedWidth(0); + m_remote->icon->setPixmap(QPixmap()); +} + +#include "KexiConnSelector.moc" |