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

List:       kde-commits
Subject:    koffice
From:       Sebastian Sauer <mail () dipe ! org>
Date:       2008-05-20 16:59:58
Message-ID: 1211302798.311431.3369.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 810401 by sebsauer:

headers+footers got saved correct now. next step; support page-styles.

 M  +123 -100  kword/part/KWOdfWriter.cpp  
 M  +3 -2      libs/kotext/opendocument/TODO  


--- trunk/koffice/kword/part/KWOdfWriter.cpp #810400:810401
@@ -49,6 +49,65 @@
     public:
         /// The KWord document.
         QPointer<KWDocument> document;
+
+        QByteArray serializeHeaderFooter(KoEmbeddedDocumentSaver& embeddedSaver, \
KoGenStyles& mainStyles, KWTextFrameSet* fs) +        {
+            QByteArray tag;
+            switch (fs->textFrameSetType()) {
+                case KWord::FirstPageHeaderTextFrameSet: tag = "style:header-first"; \
break; +                case KWord::OddPagesHeaderTextFrameSet:  tag = \
"style:header";       break; +                case \
KWord::EvenPagesHeaderTextFrameSet: tag = "style:header-left";  break; +              \
case KWord::FirstPageFooterTextFrameSet: tag = "style:footer-first"; break; +         \
case KWord::OddPagesFooterTextFrameSet:  tag = "style:footer";       break; +         \
case KWord::EvenPagesFooterTextFrameSet: tag = "style:footer-left";  break; +         \
default: return QByteArray(); +            }
+
+            QByteArray content;
+            QBuffer buffer(&content);
+            buffer.open(IO_WriteOnly);
+            KoXmlWriter writer(&buffer);
+            KoShapeSavingContext context(writer, mainStyles, embeddedSaver);
+
+            KoTextShapeData *shapedata = dynamic_cast<KoTextShapeData *>( \
fs->frames().first()->shape()->userData() ); +            Q_ASSERT(shapedata);
+
+            writer.startElement(tag);
+            shapedata->saveOdf(context);
+            writer.endElement();
+
+            return content;
+        }
+
+        void saveHeaderFooter(KoEmbeddedDocumentSaver& embeddedSaver, KoGenStyles& \
mainStyles) +        {
+            QMap<KWord::TextFrameSetType, KWTextFrameSet*> framesets;
+            foreach(KWFrameSet *fs, document->frameSets()) {
+                if (KWTextFrameSet *tfs = dynamic_cast<KWTextFrameSet*> (fs)) {
+                    framesets.insert(tfs->textFrameSetType(), tfs);
+                }
+            }
+
+            QList<KWord::TextFrameSetType> order;
+            order << KWord::FirstPageHeaderTextFrameSet << \
KWord::OddPagesHeaderTextFrameSet << KWord::EvenPagesHeaderTextFrameSet +             \
<< KWord::FirstPageFooterTextFrameSet << KWord::OddPagesFooterTextFrameSet << \
KWord::EvenPagesFooterTextFrameSet; +
+            KoGenStyle style(KoGenStyle::StyleMaster);
+            //style.setAutoStyleInStylesDotXml(true);
+
+            for(int i = 0; i < order.count(); ++i) {
+                if (! framesets.contains(order[i]))
+                    continue;
+                QByteArray content = serializeHeaderFooter(embeddedSaver, \
mainStyles, framesets[order[i]]); +                if (content.isNull())
+                    continue;
+                style.addChildElement(QString::number(i), content);
+            }
+            mainStyles.lookup(style); // appends the headerfooter-style to the \
main-style +
+            //foreach(KoGenStyles::NamedStyle s, \
mainStyles.styles(KoGenStyle::StyleAuto)) +            //    \
mainStyles.markStyleForStylesXml( s.name ); +        }
 };
 
 KWOdfWriter::KWOdfWriter(KWDocument *document)
@@ -63,6 +122,7 @@
     delete d;
 }
 
+// 1.6: KWDocument::saveOasisHelper()
 bool KWOdfWriter::save(KoOdfWriteStore & odfStore, KoEmbeddedDocumentSaver & \
embeddedSaver)  {
     kDebug()<<"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!";
 @@ -72,131 +132,93 @@
 
     KoGenStyles mainStyles;
 
-    ///////////////////////////////////////////////////////////////////////////////////////////
                
-    // Header+Footer
-
     // Header and footers save their content into master-styles/master-page, and \
their  // styles into the page-layout automatic-style.
-    QByteArray headerFooterContent;
-    {
-        QBuffer buffer(&headerFooterContent);
-        buffer.open(IO_WriteOnly);
-        KoXmlWriter headerFooterTmpWriter(&buffer);
+    d->saveHeaderFooter(embeddedSaver, mainStyles);
 
-        KoShapeSavingContext ccc(headerFooterTmpWriter, mainStyles, embeddedSaver);
-
-        QMap<KWord::TextFrameSetType, KWTextFrameSet *> textframesets;
-        foreach(KWFrameSet *fs, d->document->frameSets()) {
-            if (KWTextFrameSet *tfs = dynamic_cast<KWTextFrameSet*> (fs)) {
-                textframesets.insert(tfs->textFrameSetType(), tfs);
-            }
-        }
-        //TODO handle all
-        KWTextFrameSet *f = textframesets[ KWord::OddPagesHeaderTextFrameSet ];
-        if(f) {
-            KoTextShapeData * sd = dynamic_cast<KoTextShapeData *>( \
                f->frames().first()->shape()->userData() );
-            Q_ASSERT(sd);
-            headerFooterTmpWriter.startElement( "header" ); // e.g. style:header or \
                style:footer-left
-            sd->saveOdf(ccc); //TODO how to attach the style-name ?
-            headerFooterTmpWriter.endElement();
-
-            //foreach(KoGenStyles::NamedStyle s, mainStyles.styles( \
                KoGenStyle::StyleAuto ))
-            //    mainStyles.markStyleForStylesXml( s.name );
-        }
-    }
-
-    ///////////////////////////////////////////////////////////////////////////////////////////
  // Content
+    {
 
-    // add manifest line for content.xml
-    manifestWriter->addManifestEntry( "content.xml", "text/xml" );
+        // add manifest line for content.xml
+        manifestWriter->addManifestEntry( "content.xml", "text/xml" );
 
-    if ( !store->open( "content.xml" ) )
-        return false;
+        if ( !store->open( "content.xml" ) )
+            return false;
 
-    KoStoreDevice contentDev( store );
-    KoXmlWriter* contentWriter = KoOdfWriteStore::createOasisXmlWriter( &contentDev, \
"office:document-content" ); +        KoStoreDevice contentDev( store );
+        KoXmlWriter* contentWriter = KoOdfWriteStore::createOasisXmlWriter( \
&contentDev, "office:document-content" );  
-    // for office:master-styles
-    KTemporaryFile masterStyles;
-    masterStyles.open();
-    KoXmlWriter masterStylesTmpWriter( &masterStyles, 1 );
+        // for office:master-styles
+        KTemporaryFile masterStyles;
+        masterStyles.open();
+        KoXmlWriter masterStylesTmpWriter( &masterStyles, 1 );
 
-    // for office:body
-    KTemporaryFile contentTmpFile;
-    contentTmpFile.open();
-    KoXmlWriter contentTmpWriter( &contentTmpFile, 1 );
+        // for office:body
+        KTemporaryFile contentTmpFile;
+        contentTmpFile.open();
+        KoXmlWriter contentTmpWriter( &contentTmpFile, 1 );
 
-    //KoGenStyles mainStyles;
-    KoShapeSavingContext context(contentTmpWriter, mainStyles, embeddedSaver);
+        //KoGenStyles mainStyles;
+        KoShapeSavingContext context(contentTmpWriter, mainStyles, embeddedSaver);
+        //context.setXmlWriter(contentTmpWriter);
 
-    contentTmpWriter.startElement( "office:body" );
-    contentTmpWriter.startElement( "office:text" );
+        contentTmpWriter.startElement( "office:body" );
+        contentTmpWriter.startElement( "office:text" );
 
-    KWTextFrameSet *mainTextFrame = 0;
+        KWTextFrameSet *mainTextFrame = 0;
 
-    foreach(KWFrameSet *fs, d->document->frameSets()) {
-        // TODO loop over all non-autocreated frames and save them.
-        KWTextFrameSet *tfs = dynamic_cast<KWTextFrameSet*> (fs);
-        if (tfs) {
-            if (tfs->textFrameSetType() == KWord::MainTextFrameSet) {
-                mainTextFrame = tfs;
-                continue;
+        foreach(KWFrameSet *fs, d->document->frameSets()) {
+            // TODO loop over all non-autocreated frames and save them.
+            KWTextFrameSet *tfs = dynamic_cast<KWTextFrameSet*> (fs);
+            if (tfs) {
+                if (tfs->textFrameSetType() == KWord::MainTextFrameSet) {
+                    mainTextFrame = tfs;
+                    continue;
+                }
             }
-        }
 #if 0 //sebsauer; don't just save them but we need to handle things more explicit
-        foreach(KWFrame *frame, fs->frames()) {
-            //FIXME: Each text frame will save the entire document of the frameset.
-            frame->saveOdf(context);
+            foreach(KWFrame *frame, fs->frames()) {
+                //FIXME: Each text frame will save the entire document of the \
frameset. +                frame->saveOdf(context);
+            }
+#endif
         }
-#endif
-    }
 
-    if (mainTextFrame) {
-        if (! mainTextFrame->frames().isEmpty() && mainTextFrame->frames().first() ) \
                {
-            KoTextShapeData * shapeData = dynamic_cast<KoTextShapeData *>( \
                mainTextFrame->frames().first()->shape()->userData() );
-            if ( shapeData ) {
-                shapeData->saveOdf(context);
+        if (mainTextFrame) {
+            if (! mainTextFrame->frames().isEmpty() && \
mainTextFrame->frames().first() ) { +                KoTextShapeData * shapeData = \
dynamic_cast<KoTextShapeData *>( mainTextFrame->frames().first()->shape()->userData() \
); +                if ( shapeData ) {
+                    shapeData->saveOdf(context);
+                }
             }
         }
-    }
 
-    /*
-    contentTmpWriter.startElement( odfTagName() );
-    paContext.setXmlWriter( contentTmpWriter );
-    paContext.setOptions( KoPASavingContext::DrawId );
-    // save pages
-    foreach ( KoPAPageBase *page, m_pages )
-    {
-        page->saveOdf( paContext );
-        paContext.incrementPage();
-    }
-    */
-    contentTmpWriter.endElement(); // office:text
-    contentTmpWriter.endElement(); // office:body
+        /*
+        contentTmpWriter.startElement( odfTagName() );
+        paContext.setXmlWriter( contentTmpWriter );
+        paContext.setOptions( KoPASavingContext::DrawId );
+        // save pages
+        foreach ( KoPAPageBase *page, m_pages ) {
+            page->saveOdf( paContext );
+            paContext.incrementPage();
+        }
+        */
+        contentTmpWriter.endElement(); // office:text
+        contentTmpWriter.endElement(); // office:body
 
-    contentTmpFile.close();
+        contentTmpFile.close();
 
-    mainStyles.saveOdfAutomaticStyles( contentWriter, false );
+        mainStyles.saveOdfAutomaticStyles( contentWriter, false );
 
-    // And now we can copy over the contents from the tempfile to the real one
-    contentWriter->addCompleteElement( &contentTmpFile );
+        // And now we can copy over the contents from the tempfile to the real one
+        contentWriter->addCompleteElement( &contentTmpFile );
 
-    contentWriter->endElement(); // root element
-    contentWriter->endDocument();
-    delete contentWriter;
+        contentWriter->endElement(); // root element
+        contentWriter->endDocument();
+        delete contentWriter;
 
-    if ( !store->close() ) // done with content.xml
-        return false;
-
-    ///////////////////////////////////////////////////////////////////////////////////////////
                
-    // Styles
-
-    if( ! headerFooterContent.isNull() ) {
-        KoGenStyle headerStyle(KoGenStyle::StyleMaster);
-        //headerStyle.setAutoStyleInStylesDotXml(true);
-        headerStyle.addChildElement("",headerFooterContent);
-        mainStyles.lookup(headerStyle); //inserts it
+        if ( !store->close() ) // done with content.xml
+            return false;
     }
 
     // save the styles.xml
@@ -217,6 +239,7 @@
     if (!context.saveImages(store, manifestWriter))
         return false;
 #endif
+
     return true;
 }
 
--- trunk/koffice/libs/kotext/opendocument/TODO #810400:810401
@@ -10,8 +10,9 @@
     each time and assume that we only need to append content anyway?
 
 - bring back header+footers :)
-    ==> loading works and saving is work under progress
-    ==> support also page-styles with different headers/footers
+    ==> loading and saving works
+    ==> TODO atm we name the master-page A1 rather then "Standard" what needs to be \
fixed +    ==> TODO support also page-styles with different headers/footers
 
 - What about parent-styles aka style-inheritance? Does this REALLY work already?
 


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

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