20#include "KexiStartupFileDialog.h"
22#include <kexidb/driver.h>
24#include <kexiutils/utils.h>
27#include <tqobjectlist.h>
28#include <tqpushbutton.h>
29#include <tqapplication.h>
31#include <tdemessagebox.h>
36#include <kurlcombobox.h>
38KexiStartupFileDialog::KexiStartupFileDialog(
39 const TQString& startDirOrVariable,
int mode,
40 TQWidget *parent,
const char *name)
42 , m_confirmOverwrites(true)
43 , m_filtersUpdated(false)
45 setSizePolicy(TQSizePolicy::Minimum,TQSizePolicy::Minimum);
48 TQPoint point( 0, 0 );
49 reparent( parentWidget(), point );
52 layout()->setMargin(0);
53 setMinimumHeight(100);
54 setSizeGripEnabled (
false );
58 TQObjectList *l = queryList(
"TQPushButton" );
59 TQObjectListIt it( *l );
61 while ( (obj = it.current()) != 0 ) {
63 static_cast<TQPushButton*
>(obj)->hide();
68 TQObjectList *l = queryList(
"TQWidget");
69 TQObjectListIt it( *l );
71 while ( (obj = it.current()) != 0 ) {
73 static_cast<TQWidget*
>(obj)->installEventFilter(
this);
79 if (startDirOrVariable.startsWith(
":"))
80 m_lastVisitedPathsVariable = startDirOrVariable;
82 toggleSpeedbar(
false);
83 setFocusProxy( locationEdit );
87KexiStartupFileDialog::~KexiStartupFileDialog()
90 saveLastVisitedPath(currentFileName());
94void KexiStartupFileDialog::setMode(
int mode)
98 m_filtersUpdated =
false;
101TQStringList KexiStartupFileDialog::additionalFilters()
const
103 return m_additionalMimeTypes;
109 m_additionalMimeTypes = mimeTypes;
110 m_filtersUpdated =
false;
113TQStringList KexiStartupFileDialog::excludedFilters()
const
115 return m_excludedMimeTypes;
121 m_excludedMimeTypes = mimeTypes;
122 m_filtersUpdated =
false;
125void KexiStartupFileDialog::updateFilters()
127 if (m_filtersUpdated)
129 m_filtersUpdated =
true;
131 m_lastFileName = TQString();
138 TQStringList allfilters;
140 const bool normalOpeningMode = m_mode & Opening && !(m_mode & Custom);
141 const bool normalSavingMode = m_mode & SavingFileBasedDB && !(m_mode & Custom);
143 if (normalOpeningMode || normalSavingMode) {
145 if (mime && m_excludedMimeTypes.find(mime->name())==m_excludedMimeTypes.end()) {
147 allfilters += mime->patterns();
150 if (normalOpeningMode || m_mode & SavingServerBasedDB) {
151 mime = KMimeType::mimeType(
"application/x-kexiproject-shortcut");
152 if (mime && m_excludedMimeTypes.find(mime->name())==m_excludedMimeTypes.end()) {
154 allfilters += mime->patterns();
157 if (normalOpeningMode || m_mode & SavingServerBasedDB) {
158 mime = KMimeType::mimeType(
"application/x-kexi-connectiondata");
159 if (mime && m_excludedMimeTypes.find(mime->name())==m_excludedMimeTypes.end()) {
161 allfilters += mime->patterns();
166 if (normalOpeningMode) {
167 mime = KMimeType::mimeType(
"application/x-msaccess");
168 if (mime && m_excludedMimeTypes.find(mime->name())==m_excludedMimeTypes.end()) {
170 allfilters += mime->patterns();
174 foreach (TQStringList::ConstIterator, it, m_additionalMimeTypes) {
175 if (*it ==
"all/allfiles")
177 if (m_excludedMimeTypes.find(*it)!=m_excludedMimeTypes.end())
180 mime = KMimeType::mimeType(*it);
181 allfilters += mime->patterns();
184 if (m_excludedMimeTypes.find(
"all/allfiles")==m_excludedMimeTypes.end())
192 TQStringList allfiltersUnique;
193 TQDict<char> uniqueDict(499,
false);
194 foreach (TQStringList::ConstIterator, it, allfilters) {
196 uniqueDict.insert(*it, (
char*)1);
198 foreach_dict (TQDictIterator<char>, it, uniqueDict) {
199 allfiltersUnique += it.currentKey();
201 allfiltersUnique.sort();
203 if (allfiltersUnique.count()>1) {
204 filter.prepend(allfilters.join(
" ")+
"|" + i18n(
"All Supported Files")
205 +
" ("+allfiltersUnique.join(
" ")+
")\n");
208 if (filter.right(1)==
"\n")
209 filter.truncate(filter.length()-1);
212 if (m_mode & Opening) {
213 KexiStartupFileDialogBase::setMode( KFile::ExistingOnly | KFile::LocalOnly | KFile::File );
214 setOperationMode( KFileDialog::Opening );
216 KexiStartupFileDialogBase::setMode( KFile::LocalOnly | KFile::File );
217 setOperationMode( KFileDialog::Saving );
221void KexiStartupFileDialog::show()
223 m_filtersUpdated =
false;
225 KexiStartupFileDialogBase::show();
229TQString KexiStartupFileDialog::currentFileName()
231 setResult( TQDialog::Accepted );
237 TQString path = dir()->absPath();
238 if (!path.endsWith(
"/") && !path.endsWith(
"\\"))
240 path += m_lineEdit->text();
244 TQString path=KexiStartupFileDialogBase::selectedURL().path();
245 kdDebug() <<
"prev selectedURL() == " << path <<endl;
246 kdDebug() <<
"locationEdit == " << locationEdit->currentText().stripWhiteSpace() <<endl;
248 setSelection( locationEdit->currentText().stripWhiteSpace() );
250 path=KexiStartupFileDialogBase::selectedURL().path();
251 kdDebug() <<
"selectedURL() == " << path <<endl;
255 if (!currentFilter().isEmpty()) {
256 if (m_mode & SavingFileBasedDB) {
257 TQStringList filters = TQStringList::split(
" ", currentFilter());
258 kdDebug()<<
" filter == " << filters << endl;
259 TQString ext = TQFileInfo(path).extension(
false);
260 bool hasExtension =
false;
261 for (TQStringList::ConstIterator filterIt = filters.constBegin();
262 filterIt != filters.constEnd() && !hasExtension; ++filterIt)
264 TQString f( (*filterIt).stripWhiteSpace() );
265 hasExtension = !f.mid(2).isEmpty() && ext==f.mid(2);
269 TQString defaultExtension( m_defaultExtension );
270 if (defaultExtension.isEmpty())
271 defaultExtension = filters.first().stripWhiteSpace().mid(2);
272 path+=(TQString(
".")+defaultExtension);
273 kdDebug() <<
"KexiStartupFileDialog::checkURL(): append extension, " << path << endl;
274 setSelection( path );
278 kdDebug() <<
"KexiStartupFileDialog::currentFileName() == " << path <<endl;
288 TQString path = currentFileName().stripWhiteSpace();
291 if (path.isEmpty()) {
292 KMessageBox::error(
this, i18n(
"Enter a filename." ));
296 kdDebug() <<
"KexiStartupFileDialog::checkURL() path: " << path << endl;
300 if (mode() & KFile::ExistingOnly) {
301 if ( !fi.exists() ) {
302 KMessageBox::error(
this,
"<qt>"+i18n(
"The file \"%1\" does not exist." )
303 .arg( TQDir::convertSeparators(path) ) );
306 else if (mode() & KFile::File) {
308 KMessageBox::error(
this,
"<qt>"+i18n(
"Enter a filename." ) );
311 else if (!fi.isReadable()) {
312 KMessageBox::error(
this,
"<qt>"+i18n(
"The file \"%1\" is not readable." )
313 .arg( TQDir::convertSeparators(path) ) );
328 TQFileInfo fi(filePath);
331 const int res = KMessageBox::warningYesNo( parent, i18n(
"The file \"%1\" already exists.\n"
332 "Do you want to overwrite it?").arg( TQDir::convertSeparators(filePath) ), TQString(),
333 i18n(
"Overwrite"), KStdGuiItem::no() );
334 if (res == KMessageBox::Yes)
339void KexiStartupFileDialog::accept()
348 if (m_lastFileName==currentFileName()) {
350 m_lastFileName=TQString();
351 kdDebug() <<
"m_lastFileName==currentFileName()" << endl;
357 kdDebug() <<
"KexiStartupFileDialog::accept(): path = " << currentFileName() << endl;
366 m_lastFileName = currentFileName();
369 saveLastVisitedPath(m_lastFileName);
373void KexiStartupFileDialog::reject()
375 kdDebug() <<
"KexiStartupFileDialog: reject!" << endl;
400void KexiStartupFileDialog::setFocus()
403 m_lineEdit->setFocus();
405 locationEdit->setFocus();
409bool KexiStartupFileDialog::eventFilter ( TQObject * watched, TQEvent * e )
412 if (e->type()==TQEvent::KeyPress &&
static_cast<TQKeyEvent*
>(e)->key()==TQt::Key_Escape
413 &&
static_cast<TQKeyEvent*
>(e)->state()==TQt::NoButton) {
414 static_cast<TQKeyEvent*
>(e)->accept();
418 return KexiStartupFileDialogBase::eventFilter(watched,e);
421#include "KexiStartupFileDialog.moc"
static TQString defaultFileBasedDriverMimeType()
void setAdditionalFilters(const TQStringList &mimeTypes)
Sets additional filters list, e.g. "text/x-csv".
static bool askForOverwriting(const TQString &filePath, TQWidget *parent=0)
void setLocationText(const TQString &fn)
just sets locationWidget()->setCurrentText(fn) (and something similar on win32)
void setExcludedFilters(const TQStringList &mimeTypes)
Excludes filters list.
KEXIUTILS_EXPORT TQString fileDialogFilterString(const KMimeType::Ptr &mime, bool kdeFormat=true)