[prev in list] [next in list] [prev in thread] [next in thread] 

List:       koffice-devel
Subject:    Filter settings
From:       Clarence Dang <dang () kde ! org>
Date:       2003-06-08 12:36:52
[Download RAW message or body]

Hi,

The filter settings framework (if you call it that :)) I promised a while ago.

The 2 main motivations behind this are the following:

1. No more export filter dialogs popping up on _every_ single save with the 
wrong options preselected (no communication with the import filter)

2. True batch conversion via koconverter.

The basic idea is that a QMap <QString, QString> gets passed around and has 
settings in the format: "<filter>-<setting>" e.g. 
"kwordasciifilter-encoding"="cp1251".

Is the idea ok?  I'll have to implement it rather quickly and port KWord's 
ascii and html filters to beat the feature freeze.  The patches are just to 
show the idea (they probably don't apply because I had to manually edit out 
other changes).  Yes, they were written in hurry (I have exams very soon).

Clarence


["koconverter.patch" (text/x-diff)]

Index: koconverter.cc
===================================================================
RCS file: /home/kde/koffice/tools/converter/koconverter.cc,v
retrieving revision 1.7
diff -u -p -b -B -w -d -r1.7 koconverter.cc
--- koconverter.cc	15 May 2002 22:08:40 -0000	1.7
+++ koconverter.cc	8 Jun 2003 12:24:28 -0000
@@ -33,16 +33,34 @@ static const KCmdLineOptions options[]=
 	{"+in", I18N_NOOP("Input file"),0},
 	{"+out", I18N_NOOP("Output file"),0},
 	{"mimetype <mime>", I18N_NOOP("Mimetype of the output file"),0},
+    {"batch", I18N_NOOP("Batchmode conversion (no filter dialogs)"),0},
+    {"settings <settings>", I18N_NOOP("Default settings for filters"),0},
 	{0,0,0}
 };
 
-bool convert( const KURL & uIn, const QString & /*inputFormat*/, const KURL & uOut, \
const QString & outputFormat ) +bool convert( const KURL & uIn, const QString & \
/*inputFormat*/, const KURL & uOut, const QString & outputFormat, const QString \
&filterSettingsString, const bool batchMode )  {
     KoFilterManager* manager = new KoFilterManager( uIn.path() );
 
     ProgressObject progressObj;
     QObject::connect(manager, SIGNAL(sigProgress(int)), &progressObj, \
SLOT(slotProgress(int)));  
+    QMap<QString,QString> filterSettings;
+    QStringList filterSettingsList = QStringList::split (',', filterSettingsString);
+    for (QStringList::ConstIterator it = filterSettingsList.begin ();
+         it != filterSettingsList.end ();
+         it++)
+    {
+        int index = (*it).find ("=");
+        if (index > 0)
+            filterSettings.insert ((*it).left (index), (*it).mid (index + 1));
+    }
+
+    if (batchMode)
+        filterSettings.insert ("koffice-saveMode", "batch" );
+
+    manager->setExtraFilterSettings (filterSettings);
+
     QCString mime( outputFormat.latin1() );
     KoFilter::ConversionStatus status = manager->exp0rt( uOut.path(), mime );
     progressObj.slotProgress(-1);
@@ -79,6 +97,7 @@ int main( int argc, char **argv )
     KCmdLineArgs *args= KCmdLineArgs::parsedArgs();
     if ( args->count() == 2 )
     {
+        // Input/output files
         KURL uIn = args->url( 0 );
         KURL uOut = args->url( 1 );
         KMimeType::Ptr inputMimetype = KMimeType::findByURL( uIn );
@@ -87,6 +106,8 @@ int main( int argc, char **argv )
             kdError() << i18n("Mimetype for input file %1 not \
found!").arg(uIn.prettyURL()) << endl;  return 1;
         }
+
+        // output mimetype
         KMimeType::Ptr outputMimetype;
         if ( args->isSet("mimetype") )
         {
@@ -109,7 +130,9 @@ int main( int argc, char **argv )
         }
 
         QApplication::setOverrideCursor( Qt::waitCursor );
-        bool ok = convert( uIn, inputMimetype->name(), uOut, outputMimetype->name() \
); +        bool ok = convert( uIn, inputMimetype->name(), uOut, \
outputMimetype->name(), +                            QString::fromLatin1( \
args->getOption("settings") ), +                            args->isSet("batch") );
         QApplication::restoreOverrideCursor();
         return ok ? 0 : 2;
     }


["lib-filtersettings3.patch" (text/x-diff)]

Index: koDocument.cc
===================================================================
RCS file: /home/kde/koffice/lib/kofficecore/koDocument.cc,v
retrieving revision 1.271
diff -u -p -r1.271 koDocument.cc
--- koDocument.cc	5 May 2003 08:16:00 -0000	1.271
+++ koDocument.cc	8 Jun 2003 11:45:01 -0000
@@ -92,7 +92,7 @@ public:
         filterManager( 0L ),
         m_specialOutputFlag( 0 ),
         m_isImporting( false ), m_isExporting( false ),
-        m_filterSettings( m_normalFilterSettings ),
+        m_filterSettings( &m_normalFilterSettings ),
         m_numOperations( 0 ),
         modifiedAfterAutosave( false ),
         m_autosaving( false ),
@@ -129,7 +129,7 @@ public:
 
     QMap <QString, QString> m_normalFilterSettings,
                             m_exportFilterSettings,
-                            &m_filterSettings;
+                            *m_filterSettings;
 
     QTimer m_autoSaveTimer;
     QString lastErrorMessage; // see openFile()
@@ -301,8 +301,7 @@ bool KoDocument::exp0rt( const KURL & _u
     bool ret;
 
     d->m_isExporting = true;
-    // d->m_filterSettings is a reference
-    d->m_filterSettings = d->m_exportFilterSettings;
+    d->m_filterSettings = &d->m_exportFilterSettings;
 
 
     //
@@ -321,6 +320,7 @@ bool KoDocument::exp0rt( const KURL & _u
 
 
     // save...
+    filterSettings()->insert( "koffice-saveMode", "saveAs" );
     ret = saveAs( _url );
 
 
@@ -344,7 +344,7 @@ bool KoDocument::exp0rt( const KURL & _u
     }
 
 
-    d->m_filterSettings = d->m_normalFilterSettings;
+    d->m_filterSettings = &d->m_normalFilterSettings;
     d->m_isExporting = false;
 
     return ret;
@@ -484,19 +484,19 @@ bool KoDocument::isExporting() const
     return d->m_isExporting;
 }
 
-QMap <QString, QString> &KoDocument::filterSettings()
+QMap <QString, QString> *KoDocument::filterSettings()
 {
     return d->m_filterSettings;
 }
 
-QMap <QString, QString> &KoDocument::normalFilterSettings()
+QMap <QString, QString> *KoDocument::normalFilterSettings()
 {
-    return d->m_normalFilterSettings;
+    return &d->m_normalFilterSettings;
 }
 
-QMap <QString, QString> &KoDocument::exportFilterSettings()
+QMap <QString, QString> *KoDocument::exportFilterSettings()
 {
-    return d->m_exportFilterSettings;
+    return &d->m_exportFilterSettings;
 }
 
 void KoDocument::setCheckAutoSaveFile( bool b )
Index: koDocument.h
===================================================================
RCS file: /home/kde/koffice/lib/kofficecore/koDocument.h,v
retrieving revision 1.140
diff -u -p -r1.140 koDocument.h
--- koDocument.h	5 May 2003 08:16:00 -0000	1.140
+++ koDocument.h	8 Jun 2003 11:45:06 -0000
@@ -160,9 +160,8 @@ public:
 
     /**
      * The current filter settings (used by the filter architecture).
-     * @internal
      */
-    QMap <QString, QString> &filterSettings();
+    QMap <QString, QString> *filterSettings();
 
     /**
      * Sets whether the document can be edited or is read only.
@@ -688,7 +687,7 @@ protected:
      *  Modifying the returned settings may have a direct impact on future
      *  Save operations.
      */
-    QMap <QString, QString> &normalFilterSettings();
+    QMap <QString, QString> *normalFilterSettings();
 
     /**
      *  Returns the filter settings used with KoDocument::exp0rt (separate from
@@ -697,7 +696,7 @@ protected:
      *  Modifying the returned settings may have a direct impact on future
      *  Export operations.
      */
-    QMap <QString, QString> &exportFilterSettings();
+    QMap <QString, QString> *exportFilterSettings();
 
     /**
      *  You need to overload this function if your document may contain
Index: koFilterChain.cpp
===================================================================
RCS file: /home/kde/koffice/lib/kofficecore/koFilterChain.cpp,v
retrieving revision 1.18
diff -u -p -r1.18 koFilterChain.cpp
--- koFilterChain.cpp	8 Oct 2002 16:55:37 -0000	1.18
+++ koFilterChain.cpp	8 Jun 2003 11:45:10 -0000
@@ -38,6 +38,16 @@ namespace {
     const int SLOT_PREFIX_LEN = 8;
 }
 
+class KoFilterChain::Private
+{
+public:
+    Private ()
+    {
+        filterSettings = &dummyFilterSettings;
+    }
+
+    QMap <QString, QString> dummyFilterSettings, *filterSettings;
+};
 
 KoFilterChain::ChainLink::ChainLink( KoFilterChain* chain, KoFilterEntry::Ptr \
                filterEntry,
                                      const QCString& from, const QCString& to ) :
@@ -129,6 +139,8 @@ KoFilterChain::~KoFilterChain()
     if ( filterManagerParentChain() && filterManagerParentChain()->m_outputStorage )
         filterManagerParentChain()->m_outputStorage->leaveDirectory();
     manageIO(); // Called for the 2nd time in a row -> clean up
+
+    delete d;
 }
 
 KoFilter::ConversionStatus KoFilterChain::invokeChain()
@@ -317,8 +329,10 @@ KoFilterChain::KoFilterChain( const KoFi
     m_manager( manager ), m_state( Beginning ), m_inputStorage( 0 ),
     m_inputStorageDevice( 0 ), m_outputStorage( 0 ), m_outputStorageDevice( 0 ),
     m_inputDocument( 0 ), m_outputDocument( 0 ), m_inputTempFile( 0 ),
-    m_outputTempFile( 0 ), m_inputQueried( Nil ), m_outputQueried( Nil ), d( 0 )
+    m_outputTempFile( 0 ), m_inputQueried( Nil ), m_outputQueried( Nil )
 {
+    d = new Private;
+
     // We "own" our chain links, the filter entries are implicitly shared
     m_chainLinks.setAutoDelete( true );
 }
@@ -373,6 +387,16 @@ int KoFilterChain::filterManagerDirectio
 KoFilterChain* const KoFilterChain::filterManagerParentChain() const
 {
     return m_manager->parentChain();
+}
+
+QMap <QString, QString> *KoFilterChain::filterSettings()
+{
+    return d->filterSettings;
+}
+
+void KoFilterChain::setFilterSettings (QMap <QString, QString> *filterSettings)
+{
+    d->filterSettings = filterSettings;
 }
 
 void KoFilterChain::manageIO()
Index: koFilterChain.h
===================================================================
RCS file: /home/kde/koffice/lib/kofficecore/koFilterChain.h,v
retrieving revision 1.11
diff -u -p -r1.11 koFilterChain.h
--- koFilterChain.h	9 Apr 2002 11:10:38 -0000	1.11
+++ koFilterChain.h	8 Jun 2003 11:45:13 -0000
@@ -21,6 +21,7 @@
 
 #include <qcstring.h>
 #include <qasciidict.h>
+#include <qmap.h>
 #include <qptrlist.h>
 #include <qstringlist.h>
 
@@ -113,6 +114,8 @@ public:
      */
     KoDocument* outputDocument();
 
+    QMap <QString,QString> *filterSettings();
+    void setFilterSettings(QMap <QString,QString> *filterSettings);
 
     // debugging
     void dump() const;
Index: koFilterManager.cc
===================================================================
RCS file: /home/kde/koffice/lib/kofficecore/koFilterManager.cc,v
retrieving revision 1.127
diff -u -p -r1.127 koFilterManager.cc
--- koFilterManager.cc	14 May 2003 13:10:18 -0000	1.127
+++ koFilterManager.cc	8 Jun 2003 11:45:15 -0000
<snipped>
 // static cache for filter availability
 QMap<QString, bool> KoFilterManager::m_filterAvailable;
 
 const int KoFilterManager::s_area = 30500;
 
+
+class KoFilterManager::Private
+{
+public:
+    Private ()
+    {
+    }
+
+    QMap <QString, QString> m_extraFilterSettings, m_tempFilterSettings;
+};
+
 KoFilterManager::KoFilterManager( KoDocument* document ) :
-    m_document( document ), m_parentChain( 0 ), m_graph( "" ), d( 0 )
+    m_document( document ), m_parentChain( 0 ), m_graph( "" )
 {
+    d = new Private;
+
     if ( document )
         QObject::connect( this, SIGNAL( sigProgress( int ) ),
                           document, SIGNAL( sigProgress( int ) ) );
@@ -54,12 +149,14 @@ KoFilterManager::KoFilterManager( KoDocu
 KoFilterManager::KoFilterManager( const QString& url, const QCString& mimetypeHint,
                                   KoFilterChain* const parentChain ) :
     m_document( 0 ), m_parentChain( parentChain ), m_importUrl( url ), \
                m_importUrlMimetypeHint( mimetypeHint ),
-    m_graph( "" ), d( 0 )
+    m_graph( "" )
 {
+    d = new Private;
 }
 
 KoFilterManager::~KoFilterManager()
 {
+    delete d;
 }
 
 QString KoFilterManager::import( const QString& url, KoFilter::ConversionStatus& \
status ) @@ -107,6 +236,7 @@ QString KoFilterManager::import( const Q
     m_importUrl = url;  // We want to load that file
     m_exportUrl = QString::null;  // This is null for sure, as embedded stuff isn't
                                   // allowed to use that method
+    chain->setFilterSettings(filterSettings());
     status = chain->invokeChain();
 
     m_importUrl = QString::null;  // Reset the import URL
@@ -156,6 +304,7 @@ KoFilter::ConversionStatus KoFilterManag
         return KoFilter::BadConversionGraph;
     }
 
+    chain->setFilterSettings(filterSettings());
     return chain->invokeChain();
 }
 
@@ -369,12 +518,41 @@ bool KoFilterManager::filterAvailable( K
<snipped>
+void KoFilterManager::setExtraFilterSettings( const QMap<QString,QString> \
&extraFilterSettings ) +{
+    d->m_extraFilterSettings = extraFilterSettings;
+}
+
+QMap<QString,QString> *KoFilterManager::filterSettings()
+{
+    QMap<QString,QString> *settings;
+
+    if (m_document)
+        settings = m_document->filterSettings ();  // persistent settings
+    else
+    {
+        d->m_tempFilterSettings.clear ();  // fresh temporary settings
+        settings = &d->m_tempFilterSettings;
+    }
+
+    // apply additional settings
+    for (QMap<QString,QString>::ConstIterator it = d->m_extraFilterSettings.begin \
(); +         it != d->m_extraFilterSettings.end ();
+         it++)
+    {
+        settings->insert (it.key (), it.data ());
+    }
+
+    d->m_extraFilterSettings.clear ();  // additional settings should persist
+    return settings;
 }
 
 #include <koFilterManager.moc>
Index: koFilterManager.h
===================================================================
RCS file: /home/kde/koffice/lib/kofficecore/koFilterManager.h,v
retrieving revision 1.54
diff -u -p -r1.54 koFilterManager.h
--- koFilterManager.h	13 May 2002 17:52:19 -0000	1.54
+++ koFilterManager.h	8 Jun 2003 11:45:17 -0000
@@ -111,6 +143,8 @@ public:
      */
     static bool filterAvailable( KoFilterEntry::Ptr entry );
 
+    void setExtraFilterSettings( const QMap<QString,QString> &);
+
 signals:
     void sigProgress( int );
 
@@ -148,7 +182,7 @@ private:
     // A static cache for the availability checks of filters
     static QMap<QString, bool> m_filterAvailable;
 
-    // unused right now
+    QMap<QString,QString> *filterSettings();
     class Private;
     Private *d;
 };
Index: koMainWindow.cc
===================================================================
RCS file: /home/kde/koffice/lib/kofficecore/koMainWindow.cc,v
retrieving revision 1.301
diff -u -p -r1.301 koMainWindow.cc
--- koMainWindow.cc	29 May 2003 14:02:29 -0000	1.301
+++ koMainWindow.cc	8 Jun 2003 11:45:31 -0000
@@ -835,6 +835,7 @@ bool KoMainWindow::saveDocument( bool sa
                 pDoc->setOutputMimeType( outputFormat, specialOutputFlag );
                 if (!isExporting ())   // Save As
                 {
+                    pDoc->filterSettings()->insert ("koffice-saveMode", "saveAs");
                     ret = pDoc->saveAs( newURL );
 
                     if (ret)
@@ -851,6 +852,8 @@ bool KoMainWindow::saveDocument( bool sa
                 }
                 else    // Export
                 {
+                    // KoDocument will automatically set saveMode to saveAs
+                    // for export
                     ret = pDoc->exp0rt( newURL );
 
                     if (ret)
@@ -878,6 +881,7 @@ bool KoMainWindow::saveDocument( bool sa
         if (!needConfirm ||
                (needConfirm && exportConfirmation ( oldOutputFormat /* not so old :) \
*/, _native_format ))  )
+            pDoc->filterSettings()->insert ("koffice-saveMode", "save");
             // be sure pDoc has the correct outputMimeType!
             ret = pDoc->save();
 



_______________________________________________
koffice-devel mailing list
koffice-devel@mail.kde.org
http://mail.kde.org/mailman/listinfo/koffice-devel


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic