diff options
author | Michael Stahl <mstahl@redhat.com> | 2017-11-30 14:43:58 +0100 |
---|---|---|
committer | Michael Stahl <mstahl@redhat.com> | 2017-11-30 22:32:46 +0100 |
commit | 2bda2100d8abbf66285551379215579108a4ebf0 (patch) | |
tree | 69d1d03db73254dae2fb5961b1cdbb986eb6c986 /reportdesign | |
parent | dfe635d4f523224b7a6991b524dc2635311a5956 (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.hxx | 16 | ||||
-rw-r--r-- | reportdesign/source/filter/xml/xmlHelper.cxx | 1 | ||||
-rw-r--r-- | reportdesign/source/filter/xml/xmlSubDocument.cxx | 6 | ||||
-rw-r--r-- | reportdesign/source/filter/xml/xmlfilter.cxx | 209 | ||||
-rw-r--r-- | reportdesign/source/filter/xml/xmlfilter.hxx | 19 |
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 |