diff options
Diffstat (limited to 'kword/KWOasisSaver.cpp')
-rw-r--r-- | kword/KWOasisSaver.cpp | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/kword/KWOasisSaver.cpp b/kword/KWOasisSaver.cpp new file mode 100644 index 00000000..b4f3fd54 --- /dev/null +++ b/kword/KWOasisSaver.cpp @@ -0,0 +1,158 @@ +/* This file is part of the KDE project + Copyright (C) 2005 David Faure <faure@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 version 2 as published by the Free Software Foundation. + + 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 "KWOasisSaver.h" +#include <KoStore.h> +#include <KoOasisStore.h> +#include <KoOasisContext.h> +#include <KoXmlWriter.h> +#include "KWDocument.h" + +KWOasisSaver::KWOasisSaver( KWDocument* doc ) + : m_doc( doc ) +{ + const QCString mimeType = selectionMimeType(); + m_store = KoStore::createStore( &m_buffer, KoStore::Write, mimeType ); + Q_ASSERT( m_store ); + Q_ASSERT( !m_store->bad() ); + + m_oasisStore = new KoOasisStore( m_store ); + + //KoXmlWriter* manifestWriter = oasisStore.manifestWriter( mimeType ); + + m_savingContext = new KoSavingContext( m_mainStyles, 0, false, KoSavingContext::Store ); + + KoXmlWriter* bodyWriter = m_oasisStore->bodyWriter(); + bodyWriter->startElement( "office:body" ); + bodyWriter->startElement( "office:text" ); +} + +void KWOasisSaver::saveParagraphs( const QValueList<const KoTextParag *>& paragraphs ) +{ + for ( QValueList<const KoTextParag *>::const_iterator it = paragraphs.begin(), + end = paragraphs.end(); + it != end ; ++it ) { + saveParagraph( *it ); + } +} + +void KWOasisSaver::saveParagraph( const KoTextParag* parag ) +{ + // keep in sync with KoTextDocument::copySelection + KoXmlWriter* bodyWriter = m_oasisStore->bodyWriter(); + parag->saveOasis( *bodyWriter, *m_savingContext, 0, parag->length()-2, true ); +} + +QByteArray KWOasisSaver::data() const +{ + Q_ASSERT( !m_store ); // forgot to call finish() (or to check its return value) ? + return m_buffer.buffer(); +} + +KWOasisSaver::~KWOasisSaver() +{ + delete m_store; + delete m_oasisStore; + delete m_savingContext; +} + +bool KWOasisSaver::finish() +{ + KoXmlWriter* bodyWriter = m_oasisStore->bodyWriter(); + bodyWriter->endElement(); // office:text + bodyWriter->endElement(); // office:body + + KoXmlWriter* contentWriter = m_oasisStore->contentWriter(); + Q_ASSERT( contentWriter ); + + m_savingContext->writeFontFaces( *contentWriter ); + contentWriter->startElement( "office:automatic-styles" ); + writeAutomaticStyles( *contentWriter, m_mainStyles, false ); + contentWriter->endElement(); // office:automatic-styles + + m_oasisStore->closeContentWriter(); + + if ( !m_store->open( "styles.xml" ) ) + return false; + //manifestWriter->addManifestEntry( "styles.xml", "text/xml" ); + m_doc->saveOasisDocumentStyles( m_store, m_mainStyles, *m_savingContext, + KWDocument::SaveSelected /* simply means not SaveAll */, + QByteArray() /* no headers/footers */ ); + if ( !m_store->close() ) // done with styles.xml + return false; + + delete m_oasisStore; m_oasisStore = 0; + delete m_store; m_store = 0; + + return true; +} + +void KWOasisSaver::writeAutomaticStyles( KoXmlWriter& contentWriter, KoGenStyles& mainStyles, bool stylesDotXml ) +{ + QValueList<KoGenStyles::NamedStyle> styles = mainStyles.styles( KoGenStyle::STYLE_AUTO, stylesDotXml ); + QValueList<KoGenStyles::NamedStyle>::const_iterator it = styles.begin(); + for ( ; it != styles.end() ; ++it ) { + (*it).style->writeStyle( &contentWriter, mainStyles, "style:style", (*it).name, "style:paragraph-properties" ); + } + + styles = mainStyles.styles( KoGenStyle::STYLE_AUTO_LIST, stylesDotXml ); + it = styles.begin(); + for ( ; it != styles.end() ; ++it ) { + (*it).style->writeStyle( &contentWriter, mainStyles, "text:list-style", (*it).name, 0 ); + } + + styles = mainStyles.styles( KWDocument::STYLE_FRAME_AUTO, stylesDotXml ); + it = styles.begin(); + for ( ; it != styles.end() ; ++it ) { + (*it).style->writeStyle( &contentWriter, mainStyles, "style:style", (*it).name , "style:graphic-properties" ); + } + + styles = mainStyles.styles( KWDocument::STYLE_TABLE, stylesDotXml ); + it = styles.begin(); + for ( ; it != styles.end() ; ++it ) { + (*it).style->writeStyle( &contentWriter, mainStyles, "style:style", (*it).name , "style:table-properties" ); + } + + styles = mainStyles.styles( KWDocument::STYLE_TABLE_COLUMN, stylesDotXml ); + it = styles.begin(); + for ( ; it != styles.end() ; ++it ) { + (*it).style->writeStyle( &contentWriter, mainStyles, "style:style", (*it).name , "style:table-column-properties" ); + } + + styles = mainStyles.styles( KWDocument::STYLE_TABLE_CELL_AUTO, stylesDotXml ); + it = styles.begin(); + for ( ; it != styles.end() ; ++it ) { + (*it).style->writeStyle( &contentWriter, mainStyles, "style:style", (*it).name , "style:table-cell-properties" ); + } + + styles = mainStyles.styles( KoGenStyle::STYLE_NUMERIC_DATE, stylesDotXml ); + it = styles.begin(); + for ( ; it != styles.end() ; ++it ) { + (*it).style->writeStyle( &contentWriter, mainStyles, "number:date-style", (*it).name, 0 /*TODO ????*/ ); + } + styles = mainStyles.styles( KoGenStyle::STYLE_NUMERIC_TIME, stylesDotXml ); + it = styles.begin(); + for ( ; it != styles.end() ; ++it ) { + (*it).style->writeStyle( &contentWriter, mainStyles, "number:time-style", (*it).name, 0 /*TODO ????*/ ); + } +} + +const char* KWOasisSaver::selectionMimeType() +{ + return "application/vnd.oasis.opendocument.text"; +} |