00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "KexiConnSelector.h"
00021
00022 #include <kexidb/drivermanager.h>
00023 #include <kexidb/connectiondata.h>
00024
00025 #include <kexi.h>
00026 #include "KexiConnSelectorBase.h"
00027
00028 #include <widget/kexiprjtypeselector.h>
00029 #include <widget/kexidbconnectionwidget.h>
00030
00031 #include <kapplication.h>
00032 #include <kiconloader.h>
00033 #include <kmimetype.h>
00034 #include <klocale.h>
00035 #include <kdebug.h>
00036 #include <kconfig.h>
00037 #include <kurlcombobox.h>
00038 #include <ktoolbar.h>
00039 #include <kpopupmenu.h>
00040 #include <ktoolbarbutton.h>
00041 #include <kactionclasses.h>
00042
00043 #include <qlabel.h>
00044 #include <qpushbutton.h>
00045 #include <qlayout.h>
00046 #include <qcheckbox.h>
00047 #include <qtooltip.h>
00048 #include <qtextedit.h>
00049 #include <qgroupbox.h>
00050 #include <qwidgetstack.h>
00051 #include <qbuttongroup.h>
00052
00053 ConnectionDataLVItem::ConnectionDataLVItem(KexiDB::ConnectionData *data,
00054 const KexiDB::Driver::Info& info, QListView *list)
00055 : QListViewItem(list)
00056 , m_data(data)
00057 {
00058 update(info);
00059 }
00060
00061 ConnectionDataLVItem::~ConnectionDataLVItem()
00062 {
00063 }
00064
00065 void ConnectionDataLVItem::update(const KexiDB::Driver::Info& info)
00066 {
00067 setText(0, m_data->caption+" ");
00068 const QString &sfile = i18n("File");
00069 QString drvname = info.caption.isEmpty() ? m_data->driverName : info.caption;
00070 if (info.fileBased)
00071 setText(1, sfile + " ("+drvname+") " );
00072 else
00073 setText(1, drvname+" " );
00074 setText(2, (info.fileBased ? (QString("<")+sfile.lower()+">") : m_data->serverInfoString(true))+" " );
00075 }
00076
00077
00078
00080 class KexiConnSelectorWidgetPrivate
00081 {
00082 public:
00083 KexiConnSelectorWidgetPrivate()
00084 : conn_sel_shown(false)
00085 , file_sel_shown(false)
00086 , confirmOverwrites(true)
00087 {
00088 }
00089
00090 QWidget* openExistingWidget;
00091 KexiPrjTypeSelector* prjTypeSelector;
00092 QString startDirOrVariable;
00093 QWidgetStack *stack;
00094 QGuardedPtr<KexiDBConnectionSet> conn_set;
00095 KexiDB::DriverManager manager;
00096 bool conn_sel_shown;
00097 bool file_sel_shown;
00098 bool confirmOverwrites;
00099 };
00100
00101
00102
00103 KexiConnSelectorWidget::KexiConnSelectorWidget( KexiDBConnectionSet& conn_set,
00104 const QString& startDirOrVariable, QWidget* parent, const char* name )
00105 : QWidget( parent, name )
00106 ,d(new KexiConnSelectorWidgetPrivate())
00107 {
00108 d->conn_set = &conn_set;
00109 d->startDirOrVariable = startDirOrVariable;
00110 QString none, iconname = KMimeType::mimeType( KexiDB::Driver::defaultFileBasedDriverMimeType() )->icon(none,0);
00111 const QPixmap &icon = KGlobal::iconLoader()->loadIcon( iconname, KIcon::Desktop );
00112 setIcon( icon );
00113
00114 QVBoxLayout* globalLyr = new QVBoxLayout( this );
00115
00116
00117 d->openExistingWidget = new QWidget(this, "openExistingWidget");
00118 QVBoxLayout* openExistingWidgetLyr = new QVBoxLayout( d->openExistingWidget );
00119
00120
00121 d->prjTypeSelector = new KexiPrjTypeSelector( d->openExistingWidget );
00122 connect(d->prjTypeSelector->buttonGroup,SIGNAL(clicked(int)),this,SLOT(slotPrjTypeSelected(int)));
00123 openExistingWidgetLyr->addWidget( d->prjTypeSelector );
00124 openExistingWidgetLyr->addSpacing( KDialogBase::spacingHint() );
00125 QFrame* line = new QFrame( d->openExistingWidget, "line" );
00126 line->setFrameShape( QFrame::HLine );
00127 line->setFrameShadow( QFrame::Sunken );
00128 openExistingWidgetLyr->addWidget( line );
00129 globalLyr->addWidget(d->openExistingWidget);
00130
00131 d->stack = new QWidgetStack(this, "stack");
00132 globalLyr->addWidget(d->stack);
00133
00134
00135
00136 m_fileDlg = 0;
00137
00138
00139
00140
00141 m_remote = new KexiConnSelectorBase(d->stack, "conn_sel");
00142 m_remote->icon->setPixmap( DesktopIcon("network") );
00143 m_remote->icon->setFixedSize( m_remote->icon->pixmap()->size() );
00144
00145 connect(m_remote->btn_add, SIGNAL(clicked()), this, SLOT(slotRemoteAddBtnClicked()));
00146 connect(m_remote->btn_edit, SIGNAL(clicked()), this, SLOT(slotRemoteEditBtnClicked()));
00147 connect(m_remote->btn_remove, SIGNAL(clicked()), this, SLOT(slotRemoteRemoveBtnClicked()));
00148 QToolTip::add(m_remote->btn_add, i18n("Add a new database connection"));
00149 QToolTip::add(m_remote->btn_edit, i18n("Edit selected database connection"));
00150 QToolTip::add(m_remote->btn_remove, i18n("Remove selected database connections"));
00151 d->stack->addWidget(m_remote);
00152 if (m_remote->layout())
00153 m_remote->layout()->setMargin(0);
00154
00155 connect(m_remote->list,SIGNAL(doubleClicked(QListViewItem*)),
00156 this,SLOT(slotConnectionItemExecuted(QListViewItem*)));
00157 connect(m_remote->list,SIGNAL(returnPressed(QListViewItem*)),
00158 this,SLOT(slotConnectionItemExecuted(QListViewItem*)));
00159 connect(m_remote->list,SIGNAL(selectionChanged()),
00160 this,SLOT(slotConnectionSelectionChanged()));
00161 }
00162
00163 KexiConnSelectorWidget::~KexiConnSelectorWidget()
00164 {
00165 delete d;
00166 }
00167
00168
00169
00170
00171
00172
00173 void KexiConnSelectorWidget::showAdvancedConn()
00174 {
00175 slotPrjTypeSelected(2);
00176 d->prjTypeSelector->buttonGroup->setButton(2);
00177 }
00178
00179
00180 void KexiConnSelectorWidget::slotPrjTypeSelected(int id)
00181 {
00182 #ifdef KEXI_SERVER_SUPPORT
00183 if (id==1) {
00184 showSimpleConn();
00185 }
00186 else if (id==2) {
00187 if (!d->conn_sel_shown) {
00188 d->conn_sel_shown=true;
00189
00190
00191 for (KexiDB::ConnectionData::ListIterator it(d->conn_set->list()); it.current(); ++it) {
00192 addConnectionData( it.current() );
00193
00194
00195
00196
00197 }
00198 if (m_remote->list->firstChild()) {
00199 m_remote->list->setSelected(m_remote->list->firstChild(),true);
00200 }
00201 m_remote->descriptionEdit->setPaletteBackgroundColor(palette().active().background());
00202 m_remote->descGroupBox->layout()->setMargin(2);
00203 m_remote->list->setFocus();
00204 slotConnectionSelectionChanged();
00205 }
00206 d->stack->raiseWidget(m_remote);
00207 }
00208 #else
00209 showSimpleConn();
00210 #endif
00211 }
00212
00213 ConnectionDataLVItem* KexiConnSelectorWidget::addConnectionData( KexiDB::ConnectionData* data )
00214 {
00215 const KexiDB::Driver::Info info( d->manager.driverInfo(data->driverName) );
00216
00217 return new ConnectionDataLVItem(data, info, m_remote->list);
00218
00219 }
00220
00221 void KexiConnSelectorWidget::showSimpleConn()
00222 {
00223 d->prjTypeSelector->buttonGroup->setButton(1);
00224 if (!d->file_sel_shown) {
00225 d->file_sel_shown=true;
00226 m_fileDlg = new KexiStartupFileDialog( d->startDirOrVariable, KexiStartupFileDialog::Opening,
00227 d->stack, "openExistingFileDlg");
00228 m_fileDlg->setConfirmOverwrites( d->confirmOverwrites );
00229
00230 d->stack->addWidget(m_fileDlg);
00231
00232 for (QWidget *w = parentWidget(true);w;w=w->parentWidget(true)) {
00233 if (w->isDialog()) {
00234
00235 connect(m_fileDlg,SIGNAL(rejected()),static_cast<QDialog*>(w),SLOT(reject()));
00236
00237
00238 break;
00239 }
00240 }
00241 }
00242 d->stack->raiseWidget(m_fileDlg);
00243 #ifndef KEXI_SERVER_SUPPORT
00244
00245
00246
00247
00248
00249 #endif
00250 }
00251
00252 int KexiConnSelectorWidget::selectedConnectionType() const
00253 {
00254 return (d->stack->visibleWidget()==m_fileDlg) ? FileBased : ServerBased;
00255 }
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272 KexiDB::ConnectionData* KexiConnSelectorWidget::selectedConnectionData() const
00273 {
00274 ConnectionDataLVItem *item = static_cast<ConnectionDataLVItem*>(m_remote->list->selectedItem());
00275 if (!item)
00276 return 0;
00277 return item->data();
00278 }
00279
00280 QString KexiConnSelectorWidget::selectedFileName()
00281 {
00282 if (selectedConnectionType()!=KexiConnSelectorWidget::FileBased)
00283 return QString::null;
00284 return m_fileDlg->currentFileName();
00285 }
00286
00287 void KexiConnSelectorWidget::setSelectedFileName(const QString& fileName)
00288 {
00289 if (selectedConnectionType()!=KexiConnSelectorWidget::FileBased)
00290 return;
00291 return m_fileDlg->setSelection(fileName);
00292 }
00293
00294 void KexiConnSelectorWidget::slotConnectionItemExecuted(QListViewItem *item)
00295 {
00296 emit connectionItemExecuted(static_cast<ConnectionDataLVItem*>(item));
00297 }
00298
00299 void KexiConnSelectorWidget::slotConnectionSelectionChanged()
00300 {
00301 ConnectionDataLVItem* item = static_cast<ConnectionDataLVItem*>(m_remote->list->selectedItem());
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316 m_remote->btn_edit->setEnabled(item);
00317 m_remote->btn_remove->setEnabled(item);
00318 m_remote->descriptionEdit->setText(item ? item->data()->description : QString::null);
00319 emit connectionItemHighlighted(item);
00320 }
00321
00322 QListView* KexiConnSelectorWidget::connectionsList() const
00323 {
00324 return m_remote->list;
00325 }
00326
00327 void KexiConnSelectorWidget::setFocus()
00328 {
00329 QWidget::setFocus();
00330 if (d->stack->visibleWidget()==m_fileDlg)
00331 m_fileDlg->setFocus();
00332 else
00333 m_remote->list->setFocus();
00334 }
00335
00336 void KexiConnSelectorWidget::hideHelpers()
00337 {
00338 d->openExistingWidget->hide();
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348 }
00349
00350 void KexiConnSelectorWidget::setConfirmOverwrites(bool set)
00351 {
00352 d->confirmOverwrites = set;
00353 if (m_fileDlg)
00354 m_fileDlg->setConfirmOverwrites( d->confirmOverwrites );
00355 }
00356
00357 bool KexiConnSelectorWidget::confirmOverwrites() const
00358 {
00359 return d->confirmOverwrites;
00360 }
00361
00362
00363
00364
00365
00366
00367
00368
00369 void KexiConnSelectorWidget::slotRemoteAddBtnClicked()
00370 {
00371 KexiDB::ConnectionData data;
00372 KexiDBConnectionDialog dlg(data, QString::null,
00373 KGuiItem(i18n("&Add"), "button_ok", i18n("Add database connection")) );
00374 dlg.setCaption(i18n("Add New Database Connection"));
00375 if (QDialog::Accepted!=dlg.exec())
00376 return;
00377
00378
00379 KexiDB::ConnectionData *newData = new KexiDB::ConnectionData(*dlg.currentProjectData().connectionData());
00380 if (!d->conn_set->addConnectionData(newData)) {
00382 delete newData;
00383 return;
00384 }
00385
00386 ConnectionDataLVItem* item = addConnectionData(newData);
00387
00388 m_remote->list->setSelected(item, true);
00389 slotConnectionSelectionChanged();
00390 }
00391
00392 void KexiConnSelectorWidget::slotRemoteEditBtnClicked()
00393 {
00394 ConnectionDataLVItem* item = static_cast<ConnectionDataLVItem*>(m_remote->list->selectedItem());
00395 if (!item)
00396 return;
00397 KexiDBConnectionDialog dlg(*item->data(), QString::null,
00398 KGuiItem(i18n("&Save"), "filesave", i18n("Save changes made to this database connection")) );
00399 dlg.setCaption(i18n("Edit Database Connection"));
00400 if (QDialog::Accepted!=dlg.exec())
00401 return;
00402
00403 KexiDB::ConnectionData *newData = new KexiDB::ConnectionData( *dlg.currentProjectData().connectionData() );
00404 if (!d->conn_set->saveConnectionData(item->data(), newData)) {
00406 delete newData;
00407 return;
00408 }
00409 const KexiDB::Driver::Info info( d->manager.driverInfo(item->data()->driverName) );
00410 item->update(info);
00411 slotConnectionSelectionChanged();
00412 }
00413
00414 void KexiConnSelectorWidget::slotRemoteRemoveBtnClicked()
00415 {
00416 ConnectionDataLVItem* item = static_cast<ConnectionDataLVItem*>(m_remote->list->selectedItem());
00417 if (!item)
00418 return;
00419 if (KMessageBox::Continue!=KMessageBox::warningContinueCancel(0,
00420 i18n("Do you want to remove database connection \"%1\" from the list of available connections?")
00421 .arg(item->data()->serverInfoString(true)), QString::null, KStdGuiItem::del(), QString::null,
00422 KMessageBox::Notify|KMessageBox::Dangerous))
00423 return;
00424
00425 QListViewItem* nextItem = item->itemBelow();
00426 if (!nextItem)
00427 nextItem = item->itemAbove();
00428 if (!d->conn_set->removeConnectionData(item->data()))
00429 return;
00430
00431 m_remote->list->removeItem(item);
00432 if (nextItem)
00433 m_remote->list->setSelected(nextItem, true);
00434 slotConnectionSelectionChanged();
00435 }
00436
00437 void KexiConnSelectorWidget::hideConnectonIcon()
00438 {
00439 m_remote->icon->setFixedWidth(0);
00440 m_remote->icon->setPixmap(QPixmap());
00441 }
00442
00443 #include "KexiConnSelector.moc"