summaryrefslogtreecommitdiffstats
path: root/lib/kofficecore/KoFileDialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/kofficecore/KoFileDialog.cpp')
-rw-r--r--lib/kofficecore/KoFileDialog.cpp125
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"