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 if (id==1) {
00183 showSimpleConn();
00184 }
00185 else if (id==2) {
00186 if (!d->conn_sel_shown) {
00187 d->conn_sel_shown=true;
00188
00189
00190 for (KexiDB::ConnectionData::ListIterator it(d->conn_set->list()); it.current(); ++it) {
00191 addConnectionData( it.current() );
00192
00193
00194
00195
00196 }
00197 if (m_remote->list->firstChild()) {
00198 m_remote->list->setSelected(m_remote->list->firstChild(),true);
00199 }
00200 m_remote->descriptionEdit->setPaletteBackgroundColor(palette().active().background());
00201 m_remote->descGroupBox->layout()->setMargin(2);
00202 m_remote->list->setFocus();
00203 slotConnectionSelectionChanged();
00204 }
00205 d->stack->raiseWidget(m_remote);
00206 }
00207 }
00208
00209 ConnectionDataLVItem* KexiConnSelectorWidget::addConnectionData( KexiDB::ConnectionData* data )
00210 {
00211 const KexiDB::Driver::Info info( d->manager.driverInfo(data->driverName) );
00212
00213 return new ConnectionDataLVItem(data, info, m_remote->list);
00214
00215 }
00216
00217 void KexiConnSelectorWidget::showSimpleConn()
00218 {
00219 d->prjTypeSelector->buttonGroup->setButton(1);
00220 if (!d->file_sel_shown) {
00221 d->file_sel_shown=true;
00222 m_fileDlg = new KexiStartupFileDialog( d->startDirOrVariable, KexiStartupFileDialog::Opening,
00223 d->stack, "openExistingFileDlg");
00224 m_fileDlg->setConfirmOverwrites( d->confirmOverwrites );
00225
00226 d->stack->addWidget(m_fileDlg);
00227
00228 for (QWidget *w = parentWidget(true);w;w=w->parentWidget(true)) {
00229 if (w->isDialog()) {
00230
00231 connect(m_fileDlg,SIGNAL(rejected()),static_cast<QDialog*>(w),SLOT(reject()));
00232
00233
00234 break;
00235 }
00236 }
00237 }
00238 d->stack->raiseWidget(m_fileDlg);
00239 }
00240
00241 int KexiConnSelectorWidget::selectedConnectionType() const
00242 {
00243 return (d->stack->visibleWidget()==m_fileDlg) ? FileBased : ServerBased;
00244 }
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261 KexiDB::ConnectionData* KexiConnSelectorWidget::selectedConnectionData() const
00262 {
00263 ConnectionDataLVItem *item = static_cast<ConnectionDataLVItem*>(m_remote->list->selectedItem());
00264 if (!item)
00265 return 0;
00266 return item->data();
00267 }
00268
00269 QString KexiConnSelectorWidget::selectedFileName()
00270 {
00271 if (selectedConnectionType()!=KexiConnSelectorWidget::FileBased)
00272 return QString::null;
00273 return m_fileDlg->currentFileName();
00274 }
00275
00276 void KexiConnSelectorWidget::setSelectedFileName(const QString& fileName)
00277 {
00278 if (selectedConnectionType()!=KexiConnSelectorWidget::FileBased)
00279 return;
00280 return m_fileDlg->setSelection(fileName);
00281 }
00282
00283 void KexiConnSelectorWidget::slotConnectionItemExecuted(QListViewItem *item)
00284 {
00285 emit connectionItemExecuted(static_cast<ConnectionDataLVItem*>(item));
00286 }
00287
00288 void KexiConnSelectorWidget::slotConnectionSelectionChanged()
00289 {
00290 ConnectionDataLVItem* item = static_cast<ConnectionDataLVItem*>(m_remote->list->selectedItem());
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305 m_remote->btn_edit->setEnabled(item);
00306 m_remote->btn_remove->setEnabled(item);
00307 m_remote->descriptionEdit->setText(item ? item->data()->description : QString::null);
00308 emit connectionItemHighlighted(item);
00309 }
00310
00311 QListView* KexiConnSelectorWidget::connectionsList() const
00312 {
00313 return m_remote->list;
00314 }
00315
00316 void KexiConnSelectorWidget::setFocus()
00317 {
00318 QWidget::setFocus();
00319 if (d->stack->visibleWidget()==m_fileDlg)
00320 m_fileDlg->setFocus();
00321 else
00322 m_remote->list->setFocus();
00323 }
00324
00325 void KexiConnSelectorWidget::hideHelpers()
00326 {
00327 d->openExistingWidget->hide();
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337 }
00338
00339 void KexiConnSelectorWidget::setConfirmOverwrites(bool set)
00340 {
00341 d->confirmOverwrites = set;
00342 if (m_fileDlg)
00343 m_fileDlg->setConfirmOverwrites( d->confirmOverwrites );
00344 }
00345
00346 bool KexiConnSelectorWidget::confirmOverwrites() const
00347 {
00348 return d->confirmOverwrites;
00349 }
00350
00351
00352
00353
00354
00355
00356
00357
00358 void KexiConnSelectorWidget::slotRemoteAddBtnClicked()
00359 {
00360 KexiDB::ConnectionData data;
00361 KexiDBConnectionDialog dlg(data, QString::null,
00362 KGuiItem(i18n("&Add"), "button_ok", i18n("Add database connection")) );
00363 dlg.setCaption(i18n("Add New Database Connection"));
00364 if (QDialog::Accepted!=dlg.exec())
00365 return;
00366
00367
00368 KexiDB::ConnectionData *newData = new KexiDB::ConnectionData(*dlg.currentProjectData().connectionData());
00369 if (!d->conn_set->addConnectionData(newData)) {
00371 delete newData;
00372 return;
00373 }
00374
00375 ConnectionDataLVItem* item = addConnectionData(newData);
00376
00377 m_remote->list->setSelected(item, true);
00378 slotConnectionSelectionChanged();
00379 }
00380
00381 void KexiConnSelectorWidget::slotRemoteEditBtnClicked()
00382 {
00383 ConnectionDataLVItem* item = static_cast<ConnectionDataLVItem*>(m_remote->list->selectedItem());
00384 if (!item)
00385 return;
00386 KexiDBConnectionDialog dlg(*item->data(), QString::null,
00387 KGuiItem(i18n("&Save"), "filesave", i18n("Save changes made to this database connection")) );
00388 dlg.setCaption(i18n("Edit Database Connection"));
00389 if (QDialog::Accepted!=dlg.exec())
00390 return;
00391
00392 KexiDB::ConnectionData *newData = new KexiDB::ConnectionData( *dlg.currentProjectData().connectionData() );
00393 if (!d->conn_set->saveConnectionData(item->data(), newData)) {
00395 delete newData;
00396 return;
00397 }
00398 const KexiDB::Driver::Info info( d->manager.driverInfo(item->data()->driverName) );
00399 item->update(info);
00400 slotConnectionSelectionChanged();
00401 }
00402
00403 void KexiConnSelectorWidget::slotRemoteRemoveBtnClicked()
00404 {
00405 ConnectionDataLVItem* item = static_cast<ConnectionDataLVItem*>(m_remote->list->selectedItem());
00406 if (!item)
00407 return;
00408 if (KMessageBox::Continue!=KMessageBox::warningContinueCancel(0,
00409 i18n("Do you want to remove database connection \"%1\" from the list of available connections?")
00410 .arg(item->data()->serverInfoString(true)), QString::null, KStdGuiItem::del(), QString::null,
00411 KMessageBox::Notify|KMessageBox::Dangerous))
00412 return;
00413
00414 QListViewItem* nextItem = item->itemBelow();
00415 if (!nextItem)
00416 nextItem = item->itemAbove();
00417 if (!d->conn_set->removeConnectionData(item->data()))
00418 return;
00419
00420 m_remote->list->removeItem(item);
00421 if (nextItem)
00422 m_remote->list->setSelected(nextItem, true);
00423 slotConnectionSelectionChanged();
00424 }
00425
00426 void KexiConnSelectorWidget::hideConnectonIcon()
00427 {
00428 m_remote->icon->setFixedWidth(0);
00429 m_remote->icon->setPixmap(QPixmap());
00430 }
00431
00432 #include "KexiConnSelector.moc"