[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