summaryrefslogtreecommitdiff
path: root/reportdesign
diff options
context:
space:
mode:
authorMichael Stahl <mstahl@redhat.com>2017-11-30 14:43:58 +0100
committerMichael Stahl <mstahl@redhat.com>2017-11-30 22:32:46 +0100
commit2bda2100d8abbf66285551379215579108a4ebf0 (patch)
tree69d1d03db73254dae2fb5961b1cdbb986eb6c986 /reportdesign
parentdfe635d4f523224b7a6991b524dc2635311a5956 (diff)
reportdesign: split up ORptFilter::CreateContext()
This was handling XML elements at 3 different levels; add some more context classes to handle the nesting better. There was one tricky case: the ORptExport::exportContainer() can export a office:report element inside office:body inside report:sub-document, but i don't know how to create a report like that. This was previously handled on import via the fallback to SvXMLImportContext (created for office:body) calling ORptFilter::CreateContext(), but now it needs explicit handling in OXMLSubDocument::CreateChildContext_(). Change-Id: I839986599b2b936f57bb65da355ac1be811fe999
Diffstat (limited to 'reportdesign')
-rw-r--r--reportdesign/source/filter/xml/xmlEnums.hxx16
-rw-r--r--reportdesign/source/filter/xml/xmlHelper.cxx1
-rw-r--r--reportdesign/source/filter/xml/xmlSubDocument.cxx6
-rw-r--r--reportdesign/source/filter/xml/xmlfilter.cxx209
-rw-r--r--reportdesign/source/filter/xml/xmlfilter.hxx19
5 files changed, 205 insertions, 46 deletions
diff --git a/reportdesign/source/filter/xml/xmlEnums.hxx b/reportdesign/source/filter/xml/xmlEnums.hxx
index 91214fea3171..2a98c7103c22 100644
--- a/reportdesign/source/filter/xml/xmlEnums.hxx
+++ b/reportdesign/source/filter/xml/xmlEnums.hxx
@@ -25,14 +25,19 @@ namespace rptxml
{
enum XMLDocTokens
{
- XML_TOK_DOC_AUTOSTYLES,
XML_TOK_DOC_SETTINGS,
- XML_TOK_DOC_REPORT,
XML_TOK_DOC_STYLES,
- XML_TOK_DOC_FONTDECLS,
- XML_TOK_DOC_MASTERSTYLES,
+ XML_TOK_DOC_CONTENT,
XML_TOK_DOC_META
};
+ enum XMLDocContentTokens
+ {
+ XML_TOK_CONTENT_AUTOSTYLES,
+ XML_TOK_CONTENT_STYLES,
+ XML_TOK_CONTENT_FONTDECLS,
+ XML_TOK_CONTENT_MASTERSTYLES,
+ XML_TOK_CONTENT_BODY,
+ };
enum XMLReportToken
{
XML_TOK_REPORT_HEADER,
@@ -53,7 +58,8 @@ namespace rptxml
XML_TOK_REPORT_MIMETYPE ,
XML_TOK_REPORT_NAME ,
XML_TOK_MASTER_DETAIL_FIELDS ,
- XML_TOK_SUB_FRAME
+ XML_TOK_SUB_FRAME ,
+ XML_TOK_SUB_BODY ,
};
enum XMLGroup
{
diff --git a/reportdesign/source/filter/xml/xmlHelper.cxx b/reportdesign/source/filter/xml/xmlHelper.cxx
index cf6167001ebd..c9b2002dbd3b 100644
--- a/reportdesign/source/filter/xml/xmlHelper.cxx
+++ b/reportdesign/source/filter/xml/xmlHelper.cxx
@@ -352,6 +352,7 @@ SvXMLTokenMap* OXMLHelper::GetReportElemTokenMap()
{ XML_NAMESPACE_DRAW, XML_NAME, XML_TOK_REPORT_NAME },
{ XML_NAMESPACE_REPORT, XML_MASTER_DETAIL_FIELDS, XML_TOK_MASTER_DETAIL_FIELDS },
{ XML_NAMESPACE_DRAW, XML_FRAME, XML_TOK_SUB_FRAME },
+ { XML_NAMESPACE_OFFICE, XML_BODY, XML_TOK_SUB_BODY },
XML_TOKEN_MAP_END
};
return new SvXMLTokenMap( aElemTokenMap );
diff --git a/reportdesign/source/filter/xml/xmlSubDocument.cxx b/reportdesign/source/filter/xml/xmlSubDocument.cxx
index 4c84af1e728f..c8c01a6c85b8 100644
--- a/reportdesign/source/filter/xml/xmlSubDocument.cxx
+++ b/reportdesign/source/filter/xml/xmlSubDocument.cxx
@@ -87,6 +87,12 @@ SvXMLImportContextRef OXMLSubDocument::CreateChildContext_(
}
}
break;
+ // FIXME: is it *intentional* that this is supported?
+ // ORptExport::exportContainer() can export this but the import
+ // used to be rather accidental previously
+ case XML_TOK_SUB_BODY:
+ xContext = new RptXMLDocumentBodyContext(GetImport(), _nPrefix, _rLocalName);
+ break;
default:
break;
}
diff --git a/reportdesign/source/filter/xml/xmlfilter.cxx b/reportdesign/source/filter/xml/xmlfilter.cxx
index cb16957ea836..7d23913ff5e2 100644
--- a/reportdesign/source/filter/xml/xmlfilter.cxx
+++ b/reportdesign/source/filter/xml/xmlfilter.cxx
@@ -582,6 +582,149 @@ bool ORptFilter::implImport( const Sequence< PropertyValue >& rDescriptor )
return bRet;
}
+class RptXMLDocumentSettingsContext : public SvXMLImportContext
+{
+public:
+ RptXMLDocumentSettingsContext(SvXMLImport & rImport,
+ sal_uInt16 const nPrefix,
+ const OUString& rLocalName)
+ : SvXMLImportContext(rImport, nPrefix, rLocalName)
+ {
+ }
+
+ virtual SvXMLImportContextRef CreateChildContext(sal_uInt16 const nPrefix,
+ const OUString& rLocalName,
+ const uno::Reference<xml::sax::XAttributeList> & xAttrList) override
+ {
+ if (nPrefix == XML_NAMESPACE_OFFICE && IsXMLToken(rLocalName, XML_SETTINGS))
+ {
+ return new XMLDocumentSettingsContext(GetImport(), nPrefix, rLocalName, xAttrList);
+ }
+ else
+ {
+ return new SvXMLImportContext(GetImport(), nPrefix, rLocalName);
+ }
+ }
+};
+
+class RptXMLDocumentStylesContext : public SvXMLImportContext
+{
+public:
+ RptXMLDocumentStylesContext(SvXMLImport & rImport,
+ sal_uInt16 const nPrefix,
+ const OUString& rLocalName)
+ : SvXMLImportContext(rImport, nPrefix, rLocalName)
+ {
+ }
+
+ virtual SvXMLImportContextRef CreateChildContext(sal_uInt16 const nPrefix,
+ const OUString& rLocalName,
+ const uno::Reference<xml::sax::XAttributeList> & xAttrList) override
+ {
+ SvXMLImportContext *pContext = nullptr;
+
+ ORptFilter & rImport(static_cast<ORptFilter&>(GetImport()));
+ const SvXMLTokenMap& rTokenMap = rImport.GetDocContentElemTokenMap();
+ switch (rTokenMap.Get(nPrefix, rLocalName))
+ {
+ case XML_TOK_CONTENT_STYLES:
+ rImport.GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
+ pContext = rImport.CreateStylesContext(rLocalName, xAttrList, false);
+ break;
+ case XML_TOK_CONTENT_AUTOSTYLES:
+ // don't use the autostyles from the styles-document for the progress
+ pContext = rImport.CreateStylesContext(rLocalName, xAttrList, true);
+ break;
+ case XML_TOK_CONTENT_FONTDECLS:
+ rImport.GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
+ pContext = rImport.CreateFontDeclsContext(rLocalName, xAttrList);
+ break;
+ case XML_TOK_CONTENT_MASTERSTYLES:
+ {
+ SvXMLStylesContext* pStyleContext = new RptMLMasterStylesContext_Impl(rImport, nPrefix, rLocalName, xAttrList);//CreateMasterStylesContext( rLocalName,xAttrList );
+ pContext = pStyleContext;
+ rImport.SetMasterStyles(pStyleContext);
+ }
+ break;
+ default:
+ break;
+ }
+
+ if (!pContext)
+ pContext = new SvXMLImportContext(GetImport(), nPrefix, rLocalName);
+
+ return pContext;
+ }
+};
+
+SvXMLImportContextRef RptXMLDocumentBodyContext::CreateChildContext(
+ sal_uInt16 const nPrefix,
+ const OUString& rLocalName,
+ const uno::Reference<xml::sax::XAttributeList> & xAttrList)
+{
+ ORptFilter & rImport(static_cast<ORptFilter&>(GetImport()));
+ if ((XML_NAMESPACE_OFFICE == nPrefix || XML_NAMESPACE_OOO == nPrefix)
+ && IsXMLToken(rLocalName, XML_REPORT))
+ {
+ rImport.GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
+ const SvXMLStylesContext* pAutoStyles = rImport.GetAutoStyles();
+ if (pAutoStyles)
+ {
+ XMLPropStyleContext* pAutoStyle = const_cast<XMLPropStyleContext*>(dynamic_cast<const XMLPropStyleContext *>(pAutoStyles->FindStyleChildContext(XML_STYLE_FAMILY_PAGE_MASTER, "pm1")));
+ if (pAutoStyle)
+ {
+ pAutoStyle->FillPropertySet(rImport.getReportDefinition().get());
+ }
+ }
+ return new OXMLReport(rImport, nPrefix, rLocalName, xAttrList, rImport.getReportDefinition());
+ }
+ else
+ {
+ return new SvXMLImportContext(GetImport(), nPrefix, rLocalName);
+ }
+}
+
+class RptXMLDocumentContentContext : public SvXMLImportContext
+{
+public:
+ RptXMLDocumentContentContext(SvXMLImport & rImport,
+ sal_uInt16 const nPrefix,
+ const OUString& rLocalName)
+ : SvXMLImportContext(rImport, nPrefix, rLocalName)
+ {
+ }
+
+ virtual SvXMLImportContextRef CreateChildContext(sal_uInt16 const nPrefix,
+ const OUString& rLocalName,
+ const uno::Reference<xml::sax::XAttributeList> & xAttrList) override
+ {
+ SvXMLImportContext *pContext = nullptr;
+
+ ORptFilter & rImport(static_cast<ORptFilter&>(GetImport()));
+ const SvXMLTokenMap& rTokenMap = rImport.GetDocContentElemTokenMap();
+ switch (rTokenMap.Get(nPrefix, rLocalName))
+ {
+ case XML_TOK_CONTENT_AUTOSTYLES:
+ rImport.GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
+ pContext = rImport.CreateStylesContext(rLocalName, xAttrList, true);
+ break;
+ case XML_TOK_CONTENT_FONTDECLS:
+ rImport.GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
+ pContext = rImport.CreateFontDeclsContext(rLocalName, xAttrList);
+ break;
+ case XML_TOK_CONTENT_BODY:
+ pContext = new RptXMLDocumentBodyContext(rImport, nPrefix, rLocalName);
+ default:
+ break;
+ }
+
+ if (!pContext)
+ pContext = new SvXMLImportContext(GetImport(), nPrefix, rLocalName);
+
+ return pContext;
+ }
+};
+
SvXMLImportContext* ORptFilter::CreateContext( sal_uInt16 nPrefix,
const OUString& rLocalName,
const uno::Reference< xml::sax::XAttributeList >& xAttrList )
@@ -593,43 +736,13 @@ SvXMLImportContext* ORptFilter::CreateContext( sal_uInt16 nPrefix,
{
case XML_TOK_DOC_SETTINGS:
GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
- pContext = new XMLDocumentSettingsContext( *this, nPrefix, rLocalName,xAttrList );
- break;
- case XML_TOK_DOC_REPORT:
- GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
- {
- const SvXMLStylesContext* pAutoStyles = GetAutoStyles();
- if ( pAutoStyles )
- {
- XMLPropStyleContext* pAutoStyle = const_cast<XMLPropStyleContext*>(dynamic_cast< const XMLPropStyleContext *>(pAutoStyles->FindStyleChildContext(XML_STYLE_FAMILY_PAGE_MASTER,"pm1")));
- if ( pAutoStyle )
- {
- pAutoStyle->FillPropertySet(getReportDefinition().get());
- }
- }
- pContext = new OXMLReport( *this, nPrefix, rLocalName,xAttrList,getReportDefinition() );
- }
+ pContext = new RptXMLDocumentSettingsContext(*this, nPrefix, rLocalName);
break;
case XML_TOK_DOC_STYLES:
- GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
- pContext = CreateStylesContext( rLocalName, xAttrList, false);
+ pContext = new RptXMLDocumentStylesContext(*this, nPrefix, rLocalName);
break;
- case XML_TOK_DOC_AUTOSTYLES:
- // don't use the autostyles from the styles-document for the progress
- if ( ! IsXMLToken( rLocalName, XML_DOCUMENT_STYLES ) )
- GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
- pContext = CreateStylesContext( rLocalName, xAttrList, true);
- break;
- case XML_TOK_DOC_FONTDECLS:
- GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
- pContext = CreateFontDeclsContext( rLocalName,xAttrList );
- break;
- case XML_TOK_DOC_MASTERSTYLES:
- {
- SvXMLStylesContext* pStyleContext = new RptMLMasterStylesContext_Impl(*this, nPrefix, rLocalName,xAttrList);//CreateMasterStylesContext( rLocalName,xAttrList );
- pContext = pStyleContext;
- SetMasterStyles( pStyleContext );
- }
+ case XML_TOK_DOC_CONTENT:
+ pContext = new RptXMLDocumentContentContext(*this, nPrefix, rLocalName);
break;
case XML_TOK_DOC_META:
GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
@@ -651,13 +764,9 @@ const SvXMLTokenMap& ORptFilter::GetDocElemTokenMap() const
{
static const SvXMLTokenMapEntry aElemTokenMap[]=
{
- { XML_NAMESPACE_OFFICE, XML_SETTINGS, XML_TOK_DOC_SETTINGS },
- { XML_NAMESPACE_OFFICE, XML_STYLES, XML_TOK_DOC_STYLES },
- { XML_NAMESPACE_OFFICE, XML_AUTOMATIC_STYLES, XML_TOK_DOC_AUTOSTYLES },
- { XML_NAMESPACE_OFFICE, XML_REPORT, XML_TOK_DOC_REPORT },
- { XML_NAMESPACE_OOO, XML_REPORT, XML_TOK_DOC_REPORT },
- { XML_NAMESPACE_OFFICE, XML_FONT_FACE_DECLS, XML_TOK_DOC_FONTDECLS },
- { XML_NAMESPACE_OFFICE, XML_MASTER_STYLES, XML_TOK_DOC_MASTERSTYLES },
+ { XML_NAMESPACE_OFFICE, XML_DOCUMENT_SETTINGS, XML_TOK_DOC_SETTINGS },
+ { XML_NAMESPACE_OFFICE, XML_DOCUMENT_CONTENT, XML_TOK_DOC_CONTENT },
+ { XML_NAMESPACE_OFFICE, XML_DOCUMENT_STYLES, XML_TOK_DOC_STYLES },
{ XML_NAMESPACE_OFFICE, XML_DOCUMENT_META, XML_TOK_DOC_META },
XML_TOKEN_MAP_END
};
@@ -666,6 +775,24 @@ const SvXMLTokenMap& ORptFilter::GetDocElemTokenMap() const
return *m_pDocElemTokenMap;
}
+const SvXMLTokenMap& ORptFilter::GetDocContentElemTokenMap() const
+{
+ if (!m_pDocContentElemTokenMap.get())
+ {
+ static const SvXMLTokenMapEntry aElemTokenMap[]=
+ {
+ { XML_NAMESPACE_OFFICE, XML_STYLES, XML_TOK_CONTENT_STYLES },
+ { XML_NAMESPACE_OFFICE, XML_AUTOMATIC_STYLES, XML_TOK_CONTENT_AUTOSTYLES },
+ { XML_NAMESPACE_OFFICE, XML_FONT_FACE_DECLS, XML_TOK_CONTENT_FONTDECLS },
+ { XML_NAMESPACE_OFFICE, XML_MASTER_STYLES, XML_TOK_CONTENT_MASTERSTYLES},
+ { XML_NAMESPACE_OFFICE, XML_BODY, XML_TOK_CONTENT_BODY },
+ XML_TOKEN_MAP_END
+ };
+ m_pDocContentElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
+ }
+ return *m_pDocContentElemTokenMap;
+}
+
const SvXMLTokenMap& ORptFilter::GetReportElemTokenMap() const
{
if ( !m_pReportElemTokenMap.get() )
diff --git a/reportdesign/source/filter/xml/xmlfilter.hxx b/reportdesign/source/filter/xml/xmlfilter.hxx
index 6969c56859ac..c858e66f53de 100644
--- a/reportdesign/source/filter/xml/xmlfilter.hxx
+++ b/reportdesign/source/filter/xml/xmlfilter.hxx
@@ -70,6 +70,7 @@ private:
TGroupFunctionMap m_aFunctions;
mutable ::std::unique_ptr<SvXMLTokenMap> m_pDocElemTokenMap;
+ mutable ::std::unique_ptr<SvXMLTokenMap> m_pDocContentElemTokenMap;
mutable ::std::unique_ptr<SvXMLTokenMap> m_pReportElemTokenMap;
mutable ::std::unique_ptr<SvXMLTokenMap> m_pGroupElemTokenMap;
mutable ::std::unique_ptr<SvXMLTokenMap> m_pSectionElemTokenMap;
@@ -94,6 +95,8 @@ private:
/// @throws RuntimeException
bool implImport( const Sequence< PropertyValue >& rDescriptor );
+public:
+ using SvXMLImport::SetMasterStyles;
SvXMLImportContext* CreateStylesContext(const OUString& rLocalName,
const Reference< XAttributeList>& xAttrList, bool bIsAutoStyle );
SvXMLImportContext* CreateMetaContext(const OUString& rLocalName);
@@ -131,6 +134,7 @@ public:
virtual void SAL_CALL endDocument() override;
const SvXMLTokenMap& GetDocElemTokenMap() const;
+ const SvXMLTokenMap& GetDocContentElemTokenMap() const;
const SvXMLTokenMap& GetReportElemTokenMap() const;
const SvXMLTokenMap& GetGroupElemTokenMap() const;
const SvXMLTokenMap& GetSectionElemTokenMap() const;
@@ -228,6 +232,21 @@ public:
};
+class RptXMLDocumentBodyContext : public SvXMLImportContext
+{
+public:
+ RptXMLDocumentBodyContext(SvXMLImport & rImport,
+ sal_uInt16 const nPrefix,
+ const OUString& rLocalName)
+ : SvXMLImportContext(rImport, nPrefix, rLocalName)
+ {
+ }
+
+ virtual SvXMLImportContextRef CreateChildContext(sal_uInt16 const nPrefix,
+ const OUString& rLocalName,
+ const css::uno::Reference<css::xml::sax::XAttributeList> & xAttrList) override;
+};
+
} // rptxml
#endif // INCLUDED_REPORTDESIGN_SOURCE_FILTER_XML_XMLFILTER_HXX