You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
423 lines
12 KiB
423 lines
12 KiB
/* This file is part of the KDE project
|
|
Copyright (C) 2003-2005 Jaroslaw Staniek <js@iidea.pl>
|
|
|
|
This library 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 library 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 library; see the file COPYING.LIB. If not, write to
|
|
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
* Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
#include "KexiStartupFileDialog.h"
|
|
|
|
#include <kexidb/driver.h>
|
|
#include <core/kexi.h>
|
|
#include <kexiutils/utils.h>
|
|
|
|
#include <tqlayout.h>
|
|
#include <tqobjectlist.h>
|
|
#include <tqpushbutton.h>
|
|
#include <tqapplication.h>
|
|
|
|
#include <tdemessagebox.h>
|
|
#include <tdelocale.h>
|
|
#include <kdebug.h>
|
|
#include <kmimetype.h>
|
|
#include <tdefile.h>
|
|
#include <kurlcombobox.h>
|
|
|
|
KexiStartupFileDialog::KexiStartupFileDialog(
|
|
const TQString& startDirOrVariable, int mode,
|
|
TQWidget *parent, const char *name)
|
|
: KexiStartupFileDialogBase(startDirOrVariable, "", parent, name, 0)
|
|
, m_confirmOverwrites(true)
|
|
, m_filtersUpdated(false)
|
|
{
|
|
setSizePolicy(TQSizePolicy::Minimum,TQSizePolicy::Minimum);
|
|
setMode( mode );
|
|
|
|
TQPoint point( 0, 0 );
|
|
reparent( parentWidget(), point );
|
|
|
|
if (layout())
|
|
layout()->setMargin(0);
|
|
setMinimumHeight(100);
|
|
setSizeGripEnabled ( false );
|
|
|
|
//dirty hack to customize filedialog view:
|
|
{
|
|
TQObjectList *l = queryList( "TQPushButton" );
|
|
TQObjectListIt it( *l );
|
|
TQObject *obj;
|
|
while ( (obj = it.current()) != 0 ) {
|
|
++it;
|
|
static_cast<TQPushButton*>(TQT_TQWIDGET(obj))->hide();
|
|
}
|
|
delete l;
|
|
}
|
|
{
|
|
TQObjectList *l = queryList("TQWidget");
|
|
TQObjectListIt it( *l );
|
|
TQObject *obj;
|
|
while ( (obj = it.current()) != 0 ) {
|
|
++it;
|
|
TQT_TQWIDGET(obj)->installEventFilter(this);
|
|
}
|
|
delete l;
|
|
}
|
|
|
|
#ifdef TQ_WS_WIN
|
|
if (startDirOrVariable.startsWith(":"))
|
|
m_lastVisitedPathsVariable = startDirOrVariable; //store for later use
|
|
#else
|
|
toggleSpeedbar(false);
|
|
setFocusProxy( locationEdit );//locationWidget() );
|
|
#endif
|
|
}
|
|
|
|
KexiStartupFileDialog::~KexiStartupFileDialog()
|
|
{
|
|
#ifdef TQ_WS_WIN
|
|
saveLastVisitedPath(currentFileName());
|
|
#endif
|
|
}
|
|
|
|
void KexiStartupFileDialog::setMode(int mode)
|
|
{
|
|
//delayed
|
|
m_mode = mode;
|
|
m_filtersUpdated = false;
|
|
}
|
|
|
|
TQStringList KexiStartupFileDialog::additionalFilters() const
|
|
{
|
|
return m_additionalMimeTypes;
|
|
}
|
|
|
|
void KexiStartupFileDialog::setAdditionalFilters(const TQStringList &mimeTypes)
|
|
{
|
|
//delayed
|
|
m_additionalMimeTypes = mimeTypes;
|
|
m_filtersUpdated = false;
|
|
}
|
|
|
|
TQStringList KexiStartupFileDialog::excludedFilters() const
|
|
{
|
|
return m_excludedMimeTypes;
|
|
}
|
|
|
|
void KexiStartupFileDialog::setExcludedFilters(const TQStringList &mimeTypes)
|
|
{
|
|
//delayed
|
|
m_excludedMimeTypes = mimeTypes;
|
|
m_filtersUpdated = false;
|
|
}
|
|
|
|
void KexiStartupFileDialog::updateFilters()
|
|
{
|
|
if (m_filtersUpdated)
|
|
return;
|
|
m_filtersUpdated = true;
|
|
|
|
m_lastFileName = TQString();
|
|
// m_lastUrl = KURL();
|
|
|
|
clearFilter();
|
|
|
|
TQString filter;
|
|
KMimeType::Ptr mime;
|
|
TQStringList allfilters;
|
|
|
|
const bool normalOpeningMode = m_mode & Opening && !(m_mode & Custom);
|
|
const bool normalSavingMode = m_mode & SavingFileBasedDB && !(m_mode & Custom);
|
|
|
|
if (normalOpeningMode || normalSavingMode) {
|
|
mime = KMimeType::mimeType( KexiDB::Driver::defaultFileBasedDriverMimeType() );
|
|
if (mime && m_excludedMimeTypes.find(mime->name())==m_excludedMimeTypes.end()) {
|
|
filter += KexiUtils::fileDialogFilterString(mime);
|
|
allfilters += mime->patterns();
|
|
}
|
|
}
|
|
if (normalOpeningMode || m_mode & SavingServerBasedDB) {
|
|
mime = KMimeType::mimeType("application/x-kexiproject-shortcut");
|
|
if (mime && m_excludedMimeTypes.find(mime->name())==m_excludedMimeTypes.end()) {
|
|
filter += KexiUtils::fileDialogFilterString(mime);
|
|
allfilters += mime->patterns();
|
|
}
|
|
}
|
|
if (normalOpeningMode || m_mode & SavingServerBasedDB) {
|
|
mime = KMimeType::mimeType("application/x-kexi-connectiondata");
|
|
if (mime && m_excludedMimeTypes.find(mime->name())==m_excludedMimeTypes.end()) {
|
|
filter += KexiUtils::fileDialogFilterString(mime);
|
|
allfilters += mime->patterns();
|
|
}
|
|
}
|
|
|
|
//! @todo hardcoded for MSA:
|
|
if (normalOpeningMode) {
|
|
mime = KMimeType::mimeType("application/x-msaccess");
|
|
if (mime && m_excludedMimeTypes.find(mime->name())==m_excludedMimeTypes.end()) {
|
|
filter += KexiUtils::fileDialogFilterString(mime);
|
|
allfilters += mime->patterns();
|
|
}
|
|
}
|
|
|
|
foreach (TQStringList::ConstIterator, it, m_additionalMimeTypes) {
|
|
if (*it == "all/allfiles")
|
|
continue;
|
|
if (m_excludedMimeTypes.find(*it)!=m_excludedMimeTypes.end())
|
|
continue;
|
|
filter += KexiUtils::fileDialogFilterString(*it);
|
|
mime = KMimeType::mimeType(*it);
|
|
allfilters += mime->patterns();
|
|
}
|
|
|
|
if (m_excludedMimeTypes.find("all/allfiles")==m_excludedMimeTypes.end())
|
|
filter += KexiUtils::fileDialogFilterString("all/allfiles");
|
|
// mime = KMimeType::mimeType("all/allfiles");
|
|
// if (mime) {
|
|
// filter += TQString(mime->patterns().isEmpty() ? "*" : mime->patterns().join(" "))
|
|
// + "|" + mime->comment()+ " (*)\n";
|
|
// }
|
|
//remove duplicates made because upper- and lower-case extenstions are used:
|
|
TQStringList allfiltersUnique;
|
|
TQDict<char> uniqueDict(499, false);
|
|
foreach (TQStringList::ConstIterator, it, allfilters) {
|
|
// kdDebug() << *it << endl;
|
|
uniqueDict.insert(*it, (char*)1);
|
|
}
|
|
foreach_dict (TQDictIterator<char>, it, uniqueDict) {
|
|
allfiltersUnique += it.currentKey();
|
|
}
|
|
allfiltersUnique.sort();
|
|
|
|
if (allfiltersUnique.count()>1) {//prepend "all supoported files" entry
|
|
filter.prepend(allfilters.join(" ")+"|" + i18n("All Supported Files")
|
|
+" ("+allfiltersUnique.join(" ")+")\n");
|
|
}
|
|
|
|
if (filter.right(1)=="\n")
|
|
filter.truncate(filter.length()-1);
|
|
setFilter(filter);
|
|
|
|
if (m_mode & Opening) {
|
|
KexiStartupFileDialogBase::setMode( KFile::ExistingOnly | KFile::LocalOnly | KFile::File );
|
|
setOperationMode( KFileDialog::Opening );
|
|
} else {
|
|
KexiStartupFileDialogBase::setMode( KFile::LocalOnly | KFile::File );
|
|
setOperationMode( KFileDialog::Saving );
|
|
}
|
|
}
|
|
|
|
void KexiStartupFileDialog::show()
|
|
{
|
|
m_filtersUpdated = false;
|
|
updateFilters();
|
|
KexiStartupFileDialogBase::show();
|
|
}
|
|
|
|
//KURL KexiStartupFileDialog::currentURL()
|
|
TQString KexiStartupFileDialog::currentFileName()
|
|
{
|
|
setResult( TQDialog::Accepted ); // selectedURL tests for it
|
|
|
|
#ifdef TQ_WS_WIN
|
|
// TQString path = selectedFile();
|
|
//js @todo
|
|
// kdDebug() << "selectedFile() == " << path << " '" << url().fileName() << "' " << m_lineEdit->text() << endl;
|
|
TQString path = dir()->absPath();
|
|
if (!path.endsWith("/") && !path.endsWith("\\"))
|
|
path.append("/");
|
|
path += m_lineEdit->text();
|
|
// TQString path = TQFileInfo(selectedFile()).dirPath(true) + "/" + m_lineEdit->text();
|
|
#else
|
|
// TQString path = locationEdit->currentText().stripWhiteSpace(); //url.path().stripWhiteSpace(); that does not work, if the full path is not in the location edit !!!!!
|
|
TQString path=KexiStartupFileDialogBase::selectedURL().path();
|
|
kdDebug() << "prev selectedURL() == " << path <<endl;
|
|
kdDebug() << "locationEdit == " << locationEdit->currentText().stripWhiteSpace() <<endl;
|
|
//make sure user-entered path is acceped:
|
|
setSelection( locationEdit->currentText().stripWhiteSpace() );
|
|
|
|
path=KexiStartupFileDialogBase::selectedURL().path();
|
|
kdDebug() << "selectedURL() == " << path <<endl;
|
|
|
|
#endif
|
|
|
|
if (!currentFilter().isEmpty()) {
|
|
if (m_mode & SavingFileBasedDB) {
|
|
TQStringList filters = TQStringList::split(" ", currentFilter()); //.first().stripWhiteSpace();
|
|
kdDebug()<< " filter == " << filters << endl;
|
|
TQString ext = TQFileInfo(path).extension(false);
|
|
bool hasExtension = false;
|
|
for (TQStringList::ConstIterator filterIt = filters.constBegin();
|
|
filterIt != filters.constEnd() && !hasExtension; ++filterIt)
|
|
{
|
|
TQString f( (*filterIt).stripWhiteSpace() );
|
|
hasExtension = !f.mid(2).isEmpty() && ext==f.mid(2);
|
|
}
|
|
if (!hasExtension) {
|
|
//no extension: add one
|
|
TQString defaultExtension( m_defaultExtension );
|
|
if (defaultExtension.isEmpty())
|
|
defaultExtension = filters.first().stripWhiteSpace().mid(2); //first one
|
|
path+=(TQString(".")+defaultExtension);
|
|
kdDebug() << "KexiStartupFileDialog::checkURL(): append extension, " << path << endl;
|
|
setSelection( path );
|
|
}
|
|
}
|
|
}
|
|
kdDebug() << "KexiStartupFileDialog::currentFileName() == " << path <<endl;
|
|
return path;
|
|
// return KFileDialog::selectedURL();
|
|
}
|
|
|
|
//bool KexiStartupFileDialog::checkURL()
|
|
bool KexiStartupFileDialog::checkFileName()
|
|
{
|
|
// KURL url = currentURL();
|
|
// TQString path = url.path().stripWhiteSpace();
|
|
TQString path = currentFileName().stripWhiteSpace();
|
|
|
|
// if (url.fileName().stripWhiteSpace().isEmpty()) {
|
|
if (path.isEmpty()) {
|
|
KMessageBox::error( this, i18n( "Enter a filename." ));
|
|
return false;
|
|
}
|
|
|
|
kdDebug() << "KexiStartupFileDialog::checkURL() path: " << path << endl;
|
|
// kdDebug() << "KexiStartupFileDialog::checkURL() fname: " << url.fileName() << endl;
|
|
//todo if ( url.isLocalFile() ) {
|
|
TQFileInfo fi(path);
|
|
if (mode() & KFile::ExistingOnly) {
|
|
if ( !fi.exists() ) {
|
|
KMessageBox::error( this, "<qt>"+i18n( "The file \"%1\" does not exist." )
|
|
.arg( TQDir::convertSeparators(path) ) );
|
|
return false;
|
|
}
|
|
else if (mode() & KFile::File) {
|
|
if (!fi.isFile()) {
|
|
KMessageBox::error( this, "<qt>"+i18n( "Enter a filename." ) );
|
|
return false;
|
|
}
|
|
else if (!fi.isReadable()) {
|
|
KMessageBox::error( this, "<qt>"+i18n( "The file \"%1\" is not readable." )
|
|
.arg( TQDir::convertSeparators(path) ) );
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
else if (m_confirmOverwrites && !askForOverwriting( path, this )) {
|
|
return false;
|
|
}
|
|
// }
|
|
return true;
|
|
}
|
|
|
|
//static
|
|
bool KexiStartupFileDialog::askForOverwriting(const TQString& filePath, TQWidget *parent)
|
|
{
|
|
TQFileInfo fi(filePath);
|
|
if (!fi.exists())
|
|
return true;
|
|
const int res = KMessageBox::warningYesNo( parent, i18n( "The file \"%1\" already exists.\n"
|
|
"Do you want to overwrite it?").arg( TQDir::convertSeparators(filePath) ), TQString(),
|
|
i18n("Overwrite"), KStdGuiItem::no() );
|
|
if (res == KMessageBox::Yes)
|
|
return true;
|
|
return false;
|
|
}
|
|
|
|
void KexiStartupFileDialog::accept()
|
|
{
|
|
// locationEdit->setFocus();
|
|
// TQKeyEvent ev(TQEvent::KeyPress, TQt::Key_Enter, '\n', 0);
|
|
// TQApplication::sendEvent(locationEdit, &ev);
|
|
// TQApplication::postEvent(locationEdit, &ev);
|
|
|
|
// kdDebug() << "KexiStartupFileDialog::accept() m_lastUrl == " << m_lastUrl.path() << endl;
|
|
// if (m_lastUrl.path()==currentURL().path()) {//(js) to prevent more multiple kjob signals (I do not know why this is)
|
|
if (m_lastFileName==currentFileName()) {//(js) to prevent more multiple kjob signals (I do not know why this is)
|
|
// m_lastUrl=KURL();
|
|
m_lastFileName=TQString();
|
|
kdDebug() << "m_lastFileName==currentFileName()" << endl;
|
|
#ifdef TQ_WS_WIN
|
|
return;
|
|
#endif
|
|
}
|
|
// kdDebug() << "KexiStartupFileDialog::accept(): url = " << currentURL().path() << " " << endl;
|
|
kdDebug() << "KexiStartupFileDialog::accept(): path = " << currentFileName() << endl;
|
|
// if ( checkURL() ) {
|
|
if ( checkFileName() ) {
|
|
emit accepted();
|
|
}
|
|
// else {
|
|
// m_lastUrl = KURL();
|
|
// }
|
|
// m_lastUrl = currentURL();
|
|
m_lastFileName = currentFileName();
|
|
|
|
#ifdef TQ_WS_WIN
|
|
saveLastVisitedPath(m_lastFileName);
|
|
#endif
|
|
}
|
|
|
|
void KexiStartupFileDialog::reject()
|
|
{
|
|
kdDebug() << "KexiStartupFileDialog: reject!" << endl;
|
|
emit rejected();
|
|
}
|
|
|
|
/*#ifndef TQ_WS_WIN
|
|
KURLComboBox *KexiStartupFileDialog::locationWidget() const
|
|
{
|
|
return locationEdit;
|
|
}
|
|
#endif
|
|
*/
|
|
|
|
void KexiStartupFileDialog::setLocationText(const TQString& fn)
|
|
{
|
|
#ifdef TQ_WS_WIN
|
|
//js @todo
|
|
setSelection(fn);
|
|
#else
|
|
setSelection(fn);
|
|
// locationEdit->setCurrentText(fn);
|
|
// locationEdit->lineEdit()->setEdited( true );
|
|
// setSelection(fn);
|
|
#endif
|
|
}
|
|
|
|
void KexiStartupFileDialog::setFocus()
|
|
{
|
|
#ifdef TQ_WS_WIN
|
|
m_lineEdit->setFocus();
|
|
#else
|
|
locationEdit->setFocus();
|
|
#endif
|
|
}
|
|
|
|
bool KexiStartupFileDialog::eventFilter ( TQObject * watched, TQEvent * e )
|
|
{
|
|
//filter-out ESC key
|
|
if (e->type()==TQEvent::KeyPress && static_cast<TQKeyEvent*>(e)->key()==TQt::Key_Escape
|
|
&& static_cast<TQKeyEvent*>(e)->state()==TQt::NoButton) {
|
|
static_cast<TQKeyEvent*>(e)->accept();
|
|
emit rejected();
|
|
return true;
|
|
}
|
|
return KexiStartupFileDialogBase::eventFilter(watched,e);
|
|
}
|
|
|
|
#include "KexiStartupFileDialog.moc"
|
|
|