diff options
Diffstat (limited to 'lib/kofficecore/KoFileDialog.cpp')
-rw-r--r-- | lib/kofficecore/KoFileDialog.cpp | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/lib/kofficecore/KoFileDialog.cpp b/lib/kofficecore/KoFileDialog.cpp new file mode 100644 index 00000000..b80c23e0 --- /dev/null +++ b/lib/kofficecore/KoFileDialog.cpp @@ -0,0 +1,125 @@ +/* This file is part of the KDE project + Copyright (C) 2002-2005 David Faure <faure@kde.org> + Copyright (C) 2002-2004 Clarence Dang <dang@kde.org> + + 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 "KoFileDialog.h" +#include "KoDocument.h" +#include <kfilefiltercombo.h> +#include <klocale.h> +#include <kdiroperator.h> +#include <kdebug.h> + +KoFileDialog::KoFileDialog(const QString& startDir, const QString& filter, + QWidget *parent, const char *name, + bool modal) + : KFileDialog( startDir, filter, parent, name, modal ) +{ + connect( filterWidget, SIGNAL( activated( int) ), + this, SLOT( slotChangedfilter( int ) ) ); +} + +void KoFileDialog::slotChangedfilter( int index ) +{ + // Switch to "directory selection" mode for SaveAsDirectoryStore, + // switch back to "file selection" mode otherwise. + KFile::Mode newMode = KFile::File; + if ( index >= 1 && index <= (int)m_specialFormats.count() + && m_specialFormats[index-1] == KoDocument::SaveAsDirectoryStore ) { + newMode = KFile::Directory; + } + if ( newMode != mode() ) + { + ops->setMode( newMode ); + updateAutoSelectExtension(); + } +} + +void KoFileDialog::setSpecialMimeFilter( QStringList& mimeFilter, + const QString& currentFormat, const int specialOutputFlag, + const QString& nativeFormat, + int supportedSpecialFormats ) +{ + Q_ASSERT( !mimeFilter.isEmpty() ); + Q_ASSERT( mimeFilter[0] == nativeFormat ); + + bool addUncompressed = supportedSpecialFormats & KoDocument::SaveAsDirectoryStore; + bool addFlatXML = supportedSpecialFormats & KoDocument::SaveAsFlatXML; + + int idxSpecialOutputFlag = 0; + int numSpecialEntries = 0; + if ( addUncompressed ) { + ++numSpecialEntries; + m_specialFormats.append( KoDocument::SaveAsDirectoryStore ); + if ( specialOutputFlag == KoDocument::SaveAsDirectoryStore ) + idxSpecialOutputFlag = numSpecialEntries; + } + if ( addFlatXML ) { + ++numSpecialEntries; + m_specialFormats.append( KoDocument::SaveAsFlatXML ); + if ( specialOutputFlag == KoDocument::SaveAsFlatXML ) + idxSpecialOutputFlag = numSpecialEntries; + } + + // Insert numSpecialEntries entries with native mimetypes, for the special entries. + QStringList::Iterator mimeFilterIt = mimeFilter.at( 1 ); + mimeFilter.insert( mimeFilterIt /* before 1 -> after 0 */, numSpecialEntries, nativeFormat ); + + // Fill in filter combo + // Note: if currentFormat doesn't exist in mimeFilter, filterWidget + // will default to the first item (native format) + setMimeFilter( mimeFilter, currentFormat.isEmpty() ? nativeFormat : currentFormat ); + + // To get a different description in the combo, we need to change its entries afterwards + KMimeType::Ptr type = KMimeType::mimeType( nativeFormat ); + int idx = 1; // 0 is the native format + + if ( addUncompressed ) + filterWidget->changeItem( i18n("%1 (Uncompressed XML Files)").arg( type->comment() ), idx++ ); + if ( addFlatXML ) + filterWidget->changeItem( i18n("%1 (Flat XML File)").arg( type->comment() ), idx++ ); + // if you add an entry here, update numSpecialEntries above and specialEntrySelected() below + + // For native format... + if (currentFormat == nativeFormat || currentFormat.isEmpty()) + { + // KFileFilterCombo selected the _last_ "native mimetype" entry, select the correct one + filterWidget->setCurrentItem( idxSpecialOutputFlag ); + slotChangedfilter( filterWidget->currentItem() ); + } + // [Mainly KWord] Tell MS Office users that they can save in RTF! + int i = 0; + for (mimeFilterIt = mimeFilter.begin (); mimeFilterIt != mimeFilter.end (); ++mimeFilterIt, i++) + { + KMimeType::Ptr mime = KMimeType::mimeType (*mimeFilterIt); + QString compatString = mime->property ("X-KDE-CompatibleApplication").toString (); + if (!compatString.isEmpty ()) + filterWidget->changeItem (i18n ("%1 (%2 Compatible)").arg (mime->comment ()).arg (compatString), i); + } +} + +int KoFileDialog::specialEntrySelected() +{ + int i = filterWidget->currentItem(); + // Item 0 is the native format, the following ones are the special formats + if ( i >= 1 && i <= (int)m_specialFormats.count() ) + return m_specialFormats[i-1]; + return 0; +} + +#include "KoFileDialog.moc" |