kexi
KexiStartupFileDialog.cpp00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "KexiStartupFileDialog.h"
00021
00022 #include <kexidb/driver.h>
00023 #include <core/kexi.h>
00024 #include <kexiutils/utils.h>
00025
00026 #include <qlayout.h>
00027 #include <qobjectlist.h>
00028 #include <qpushbutton.h>
00029 #include <qapplication.h>
00030
00031 #include <kmessagebox.h>
00032 #include <klocale.h>
00033 #include <kdebug.h>
00034 #include <kmimetype.h>
00035 #include <kfile.h>
00036 #include <kurlcombobox.h>
00037
00038 KexiStartupFileDialog::KexiStartupFileDialog(
00039 const QString& startDirOrVariable, int mode,
00040 QWidget *parent, const char *name)
00041 : KexiStartupFileDialogBase(startDirOrVariable, "", parent, name, 0)
00042 , m_confirmOverwrites(true)
00043 , m_filtersUpdated(false)
00044 {
00045 setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum);
00046 setMode( mode );
00047
00048 QPoint point( 0, 0 );
00049 reparent( parentWidget(), point );
00050
00051 if (layout())
00052 layout()->setMargin(0);
00053 setMinimumHeight(100);
00054 setSizeGripEnabled ( false );
00055
00056
00057 {
00058 QObjectList *l = queryList( "QPushButton" );
00059 QObjectListIt it( *l );
00060 QObject *obj;
00061 while ( (obj = it.current()) != 0 ) {
00062 ++it;
00063 static_cast<QPushButton*>(obj)->hide();
00064 }
00065 delete l;
00066 }
00067 {
00068 QObjectList *l = queryList("QWidget");
00069 QObjectListIt it( *l );
00070 QObject *obj;
00071 while ( (obj = it.current()) != 0 ) {
00072 ++it;
00073 static_cast<QWidget*>(obj)->installEventFilter(this);
00074 }
00075 delete l;
00076 }
00077
00078 #ifdef Q_WS_WIN
00079 if (startDirOrVariable.startsWith(":"))
00080 m_lastVisitedPathsVariable = startDirOrVariable;
00081 #else
00082 toggleSpeedbar(false);
00083 setFocusProxy( locationEdit );
00084 #endif
00085 }
00086
00087 KexiStartupFileDialog::~KexiStartupFileDialog()
00088 {
00089 #ifdef Q_WS_WIN
00090 saveLastVisitedPath(currentFileName());
00091 #endif
00092 }
00093
00094 void KexiStartupFileDialog::setMode(int mode)
00095 {
00096
00097 m_mode = mode;
00098 m_filtersUpdated = false;
00099 }
00100
00101 QStringList KexiStartupFileDialog::additionalFilters() const
00102 {
00103 return m_additionalMimeTypes;
00104 }
00105
00106 void KexiStartupFileDialog::setAdditionalFilters(const QStringList &mimeTypes)
00107 {
00108
00109 m_additionalMimeTypes = mimeTypes;
00110 m_filtersUpdated = false;
00111 }
00112
00113 QStringList KexiStartupFileDialog::excludedFilters() const
00114 {
00115 return m_excludedMimeTypes;
00116 }
00117
00118 void KexiStartupFileDialog::setExcludedFilters(const QStringList &mimeTypes)
00119 {
00120
00121 m_excludedMimeTypes = mimeTypes;
00122 m_filtersUpdated = false;
00123 }
00124
00125 void KexiStartupFileDialog::updateFilters()
00126 {
00127 if (m_filtersUpdated)
00128 return;
00129 m_filtersUpdated = true;
00130
00131 m_lastFileName = QString::null;
00132
00133
00134 clearFilter();
00135
00136 QString filter;
00137 KMimeType::Ptr mime;
00138 QStringList allfilters;
00139
00140 const bool normalOpeningMode = m_mode & Opening && !(m_mode & Custom);
00141 const bool normalSavingMode = m_mode & SavingFileBasedDB && !(m_mode & Custom);
00142
00143 if (normalOpeningMode || normalSavingMode) {
00144 mime = KMimeType::mimeType( KexiDB::Driver::defaultFileBasedDriverMimeType() );
00145 if (mime && m_excludedMimeTypes.find(mime->name())==m_excludedMimeTypes.end()) {
00146 filter += KexiUtils::fileDialogFilterString(mime);
00147 allfilters += mime->patterns();
00148 }
00149 }
00150 if (normalOpeningMode || m_mode & SavingServerBasedDB) {
00151 mime = KMimeType::mimeType("application/x-kexiproject-shortcut");
00152 if (mime && m_excludedMimeTypes.find(mime->name())==m_excludedMimeTypes.end()) {
00153 filter += KexiUtils::fileDialogFilterString(mime);
00154 allfilters += mime->patterns();
00155 }
00156 }
00157 if (normalOpeningMode || m_mode & SavingServerBasedDB) {
00158 mime = KMimeType::mimeType("application/x-kexi-connectiondata");
00159 if (mime && m_excludedMimeTypes.find(mime->name())==m_excludedMimeTypes.end()) {
00160 filter += KexiUtils::fileDialogFilterString(mime);
00161 allfilters += mime->patterns();
00162 }
00163 }
00164
00166 if (normalOpeningMode) {
00167 mime = KMimeType::mimeType("application/x-msaccess");
00168 if (mime && m_excludedMimeTypes.find(mime->name())==m_excludedMimeTypes.end()) {
00169 filter += KexiUtils::fileDialogFilterString(mime);
00170 allfilters += mime->patterns();
00171 }
00172 }
00173
00174 foreach (QStringList::ConstIterator, it, m_additionalMimeTypes) {
00175 if (*it == "all/allfiles")
00176 continue;
00177 if (m_excludedMimeTypes.find(*it)!=m_excludedMimeTypes.end())
00178 continue;
00179 filter += KexiUtils::fileDialogFilterString(*it);
00180 mime = KMimeType::mimeType(*it);
00181 allfilters += mime->patterns();
00182 }
00183
00184 if (m_excludedMimeTypes.find("all/allfiles")==m_excludedMimeTypes.end())
00185 filter += KexiUtils::fileDialogFilterString("all/allfiles");
00186
00187
00188
00189
00190
00191
00192 QStringList allfiltersUnique;
00193 QDict<char> uniqueDict(499, false);
00194 foreach (QStringList::ConstIterator, it, allfilters) {
00195
00196 uniqueDict.insert(*it, (char*)1);
00197 }
00198 foreach_dict (QDictIterator<char>, it, uniqueDict) {
00199 allfiltersUnique += it.currentKey();
00200 }
00201 allfiltersUnique.sort();
00202
00203 if (allfiltersUnique.count()>1) {
00204 filter.prepend(allfilters.join(" ")+"|" + i18n("All Supported Files")
00205 +" ("+allfiltersUnique.join(" ")+")\n");
00206 }
00207
00208 if (filter.right(1)=="\n")
00209 filter.truncate(filter.length()-1);
00210 setFilter(filter);
00211
00212 if (m_mode & Opening) {
00213 KexiStartupFileDialogBase::setMode( KFile::ExistingOnly | KFile::LocalOnly | KFile::File );
00214 setOperationMode( KFileDialog::Opening );
00215 } else {
00216 KexiStartupFileDialogBase::setMode( KFile::LocalOnly | KFile::File );
00217 setOperationMode( KFileDialog::Saving );
00218 }
00219 }
00220
00221 void KexiStartupFileDialog::show()
00222 {
00223 m_filtersUpdated = false;
00224 updateFilters();
00225 KexiStartupFileDialogBase::show();
00226 }
00227
00228
00229 QString KexiStartupFileDialog::currentFileName()
00230 {
00231 setResult( QDialog::Accepted );
00232
00233 #ifdef Q_WS_WIN
00234
00235
00236
00237 QString path = dir()->absPath();
00238 if (!path.endsWith("/") && !path.endsWith("\\"))
00239 path.append("/");
00240 path += m_lineEdit->text();
00241
00242 #else
00243
00244 QString path=KexiStartupFileDialogBase::selectedURL().path();
00245 kdDebug() << "prev selectedURL() == " << path <<endl;
00246 kdDebug() << "locationEdit == " << locationEdit->currentText().stripWhiteSpace() <<endl;
00247
00248 setSelection( locationEdit->currentText().stripWhiteSpace() );
00249
00250 path=KexiStartupFileDialogBase::selectedURL().path();
00251 kdDebug() << "selectedURL() == " << path <<endl;
00252
00253 #endif
00254
00255 if (!currentFilter().isEmpty()) {
00256 if (m_mode & SavingFileBasedDB) {
00257 QStringList filters = QStringList::split(" ", currentFilter());
00258 kdDebug()<< " filter == " << filters << endl;
00259 QString ext = QFileInfo(path).extension(false);
00260 bool hasExtension = false;
00261 for (QStringList::ConstIterator filterIt = filters.constBegin();
00262 filterIt != filters.constEnd() && !hasExtension; ++filterIt)
00263 {
00264 QString f( (*filterIt).stripWhiteSpace() );
00265 hasExtension = !f.mid(2).isEmpty() && ext==f.mid(2);
00266 }
00267 if (!hasExtension) {
00268
00269 QString defaultExtension( m_defaultExtension );
00270 if (defaultExtension.isEmpty())
00271 defaultExtension = filters.first().stripWhiteSpace().mid(2);
00272 path+=(QString(".")+defaultExtension);
00273 kdDebug() << "KexiStartupFileDialog::checkURL(): append extension, " << path << endl;
00274 setSelection( path );
00275 }
00276 }
00277 }
00278 kdDebug() << "KexiStartupFileDialog::currentFileName() == " << path <<endl;
00279 return path;
00280
00281 }
00282
00283
00284 bool KexiStartupFileDialog::checkFileName()
00285 {
00286
00287
00288 QString path = currentFileName().stripWhiteSpace();
00289
00290
00291 if (path.isEmpty()) {
00292 KMessageBox::error( this, i18n( "Enter a filename." ));
00293 return false;
00294 }
00295
00296 kdDebug() << "KexiStartupFileDialog::checkURL() path: " << path << endl;
00297
00298
00299 QFileInfo fi(path);
00300 if (mode() & KFile::ExistingOnly) {
00301 if ( !fi.exists() ) {
00302 KMessageBox::error( this, "<qt>"+i18n( "The file \"%1\" does not exist." )
00303 .arg( QDir::convertSeparators(path) ) );
00304 return false;
00305 }
00306 else if (mode() & KFile::File) {
00307 if (!fi.isFile()) {
00308 KMessageBox::error( this, "<qt>"+i18n( "Enter a filename." ) );
00309 return false;
00310 }
00311 else if (!fi.isReadable()) {
00312 KMessageBox::error( this, "<qt>"+i18n( "The file \"%1\" is not readable." )
00313 .arg( QDir::convertSeparators(path) ) );
00314 return false;
00315 }
00316 }
00317 }
00318 else if (m_confirmOverwrites && !askForOverwriting( path, this )) {
00319 return false;
00320 }
00321
00322 return true;
00323 }
00324
00325
00326 bool KexiStartupFileDialog::askForOverwriting(const QString& filePath, QWidget *parent)
00327 {
00328 QFileInfo fi(filePath);
00329 if (!fi.exists())
00330 return true;
00331 const int res = KMessageBox::warningYesNo( parent, i18n( "The file \"%1\" already exists.\n"
00332 "Do you want to overwrite it?").arg( QDir::convertSeparators(filePath) ), QString::null,
00333 i18n("Overwrite"), KStdGuiItem::no() );
00334 if (res == KMessageBox::Yes)
00335 return true;
00336 return false;
00337 }
00338
00339 void KexiStartupFileDialog::accept()
00340 {
00341
00342
00343
00344
00345
00346
00347
00348 if (m_lastFileName==currentFileName()) {
00349
00350 m_lastFileName=QString::null;
00351 kdDebug() << "m_lastFileName==currentFileName()" << endl;
00352 #ifdef Q_WS_WIN
00353 return;
00354 #endif
00355 }
00356
00357 kdDebug() << "KexiStartupFileDialog::accept(): path = " << currentFileName() << endl;
00358
00359 if ( checkFileName() ) {
00360 emit accepted();
00361 }
00362
00363
00364
00365
00366 m_lastFileName = currentFileName();
00367
00368 #ifdef Q_WS_WIN
00369 saveLastVisitedPath(m_lastFileName);
00370 #endif
00371 }
00372
00373 void KexiStartupFileDialog::reject()
00374 {
00375 kdDebug() << "KexiStartupFileDialog: reject!" << endl;
00376 emit rejected();
00377 }
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387 void KexiStartupFileDialog::setLocationText(const QString& fn)
00388 {
00389 #ifdef Q_WS_WIN
00390
00391 setSelection(fn);
00392 #else
00393 setSelection(fn);
00394
00395
00396
00397 #endif
00398 }
00399
00400 void KexiStartupFileDialog::setFocus()
00401 {
00402 #ifdef Q_WS_WIN
00403 m_lineEdit->setFocus();
00404 #else
00405 locationEdit->setFocus();
00406 #endif
00407 }
00408
00409 bool KexiStartupFileDialog::eventFilter ( QObject * watched, QEvent * e )
00410 {
00411
00412 if (e->type()==QEvent::KeyPress && static_cast<QKeyEvent*>(e)->key()==Qt::Key_Escape
00413 && static_cast<QKeyEvent*>(e)->state()==Qt::NoButton) {
00414 static_cast<QKeyEvent*>(e)->accept();
00415 emit rejected();
00416 return true;
00417 }
00418 return KexiStartupFileDialogBase::eventFilter(watched,e);
00419 }
00420
00421 #include "KexiStartupFileDialog.moc"
00422
|