diff options
author | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-01-20 01:29:50 +0000 |
---|---|---|
committer | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-01-20 01:29:50 +0000 |
commit | 8362bf63dea22bbf6736609b0f49c152f975eb63 (patch) | |
tree | 0eea3928e39e50fae91d4e68b21b1e6cbae25604 /kexi/main/startup/KexiStartupFileDialog_win.cpp | |
download | koffice-8362bf63dea22bbf6736609b0f49c152f975eb63.tar.gz koffice-8362bf63dea22bbf6736609b0f49c152f975eb63.zip |
Added old abandoned KDE3 version of koffice
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/koffice@1077364 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kexi/main/startup/KexiStartupFileDialog_win.cpp')
-rw-r--r-- | kexi/main/startup/KexiStartupFileDialog_win.cpp | 476 |
1 files changed, 476 insertions, 0 deletions
diff --git a/kexi/main/startup/KexiStartupFileDialog_win.cpp b/kexi/main/startup/KexiStartupFileDialog_win.cpp new file mode 100644 index 00000000..aa06fb9a --- /dev/null +++ b/kexi/main/startup/KexiStartupFileDialog_win.cpp @@ -0,0 +1,476 @@ +/* This file is part of the KDE project + Copyright (C) 2003-2004 Jaroslaw Staniek <[email protected]> + + 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. +*/ + +/*! + Temporary moved from QKW KFileDialog implementation. + TODO: move to KDElibs/win32 KFileDialog wrapper +*/ + +#include "KexiStartupFileDialog.h" +#include <kexiutils/utils.h> + +#include <kiconloader.h> +#include <kdebug.h> +#include <krecentdirs.h> + +#include <qobjectlist.h> +#include <qlineedit.h> + +#include <win/win32_utils.h> + +//! @internal +class KexiStartupFileDialogBasePrivate +{ + public: + KexiStartupFileDialogBasePrivate() + {} + KFile::Mode mode; + QString kde_filters; + QStringList mimetypes; +}; + +KexiStartupFileDialogBase::KexiStartupFileDialogBase( + const QString & dirName, const QString & filter, + QWidget * parent, const char * name, bool modal ) + : QFileDialog( realStartDir(dirName), filter, parent, name, modal ) + , d(new KexiStartupFileDialogBasePrivate()) +{ +// QString _dirName = dirName; + QString _dirName = dirPath(); + //make default 'My Documents' folder +//TODO: store changes in the app's config file? + if (_dirName.isEmpty()) + _dirName = KGlobalSettings::documentPath(); + + init(_dirName, filter, parent); + + //find "OK" button + QObjectList *l = queryList( "QPushButton", "OK", false ); + m_okBtn = dynamic_cast<QPushButton*>(l->first()); + delete l; + l = queryList( "QLineEdit", "name/filter editor", false ); + m_lineEdit = dynamic_cast<QLineEdit*>(l->first()); + delete l; + + adjustSize(); +} + +KexiStartupFileDialogBase::~KexiStartupFileDialogBase() +{ +} + +void KexiStartupFileDialogBase::init(const QString& startDir, const QString& filter, QWidget* widget) +{ +//TODO initStatic(); +//TODO d = new KFileDialogPrivate(); + +//(js) d->boxLayout = 0; +//TODO d->keepLocation = false; +//TODO d->operationMode = Opening; + setMode(KFile::File | KFile::ExistingOnly); //(js) default: open action + setIcon( KGlobal::iconLoader()->loadIcon("fileopen", KIcon::Desktop) ); + setDir(QDir(startDir)); +//TODO d->hasDefaultFilter = false; +//TODO d->hasView = false; +//(js) d->mainWidget = new QWidget( this, "KFileDialog::mainWidget"); +//(js) setMainWidget( d->mainWidget ); +//(js) d->okButton = new KPushButton( KStdGuiItem::ok(), d->mainWidget ); +//(js) d->okButton->setDefault( true ); +//(js) d->cancelButton = new KPushButton(KStdGuiItem::cancel(), d->mainWidget); +//(js) connect( d->okButton, SIGNAL( clicked() ), SLOT( slotOk() )); +//(js) connect( d->cancelButton, SIGNAL( clicked() ), SLOT( slotCancel() )); +//(js) d->customWidget = widget; +//(js) d->autoSelectExtCheckBox = 0; // delayed loading +//TODO d->autoSelectExtChecked = false; +//(js) d->urlBar = 0; // delayed loading +//TODO KConfig *config = KGlobal::config(); +//TODO KConfigGroupSaver cs( config, ConfigGroup ); +//TODO d->initializeSpeedbar = config->readBoolEntry( "Set speedbar defaults", +//TODO true ); +//TODO d->completionLock = false; + +//TODO QtMsgHandler oldHandler = qInstallMsgHandler( silenceQToolBar ); +//TODO toolbar = 0; //(js) +//(js) toolbar = new KToolBar( d->mainWidget, "KFileDialog::toolbar", true); +//(js) toolbar->setFlat(true); +//TODO qInstallMsgHandler( oldHandler ); + +//(js) d->pathCombo = new KURLComboBox( KURLComboBox::Directories, true, +//(js) toolbar, "path combo" ); +//(js) QToolTip::add( d->pathCombo, i18n("Often used directories") ); +//(js) QWhatsThis::add( d->pathCombo, "<qt>" + i18n("Commonly used locations are listed here. " +//(js) "This includes standard locations, such as your home directory, as well as " +//(js) "locations that have been visited recently.") + autocompletionWhatsThisText); +/* + KURL u; + u.setPath( QDir::rootDirPath() ); + QString text = i18n("Root Directory: %1").arg( u.path() ); + d->pathCombo->addDefaultURL( u, + KMimeType::pixmapForURL( u, 0, KIcon::Small ), + text ); + + u.setPath( QDir::homeDirPath() ); + text = i18n("Home Directory: %1").arg( u.path( +1 ) ); + d->pathCombo->addDefaultURL( u, KMimeType::pixmapForURL( u, 0, KIcon::Small ), + text ); + + KURL docPath; + docPath.setPath( KGlobalSettings::documentPath() ); + if ( u.path(+1) != docPath.path(+1) ) { + text = i18n("Documents: %1").arg( docPath.path( +1 ) ); + d->pathCombo->addDefaultURL( u, + KMimeType::pixmapForURL( u, 0, KIcon::Small ), + text ); + } + + u.setPath( KGlobalSettings::desktopPath() ); + text = i18n("Desktop: %1").arg( u.path( +1 ) ); + d->pathCombo->addDefaultURL( u, + KMimeType::pixmapForURL( u, 0, KIcon::Small ), + text ); + + u.setPath( "/tmp" ); + + d->url = getStartURL( startDir, d->fileClass ); + d->selection = d->url.url(); + + // If local, check it exists. If not, go up until it exists. + if ( d->url.isLocalFile() ) + { + if ( !QFile::exists( d->url.path() ) ) + { + d->url = d->url.upURL(); + QDir dir( d->url.path() ); + while ( !dir.exists() ) + { + d->url = d->url.upURL(); + dir.setPath( d->url.path() ); + } + } + } + + ops = new KDirOperator(d->url, d->mainWidget, "KFileDialog::ops"); + ops->setOnlyDoubleClickSelectsFiles( true ); + connect(ops, SIGNAL(urlEntered(const KURL&)), + SLOT(urlEntered(const KURL&))); + connect(ops, SIGNAL(fileHighlighted(const KFileItem *)), + SLOT(fileHighlighted(const KFileItem *))); + connect(ops, SIGNAL(fileSelected(const KFileItem *)), + SLOT(fileSelected(const KFileItem *))); + connect(ops, SIGNAL(finishedLoading()), + SLOT(slotLoadingFinished())); + + ops->setupMenu(KDirOperator::SortActions | + KDirOperator::FileActions | + KDirOperator::ViewActions); + KActionCollection *coll = ops->actionCollection(); + + // plug nav items into the toolbar + coll->action( "up" )->plug( toolbar ); + coll->action( "up" )->setWhatsThis(i18n("<qt>Click this button to enter the parent directory.<p>" + "For instance, if the current location is file:/home/%1 clicking this " + "button will take you to file:/home.</qt>").arg(getlogin())); + coll->action( "back" )->plug( toolbar ); + coll->action( "back" )->setWhatsThis(i18n("Click this button to move backwards one step in the browsing history.")); + coll->action( "forward" )->plug( toolbar ); + coll->action( "forward" )->setWhatsThis(i18n("Click this button to move forward one step in the browsing history.")); + coll->action( "reload" )->plug( toolbar ); + coll->action( "reload" )->setWhatsThis(i18n("Click this button to reload the contents of the current location.")); + coll->action( "mkdir" )->setShortcut(Key_F10); + coll->action( "mkdir" )->plug( toolbar ); + coll->action( "mkdir" )->setWhatsThis(i18n("Click this button to create a new directory.")); + + d->bookmarkHandler = new KFileBookmarkHandler( this ); + toolbar->insertButton(QString::fromLatin1("bookmark"), + (int)HOTLIST_BUTTON, true, + i18n("Bookmarks")); + toolbar->getButton(HOTLIST_BUTTON)->setPopup( d->bookmarkHandler->menu(), + true); + QWhatsThis::add(toolbar->getButton(HOTLIST_BUTTON), + i18n("<qt>This button allows you to bookmark specific locations. " + "Click on this button to open the bookmark menu where you may add, " + "edit or select a bookmark.<p>" + "These bookmarks are specific to the file dialog, but otherwise operate " + "like bookmarks elsewhere in KDE.</qt>")); + connect( d->bookmarkHandler, SIGNAL( openURL( const QString& )), + SLOT( enterURL( const QString& ))); + + KToggleAction *showSidebarAction = + new KToggleAction(i18n("Show Quick Access Navigation Panel"), Key_F9, coll,"toggleSpeedbar"); + connect( showSidebarAction, SIGNAL( toggled( bool ) ), + SLOT( toggleSpeedbar( bool )) ); + + KActionMenu *menu = new KActionMenu( i18n("Configure"), "configure", this, "extra menu" ); + menu->setWhatsThis(i18n("<qt>This is the configuration menu for the file dialog. " + "Various options can be accessed from this menu including: <ul>" + "<li>how files are sorted in the list</li>" + "<li>types of view, including icon and list</li>" + "<li>showing of hidden files</li>" + "<li>the Quick Access navigation panel</li>" + "<li>file previews</li>" + "<li>separating directories from files</li></ul></qt>")); + menu->insert( coll->action( "sorting menu" )); + menu->insert( coll->action( "separator" )); + coll->action( "short view" )->setShortcut(Key_F6); + menu->insert( coll->action( "short view" )); + coll->action( "detailed view" )->setShortcut(Key_F7); + menu->insert( coll->action( "detailed view" )); + menu->insert( coll->action( "separator" )); + coll->action( "show hidden" )->setShortcut(Key_F8); + menu->insert( coll->action( "show hidden" )); + menu->insert( showSidebarAction ); + coll->action( "preview" )->setShortcut(Key_F11); + menu->insert( coll->action( "preview" )); + coll->action( "separate dirs" )->setShortcut(Key_F12); + menu->insert( coll->action( "separate dirs" )); + + menu->setDelayed( false ); + connect( menu->popupMenu(), SIGNAL( aboutToShow() ), + ops, SLOT( updateSelectionDependentActions() )); + menu->plug( toolbar ); +*/ + /* + * ugly little hack to have a 5 pixel space between the buttons + * and the combo box + */ +/* QWidget *spacerWidget = new QWidget(toolbar); +//(js) spacerWidget->setMinimumWidth(spacingHint()); +//(js) spacerWidget->setMaximumWidth(spacingHint()); + d->m_pathComboIndex = toolbar->insertWidget(-1, -1, spacerWidget); + toolbar->insertWidget(PATH_COMBO, 0, d->pathCombo); + + + toolbar->setItemAutoSized (PATH_COMBO); + toolbar->setIconText(KToolBar::IconOnly); + toolbar->setBarPos(KToolBar::Top); + toolbar->setMovingEnabled(false); + toolbar->adjustSize(); + + d->pathCombo->setCompletionObject( ops->dirCompletionObject(), false ); + + connect( d->pathCombo, SIGNAL( urlActivated( const KURL& )), + this, SLOT( enterURL( const KURL& ) )); + connect( d->pathCombo, SIGNAL( returnPressed( const QString& )), + this, SLOT( enterURL( const QString& ) )); + connect( d->pathCombo, SIGNAL(textChanged( const QString& )), + SLOT( pathComboChanged( const QString& ) )); + connect( d->pathCombo, SIGNAL( completion( const QString& )), + SLOT( dirCompletion( const QString& ))); + connect( d->pathCombo, SIGNAL( textRotation(KCompletionBase::KeyBindingType) ), + d->pathCombo, SLOT( rotateText(KCompletionBase::KeyBindingType) )); + + QString whatsThisText; + + // the Location label/edit + d->locationLabel = new QLabel(i18n("&Location:"), d->mainWidget); + locationEdit = new KURLComboBox(KURLComboBox::Files, true, + d->mainWidget, "LocationEdit"); + updateLocationWhatsThis (); + d->locationLabel->setBuddy(locationEdit); + + // to get the completionbox-signals connected: + locationEdit->setHandleSignals( true ); + (void) locationEdit->completionBox(); + + locationEdit->setFocus(); +// locationEdit->setCompletionObject( new KURLCompletion() ); +// locationEdit->setAutoDeleteCompletionObject( true ); + locationEdit->setCompletionObject( ops->completionObject(), false ); + + connect( locationEdit, SIGNAL( returnPressed() ), + this, SLOT( slotOk())); + connect(locationEdit, SIGNAL( activated( const QString& )), + this, SLOT( locationActivated( const QString& ) )); + connect( locationEdit, SIGNAL( completion( const QString& )), + SLOT( fileCompletion( const QString& ))); + connect( locationEdit, SIGNAL( textRotation(KCompletionBase::KeyBindingType) ), + locationEdit, SLOT( rotateText(KCompletionBase::KeyBindingType) )); + + // the Filter label/edit + whatsThisText = i18n("<qt>This is the filter to apply to the file list. " + "File names that do not match the filter will not be shown.<p>" + "You may select from one of the preset filters in the " + "drop down menu, or you may enter a custom filter " + "directly into the text area.<p>" + "Wildcards such as * and ? are allowed.</qt>"); + d->filterLabel = new QLabel(i18n("&Filter:"), d->mainWidget); + QWhatsThis::add(d->filterLabel, whatsThisText); + filterWidget = new KFileFilterCombo(d->mainWidget, + "KFileDialog::filterwidget"); + QWhatsThis::add(filterWidget, whatsThisText); + setFilter(filter); + d->filterLabel->setBuddy(filterWidget); + connect(filterWidget, SIGNAL(filterChanged()), SLOT(slotFilterChanged())); + + // the Automatically Select Extension checkbox + // (the text, visibility etc. is set in updateAutoSelectExtension(), which is called by readConfig()) + d->autoSelectExtCheckBox = new QCheckBox (d->mainWidget); + connect(d->autoSelectExtCheckBox, SIGNAL(clicked()), SLOT(slotAutoSelectExtClicked())); + + initGUI(); // activate GM + + readRecentFiles( config ); + + adjustSize(); + + // we set the completionLock to avoid entering pathComboChanged() when + // inserting the list of URLs into the combo. + d->completionLock = true; + ops->setViewConfig( config, ConfigGroup ); + readConfig( config, ConfigGroup ); + setSelection(d->selection); + d->completionLock = false; + */ +} + +void KexiStartupFileDialogBase::clearFilter() +{ + d->kde_filters = "";//(js) + QFileDialog::setFilter(""); //(js); +//todo d->mimetypes.clear(); +//todo d->hasDefaultFilter = false; + + updateAutoSelectExtension (); +} + +KFile::Mode KexiStartupFileDialogBase::mode() const +{ + return d->mode; +} + +void KexiStartupFileDialogBase::setMode( KFile::Mode m ) +{ + //(js) translate mode for QFileDialog + d->mode = m; + QFileDialog::Mode qm = (QFileDialog::Mode)0; + if (m & KFile::File) qm = Mode(qm | QFileDialog::AnyFile); + else if (m & KFile::Directory) qm = Mode(qm | QFileDialog::DirectoryOnly); + if (m & KFile::Files) qm = Mode(qm | QFileDialog::ExistingFiles); + if (m & KFile::ExistingOnly) qm = Mode(qm | QFileDialog::ExistingFile); + + QFileDialog::setMode( qm ); +/*(js) ops->setMode(m); + if ( ops->dirOnlyMode() ) { +//(js) filterWidget->setDefaultFilter( i18n("*|All Directories") ); + } + else { +//(js) filterWidget->setDefaultFilter( i18n("*|All Files") ); + } + + updateAutoSelectExtension ();*/ +} + +void KexiStartupFileDialogBase::setMode( unsigned int m ) +{ + setMode(static_cast<KFile::Mode>( m )); +} + +void KexiStartupFileDialogBase::setOperationMode( KFileDialog::OperationMode mode ) +{ +// d->operationMode = mode; + // d->keepLocation = (mode == Saving); + if (mode == KFileDialog::Saving) { + setMode( KFile::File ); + setIcon( KGlobal::iconLoader()->loadIcon("filesave", KIcon::Desktop) ); + } +//(js) filterWidget->setEditable( !d->hasDefaultFilter || mode != Saving ); +//(js) d->okButton->setGuiItem( (mode == Saving) ? KStdGuiItem::save() : KStdGuiItem::ok() ); +//TODO updateLocationWhatsThis (); + updateAutoSelectExtension (); +} + +QString KexiStartupFileDialogBase::currentFilter() const +{ + //(js)filterWidget->currentFilter(); + + //we need to convert Qt filter format to KDE format + //Qt format: "some text (*.first *.second)" or "All (*)" + //KDE format: "*.first *.second" or "*" + QString f = selectedFilter(); + if (f.find('(')!=-1) + f = f.mid(f.find('(')+1); + if (f.mid(f.find(')')!=-1)) + f = f.left(f.find(')')); + return f; +} + +void KexiStartupFileDialogBase::setFilter(const QString& filter) +{ + d->kde_filters = filter; + int pos = d->kde_filters.find('/'); + + // Check for an un-escaped '/', if found + // interpret as a MIME filter. + + if (pos > 0 && filter[pos - 1] != '\\') { + QStringList filters = QStringList::split( " ", d->kde_filters ); + setMimeFilter( filters ); + return; + } + QFileDialog::setFilters( convertKFileDialogFilterToQFileDialogFilter(filter) ); + //</js> +//(js) ops->clearFilter(); +//(js) filterWidget->setFilter(copy); +//(js) ops->setNameFilter(filterWidget->currentFilter()); +//(js) d->hasDefaultFilter = false; +//(js) filterWidget->setEditable( true ); + + updateAutoSelectExtension (); +} + +void KexiStartupFileDialogBase::setMimeFilter( const QStringList& mimeTypes, + const QString& defaultType ) +{ + d->mimetypes = mimeTypes; +//(js) filterWidget->setMimeFilter( mimeTypes, defaultType ); + +//(js) QStringList types = QStringList::split(" ", filterWidget->currentFilter()); +//(js) types.append( QString::fromLatin1( "inode/directory" )); +//(js) ops->clearFilter(); +//(js) ops->setMimeFilter( types ); +//(js) d->hasDefaultFilter = !defaultType.isEmpty(); +//(js) filterWidget->setEditable( !d->hasDefaultFilter || +//(js) d->operationMode != Saving ); + +//TODO updateAutoSelectExtension (); +} + +QString KexiStartupFileDialogBase::realStartDir(const QString& startDir) +{ + if (!startDir.startsWith(":")) + return startDir; + QString recentDir; //dummy + QString path( KFileDialog::getStartURL(startDir, recentDir).path() ); + if (path.isEmpty()) + return QString::null; + QFileInfo fi(path); + return fi.isDir() ? fi.absFilePath() : fi.dir(true).absPath(); +} + +void KexiStartupFileDialogBase::saveLastVisitedPath(const QString& path) +{ + if (!m_lastVisitedPathsVariable.isEmpty()) { + //save last visited dir path +// QString dir = QDir(path).absPath(); + QFileInfo fi(path); + QString dir( fi.isDir() ? fi.absFilePath() : fi.dir(true).absPath() ); + if (!dir.isEmpty()) + KRecentDirs::add(m_lastVisitedPathsVariable, dir); + } +} |