[Libreoffice-commits] .: Branch 'libreoffice-3-3' - writerperfect/prj writerperfect/source writerperfect/util
Fridrich Strba
fridrich at kemper.freedesktop.org
Tue Nov 16 04:54:50 PST 2010
writerperfect/prj/build.lst | 2
writerperfect/source/filter/DocumentCollector.cxx | 798 +++++++++++----
writerperfect/source/filter/DocumentCollector.hxx | 90 +
writerperfect/source/filter/DocumentElement.cxx | 11
writerperfect/source/filter/DocumentElement.hxx | 24
writerperfect/source/filter/DocumentHandler.cxx | 25
writerperfect/source/filter/DocumentHandler.hxx | 4
writerperfect/source/filter/DocumentHandlerInterface.hxx | 45
writerperfect/source/filter/FilterInternal.hxx | 8
writerperfect/source/filter/FontStyle.cxx | 12
writerperfect/source/filter/FontStyle.hxx | 9
writerperfect/source/filter/GraphicsStyle.cxx | 40
writerperfect/source/filter/GraphicsStyle.hxx | 40
writerperfect/source/filter/InternalHandler.cxx | 54 +
writerperfect/source/filter/InternalHandler.hxx | 46
writerperfect/source/filter/ListStyle.cxx | 89 +
writerperfect/source/filter/ListStyle.hxx | 15
writerperfect/source/filter/OdgExporter.cxx | 648 ++++++++++++
writerperfect/source/filter/OdgExporter.hxx | 90 +
writerperfect/source/filter/PageSpan.cxx | 163 ++-
writerperfect/source/filter/PageSpan.hxx | 25
writerperfect/source/filter/SectionStyle.cxx | 8
writerperfect/source/filter/SectionStyle.hxx | 8
writerperfect/source/filter/Style.hxx | 8
writerperfect/source/filter/TableStyle.cxx | 37
writerperfect/source/filter/TableStyle.hxx | 12
writerperfect/source/filter/TextRunStyle.cxx | 85 -
writerperfect/source/filter/TextRunStyle.hxx | 11
writerperfect/source/filter/WriterProperties.hxx | 1
writerperfect/source/filter/makefile.mk | 13
writerperfect/source/stream/WPXSvStream.cxx | 11
writerperfect/source/stream/WPXSvStream.h | 8
writerperfect/source/wpdimp/WordPerfectCollector.cxx | 13
writerperfect/source/wpdimp/WordPerfectCollector.hxx | 8
writerperfect/source/wpdimp/WordPerfectImportFilter.cxx | 172 ++-
writerperfect/source/wpdimp/WordPerfectImportFilter.hxx | 60 +
writerperfect/source/wpdimp/makefile.mk | 4
writerperfect/source/wpdimp/wpft_genericfilter.cxx | 23
writerperfect/source/wpgimp/WPGImportFilter.cxx | 22
writerperfect/source/wpgimp/makefile.mk | 7
writerperfect/source/wpsimp/MSWorksCollector.cxx | 6
writerperfect/source/wpsimp/MSWorksCollector.hxx | 5
writerperfect/source/wpsimp/MSWorksImportFilter.cxx | 4
writerperfect/util/makefile.mk | 8
44 files changed, 2250 insertions(+), 522 deletions(-)
New commits:
commit 3c31fb6f22c654e31839ed2dd23e4b2687059610
Author: Fridrich Å trba <fridrich.strba at bluewin.ch>
Date: Tue Nov 16 13:53:39 2010 +0100
Use the new stable libwp* releases as default
diff --git a/writerperfect/prj/build.lst b/writerperfect/prj/build.lst
index bf7a656..87b258a 100644
--- a/writerperfect/prj/build.lst
+++ b/writerperfect/prj/build.lst
@@ -1,4 +1,4 @@
-wp writerperfect : LIBWPG:libwpg LIBWPS:libwps LIBWPD:libwpd sot comphelper xmloff svtools NULL
+wp writerperfect : LIBWPG:libwpg LIBWPS:libwps LIBWPD:libwpd sot comphelper xmloff svtools sfx2 NULL
wp writerperfect usr1 - all wp_mkout NULL
wp writerperfect\source\stream nmake - all wp_stream NULL
wp writerperfect\source\filter nmake - all wp_filter NULL
diff --git a/writerperfect/source/filter/DocumentCollector.cxx b/writerperfect/source/filter/DocumentCollector.cxx
index 879e1d0..5db1900 100644
--- a/writerperfect/source/filter/DocumentCollector.cxx
+++ b/writerperfect/source/filter/DocumentCollector.cxx
@@ -40,6 +40,8 @@
#include "DocumentCollector.hxx"
#include "DocumentElement.hxx"
+#include "DocumentHandler.hxx"
+#include "InternalHandler.hxx"
#include "TextRunStyle.hxx"
#include "FontStyle.hxx"
#include "ListStyle.hxx"
@@ -48,34 +50,49 @@
#include "TableStyle.hxx"
#include "FilterInternal.hxx"
#include "WriterProperties.hxx"
+#include "OdgExporter.hxx"
_WriterDocumentState::_WriterDocumentState() :
mbFirstElement(true),
+ mbFirstParagraphInPageSpan(true),
mbInFakeSection(false),
mbListElementOpenedAtCurrentLevel(false),
mbTableCellOpened(false),
mbHeaderRow(false),
- mbInNote(false)
+ mbInNote(false),
+ mbInTextBox(false),
+ mbInFrame(false)
{
}
-DocumentCollector::DocumentCollector(WPSInputStream *pInput, DocumentHandler *pHandler) :
+_WriterListState::_WriterListState() :
+ mpCurrentListStyle(NULL),
+ miCurrentListLevel(0),
+ miLastListLevel(0),
+ miLastListNumber(0),
+ mbListContinueNumbering(false),
+ mbListElementParagraphOpened(false),
+ mbListElementOpened()
+{
+}
+
+DocumentCollector::DocumentCollector(WPXInputStream *pInput, DocumentHandlerInterface *pHandler) :
mpInput(pInput),
mpHandler(pHandler),
mbUsed(false),
+ mWriterDocumentStates(),
+ mWriterListStates(),
mfSectionSpaceAfter(0.0f),
miNumListStyles(0),
mpCurrentContentElements(&mBodyElements),
mpCurrentPageSpan(NULL),
miNumPageStyles(0),
- mpCurrentListStyle(NULL),
- miCurrentListLevel(0),
- miLastListLevel(0),
- miLastListNumber(0),
- mbListContinueNumbering(false),
- mbListElementOpened(false),
- mbListElementParagraphOpened(false)
+ miObjectNumber(0),
+ mbIsFlatXML(true),
+ mpPassword(NULL)
{
+ mWriterDocumentStates.push(WriterDocumentState());
+ mWriterListStates.push(WriterListState());
}
DocumentCollector::~DocumentCollector()
@@ -103,7 +120,7 @@ bool DocumentCollector::filter()
WRITER_DEBUG_MSG(("Destroying the body elements\n"));
for (std::vector<DocumentElement *>::iterator iterBody = mBodyElements.begin(); iterBody != mBodyElements.end(); iterBody++) {
- delete((*iterBody));
+ delete (*iterBody);
(*iterBody) = NULL;
}
@@ -116,14 +133,14 @@ bool DocumentCollector::filter()
WRITER_DEBUG_MSG(("Destroying the rest of the styles elements\n"));
for (std::map<WPXString, ParagraphStyle *, ltstr>::iterator iterTextStyle = mTextStyleHash.begin(); iterTextStyle != mTextStyleHash.end(); iterTextStyle++) {
- delete iterTextStyle->second;
+ delete (iterTextStyle->second);
}
for (std::map<WPXString, SpanStyle *, ltstr>::iterator iterSpanStyle = mSpanStyleHash.begin(); iterSpanStyle != mSpanStyleHash.end(); iterSpanStyle++) {
- delete iterSpanStyle->second;
+ delete(iterSpanStyle->second);
}
for (std::map<WPXString, FontStyle *, ltstr>::iterator iterFont = mFontHash.begin(); iterFont != mFontHash.end(); iterFont++) {
- delete iterFont->second;
+ delete(iterFont->second);
}
for (std::vector<ListStyle *>::iterator iterListStyles = mListStyles.begin(); iterListStyles != mListStyles.end(); iterListStyles++) {
@@ -133,80 +150,101 @@ bool DocumentCollector::filter()
delete (*iterSectionStyles);
}
for (std::vector<TableStyle *>::iterator iterTableStyles = mTableStyles.begin(); iterTableStyles != mTableStyles.end(); iterTableStyles++) {
- delete (*iterTableStyles);
+ delete((*iterTableStyles));
}
for (std::vector<PageSpan *>::iterator iterPageSpans = mPageSpans.begin(); iterPageSpans != mPageSpans.end(); iterPageSpans++) {
delete (*iterPageSpans);
}
+ for (std::vector<DocumentElement *>::iterator iterFrameStyles = mFrameStyles.begin(); iterFrameStyles != mFrameStyles.end(); iterFrameStyles++) {
+ delete(*iterFrameStyles);
+ }
+ for (std::vector<DocumentElement *>::iterator iterFrameAutomaticStyles = mFrameAutomaticStyles.begin();
+ iterFrameAutomaticStyles != mFrameAutomaticStyles.end(); iterFrameAutomaticStyles++) {
+ delete(*iterFrameAutomaticStyles);
+ }
+ for (std::vector<DocumentElement *>::iterator iterMetaData = mMetaData.begin(); iterMetaData != mMetaData.end(); iterMetaData++) {
+ delete(*iterMetaData);
+ }
return true;
}
-void DocumentCollector::_writeDefaultStyles(DocumentHandler *pHandler)
+void DocumentCollector::_writeDefaultStyles(DocumentHandlerInterface *pHandler)
{
- TagOpenElement stylesOpenElement("office:styles");
- stylesOpenElement.write(pHandler);
+ TagOpenElement("office:styles").write(pHandler);
TagOpenElement defaultParagraphStyleOpenElement("style:default-style");
defaultParagraphStyleOpenElement.addAttribute("style:family", "paragraph");
defaultParagraphStyleOpenElement.write(pHandler);
- TagOpenElement defaultParagraphStylePropertiesOpenElement("style:properties");
- defaultParagraphStylePropertiesOpenElement.addAttribute("style:family", "paragraph");
- defaultParagraphStylePropertiesOpenElement.addAttribute("style:tab-stop-distance", "0.5inch");
+ TagOpenElement defaultParagraphStylePropertiesOpenElement("style:paragraph-properties");
+ defaultParagraphStylePropertiesOpenElement.addAttribute("style:tab-stop-distance", "0.5in");
defaultParagraphStylePropertiesOpenElement.write(pHandler);
- TagCloseElement defaultParagraphStylePropertiesCloseElement("style:properties");
+ TagCloseElement defaultParagraphStylePropertiesCloseElement("style:paragraph-properties");
defaultParagraphStylePropertiesCloseElement.write(pHandler);
- TagCloseElement defaultParagraphStyleCloseElement("style:default-style");
- defaultParagraphStyleCloseElement.write(pHandler);
+ pHandler->endElement("style:default-style");
+
+ TagOpenElement defaultTableRowStyleOpenElement("style:default-style");
+ defaultTableRowStyleOpenElement.addAttribute("style:family", "table-row");
+ defaultTableRowStyleOpenElement.write(pHandler);
+
+ TagOpenElement defaultTableRowPropertiesOpenElement("style:table-row-properties");
+ defaultTableRowPropertiesOpenElement.addAttribute("fo:keep-together", "auto");
+ defaultTableRowPropertiesOpenElement.write(pHandler);
+
+ pHandler->endElement("style:table-row-properties");
+ pHandler->endElement("style:default-style");
TagOpenElement standardStyleOpenElement("style:style");
standardStyleOpenElement.addAttribute("style:name", "Standard");
standardStyleOpenElement.addAttribute("style:family", "paragraph");
standardStyleOpenElement.addAttribute("style:class", "text");
standardStyleOpenElement.write(pHandler);
- TagCloseElement standardStyleCloseElement("style:style");
- standardStyleCloseElement.write(pHandler);
+
+ pHandler->endElement("style:style");
TagOpenElement textBodyStyleOpenElement("style:style");
- textBodyStyleOpenElement.addAttribute("style:name", "Text Body");
+ textBodyStyleOpenElement.addAttribute("style:name", "Text_Body");
+ textBodyStyleOpenElement.addAttribute("style:display-name", "Text Body");
textBodyStyleOpenElement.addAttribute("style:family", "paragraph");
textBodyStyleOpenElement.addAttribute("style:parent-style-name", "Standard");
textBodyStyleOpenElement.addAttribute("style:class", "text");
textBodyStyleOpenElement.write(pHandler);
- TagCloseElement textBodyStyleCloseElement("style:style");
- textBodyStyleCloseElement.write(pHandler);
+
+ pHandler->endElement("style:style");
TagOpenElement tableContentsStyleOpenElement("style:style");
- tableContentsStyleOpenElement.addAttribute("style:name", "Table Contents");
+ tableContentsStyleOpenElement.addAttribute("style:name", "Table_Contents");
+ tableContentsStyleOpenElement.addAttribute("style:display-name", "Table Contents");
tableContentsStyleOpenElement.addAttribute("style:family", "paragraph");
- tableContentsStyleOpenElement.addAttribute("style:parent-style-name", "Text Body");
+ tableContentsStyleOpenElement.addAttribute("style:parent-style-name", "Text_Body");
tableContentsStyleOpenElement.addAttribute("style:class", "extra");
tableContentsStyleOpenElement.write(pHandler);
- TagCloseElement tableContentsStyleCloseElement("style:style");
- tableContentsStyleCloseElement.write(pHandler);
+
+ pHandler->endElement("style:style");
TagOpenElement tableHeadingStyleOpenElement("style:style");
- tableHeadingStyleOpenElement.addAttribute("style:name", "Table Heading");
+ tableHeadingStyleOpenElement.addAttribute("style:name", "Table_Heading");
+ tableHeadingStyleOpenElement.addAttribute("style:display-name", "Table Heading");
tableHeadingStyleOpenElement.addAttribute("style:family", "paragraph");
- tableHeadingStyleOpenElement.addAttribute("style:parent-style-name", "Table Contents");
+ tableHeadingStyleOpenElement.addAttribute("style:parent-style-name", "Table_Contents");
tableHeadingStyleOpenElement.addAttribute("style:class", "extra");
tableHeadingStyleOpenElement.write(pHandler);
- TagCloseElement tableHeadingStyleCloseElement("style:style");
- tableHeadingStyleCloseElement.write(pHandler);
- TagCloseElement stylesCloseElement("office:styles");
- stylesCloseElement.write(pHandler);
+ pHandler->endElement("style:style");
+
+ for (std::vector<DocumentElement *>::const_iterator iter = mFrameStyles.begin();
+ iter != mFrameStyles.end(); iter++)
+ (*iter)->write(pHandler);
+ pHandler->endElement("office:styles");
}
-void DocumentCollector::_writeMasterPages(DocumentHandler *pHandler)
+void DocumentCollector::_writeMasterPages(DocumentHandlerInterface *pHandler)
{
- WPXPropertyList xBlankAttrList;
-
- pHandler->startElement("office:master-styles", xBlankAttrList);
+ TagOpenElement("office:master-styles").write(mpHandler);
int pageNumber = 1;
for (unsigned int i=0; i<mPageSpans.size(); i++)
{
@@ -218,65 +256,79 @@ void DocumentCollector::_writeMasterPages(DocumentHandler *pHandler)
pHandler->endElement("office:master-styles");
}
-void DocumentCollector::_writePageMasters(DocumentHandler *pHandler)
+void DocumentCollector::_writePageLayouts(DocumentHandlerInterface *pHandler)
{
for (unsigned int i=0; i<mPageSpans.size(); i++)
{
- mPageSpans[i]->writePageMaster(i, pHandler);
+ mPageSpans[i]->writePageLayout(i, pHandler);
}
}
-bool DocumentCollector::_writeTargetDocument(DocumentHandler *pHandler)
+bool DocumentCollector::_writeTargetDocument(DocumentHandlerInterface *pHandler)
{
WRITER_DEBUG_MSG(("WriterWordPerfect: Document Body: Printing out the header stuff..\n"));
- WPXPropertyList xBlankAttrList;
WRITER_DEBUG_MSG(("WriterWordPerfect: Document Body: Start Document\n"));
mpHandler->startDocument();
WRITER_DEBUG_MSG(("WriterWordPerfect: Document Body: preamble\n"));
WPXPropertyList docContentPropList;
- docContentPropList.insert("xmlns:office", "http://openoffice.org/2000/office");
- docContentPropList.insert("xmlns:style", "http://openoffice.org/2000/style");
- docContentPropList.insert("xmlns:text", "http://openoffice.org/2000/text");
- docContentPropList.insert("xmlns:table", "http://openoffice.org/2000/table");
- docContentPropList.insert("xmlns:draw", "http://openoffice.org/2000/draw");
- docContentPropList.insert("xmlns:fo", "http://www.w3.org/1999/XSL/Format");
+ docContentPropList.insert("xmlns:office", "urn:oasis:names:tc:opendocument:xmlns:office:1.0");
+ docContentPropList.insert("xmlns:meta", "urn:oasis:names:tc:opendocument:xmlns:meta:1.0");
+ docContentPropList.insert("xmlns:dc", "http://purl.org/dc/elements/1.1/");
+ docContentPropList.insert("xmlns:config", "urn:oasis:names:tc:opendocument:xmlns:config:1.0");
+ docContentPropList.insert("xmlns:text", "urn:oasis:names:tc:opendocument:xmlns:text:1.0");
+ docContentPropList.insert("xmlns:table", "urn:oasis:names:tc:opendocument:xmlns:table:1.0");
+ docContentPropList.insert("xmlns:draw", "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0");
+ docContentPropList.insert("xmlns:fo", "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0");
docContentPropList.insert("xmlns:xlink", "http://www.w3.org/1999/xlink");
docContentPropList.insert("xmlns:number", "http://openoffice.org/2000/datastyle");
- docContentPropList.insert("xmlns:svg", "http://www.w3.org/2000/svg");
- docContentPropList.insert("xmlns:chart", "http://openoffice.org/2000/chart");
- docContentPropList.insert("xmlns:dr3d", "http://openoffice.org/2000/dr3d");
+ docContentPropList.insert("xmlns:svg", "urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0");
+ docContentPropList.insert("xmlns:chart", "urn:oasis:names:tc:opendocument:xmlns:chart:1.0");
+ docContentPropList.insert("xmlns:dr3d", "urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0");
docContentPropList.insert("xmlns:math", "http://www.w3.org/1998/Math/MathML");
- docContentPropList.insert("xmlns:form", "http://openoffice.org/2000/form");
- docContentPropList.insert("xmlns:script", "http://openoffice.org/2000/script");
- docContentPropList.insert("office:class", "text");
+ docContentPropList.insert("xmlns:form", "urn:oasis:names:tc:opendocument:xmlns:form:1.0");
+ docContentPropList.insert("xmlns:script", "urn:oasis:names:tc:opendocument:xmlns:script:1.0");
+ docContentPropList.insert("xmlns:style", "urn:oasis:names:tc:opendocument:xmlns:style:1.0");
docContentPropList.insert("office:version", "1.0");
- mpHandler->startElement("office:document-content", docContentPropList);
+ docContentPropList.insert("office:mimetype", "application/vnd.oasis.opendocument.text");
+ mpHandler->startElement("office:document", docContentPropList);
+
+ // write out the metadata
+ TagOpenElement("office:meta").write(mpHandler);
+ for (std::vector<DocumentElement *>::const_iterator iterMetaData = mMetaData.begin(); iterMetaData != mMetaData.end(); iterMetaData++) {
+ (*iterMetaData)->write(mpHandler);
+ }
+ mpHandler->endElement("office:meta");
// write out the font styles
- mpHandler->startElement("office:font-decls", xBlankAttrList);
+ TagOpenElement("office:font-face-decls").write(mpHandler);
for (std::map<WPXString, FontStyle *, ltstr>::iterator iterFont = mFontHash.begin(); iterFont != mFontHash.end(); iterFont++) {
iterFont->second->write(mpHandler);
}
- TagOpenElement symbolFontOpen("style:font-decl");
+ TagOpenElement symbolFontOpen("style:font-face");
symbolFontOpen.addAttribute("style:name", "StarSymbol");
- symbolFontOpen.addAttribute("fo:font-family", "StarSymbol");
+ symbolFontOpen.addAttribute("svg:font-family", "StarSymbol");
symbolFontOpen.addAttribute("style:font-charset", "x-symbol");
symbolFontOpen.write(mpHandler);
- mpHandler->endElement("style:font-decl");
-
- mpHandler->endElement("office:font-decls");
+ mpHandler->endElement("style:font-face");
+ mpHandler->endElement("office:font-face-decls");
WRITER_DEBUG_MSG(("WriterWordPerfect: Document Body: Writing out the styles..\n"));
// write default styles
_writeDefaultStyles(mpHandler);
- mpHandler->startElement("office:automatic-styles", xBlankAttrList);
+ TagOpenElement("office:automatic-styles").write(mpHandler);
- for (std::map<WPXString, ParagraphStyle *, ltstr>::iterator iterTextStyle = mTextStyleHash.begin();
+ for (std::vector<DocumentElement *>::const_iterator iterFrameAutomaticStyles = mFrameAutomaticStyles.begin();
+ iterFrameAutomaticStyles != mFrameAutomaticStyles.end(); iterFrameAutomaticStyles++)
+ {
+ (*iterFrameAutomaticStyles)->write(pHandler);
+ }
+
+ for (std::map<WPXString, ParagraphStyle *, ltstr>::const_iterator iterTextStyle = mTextStyleHash.begin();
iterTextStyle != mTextStyleHash.end(); iterTextStyle++)
{
// writing out the paragraph styles
@@ -288,29 +340,29 @@ bool DocumentCollector::_writeTargetDocument(DocumentHandler *pHandler)
}
// span styles..
- for (std::map<WPXString, SpanStyle *, ltstr>::iterator iterSpanStyle = mSpanStyleHash.begin();
+ for (std::map<WPXString, SpanStyle *, ltstr>::const_iterator iterSpanStyle = mSpanStyleHash.begin();
iterSpanStyle != mSpanStyleHash.end(); iterSpanStyle++)
{
(iterSpanStyle->second)->write(pHandler);
}
// writing out the sections styles
- for (std::vector<SectionStyle *>::iterator iterSectionStyles = mSectionStyles.begin(); iterSectionStyles != mSectionStyles.end(); iterSectionStyles++) {
+ for (std::vector<SectionStyle *>::const_iterator iterSectionStyles = mSectionStyles.begin(); iterSectionStyles != mSectionStyles.end(); iterSectionStyles++) {
(*iterSectionStyles)->write(pHandler);
}
// writing out the lists styles
- for (std::vector<ListStyle *>::iterator iterListStyles = mListStyles.begin(); iterListStyles != mListStyles.end(); iterListStyles++) {
+ for (std::vector<ListStyle *>::const_iterator iterListStyles = mListStyles.begin(); iterListStyles != mListStyles.end(); iterListStyles++) {
(*iterListStyles)->write(pHandler);
}
// writing out the table styles
- for (std::vector<TableStyle *>::iterator iterTableStyles = mTableStyles.begin(); iterTableStyles != mTableStyles.end(); iterTableStyles++) {
+ for (std::vector<TableStyle *>::const_iterator iterTableStyles = mTableStyles.begin(); iterTableStyles != mTableStyles.end(); iterTableStyles++) {
(*iterTableStyles)->write(pHandler);
}
// writing out the page masters
- _writePageMasters(pHandler);
+ _writePageLayouts(pHandler);
pHandler->endElement("office:automatic-styles");
@@ -319,15 +371,17 @@ bool DocumentCollector::_writeTargetDocument(DocumentHandler *pHandler)
WRITER_DEBUG_MSG(("WriterWordPerfect: Document Body: Writing out the document..\n"));
// writing out the document
- pHandler->startElement("office:body", xBlankAttrList);
+ TagOpenElement("office:body").write(mpHandler);
+ TagOpenElement("office:text").write(mpHandler);
- for (std::vector<DocumentElement *>::iterator iterBodyElements = mBodyElements.begin(); iterBodyElements != mBodyElements.end(); iterBodyElements++) {
+ for (std::vector<DocumentElement *>::const_iterator iterBodyElements = mBodyElements.begin(); iterBodyElements != mBodyElements.end(); iterBodyElements++) {
(*iterBodyElements)->write(pHandler);
}
WRITER_DEBUG_MSG(("WriterWordPerfect: Document Body: Finished writing all doc els..\n"));
+ pHandler->endElement("office:text");
pHandler->endElement("office:body");
- pHandler->endElement("office:document-content");
+ pHandler->endElement("office:document");
pHandler->endDocument();
@@ -375,11 +429,31 @@ void DocumentCollector::_allocateFontName(const WPXString & sFontName)
}
}
+void DocumentCollector::setDocumentMetaData(const WPXPropertyList &propList)
+{
+ WPXPropertyList::Iter i(propList);
+ for (i.rewind(); i.next(); )
+ {
+ // filter out libwpd elements
+ if (strncmp(i.key(), "libwpd", 6) != 0 && strncmp(i.key(), "dcterms", 7) != 0)
+ {
+ mMetaData.push_back(new TagOpenElement(i.key()));
+ WPXString sStringValue(i()->getStr(), true);
+ mMetaData.push_back(new CharDataElement(sStringValue.cstr()));
+ mMetaData.push_back(new TagCloseElement(i.key()));
+ }
+ }
+
+}
+
void DocumentCollector::openPageSpan(const WPXPropertyList &propList)
{
PageSpan *pPageSpan = new PageSpan(propList);
mPageSpans.push_back(pPageSpan);
mpCurrentPageSpan = pPageSpan;
+ miNumPageStyles++;
+
+ mWriterDocumentStates.top().mbFirstParagraphInPageSpan = true;
}
void DocumentCollector::openHeader(const WPXPropertyList &propList)
@@ -419,16 +493,20 @@ void DocumentCollector::closeFooter()
void DocumentCollector::openSection(const WPXPropertyList &propList, const WPXPropertyListVector &columns)
{
int iNumColumns = columns.count();
- float fSectionMarginLeft = 0.0f;
- float fSectionMarginRight = 0.0f;
+ double fSectionMarginLeft = 0.0;
+ double fSectionMarginRight = 0.0;
if (propList["fo:margin-left"])
- fSectionMarginLeft = propList["fo:margin-left"]->getFloat();
+ fSectionMarginLeft = propList["fo:margin-left"]->getDouble();
if (propList["fo:margin-right"])
- fSectionMarginRight = propList["fo:margin-right"]->getFloat();
+ fSectionMarginRight = propList["fo:margin-right"]->getDouble();
if (iNumColumns > 1 || fSectionMarginLeft != 0 || fSectionMarginRight != 0)
{
- mfSectionSpaceAfter = propList["fo:margin-bottom"]->getFloat();
+ if (propList["fo:margin-bottom"])
+ mfSectionSpaceAfter = propList["fo:margin-bottom"]->getDouble();
+ else if (propList["libwpd:margin-bottom"])
+ mfSectionSpaceAfter = propList["libwpd:margin-bottom"]->getDouble();
+
WPXString sSectionName;
sSectionName.sprintf("Section%i", mSectionStyles.size());
@@ -438,29 +516,20 @@ void DocumentCollector::openSection(const WPXPropertyList &propList, const WPXPr
TagOpenElement *pSectionOpenElement = new TagOpenElement("text:section");
pSectionOpenElement->addAttribute("text:style-name", pSectionStyle->getName());
pSectionOpenElement->addAttribute("text:name", pSectionStyle->getName());
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(pSectionOpenElement));
+ mpCurrentContentElements->push_back(pSectionOpenElement);
}
else
- mWriterDocumentState.mbInFakeSection = true;
+ mWriterDocumentStates.top().mbInFakeSection = true;
}
void DocumentCollector::closeSection()
{
- if (!mWriterDocumentState.mbInFakeSection)
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(new TagCloseElement("text:section")));
+ if (!mWriterDocumentStates.top().mbInFakeSection)
+ mpCurrentContentElements->push_back(new TagCloseElement("text:section"));
else
- mWriterDocumentState.mbInFakeSection = false;
+ mWriterDocumentStates.top().mbInFakeSection = false;
- // open as many paragraphs as needed to simulate section space after
- // WLACH_REFACTORING: disable this for now..
- #if 0
- for (float f=0.0f; f<mfSectionSpaceAfter; f+=1.0f) {
- vector<WPXTabStop> dummyTabStops;
- openParagraph(WPX_PARAGRAPH_JUSTIFICATION_LEFT, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, dummyTabStops, false, false);
- closeParagraph();
- }
- #endif
- mfSectionSpaceAfter = 0.0f;
+ mfSectionSpaceAfter = 0.0;
}
void DocumentCollector::openParagraph(const WPXPropertyList &propList, const WPXPropertyListVector &tabStops)
@@ -471,7 +540,7 @@ void DocumentCollector::openParagraph(const WPXPropertyList &propList, const WPX
WPXPropertyList *pPersistPropList = new WPXPropertyList(propList);
ParagraphStyle *pStyle = NULL;
- if (mWriterDocumentState.mbFirstElement && mpCurrentContentElements == &mBodyElements)
+ if (mWriterDocumentStates.top().mbFirstElement && mpCurrentContentElements == &mBodyElements)
{
// we don't have to go through the fuss of determining if the paragraph style is
// unique in this case, because if we are the first document element, then we
@@ -483,26 +552,36 @@ void DocumentCollector::openParagraph(const WPXPropertyList &propList, const WPX
sName.sprintf("FS");
WPXString sParagraphHashKey("P|FS");
- pPersistPropList->insert("style:master-page-name", "Page Style 1");
+ pPersistPropList->insert("style:master-page-name", "Page_Style_1");
pStyle = new ParagraphStyle(pPersistPropList, tabStops, sName);
mTextStyleHash[sParagraphHashKey] = pStyle;
- mWriterDocumentState.mbFirstElement = false;
+ mWriterDocumentStates.top().mbFirstElement = false;
+ mWriterDocumentStates.top().mbFirstParagraphInPageSpan = false;
}
else
{
- if (mWriterDocumentState.mbTableCellOpened)
+ if (mWriterDocumentStates.top().mbFirstParagraphInPageSpan && mpCurrentContentElements == &mBodyElements)
{
- if (mWriterDocumentState.mbHeaderRow)
- pPersistPropList->insert("style:parent-style-name", "Table Heading");
+ WPXString sPageStyleName;
+ sPageStyleName.sprintf("Page_Style_%i", miNumPageStyles);
+ pPersistPropList->insert("style:master-page-name", sPageStyleName);
+ mWriterDocumentStates.top().mbFirstParagraphInPageSpan = false;
+ }
+
+ if (mWriterDocumentStates.top().mbTableCellOpened)
+ {
+ if (mWriterDocumentStates.top().mbHeaderRow)
+ pPersistPropList->insert("style:parent-style-name", "Table_Heading");
else
- pPersistPropList->insert("style:parent-style-name", "Table Contents");
+ pPersistPropList->insert("style:parent-style-name", "Table_Contents");
}
else
pPersistPropList->insert("style:parent-style-name", "Standard");
WPXString sKey = getParagraphStyleKey(*pPersistPropList, tabStops);
- if (mTextStyleHash.find(sKey) == mTextStyleHash.end()) {
+ if (mTextStyleHash.find(sKey) == mTextStyleHash.end())
+ {
WPXString sName;
sName.sprintf("S%i", mTextStyleHash.size());
@@ -519,12 +598,12 @@ void DocumentCollector::openParagraph(const WPXPropertyList &propList, const WPX
// create a document element corresponding to the paragraph, and append it to our list of document elements
TagOpenElement *pParagraphOpenElement = new TagOpenElement("text:p");
pParagraphOpenElement->addAttribute("text:style-name", pStyle->getName());
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(pParagraphOpenElement));
+ mpCurrentContentElements->push_back(pParagraphOpenElement);
}
void DocumentCollector::closeParagraph()
{
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(new TagCloseElement("text:p")));
+ mpCurrentContentElements->push_back(new TagCloseElement("text:p"));
}
void DocumentCollector::openSpan(const WPXPropertyList &propList)
@@ -552,12 +631,12 @@ void DocumentCollector::openSpan(const WPXPropertyList &propList)
// create a document element corresponding to the paragraph, and append it to our list of document elements
TagOpenElement *pSpanOpenElement = new TagOpenElement("text:span");
pSpanOpenElement->addAttribute("text:style-name", sName.cstr());
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(pSpanOpenElement));
+ mpCurrentContentElements->push_back(pSpanOpenElement);
}
void DocumentCollector::closeSpan()
{
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(new TagCloseElement("text:span")));
+ mpCurrentContentElements->push_back(new TagCloseElement("text:span"));
}
void DocumentCollector::defineOrderedListLevel(const WPXPropertyList &propList)
@@ -567,8 +646,8 @@ void DocumentCollector::defineOrderedListLevel(const WPXPropertyList &propList)
id = propList["libwpd:id"]->getInt();
OrderedListStyle *pOrderedListStyle = NULL;
- if (mpCurrentListStyle && mpCurrentListStyle->getListID() == id)
- pOrderedListStyle = static_cast<OrderedListStyle *>(mpCurrentListStyle); // FIXME: using a dynamic cast here causes oo to crash?!
+ if (mWriterListStates.top().mpCurrentListStyle && mWriterListStates.top().mpCurrentListStyle->getListID() == id)
+ pOrderedListStyle = static_cast<OrderedListStyle *>(mWriterListStates.top().mpCurrentListStyle); // FIXME: using a dynamic cast here causes oo to crash?!
// this rather appalling conditional makes sure we only start a new list (rather than continue an old
// one) if: (1) we have no prior list OR (2) the prior list is actually definitively different
@@ -576,27 +655,27 @@ void DocumentCollector::defineOrderedListLevel(const WPXPropertyList &propList)
// is starting a new list at level 1 (and only level 1)
if (pOrderedListStyle == NULL || pOrderedListStyle->getListID() != id ||
(propList["libwpd:level"] && propList["libwpd:level"]->getInt()==1 &&
- (propList["text:start-value"] && (unsigned int)(propList["text:start-value"]->getInt()) != (miLastListNumber+1))))
+ (propList["text:start-value"] && propList["text:start-value"]->getInt() != (mWriterListStates.top().miLastListNumber+1))))
{
WRITER_DEBUG_MSG(("Attempting to create a new ordered list style (listid: %i)\n", id));
WPXString sName;
sName.sprintf("OL%i", miNumListStyles);
miNumListStyles++;
- pOrderedListStyle = new OrderedListStyle(sName.cstr(), propList["libwpd:id"]->getInt());
- mListStyles.push_back(static_cast<ListStyle *>(pOrderedListStyle));
- mpCurrentListStyle = static_cast<ListStyle *>(pOrderedListStyle);
- mbListContinueNumbering = false;
- miLastListNumber = 0;
+ pOrderedListStyle = new OrderedListStyle(sName.cstr(), id);
+ mListStyles.push_back(pOrderedListStyle);
+ mWriterListStates.top().mpCurrentListStyle = pOrderedListStyle;
+ mWriterListStates.top().mbListContinueNumbering = false;
+ mWriterListStates.top().miLastListNumber = 0;
}
else
- mbListContinueNumbering = true;
+ mWriterListStates.top().mbListContinueNumbering = true;
// Iterate through ALL list styles with the same WordPerfect list id and define a level if it is not already defined
// This solves certain problems with lists that start and finish without reaching certain levels and then begin again
// and reach those levels. See gradguide0405_PC.wpd in the regression suite
for (std::vector<ListStyle *>::iterator iterOrderedListStyles = mListStyles.begin(); iterOrderedListStyles != mListStyles.end(); iterOrderedListStyles++)
{
- if ((* iterOrderedListStyles)->getListID() == propList["libwpd:id"]->getInt())
+ if ((* iterOrderedListStyles)->getListID() == id)
(* iterOrderedListStyles)->updateListLevel((propList["libwpd:level"]->getInt() - 1), propList);
}
}
@@ -608,106 +687,114 @@ void DocumentCollector::defineUnorderedListLevel(const WPXPropertyList &propList
id = propList["libwpd:id"]->getInt();
UnorderedListStyle *pUnorderedListStyle = NULL;
- if (mpCurrentListStyle && mpCurrentListStyle->getListID() == id)
- pUnorderedListStyle = static_cast<UnorderedListStyle *>(mpCurrentListStyle); // FIXME: using a dynamic cast here causes oo to crash?!
+ if (mWriterListStates.top().mpCurrentListStyle && mWriterListStates.top().mpCurrentListStyle->getListID() == id)
+ pUnorderedListStyle = static_cast<UnorderedListStyle *>(mWriterListStates.top().mpCurrentListStyle); // FIXME: using a dynamic cast here causes oo to crash?!
if (pUnorderedListStyle == NULL) {
WRITER_DEBUG_MSG(("Attempting to create a new unordered list style (listid: %i)\n", id));
WPXString sName;
sName.sprintf("UL%i", miNumListStyles);
+ miNumListStyles++;
pUnorderedListStyle = new UnorderedListStyle(sName.cstr(), id);
- mListStyles.push_back(static_cast<ListStyle *>(pUnorderedListStyle));
- mpCurrentListStyle = static_cast<ListStyle *>(pUnorderedListStyle);
+ mListStyles.push_back(pUnorderedListStyle);
+ mWriterListStates.top().mpCurrentListStyle = pUnorderedListStyle;
}
// See comment in DocumentCollector::defineOrderedListLevel
for (std::vector<ListStyle *>::iterator iterUnorderedListStyles = mListStyles.begin(); iterUnorderedListStyles != mListStyles.end(); iterUnorderedListStyles++)
{
- if ((* iterUnorderedListStyles)->getListID() == propList["libwpd:id"]->getInt())
+ if ((* iterUnorderedListStyles)->getListID() == id)
(* iterUnorderedListStyles)->updateListLevel((propList["libwpd:level"]->getInt() - 1), propList);
}
}
void DocumentCollector::openOrderedListLevel(const WPXPropertyList & /* propList */)
{
- miCurrentListLevel++;
- TagOpenElement *pListLevelOpenElement = new TagOpenElement("text:ordered-list");
+ if (mWriterListStates.top().mbListElementParagraphOpened)
+ {
+ mpCurrentContentElements->push_back(new TagCloseElement("text:p"));
+ mWriterListStates.top().mbListElementParagraphOpened = false;
+ }
+ TagOpenElement *pListLevelOpenElement = new TagOpenElement("text:list");
_openListLevel(pListLevelOpenElement);
- if (mbListContinueNumbering) {
+ if (mWriterListStates.top().mbListContinueNumbering) {
pListLevelOpenElement->addAttribute("text:continue-numbering", "true");
}
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(pListLevelOpenElement));
+ mpCurrentContentElements->push_back(pListLevelOpenElement);
}
void DocumentCollector::openUnorderedListLevel(const WPXPropertyList & /* propList */)
{
- miCurrentListLevel++;
- TagOpenElement *pListLevelOpenElement = new TagOpenElement("text:unordered-list");
+ if (mWriterListStates.top().mbListElementParagraphOpened)
+ {
+ mpCurrentContentElements->push_back(new TagCloseElement("text:p"));
+ mWriterListStates.top().mbListElementParagraphOpened = false;
+ }
+ TagOpenElement *pListLevelOpenElement = new TagOpenElement("text:list");
_openListLevel(pListLevelOpenElement);
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(pListLevelOpenElement));
+ mpCurrentContentElements->push_back(pListLevelOpenElement);
}
void DocumentCollector::_openListLevel(TagOpenElement *pListLevelOpenElement)
{
- if (!mbListElementOpened && miCurrentListLevel > 1)
- {
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(new TagOpenElement("text:list-item")));
- }
- else if (mbListElementParagraphOpened)
+ if (!mWriterListStates.top().mbListElementOpened.empty() &&
+ !mWriterListStates.top().mbListElementOpened.top())
{
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(new TagCloseElement("text:p")));
- mbListElementParagraphOpened = false;
+ mpCurrentContentElements->push_back(new TagOpenElement("text:list-item"));
+ mWriterListStates.top().mbListElementOpened.top() = true;
}
- if (miCurrentListLevel==1) {
- pListLevelOpenElement->addAttribute("text:style-name", mpCurrentListStyle->getName());
+ mWriterListStates.top().mbListElementOpened.push(false);
+ if (mWriterListStates.top().mbListElementOpened.size() == 1) {
+ pListLevelOpenElement->addAttribute("text:style-name", mWriterListStates.top().mpCurrentListStyle->getName());
}
-
- mbListElementOpened = false;
}
void DocumentCollector::closeOrderedListLevel()
{
- _closeListLevel("ordered-list");
+ _closeListLevel();
}
void DocumentCollector::closeUnorderedListLevel()
{
- _closeListLevel("unordered-list");
+ _closeListLevel();
}
-void DocumentCollector::_closeListLevel(const char *szListType)
+void DocumentCollector::_closeListLevel()
{
- if (mbListElementOpened)
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(new TagCloseElement("text:list-item")));
-
- miCurrentListLevel--;
+ if (mWriterListStates.top().mbListElementOpened.top())
+ {
+ mpCurrentContentElements->push_back(new TagCloseElement("text:list-item"));
+ mWriterListStates.top().mbListElementOpened.top() = false;
+ }
- WPXString sCloseElement;
- sCloseElement.sprintf("text:%s", szListType);
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(new TagCloseElement(sCloseElement.cstr())));
+ mpCurrentContentElements->push_back(new TagCloseElement("text:list"));
- if (miCurrentListLevel > 0)
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(new TagCloseElement("text:list-item")));
- mbListElementOpened = false;
+ if (!mWriterListStates.top().mbListElementOpened.empty())
+ {
+ mWriterListStates.top().mbListElementOpened.pop();
+ }
}
void DocumentCollector::openListElement(const WPXPropertyList &propList, const WPXPropertyListVector &tabStops)
{
- miLastListLevel = miCurrentListLevel;
- if (miCurrentListLevel == 1)
- miLastListNumber++;
+ mWriterListStates.top().miLastListLevel = mWriterListStates.top().miCurrentListLevel;
+ if (mWriterListStates.top().miCurrentListLevel == 1)
+ mWriterListStates.top().miLastListNumber++;
- if (mbListElementOpened)
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(new TagCloseElement("text:list-item")));
+ if (mWriterListStates.top().mbListElementOpened.top())
+ {
+ mpCurrentContentElements->push_back(new TagCloseElement("text:list-item"));
+ mWriterListStates.top().mbListElementOpened.top() = false;
+ }
ParagraphStyle *pStyle = NULL;
WPXPropertyList *pPersistPropList = new WPXPropertyList(propList);
- pPersistPropList->insert("style:list-style-name", mpCurrentListStyle->getName());
+ pPersistPropList->insert("style:list-style-name", mWriterListStates.top().mpCurrentListStyle->getName());
pPersistPropList->insert("style:parent-style-name", "Standard");
WPXString sKey = getParagraphStyleKey(*pPersistPropList, tabStops);
@@ -727,17 +814,18 @@ void DocumentCollector::openListElement(const WPXPropertyList &propList, const W
delete pPersistPropList;
}
- TagOpenElement *pOpenListElement = new TagOpenElement("text:list-item");
- TagOpenElement *pOpenListElementParagraph = new TagOpenElement("text:p");
+ mpCurrentContentElements->push_back(new TagOpenElement("text:list-item"));
+ TagOpenElement *pOpenListElementParagraph = new TagOpenElement("text:p");
pOpenListElementParagraph->addAttribute("text:style-name", pStyle->getName());
+ mpCurrentContentElements->push_back(pOpenListElementParagraph);
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(pOpenListElement));
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(pOpenListElementParagraph));
+ if (mpCurrentContentElements == &mBodyElements)
+ mWriterDocumentStates.top().mbFirstParagraphInPageSpan = false;
- mbListElementOpened = true;
- mbListElementParagraphOpened = true;
- mbListContinueNumbering = false;
+ mWriterListStates.top().mbListElementOpened.top() = true;
+ mWriterListStates.top().mbListElementParagraphOpened = true;
+ mWriterListStates.top().mbListContinueNumbering = false;
}
void DocumentCollector::closeListElement()
@@ -746,69 +834,100 @@ void DocumentCollector::closeListElement()
// could contain another list level in OOo's implementation of lists). that is done in the closeListLevel
// code (or when we open another list element)
- if (mbListElementParagraphOpened)
+ if (mWriterListStates.top().mbListElementParagraphOpened)
{
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(new TagCloseElement("text:p")));
- mbListElementParagraphOpened = false;
+ mpCurrentContentElements->push_back(new TagCloseElement("text:p"));
+ mWriterListStates.top().mbListElementParagraphOpened = false;
}
}
void DocumentCollector::openFootnote(const WPXPropertyList &propList)
{
- TagOpenElement *pOpenFootNote = new TagOpenElement("text:footnote");
+ mWriterListStates.push(WriterListState());
+ TagOpenElement *pOpenFootNote = new TagOpenElement("text:note");
+ pOpenFootNote->addAttribute("text:note-class", "footnote");
if (propList["libwpd:number"])
{
WPXString tmpString("ftn");
tmpString.append(propList["libwpd:number"]->getStr());
pOpenFootNote->addAttribute("text:id", tmpString);
}
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(pOpenFootNote));
+ mpCurrentContentElements->push_back(pOpenFootNote);
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(new TagOpenElement("text:footnote-citation")));
+ mpCurrentContentElements->push_back(new TagOpenElement("text:note-citation"));
if (propList["libwpd:number"])
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(new CharDataElement(propList["libwpd:number"]->getStr().cstr())));
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(new TagCloseElement("text:footnote-citation")));
+ mpCurrentContentElements->push_back(new CharDataElement(propList["libwpd:number"]->getStr().cstr()));
+ mpCurrentContentElements->push_back(new TagCloseElement("text:note-citation"));
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(new TagOpenElement("text:footnote-body")));
+ mpCurrentContentElements->push_back(new TagOpenElement("text:note-body"));
- mWriterDocumentState.mbInNote = true;
+ mWriterDocumentStates.top().mbInNote = true;
}
void DocumentCollector::closeFootnote()
{
- mWriterDocumentState.mbInNote = false;
+ mWriterDocumentStates.top().mbInNote = false;
+ if (mWriterListStates.size() > 1)
+ mWriterListStates.pop();
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(new TagCloseElement("text:footnote-body")));
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(new TagCloseElement("text:footnote")));
+ mpCurrentContentElements->push_back(new TagCloseElement("text:note-body"));
+ mpCurrentContentElements->push_back(new TagCloseElement("text:note"));
}
void DocumentCollector::openEndnote(const WPXPropertyList &propList)
{
- TagOpenElement *pOpenEndNote = new TagOpenElement("text:endnote");
+ mWriterListStates.push(WriterListState());
+ TagOpenElement *pOpenEndNote = new TagOpenElement("text:note");
+ pOpenEndNote->addAttribute("text:note-class", "endnote");
if (propList["libwpd:number"])
{
WPXString tmpString("edn");
tmpString.append(propList["libwpd:number"]->getStr());
pOpenEndNote->addAttribute("text:id", tmpString);
}
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(pOpenEndNote));
+ mpCurrentContentElements->push_back(pOpenEndNote);
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(new TagOpenElement("text:endnote-citation")));
+ mpCurrentContentElements->push_back(new TagOpenElement("text:note-citation"));
if (propList["libwpd:number"])
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(new CharDataElement(propList["libwpd:number"]->getStr().cstr())));
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(new TagCloseElement("text:endnote-citation")));
+ mpCurrentContentElements->push_back(new CharDataElement(propList["libwpd:number"]->getStr().cstr()));
+ mpCurrentContentElements->push_back(new TagCloseElement("text:note-citation"));
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(new TagOpenElement("text:endnote-body")));
+ mpCurrentContentElements->push_back(new TagOpenElement("text:note-body"));
+ mWriterDocumentStates.top().mbInNote = true;
}
+
void DocumentCollector::closeEndnote()
{
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(new TagCloseElement("text:endnote-body")));
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(new TagCloseElement("text:endnote")));
+ mWriterDocumentStates.top().mbInNote = false;
+ if (mWriterListStates.size() > 1)
+ mWriterListStates.pop();
+
+ mpCurrentContentElements->push_back(new TagCloseElement("text:note-body"));
+ mpCurrentContentElements->push_back(new TagCloseElement("text:note"));
+}
+
+void DocumentCollector::openComment(const WPXPropertyList & /*propList*/)
+{
+ mWriterListStates.push(WriterListState());
+ mpCurrentContentElements->push_back(new TagOpenElement("office:annotation"));
+
+ mWriterDocumentStates.top().mbInNote = true;
+}
+
+void DocumentCollector::closeComment()
+{
+ mWriterDocumentStates.top().mbInNote = false;
+ if (mWriterListStates.size() > 1)
+ mWriterListStates.pop();
+
+ mpCurrentContentElements->push_back(new TagCloseElement("office:annotation"));
}
void DocumentCollector::openTable(const WPXPropertyList &propList, const WPXPropertyListVector &columns)
{
+ if (!mWriterDocumentStates.top().mbInNote)
+ {
WPXString sTableName;
sTableName.sprintf("Table%i", mTableStyles.size());
@@ -817,11 +936,11 @@ void DocumentCollector::openTable(const WPXPropertyList &propList, const WPXProp
// WLACH_REFACTORING: characterize this behaviour, probably should nip it at the bud within libwpd
TableStyle *pTableStyle = new TableStyle(propList, columns, sTableName.cstr());
- if (mWriterDocumentState.mbFirstElement && mpCurrentContentElements == &mBodyElements)
+ if (mWriterDocumentStates.top().mbFirstElement && mpCurrentContentElements == &mBodyElements)
{
- WPXString sMasterPageName("Page Style 1");
+ WPXString sMasterPageName("Page_Style_1");
pTableStyle->setMasterPageName(sMasterPageName);
- mWriterDocumentState.mbFirstElement = false;
+ mWriterDocumentStates.top().mbFirstElement = false;
}
mTableStyles.push_back(pTableStyle);
@@ -832,7 +951,7 @@ void DocumentCollector::openTable(const WPXPropertyList &propList, const WPXProp
pTableOpenElement->addAttribute("table:name", sTableName.cstr());
pTableOpenElement->addAttribute("table:style-name", sTableName.cstr());
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(pTableOpenElement));
+ mpCurrentContentElements->push_back(pTableOpenElement);
for (int i=0; i<pTableStyle->getNumColumns(); i++)
{
@@ -846,13 +965,16 @@ void DocumentCollector::openTable(const WPXPropertyList &propList, const WPXProp
mpCurrentContentElements->push_back(pTableColumnCloseElement);
}
}
+}
void DocumentCollector::openTableRow(const WPXPropertyList &propList)
{
+ if (!mWriterDocumentStates.top().mbInNote)
+ {
if (propList["libwpd:is-header-row"] && (propList["libwpd:is-header-row"]->getInt()))
{
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(new TagOpenElement("table:table-header-rows")));
- mWriterDocumentState.mbHeaderRow = true;
+ mpCurrentContentElements->push_back(new TagOpenElement("table:table-header-rows"));
+ mWriterDocumentStates.top().mbHeaderRow = true;
}
WPXString sTableRowStyleName;
@@ -862,21 +984,27 @@ void DocumentCollector::openTableRow(const WPXPropertyList &propList)
TagOpenElement *pTableRowOpenElement = new TagOpenElement("table:table-row");
pTableRowOpenElement->addAttribute("table:style-name", sTableRowStyleName);
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(pTableRowOpenElement));
+ mpCurrentContentElements->push_back(pTableRowOpenElement);
+ }
}
void DocumentCollector::closeTableRow()
{
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(new TagCloseElement("table:table-row")));
- if (mWriterDocumentState.mbHeaderRow)
+ if (!mWriterDocumentStates.top().mbInNote)
{
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(new TagCloseElement("table:table-header-rows")));
- mWriterDocumentState.mbHeaderRow = false;
+ mpCurrentContentElements->push_back(new TagCloseElement("table:table-row"));
+ if (mWriterDocumentStates.top().mbHeaderRow)
+ {
+ mpCurrentContentElements->push_back(new TagCloseElement("table:table-header-rows"));
+ mWriterDocumentStates.top().mbHeaderRow = false;
+ }
}
}
void DocumentCollector::openTableCell(const WPXPropertyList &propList)
{
+ if (!mWriterDocumentStates.top().mbInNote)
+ {
WPXString sTableCellStyleName;
sTableCellStyleName.sprintf( "%s.Cell%i", mpCurrentTableStyle->getName().cstr(), mpCurrentTableStyle->getNumTableCellStyles());
TableCellStyle *pTableCellStyle = new TableCellStyle(propList, sTableCellStyleName.cstr());
@@ -890,39 +1018,72 @@ void DocumentCollector::openTableCell(const WPXPropertyList &propList)
if (propList["table:number-rows-spanned"])
pTableCellOpenElement->addAttribute("table:number-rows-spanned",
propList["table:number-rows-spanned"]->getStr().cstr());
- pTableCellOpenElement->addAttribute("table:value-type", "string");
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(pTableCellOpenElement));
+ // pTableCellOpenElement->addAttribute("table:value-type", "string");
+ mpCurrentContentElements->push_back(pTableCellOpenElement);
- mWriterDocumentState.mbTableCellOpened = true;
+ mWriterDocumentStates.top().mbTableCellOpened = true;
+ }
}
void DocumentCollector::closeTableCell()
{
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(new TagCloseElement("table:table-cell")));
- mWriterDocumentState.mbTableCellOpened = false;
+ if (!mWriterDocumentStates.top().mbInNote)
+ {
+ mpCurrentContentElements->push_back(new TagCloseElement("table:table-cell"));
+ mWriterDocumentStates.top().mbTableCellOpened = false;
+ }
}
void DocumentCollector::insertCoveredTableCell(const WPXPropertyList & /* propList */)
{
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(new TagOpenElement("table:covered-table-cell")));
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(new TagCloseElement("table:covered-table-cell")));
+ if (!mWriterDocumentStates.top().mbInNote)
+ {
+ mpCurrentContentElements->push_back(new TagOpenElement("table:covered-table-cell"));
+ mpCurrentContentElements->push_back(new TagCloseElement("table:covered-table-cell"));
+ }
}
void DocumentCollector::closeTable()
{
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(new TagCloseElement("table:table")));
+ if (!mWriterDocumentStates.top().mbInNote)
+ {
+ mpCurrentContentElements->push_back(new TagCloseElement("table:table"));
+ }
}
+
void DocumentCollector::insertTab()
{
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(new TagOpenElement("text:tab-stop")));
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(new TagCloseElement("text:tab-stop")));
+ mpCurrentContentElements->push_back(new TagOpenElement("text:tab"));
+ mpCurrentContentElements->push_back(new TagCloseElement("text:tab"));
+}
+
+void DocumentCollector::insertSpace()
+{
+ mpCurrentContentElements->push_back(new TagOpenElement("text:s"));
+ mpCurrentContentElements->push_back(new TagCloseElement("text:s"));
}
void DocumentCollector::insertLineBreak()
{
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(new TagOpenElement("text:line-break")));
- mpCurrentContentElements->push_back(static_cast<DocumentElement *>(new TagCloseElement("text:line-break")));
+ mpCurrentContentElements->push_back(new TagOpenElement("text:line-break"));
+ mpCurrentContentElements->push_back(new TagCloseElement("text:line-break"));
+}
+
+void DocumentCollector::insertField(const WPXString &type, const WPXPropertyList &propList)
+{
+ if (!type.len())
+ return;
+
+ TagOpenElement *openElement = new TagOpenElement(type.cstr());
+ if (type == "text:page-number")
+ openElement->addAttribute("text:select-page", "current");
+
+ if (propList["style:num-format"])
+ openElement->addAttribute("style:num-format", propList["style:num-format"]->getStr());
+
+ mpCurrentContentElements->push_back(openElement);
+ mpCurrentContentElements->push_back(new TagCloseElement(type.cstr()));
}
void DocumentCollector::insertText(const WPXString &text)
@@ -931,4 +1092,221 @@ void DocumentCollector::insertText(const WPXString &text)
mpCurrentContentElements->push_back(pText);
}
+void DocumentCollector::openFrame(const WPXPropertyList &propList)
+{
+ mWriterListStates.push(WriterListState());
+
+ // First, let's create a Frame Style for this box
+ TagOpenElement *frameStyleOpenElement = new TagOpenElement("style:style");
+ WPXString frameStyleName;
+ frameStyleName.sprintf("GraphicFrame_%i", miObjectNumber);
+ frameStyleOpenElement->addAttribute("style:name", frameStyleName);
+ frameStyleOpenElement->addAttribute("style:family", "graphic");
+
+ mFrameStyles.push_back(frameStyleOpenElement);
+
+ TagOpenElement *frameStylePropertiesOpenElement = new TagOpenElement("style:graphic-properties");
+
+ if (propList["text:anchor-type"])
+ frameStylePropertiesOpenElement->addAttribute("text:anchor-type", propList["text:anchor-type"]->getStr());
+ else
+ frameStylePropertiesOpenElement->addAttribute("text:anchor-type","paragraph");
+
+ if (propList["text:anchor-page-number"])
+ frameStylePropertiesOpenElement->addAttribute("text:anchor-page-number", propList["text:anchor-page-number"]->getStr());
+
+ if (propList["svg:x"])
+ frameStylePropertiesOpenElement->addAttribute("svg:x", propList["svg:x"]->getStr());
+
+ if (propList["svg:y"])
+ frameStylePropertiesOpenElement->addAttribute("svg:y", propList["svg:y"]->getStr());
+
+ if (propList["svg:width"])
+ frameStylePropertiesOpenElement->addAttribute("svg:width", propList["svg:width"]->getStr());
+
+ if (propList["svg:height"])
+ frameStylePropertiesOpenElement->addAttribute("svg:height", propList["svg:height"]->getStr());
+
+ if (propList["style:rel-width"])
+ frameStylePropertiesOpenElement->addAttribute("style:rel-width", propList["style:rel-width"]->getStr());
+
+ if (propList["style:rel-height"])
+ frameStylePropertiesOpenElement->addAttribute("style:rel-height", propList["style:rel-height"]->getStr());
+
+ if (propList["fo:max-width"])
+ frameStylePropertiesOpenElement->addAttribute("fo:max-width", propList["fo:max-width"]->getStr());
+
+ if (propList["fo:max-height"])
+ frameStylePropertiesOpenElement->addAttribute("fo:max-height", propList["fo:max-height"]->getStr());
+
+ if (propList["style:wrap"])
+ frameStylePropertiesOpenElement->addAttribute("style:wrap", propList["style:wrap"]->getStr());
+
+ mFrameStyles.push_back(frameStylePropertiesOpenElement);
+
+ mFrameStyles.push_back(new TagCloseElement("style:graphic-properties"));
+
+ mFrameStyles.push_back(new TagCloseElement("style:style"));
+
+ // Now, let's create an automatic style for this frame
+ TagOpenElement *frameAutomaticStyleElement = new TagOpenElement("style:style");
+ WPXString frameAutomaticStyleName;
+ frameAutomaticStyleName.sprintf("fr%i", miObjectNumber);
+ frameAutomaticStyleElement->addAttribute("style:name", frameAutomaticStyleName);
+ frameAutomaticStyleElement->addAttribute("style:family", "graphic");
+ frameAutomaticStyleElement->addAttribute("style:parent-style-name", frameStyleName);
+
+ mFrameAutomaticStyles.push_back(frameAutomaticStyleElement);
+
+ TagOpenElement *frameAutomaticStylePropertiesElement = new TagOpenElement("style:graphic-properties");
+ if (propList["style:horizontal-pos"])
+ frameAutomaticStylePropertiesElement->addAttribute("style:horizontal-pos", propList["style:horizontal-pos"]->getStr());
+ else
+ frameAutomaticStylePropertiesElement->addAttribute("style:horizontal-pos", "left");
+
+ if (propList["style:horizontal-rel"])
+ frameAutomaticStylePropertiesElement->addAttribute("style:horizontal-rel", propList["style:horizontal-rel"]->getStr());
+ else
+ frameAutomaticStylePropertiesElement->addAttribute("style:horizontal-rel", "paragraph");
+
+ if (propList["style:vertical-pos"])
+ frameAutomaticStylePropertiesElement->addAttribute("style:vertical-pos", propList["style:vertical-pos"]->getStr());
+ else
+ frameAutomaticStylePropertiesElement->addAttribute("style:vertical-pos", "top");
+
+ if (propList["style:vertical-rel"])
+ frameAutomaticStylePropertiesElement->addAttribute("style:vertical-rel", propList["style:vertical-rel"]->getStr());
+ else
+ frameAutomaticStylePropertiesElement->addAttribute("style:vertical-rel", "page-content");
+
+ if (propList["fo:max-width"])
+ frameAutomaticStylePropertiesElement->addAttribute("fo:max-width", propList["fo:max-width"]->getStr());
+
+ if (propList["fo:max-height"])
+ frameAutomaticStylePropertiesElement->addAttribute("fo:max-height", propList["fo:max-height"]->getStr());
+
+ frameAutomaticStylePropertiesElement->addAttribute("draw:ole-draw-aspect", "1");
+
+ mFrameAutomaticStyles.push_back(frameAutomaticStylePropertiesElement);
+
+ mFrameAutomaticStyles.push_back(new TagCloseElement("style:graphic-properties"));
+
+ mFrameAutomaticStyles.push_back(new TagCloseElement("style:style"));
+
+ // And write the frame itself
+ TagOpenElement *drawFrameOpenElement = new TagOpenElement("draw:frame");
+
+ drawFrameOpenElement->addAttribute("draw:style-name", frameAutomaticStyleName);
+ WPXString objectName;
+ objectName.sprintf("Object%i", miObjectNumber++);
+ drawFrameOpenElement->addAttribute("draw:name", objectName);
+ if (propList["text:anchor-type"])
+ drawFrameOpenElement->addAttribute("text:anchor-type", propList["text:anchor-type"]->getStr());
+ else
+ drawFrameOpenElement->addAttribute("text:anchor-type","paragraph");
+
+ if (propList["text:anchor-page-number"])
+ drawFrameOpenElement->addAttribute("text:anchor-page-number", propList["text:anchor-page-number"]->getStr());
+
+ if (propList["svg:x"])
+ drawFrameOpenElement->addAttribute("svg:x", propList["svg:x"]->getStr());
+
+ if (propList["svg:y"])
+ drawFrameOpenElement->addAttribute("svg:y", propList["svg:y"]->getStr());
+
+ if (propList["svg:width"])
+ drawFrameOpenElement->addAttribute("svg:width", propList["svg:width"]->getStr());
+
+ if (propList["svg:height"])
+ drawFrameOpenElement->addAttribute("svg:height", propList["svg:height"]->getStr());
+
+ if (propList["style:rel-width"])
+ drawFrameOpenElement->addAttribute("style:rel-width", propList["style:rel-width"]->getStr());
+
+ if (propList["style:rel-height"])
+ drawFrameOpenElement->addAttribute("style:rel-height", propList["style:rel-height"]->getStr());
+
+ mpCurrentContentElements->push_back(drawFrameOpenElement);
+
+ mWriterDocumentStates.top().mbInFrame = true;
+}
+
+void DocumentCollector::closeFrame()
+{
+ if (mWriterListStates.size() > 1)
+ mWriterListStates.pop();
+
+ mpCurrentContentElements->push_back(new TagCloseElement("draw:frame"));
+
+ mWriterDocumentStates.top().mbInFrame = false;
+}
+
+void DocumentCollector::insertBinaryObject(const WPXPropertyList &propList, const WPXBinaryData &data)
+{
+ if (!data.size())
+ return;
+ if (!mWriterDocumentStates.top().mbInFrame) // Embedded objects without a frame simply don't make sense for us
+ return;
+ if (!propList["libwpd:mimetype"])
+ return;
+
+ if (propList["libwpd:mimetype"]->getStr() == "image/x-wpg")
+ {
+ std::vector<DocumentElement *> tmpContentElements;
+ InternalHandler tmpHandler(&tmpContentElements);
+ OdgExporter exporter(&tmpHandler);
+
+ libwpg::WPGFileFormat fileFormat = libwpg::WPG_AUTODETECT;
+
+ if (!libwpg::WPGraphics::isSupported(const_cast<WPXInputStream *>(data.getDataStream())))
+ fileFormat = libwpg::WPG_WPG1;
+
+ if (libwpg::WPGraphics::parse(const_cast<WPXInputStream *>(data.getDataStream()), &exporter, fileFormat) && !tmpContentElements.empty())
+ {
+ mpCurrentContentElements->push_back(new TagOpenElement("draw:object"));
+ for (std::vector<DocumentElement *>::const_iterator iter = tmpContentElements.begin(); iter != tmpContentElements.end(); iter++)
+ mpCurrentContentElements->push_back(*iter);
+ mpCurrentContentElements->push_back(new TagCloseElement("draw:object"));
+ }
+ }
+ else
+ {
+ mpCurrentContentElements->push_back(new TagOpenElement("draw:image"));
+
+ mpCurrentContentElements->push_back(new TagOpenElement("office:binary-data"));
+
+ WPXString binaryBase64Data = data.getBase64Data();
+
+ mpCurrentContentElements->push_back(new CharDataElement(binaryBase64Data.cstr()));
+
+ mpCurrentContentElements->push_back(new TagCloseElement("office:binary-data"));
+
+ mpCurrentContentElements->push_back(new TagCloseElement("draw:image"));
+ }
+}
+
+void DocumentCollector::openTextBox(const WPXPropertyList & /*propList*/)
+{
+ if (!mWriterDocumentStates.top().mbInFrame) // Text box without a frame simply doesn't make sense for us
+ return;
+ mWriterListStates.push(WriterListState());
+ mWriterDocumentStates.push(WriterDocumentState());
+ mpCurrentContentElements->push_back(new TagOpenElement("draw:text-box"));
+ mWriterDocumentStates.top().mbInTextBox = true;
+ mWriterDocumentStates.top().mbFirstElement = false;
+}
+
+void DocumentCollector::closeTextBox()
+{
+ if (!mWriterDocumentStates.top().mbInTextBox)
+ return;
+ if (mWriterListStates.size() > 1)
+ mWriterListStates.pop();
+ if (mWriterDocumentStates.size() > 1)
+ mWriterDocumentStates.pop();
+
+ mpCurrentContentElements->push_back(new TagCloseElement("draw:text-box"));
+}
+
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/filter/DocumentCollector.hxx b/writerperfect/source/filter/DocumentCollector.hxx
index 218cc68..619bc1d 100644
--- a/writerperfect/source/filter/DocumentCollector.hxx
+++ b/writerperfect/source/filter/DocumentCollector.hxx
@@ -46,8 +46,9 @@
#include <stack>
#include <string.h>
+#include "DocumentHandlerInterface.hxx"
+
class DocumentElement;
-class DocumentHandler;
class TagOpenElement;
class FontStyle;
class ListStyle;
@@ -64,11 +65,29 @@ struct _WriterDocumentState
_WriterDocumentState();
bool mbFirstElement;
+ bool mbFirstParagraphInPageSpan;
bool mbInFakeSection;
bool mbListElementOpenedAtCurrentLevel;
bool mbTableCellOpened;
bool mbHeaderRow;
bool mbInNote;
+ bool mbInTextBox;
+ bool mbInFrame;
+};
+
+// list state
+typedef struct _WriterListState WriterListState;
+struct _WriterListState
+{
+ _WriterListState();
+
+ ListStyle *mpCurrentListStyle;
+ unsigned int miCurrentListLevel;
+ unsigned int miLastListLevel;
+ unsigned int miLastListNumber;
+ bool mbListContinueNumbering;
+ bool mbListElementParagraphOpened;
+ std::stack<bool> mbListElementOpened;
};
enum WriterListType { unordered, ordered };
@@ -81,20 +100,23 @@ struct ltstr
}
};
-class DocumentCollector : public WPXHLListenerImpl
+class DocumentCollector : public WPXDocumentInterface
{
public:
- DocumentCollector(WPSInputStream *pInput, DocumentHandler *pHandler);
+ DocumentCollector(WPXInputStream *pInput, DocumentHandlerInterface *pHandler);
virtual ~DocumentCollector();
bool filter();
- virtual void setDocumentMetaData(const WPXPropertyList & /* propList */) {}
+ // WPXDocumentInterface's callbacks
+ virtual void setDocumentMetaData(const WPXPropertyList &propList);
virtual void startDocument() {}
virtual void endDocument() {}
+ virtual void definePageStyle(const WPXPropertyList&) {}
virtual void openPageSpan(const WPXPropertyList &propList);
virtual void closePageSpan() {}
+ virtual void defineSectionStyle(const WPXPropertyList&, const WPXPropertyListVector&) {}
virtual void openSection(const WPXPropertyList &propList, const WPXPropertyListVector &columns);
virtual void closeSection();
@@ -103,16 +125,19 @@ public:
virtual void openFooter(const WPXPropertyList &propList);
virtual void closeFooter();
+ virtual void defineParagraphStyle(const WPXPropertyList&, const WPXPropertyListVector&) {}
virtual void openParagraph(const WPXPropertyList &propList, const WPXPropertyListVector &tabStops);
virtual void closeParagraph();
+ virtual void defineCharacterStyle(const WPXPropertyList&) {}
virtual void openSpan(const WPXPropertyList &propList);
virtual void closeSpan();
-
virtual void insertTab();
+ virtual void insertSpace();
virtual void insertText(const WPXString &text);
virtual void insertLineBreak();
+ virtual void insertField(const WPXString &type, const WPXPropertyList &propList);
virtual void defineOrderedListLevel(const WPXPropertyList &propList);
virtual void defineUnorderedListLevel(const WPXPropertyList &propList);
@@ -127,6 +152,10 @@ public:
virtual void closeFootnote();
virtual void openEndnote(const WPXPropertyList &propList);
virtual void closeEndnote();
+ virtual void openComment(const WPXPropertyList &propList);
+ virtual void closeComment();
+ virtual void openTextBox(const WPXPropertyList &propList);
+ virtual void closeTextBox();
virtual void openTable(const WPXPropertyList &propList, const WPXPropertyListVector &columns);
virtual void openTableRow(const WPXPropertyList &propList);
@@ -135,25 +164,34 @@ public:
virtual void closeTableCell();
virtual void insertCoveredTableCell(const WPXPropertyList &propList);
virtual void closeTable();
- virtual bool parseSourceDocument(WPSInputStream &input) = 0;
+
+ virtual void openFrame(const WPXPropertyList & propList);
+ virtual void closeFrame();
+
+ virtual void insertBinaryObject(const WPXPropertyList &propList, const WPXBinaryData &data);
+ virtual void insertEquation(const WPXPropertyList & /* propList */, const WPXString & /* data */) {}
+
+ virtual bool parseSourceDocument(WPXInputStream &input) = 0;
protected:
void _resetDocumentState();
- bool _writeTargetDocument(DocumentHandler *pHandler);
- void _writeDefaultStyles(DocumentHandler *pHandler);
- void _writeMasterPages(DocumentHandler *pHandler);
- void _writePageMasters(DocumentHandler *pHandler);
+ bool _writeTargetDocument(DocumentHandlerInterface *pHandler);
+ void _writeDefaultStyles(DocumentHandlerInterface *pHandler);
+ void _writeMasterPages(DocumentHandlerInterface *pHandler);
+ void _writePageLayouts(DocumentHandlerInterface *pHandler);
void _allocateFontName(const WPXString &);
private:
void _openListLevel(TagOpenElement *pListLevelOpenElement);
- void _closeListLevel(const char *szListType);
+ void _closeListLevel();
- WPSInputStream *mpInput;
- DocumentHandler *mpHandler;
+ WPXInputStream *mpInput;
+ DocumentHandlerInterface *mpHandler;
bool mbUsed; // whether or not it has been before (you can only use me once!)
- WriterDocumentState mWriterDocumentState;
+ std::stack<WriterDocumentState> mWriterDocumentStates;
+
+ std::stack<WriterListState> mWriterListStates;
// paragraph styles
std::map<WPXString, ParagraphStyle *, ltstr> mTextStyleHash;
@@ -171,6 +209,14 @@ private:
// table styles
std::vector<TableStyle *> mTableStyles;
+ // frame styles
+ std::vector<DocumentElement *> mFrameStyles;
+
+ std::vector<DocumentElement *> mFrameAutomaticStyles;
+
+ // metadata
+ std::vector<DocumentElement *> mMetaData;
+
// list styles
unsigned int miNumListStyles;
@@ -186,18 +232,18 @@ private:
PageSpan *mpCurrentPageSpan;
int miNumPageStyles;
- // list styles / state
- ListStyle *mpCurrentListStyle;
- unsigned int miCurrentListLevel;
- unsigned int miLastListLevel;
- unsigned int miLastListNumber;
+ // list styles
std::vector<ListStyle *> mListStyles;
- bool mbListContinueNumbering;
- bool mbListElementOpened;
- bool mbListElementParagraphOpened;
+
+ // object state
+ unsigned miObjectNumber;
// table state
TableStyle *mpCurrentTableStyle;
+
+ const bool mbIsFlatXML;
+
+ const char * mpPassword;
};
#endif
diff --git a/writerperfect/source/filter/DocumentElement.cxx b/writerperfect/source/filter/DocumentElement.cxx
index 9948c38..18380e1 100644
--- a/writerperfect/source/filter/DocumentElement.cxx
+++ b/writerperfect/source/filter/DocumentElement.cxx
@@ -27,6 +27,7 @@
*/
#include "DocumentElement.hxx"
+#include "DocumentHandler.hxx"
#include "FilterInternal.hxx"
#include <string.h>
@@ -37,7 +38,7 @@ void TagElement::print() const
WRITER_DEBUG_MSG(("%s\n", msTagName.cstr()));
}
-void TagOpenElement::write(DocumentHandler *pHandler) const
+void TagOpenElement::write(DocumentHandlerInterface *pHandler) const
{
pHandler->startElement(getTagName().cstr(), maAttrList);
}
@@ -52,14 +53,14 @@ void TagOpenElement::addAttribute(const char *szAttributeName, const WPXString &
maAttrList.insert(szAttributeName, sAttributeValue);
}
-void TagCloseElement::write(DocumentHandler *pHandler) const
+void TagCloseElement::write(DocumentHandlerInterface *pHandler) const
{
WRITER_DEBUG_MSG(("TagCloseElement: write (%s)\n", getTagName().cstr()));
pHandler->endElement(getTagName().cstr());
}
-void CharDataElement::write(DocumentHandler *pHandler) const
+void CharDataElement::write(DocumentHandlerInterface *pHandler) const
{
WRITER_DEBUG_MSG(("TextElement: write\n"));
pHandler->characters(msData);
@@ -72,8 +73,10 @@ TextElement::TextElement(const WPXString & sTextBuf) :
// write: writes a text run, appropriately converting spaces to <text:s>
// elements
-void TextElement::write(DocumentHandler *pHandler) const
+void TextElement::write(DocumentHandlerInterface *pHandler) const
{
+ if (msTextBuf.len() <= 0)
+ return;
WPXPropertyList xBlankAttrList;
WPXString sTemp;
diff --git a/writerperfect/source/filter/DocumentElement.hxx b/writerperfect/source/filter/DocumentElement.hxx
index 3481359..cb84777 100644
--- a/writerperfect/source/filter/DocumentElement.hxx
+++ b/writerperfect/source/filter/DocumentElement.hxx
@@ -28,30 +28,25 @@
#ifndef _DOCUMENTELEMENT_H
#define _DOCUMENTELEMENT_H
-#if defined _MSC_VER
-#pragma warning( push, 1 )
-#endif
#include <libwpd/libwpd.h>
#include <libwpd/WPXProperty.h>
#include <libwpd/WPXString.h>
-#if defined _MSC_VER
-#pragma warning( pop )
-#endif
#include <vector>
-#include "DocumentHandler.hxx"
+#include "DocumentHandlerInterface.hxx"
class DocumentElement
{
public:
virtual ~DocumentElement() {}
- virtual void write(DocumentHandler *pHandler) const = 0;
+ virtual void write(DocumentHandlerInterface *pHandler) const = 0;
virtual void print() const {}
};
class TagElement : public DocumentElement
{
public:
+ virtual ~TagElement() {}
TagElement(const char *szTagName) : msTagName(szTagName) {}
const WPXString & getTagName() const { return msTagName; }
virtual void print() const;
@@ -63,9 +58,9 @@ class TagOpenElement : public TagElement
{
public:
TagOpenElement(const char *szTagName) : TagElement(szTagName) {}
- ~TagOpenElement() {}
+ virtual ~TagOpenElement() {}
void addAttribute(const char *szAttributeName, const WPXString &sAttributeValue);
- virtual void write(DocumentHandler *pHandler) const;
+ virtual void write(DocumentHandlerInterface *pHandler) const;
virtual void print () const;
private:
WPXPropertyList maAttrList;
@@ -75,14 +70,16 @@ class TagCloseElement : public TagElement
{
public:
TagCloseElement(const char *szTagName) : TagElement(szTagName) {}
- virtual void write(DocumentHandler *pHandler) const;
+ virtual ~TagCloseElement() {}
+ virtual void write(DocumentHandlerInterface *pHandler) const;
};
class CharDataElement : public DocumentElement
{
public:
CharDataElement(const char *sData) : DocumentElement(), msData(sData) {}
- virtual void write(DocumentHandler *pHandler) const;
+ virtual ~CharDataElement() {}
+ virtual void write(DocumentHandlerInterface *pHandler) const;
private:
WPXString msData;
};
@@ -91,7 +88,8 @@ class TextElement : public DocumentElement
{
public:
TextElement(const WPXString & sTextBuf);
- virtual void write(DocumentHandler *pHandler) const;
+ virtual ~TextElement() {}
+ virtual void write(DocumentHandlerInterface *pHandler) const;
private:
WPXString msTextBuf;
diff --git a/writerperfect/source/filter/DocumentHandler.cxx b/writerperfect/source/filter/DocumentHandler.cxx
index b3d247d..ab16391 100644
--- a/writerperfect/source/filter/DocumentHandler.cxx
+++ b/writerperfect/source/filter/DocumentHandler.cxx
@@ -29,6 +29,8 @@
#include <xmloff/attrlist.hxx>
+// #define DEBUG_XML 1
+
using namespace ::rtl;
using rtl::OUString;
@@ -41,19 +43,19 @@ DocumentHandler::DocumentHandler(Reference < XDocumentHandler > &xHandler) :
void DocumentHandler::startDocument()
{
- WRITER_DEBUG_MSG(("DocumentHandler::startDocument\n"));
mxHandler->startDocument();
}
void DocumentHandler::endDocument()
{
- WRITER_DEBUG_MSG(("DocumentHandler::endDocument\n"));
mxHandler->endDocument();
}
void DocumentHandler::startElement(const char *psName, const WPXPropertyList &xPropList)
{
- WRITER_DEBUG_MSG(("DocumentHandler::startElement\n"));
+#ifdef DEBUG_XML
+ printf("<%s", psName);
+#endif
SvXMLAttributeList *pAttrList = new SvXMLAttributeList();
Reference < XAttributeList > xAttrList(pAttrList);
WPXPropertyList::Iter i(xPropList);
@@ -61,23 +63,36 @@ void DocumentHandler::startElement(const char *psName, const WPXPropertyList &xP
{
// filter out libwpd elements
if (strncmp(i.key(), "libwpd", 6) != 0)
+ {
pAttrList->AddAttribute(OUString::createFromAscii(i.key()),
OUString::createFromAscii(i()->getStr().cstr()));
+#ifdef DEBUG_XML
+ printf(" %s=\"%s\"", i.key(), i()->getStr().cstr());
+#endif
+ }
}
+#ifdef DEBUG_XML
+ printf(">");
+#endif
mxHandler->startElement(OUString::createFromAscii(psName), xAttrList);
}
void DocumentHandler::endElement(const char *psName)
{
- WRITER_DEBUG_MSG(("DocumentHandler::endElement\n"));
+#ifdef DEBUG_XML
+ printf("</%s>", psName);
+#endif
mxHandler->endElement(OUString::createFromAscii(psName));
}
void DocumentHandler::characters(const WPXString &sCharacters)
{
- WRITER_DEBUG_MSG(("DocumentHandler::characters\n"));
OUString sCharU16(sCharacters.cstr(), strlen(sCharacters.cstr()), RTL_TEXTENCODING_UTF8);
+#ifdef DEBUG_XML
+ WPXString sEscapedCharacters(sCharacters, true);
+ printf("%s", sEscapedCharacters.cstr());
+#endif
mxHandler->characters(sCharU16);
}
diff --git a/writerperfect/source/filter/DocumentHandler.hxx b/writerperfect/source/filter/DocumentHandler.hxx
index 82a8213..249f64f 100644
--- a/writerperfect/source/filter/DocumentHandler.hxx
+++ b/writerperfect/source/filter/DocumentHandler.hxx
@@ -12,10 +12,12 @@
#pragma warning( pop )
#endif
+#include "DocumentHandlerInterface.hxx"
+
using com::sun::star::uno::Reference;
using com::sun::star::xml::sax::XDocumentHandler;
-class DocumentHandler
+class DocumentHandler: public DocumentHandlerInterface
{
public:
DocumentHandler(Reference < XDocumentHandler > &xHandler);
diff --git a/writerperfect/source/filter/DocumentHandlerInterface.hxx b/writerperfect/source/filter/DocumentHandlerInterface.hxx
new file mode 100644
index 0000000..73ced7d
--- /dev/null
+++ b/writerperfect/source/filter/DocumentHandlerInterface.hxx
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2004 William Lachance (wlach at interlog.com)
+ * Copyright (C) 2004 Net Integration Technologies (http://www.net-itech.com)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ *
+ * Contributor(s): Martin Gallwey (gallwey at sun.com)
+ *
+ */
+
+/* "This product is not manufactured, approved, or supported by
+ * Corel Corporation or Corel Corporation Limited."
+ */
+#ifndef _DOCUMENTHANDLERINTERFACE_H
+#define _DOCUMENTHANDLERINTERFACE_H
+#include <libwpd/libwpd.h>
+#include <libwpd/WPXProperty.h>
+#include <libwpd/WPXString.h>
+
+class DocumentHandlerInterface
+{
+public:
+ DocumentHandlerInterface() {};
+ virtual ~DocumentHandlerInterface() {};
+
+ virtual void startDocument() = 0;
+ virtual void endDocument() = 0;
+ virtual void startElement(const char *psName, const WPXPropertyList &xPropList) = 0;
+ virtual void endElement(const char *psName) = 0;
+ virtual void characters(const WPXString &sCharacters) = 0;
+};
+#endif
diff --git a/writerperfect/source/filter/FilterInternal.hxx b/writerperfect/source/filter/FilterInternal.hxx
index 4239a57..c53e83e 100644
--- a/writerperfect/source/filter/FilterInternal.hxx
+++ b/writerperfect/source/filter/FilterInternal.hxx
@@ -2,7 +2,7 @@
/* FilterInternal: Debugging information
*
* Copyright (C) 2002-2003 William Lachance (william.lachance at sympatico.ca)
- *
+ *
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
@@ -20,6 +20,10 @@
* For further information visit http://libwpd.sourceforge.net
*
*/
+
+#ifndef _FILTERINTERNAL_HXX
+#define _FILTERINTERNAL_HXX
+
#include <stdio.h>
#ifdef DEBUG
#define WRITER_DEBUG_MSG(M) printf M
@@ -31,4 +35,6 @@ const float fDefaultSideMargin = 1.0f; // inches
const float fDefaultPageWidth = 8.5f; // inches (OOo required default: we will handle this later)
const float fDefaultPageHeight = 11.0f; // inches
+#endif
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/filter/FontStyle.cxx b/writerperfect/source/filter/FontStyle.cxx
index 6e1214a..07afe4b 100644
--- a/writerperfect/source/filter/FontStyle.cxx
+++ b/writerperfect/source/filter/FontStyle.cxx
@@ -30,7 +30,7 @@
#include "DocumentElement.hxx"
FontStyle::FontStyle(const char *psName, const char *psFontFamily) : Style(psName),
- msFontFamily(psFontFamily),
+ msFontFamily(psFontFamily, true),
msFontPitch(IMP_DEFAULT_FONT_PITCH)
{
}
@@ -39,14 +39,14 @@ FontStyle::~FontStyle()
{
}
-void FontStyle::write(DocumentHandler *pHandler) const
+void FontStyle::write(DocumentHandlerInterface *pHandler) const
{
- TagOpenElement styleOpen("style:font-decl");
+ TagOpenElement styleOpen("style:font-face");
styleOpen.addAttribute("style:name", getName());
- styleOpen.addAttribute("fo:font-family", msFontFamily);
- styleOpen.addAttribute("style:font-pitch", msFontPitch);
+ styleOpen.addAttribute("svg:font-family", msFontFamily);
+// styleOpen.addAttribute("style:font-pitch", msFontPitch);
styleOpen.write(pHandler);
- TagCloseElement styleClose("style:font-decl");
+ TagCloseElement styleClose("style:font-face");
styleClose.write(pHandler);
}
diff --git a/writerperfect/source/filter/FontStyle.hxx b/writerperfect/source/filter/FontStyle.hxx
index 8d16b13..aec430d 100644
--- a/writerperfect/source/filter/FontStyle.hxx
+++ b/writerperfect/source/filter/FontStyle.hxx
@@ -27,23 +27,18 @@
*/
#ifndef _FONTSTYLE_H
#define _FONTSTYLE_H
-#if defined _MSC_VER
-#pragma warning( push, 1 )
-#endif
#include <libwpd/libwpd.h>
-#if defined _MSC_VER
-#pragma warning( pop )
-#endif
#include "Style.hxx"
#include "WriterProperties.hxx"
+#include "DocumentHandlerInterface.hxx"
class FontStyle : public Style
{
public:
FontStyle(const char *psName, const char *psFontFamily);
~FontStyle();
- virtual void write(DocumentHandler *pHandler) const;
+ virtual void write(DocumentHandlerInterface *pHandler) const;
const WPXString &getFontFamily() const { return msFontFamily; }
private:
diff --git a/writerperfect/source/filter/GraphicsStyle.cxx b/writerperfect/source/filter/GraphicsStyle.cxx
new file mode 100644
index 0000000..4067f55
--- /dev/null
+++ b/writerperfect/source/filter/GraphicsStyle.cxx
@@ -0,0 +1,40 @@
+/* GraphicsStyle:
+ *
+ * Copyright (C) 2007 Fridrich Strba .strba at bluewin.ch)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This program 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; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * For further information visit http://libwpd.sourceforge.net
+ *
+ */
+
+/* "This product is not manufactured, approved, or supported by
+ * Corel Corporation or Corel Corporation Limited."
+ */
+#include "GraphicsStyle.hxx"
+#include "WriterProperties.hxx"
+#include "DocumentElement.hxx"
+
+GraphicsStyle::GraphicsStyle(const char *psName) : Style(psName)
+{
+}
+
+GraphicsStyle::~GraphicsStyle()
+{
+}
+
+void GraphicsStyle::write(DocumentHandlerInterface * /* pHandler */) const
+{
+}
diff --git a/writerperfect/source/filter/GraphicsStyle.hxx b/writerperfect/source/filter/GraphicsStyle.hxx
new file mode 100644
index 0000000..b6ee0c6
--- /dev/null
+++ b/writerperfect/source/filter/GraphicsStyle.hxx
@@ -0,0 +1,40 @@
+/* GraphicsStyle:
+ *
+ * Copyright (C) 2007 Fridrich Strba .strba at bluewin.ch)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This program 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; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * For further information visit http://libwpd.sourceforge.net
+ *
+ */
+
+/* "This product is not manufactured, approved, or supported by
+ * Corel Corporation or Corel Corporation Limited."
+ */
+#ifndef _GRAPHICSSTYLE_H
+#define _GRAPHICSSTYLE_H
+
+#include "Style.hxx"
+#include "WriterProperties.hxx"
+#include "DocumentHandlerInterface.hxx"
+
+class GraphicsStyle : public Style
+{
+public:
+ GraphicsStyle(const char *psName);
+ ~GraphicsStyle();
+ virtual void write(DocumentHandlerInterface *pHandler) const;
+};
+#endif
diff --git a/writerperfect/source/filter/InternalHandler.cxx b/writerperfect/source/filter/InternalHandler.cxx
new file mode 100644
index 0000000..82479bd
--- /dev/null
+++ b/writerperfect/source/filter/InternalHandler.cxx
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2007 Fridrich Strba .strba at bluewin.ch)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ */
+
+/* "This product is not manufactured, approved, or supported by
+ * Corel Corporation or Corel Corporation Limited."
+ */
+
+#include "InternalHandler.hxx"
+
+#include <string.h>
+
+InternalHandler::InternalHandler(std::vector<DocumentElement *> *elements):
+ mpElements(elements)
+{
+}
+
+void InternalHandler::startElement(const char *psName, const WPXPropertyList &xPropList)
+{
+ TagOpenElement *element = new TagOpenElement(psName);
+ WPXPropertyList::Iter i(xPropList);
+ for (i.rewind(); i.next(); )
+ {
+ // filter out libwpd elements
+ if (strncmp(i.key(), "libwpd", 6) != 0)
+ element->addAttribute(i.key(), i()->getStr());
+ }
+ mpElements->push_back(element);
+}
+
+void InternalHandler::endElement(const char *psName)
+{
+ mpElements->push_back(new TagCloseElement(psName));
+}
+
+void InternalHandler::characters(const WPXString &sCharacters)
+{
+ mpElements->push_back(new CharDataElement(sCharacters.cstr()));
+}
diff --git a/writerperfect/source/filter/InternalHandler.hxx b/writerperfect/source/filter/InternalHandler.hxx
new file mode 100644
index 0000000..9913ac8
--- /dev/null
+++ b/writerperfect/source/filter/InternalHandler.hxx
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2007 Fridrich Strba .strba at bluewin.ch)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ */
+
+/* "This product is not manufactured, approved, or supported by
+ * Corel Corporation or Corel Corporation Limited."
+ */
+
+#ifndef _INTERNALHANDLER_H
+#define _INTERNALHANDLER_H
+#include <libwpd/libwpd.h>
+#include <libwpd/WPXProperty.h>
+#include <libwpd/WPXString.h>
+#include "DocumentElement.hxx"
+#include "DocumentHandlerInterface.hxx"
+
+class InternalHandler : public DocumentHandlerInterface
+{
+public:
+ InternalHandler(std::vector<DocumentElement *> *elements);
+ ~InternalHandler() {};
+
+ void startDocument() {};
+ void endDocument() {};
+ void startElement(const char *psName, const WPXPropertyList &xPropList);
+ void endElement(const char *psName);
+ void characters(const WPXString &sCharacters);
+private:
+ std::vector<DocumentElement *> *mpElements;
+};
+#endif
diff --git a/writerperfect/source/filter/ListStyle.cxx b/writerperfect/source/filter/ListStyle.cxx
index 8a4aa1e..248ea7d 100644
--- a/writerperfect/source/filter/ListStyle.cxx
+++ b/writerperfect/source/filter/ListStyle.cxx
@@ -1,9 +1,9 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/* ListStyle: Stores (and writes) list-based information that is
+/* ListStyle: Stores (and writes) list-based information that is
* needed at the head of an OO document.
*
* Copyright (C) 2002-2003 William Lachance (william.lachance at sympatico.ca)
- *
+ *
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
@@ -22,54 +22,66 @@
*
*/
-/* "This product is not manufactured, approved, or supported by
+/* "This product is not manufactured, approved, or supported by
* Corel Corporation or Corel Corporation Limited."
*/
#include "FilterInternal.hxx"
#include "ListStyle.hxx"
#include "DocumentElement.hxx"
-OrderedListLevelStyle::OrderedListLevelStyle(const WPXPropertyList &xPropList) :
+OrderedListLevelStyle::OrderedListLevelStyle(const WPXPropertyList &xPropList) :
mPropList(xPropList)
{
}
-void OrderedListStyle::updateListLevel(const int iLevel, const WPXPropertyList &xPropList)
-{
+void OrderedListStyle::updateListLevel(const int iLevel, const WPXPropertyList &xPropList)
+{
if (iLevel < 0)
return;
if (!isListLevelDefined(iLevel))
setListLevel(iLevel, new OrderedListLevelStyle(xPropList));
}
-void OrderedListLevelStyle::write(DocumentHandler *pHandler, int iLevel) const
+void OrderedListLevelStyle::write(DocumentHandlerInterface *pHandler, int iLevel) const
{
WPXString sLevel;
sLevel.sprintf("%i", (iLevel+1));
TagOpenElement listLevelStyleOpen("text:list-level-style-number");
listLevelStyleOpen.addAttribute("text:level", sLevel);
- listLevelStyleOpen.addAttribute("text:style-name", "Numbering Symbols");
+ listLevelStyleOpen.addAttribute("text:style-name", "Numbering_Symbols");
if (mPropList["style:num-prefix"])
- listLevelStyleOpen.addAttribute("style:num-prefix", mPropList["style:num-prefix"]->getStr());
+ {
+ WPXString sEscapedString(mPropList["style:num-prefix"]->getStr(), true);
+ listLevelStyleOpen.addAttribute("style:num-prefix", sEscapedString);
+ }
if (mPropList["style:num-suffix"])
- listLevelStyleOpen.addAttribute("style:num-suffix", mPropList["style:num-suffix"]->getStr());
+ {
+ WPXString sEscapedString(mPropList["style:num-suffix"]->getStr(), true);
+ listLevelStyleOpen.addAttribute("style:num-suffix", sEscapedString);
+ }
if (mPropList["style:num-format"])
listLevelStyleOpen.addAttribute("style:num-format", mPropList["style:num-format"]->getStr());
if (mPropList["text:start-value"])
+ {
+ // odf as to the version 1.1 does require the text:start-value to be a positive integer, means > 0
+ if (mPropList["text:start-value"]->getInt() > 0)
listLevelStyleOpen.addAttribute("text:start-value", mPropList["text:start-value"]->getStr());
+ else
+ listLevelStyleOpen.addAttribute("text:start-value", "1");
+ }
listLevelStyleOpen.write(pHandler);
- TagOpenElement stylePropertiesOpen("style:properties");
- if (mPropList["text:space-before"])
+ TagOpenElement stylePropertiesOpen("style:list-level-properties");
+ if (mPropList["text:space-before"] && mPropList["text:space-before"]->getDouble() > 0.0f)
stylePropertiesOpen.addAttribute("text:space-before", mPropList["text:space-before"]->getStr());
- if (mPropList["text:min-label-width"])
+ if (mPropList["text:min-label-width"] && mPropList["text:min-label-width"]->getDouble() > 0.0f)
stylePropertiesOpen.addAttribute("text:min-label-width", mPropList["text:min-label-width"]->getStr());
- if (mPropList["text:min-label-distance"])
+ if (mPropList["text:min-label-distance"] && mPropList["text:min-label-distance"]->getDouble() > 0.0f)
stylePropertiesOpen.addAttribute("text:min-label-distance", mPropList["text:min-label-distance"]->getStr());
stylePropertiesOpen.write(pHandler);
- pHandler->endElement("style:properties");
+ pHandler->endElement("style:list-level-properties");
pHandler->endElement("text:list-level-style-number");
}
@@ -78,37 +90,46 @@ UnorderedListLevelStyle::UnorderedListLevelStyle(const WPXPropertyList &xPropLis
{
}
-void UnorderedListStyle::updateListLevel(const int iLevel, const WPXPropertyList &xPropList)
-{
+void UnorderedListStyle::updateListLevel(const int iLevel, const WPXPropertyList &xPropList)
+{
if (iLevel < 0)
return;
if (!isListLevelDefined(iLevel))
setListLevel(iLevel, new UnorderedListLevelStyle(xPropList));
}
-void UnorderedListLevelStyle::write(DocumentHandler *pHandler, int iLevel) const
+void UnorderedListLevelStyle::write(DocumentHandlerInterface *pHandler, int iLevel) const
{
WPXString sLevel;
sLevel.sprintf("%i", (iLevel+1));
TagOpenElement listLevelStyleOpen("text:list-level-style-bullet");
listLevelStyleOpen.addAttribute("text:level", sLevel);
- listLevelStyleOpen.addAttribute("text:style-name", "Bullet Symbols");
- listLevelStyleOpen.addAttribute("style:num-suffice", ".");
- if (mPropList["text:bullet-char"])
- listLevelStyleOpen.addAttribute("text:bullet-char", mPropList["text:bullet-char"]->getStr());
+ listLevelStyleOpen.addAttribute("text:style-name", "Bullet_Symbols");
+ if (mPropList["text:bullet-char"] && (mPropList["text:bullet-char"]->getStr().len()))
+ {
+ // The following is needed because the odf format does not accept bullet chars longer than one character
+ WPXString::Iter i(mPropList["text:bullet-char"]->getStr()); i.rewind();
+ WPXString sEscapedString(".");
+ if (i.next())
+ sEscapedString = WPXString(i(), true);
+ listLevelStyleOpen.addAttribute("text:bullet-char", sEscapedString);
+
+ }
+ else
+ listLevelStyleOpen.addAttribute("text:bullet-char", ".");
listLevelStyleOpen.write(pHandler);
- TagOpenElement stylePropertiesOpen("style:properties");
- if (mPropList["text:space-before"])
+ TagOpenElement stylePropertiesOpen("style:list-level-properties");
+ if (mPropList["text:space-before"] && mPropList["text:space-before"]->getDouble() > 0.0f)
stylePropertiesOpen.addAttribute("text:space-before", mPropList["text:space-before"]->getStr());
- if (mPropList["text:min-label-width"])
+ if (mPropList["text:min-label-width"] && mPropList["text:min-label-width"]->getDouble() > 0.0f)
stylePropertiesOpen.addAttribute("text:min-label-width", mPropList["text:min-label-width"]->getStr());
- if (mPropList["text:min-label-distance"])
+ if (mPropList["text:min-label-distance"] && mPropList["text:min-label-distance"]->getDouble() > 0.0f)
stylePropertiesOpen.addAttribute("text:min-label-distance", mPropList["text:min-label-distance"]->getStr());
stylePropertiesOpen.addAttribute("style:font-name", "OpenSymbol");
stylePropertiesOpen.write(pHandler);
- pHandler->endElement("style:properties");
+ pHandler->endElement("style:list-level-properties");
pHandler->endElement("text:list-level-style-bullet");
}
@@ -118,7 +139,7 @@ ListStyle::ListStyle(const char *psName, const int iListID) :
{
for (int i=0; i<WP6_NUM_LIST_LEVELS; i++)
mppListLevels[i] = NULL;
-
+
}
ListStyle::~ListStyle()
@@ -132,29 +153,29 @@ ListStyle::~ListStyle()
bool ListStyle::isListLevelDefined(int iLevel) const
{
- if (mppListLevels[iLevel] == NULL)
+ if (mppListLevels[iLevel] == NULL)
return false;
-
+
return true;
}
void ListStyle::setListLevel(int iLevel, ListLevelStyle *iListLevelStyle)
{
- // can't uncomment this next line without adding some extra logic.
+ // can't uncomment this next line without adding some extra logic.
// figure out which is best: use the initial message, or constantly
// update?
- if (mppListLevels[iLevel] == NULL)
+ if (mppListLevels[iLevel] == NULL)
mppListLevels[iLevel] = iListLevelStyle;
}
-void ListStyle::write(DocumentHandler *pHandler) const
+void ListStyle::write(DocumentHandlerInterface *pHandler) const
{
TagOpenElement listStyleOpenElement("text:list-style");
listStyleOpenElement.addAttribute("style:name", getName());
listStyleOpenElement.write(pHandler);
for (int i=0; i<WP6_NUM_LIST_LEVELS; i++) {
- if (mppListLevels[i] != NULL)
+ if (mppListLevels[i] != NULL)
mppListLevels[i]->write(pHandler, i);
}
diff --git a/writerperfect/source/filter/ListStyle.hxx b/writerperfect/source/filter/ListStyle.hxx
index c354934..cbba20a 100644
--- a/writerperfect/source/filter/ListStyle.hxx
+++ b/writerperfect/source/filter/ListStyle.hxx
@@ -27,18 +27,13 @@
*/
#ifndef _LISTSTYLE_H
#define _LISTSTYLE_H
-#if defined _MSC_VER
-#pragma warning( push, 1 )
-#endif
#include <libwpd/libwpd.h>
-#if defined _MSC_VER
-#pragma warning( pop )
-#endif
#define WP6_NUM_LIST_LEVELS 8 // see WP6FileStructure.h (we shouldn't need to reference this)
#include "Style.hxx"
#include "WriterProperties.hxx"
+#include "DocumentHandlerInterface.hxx"
class DocumentElement;
@@ -46,14 +41,14 @@ class ListLevelStyle
{
public:
virtual ~ListLevelStyle() {};
- virtual void write(DocumentHandler *pHandler, int iLevel) const = 0;
+ virtual void write(DocumentHandlerInterface *pHandler, int iLevel) const = 0;
};
class OrderedListLevelStyle : public ListLevelStyle
{
public:
OrderedListLevelStyle(const WPXPropertyList &xPropList);
- void write(DocumentHandler *pHandler, int iLevel) const;
+ void write(DocumentHandlerInterface *pHandler, int iLevel) const;
private:
WPXPropertyList mPropList;
};
@@ -62,7 +57,7 @@ class UnorderedListLevelStyle : public ListLevelStyle
{
... etc. - the rest is truncated
More information about the Libreoffice-commits
mailing list