filter/source/config/fragments/filters/OOXML_Text_Template.xcu | 2 include/oox/core/filterbase.hxx | 2 oox/source/core/filterbase.cxx | 21 +++- sw/CppunitTest_sw_ooxmlexport_template.mk | 14 +++ sw/Module_sw.mk | 1 sw/qa/extras/ooxmlexport/data/sample.dotx |binary sw/qa/extras/ooxmlexport/ooxmlexport_template.cxx | 44 ++++++++++ sw/source/filter/ww8/docxexport.cxx | 34 ++++++- sw/source/filter/ww8/docxexport.hxx | 7 + sw/source/filter/ww8/docxexportfilter.cxx | 2 writerfilter/source/filter/WriterFilter.cxx | 10 +- 11 files changed, 122 insertions(+), 15 deletions(-)
New commits: commit be5730dc4c97e813ade617227e79b9340f7f613a Author: Vasily Melenchuk <[email protected]> AuthorDate: Tue Dec 11 19:47:25 2018 +0300 Commit: Thorsten Behrens <[email protected]> CommitDate: Tue Dec 18 11:39:11 2018 +0100 sw: support for saving into .dotx file Template format now supported not only for import, but for export too. Change-Id: Id55651a23067e882c95b1ce4be25a4fd3d08de6d Reviewed-on: https://gerrit.libreoffice.org/64947 Tested-by: Jenkins Reviewed-by: Katarina Behrens <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/65321 Reviewed-by: Thorsten Behrens <[email protected]> Tested-by: Thorsten Behrens <[email protected]> diff --git a/filter/source/config/fragments/filters/OOXML_Text_Template.xcu b/filter/source/config/fragments/filters/OOXML_Text_Template.xcu index b27998c8d6af..90fd38bf6b2a 100644 --- a/filter/source/config/fragments/filters/OOXML_Text_Template.xcu +++ b/filter/source/config/fragments/filters/OOXML_Text_Template.xcu @@ -16,7 +16,7 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . --> <node oor:name="Office Open XML Text Template" oor:op="replace"> - <prop oor:name="Flags"><value>IMPORT ALIEN 3RDPARTYFILTER TEMPLATE TEMPLATEPATH</value></prop> + <prop oor:name="Flags"><value>IMPORT EXPORT ALIEN 3RDPARTYFILTER TEMPLATE TEMPLATEPATH</value></prop> <prop oor:name="UIComponent"/> <prop oor:name="FilterService"><value>com.sun.star.comp.Writer.WriterFilter</value></prop> <prop oor:name="UserData"><value></value></prop> diff --git a/include/oox/core/filterbase.hxx b/include/oox/core/filterbase.hxx index 790d8d94b436..dbab52c3cd76 100644 --- a/include/oox/core/filterbase.hxx +++ b/include/oox/core/filterbase.hxx @@ -240,6 +240,8 @@ public: bool exportVBA() const; + bool isExportTemplate() const; + protected: virtual css::uno::Reference< css::io::XInputStream > implGetInputStream( utl::MediaDescriptor& rMediaDesc ) const; diff --git a/oox/source/core/filterbase.cxx b/oox/source/core/filterbase.cxx index c24c61c2fa15..46259a8e1809 100644 --- a/oox/source/core/filterbase.cxx +++ b/oox/source/core/filterbase.cxx @@ -28,6 +28,7 @@ #include <com/sun/star/task/XStatusIndicator.hpp> #include <com/sun/star/uno/XComponentContext.hpp> #include <cppuhelper/supportsservice.hxx> +#include <comphelper/documentconstants.hxx> #include <unotools/mediadescriptor.hxx> #include <osl/mutex.hxx> #include <osl/diagnose.h> @@ -150,6 +151,8 @@ struct FilterBaseImpl bool mbExportVBA; + bool mbExportTemplate; + /// @throws RuntimeException explicit FilterBaseImpl( const Reference< XComponentContext >& rxContext ); @@ -163,7 +166,8 @@ FilterBaseImpl::FilterBaseImpl( const Reference< XComponentContext >& rxContext meDirection( FILTERDIRECTION_UNKNOWN ), meVersion( ECMA_DIALECT ), mxComponentContext( rxContext, UNO_SET_THROW ), - mbExportVBA(false) + mbExportVBA(false), + mbExportTemplate(false) { } @@ -426,10 +430,8 @@ void SAL_CALL FilterBase::initialize( const Sequence< Any >& rArgs ) { Sequence<css::beans::PropertyValue> aSeq; rArgs[0] >>= aSeq; - sal_Int32 nLen = aSeq.getLength(); - for (sal_Int32 i = 0; i < nLen; ++i) + for (const auto& rVal : aSeq) { - css::beans::PropertyValue& rVal = aSeq[i]; if (rVal.Name == "UserData") { css::uno::Sequence<OUString> aUserDataSeq; @@ -443,6 +445,12 @@ void SAL_CALL FilterBase::initialize( const Sequence< Any >& rArgs ) } } } + else if (rVal.Name == "Flags") + { + sal_Int32 nFlags; + rVal.Value >>= nFlags; + mxImpl->mbExportTemplate = bool(static_cast<SfxFilterFlags>(nFlags) & SfxFilterFlags::TEMPLATE); + } } } } @@ -586,6 +594,11 @@ bool FilterBase::exportVBA() const return mxImpl->mbExportVBA; } +bool FilterBase::isExportTemplate() const +{ + return mxImpl->mbExportTemplate; +} + } // namespace core } // namespace oox diff --git a/sw/CppunitTest_sw_ooxmlexport_template.mk b/sw/CppunitTest_sw_ooxmlexport_template.mk new file mode 100644 index 000000000000..79bb3b70a59b --- /dev/null +++ b/sw/CppunitTest_sw_ooxmlexport_template.mk @@ -0,0 +1,14 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +#************************************************************************* +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +#************************************************************************* + +$(eval $(call sw_ooxmlexport_test,_template)) + +# vim: set noet sw=4 ts=4: diff --git a/sw/Module_sw.mk b/sw/Module_sw.mk index d36b96a94cfe..def5b6623763 100644 --- a/sw/Module_sw.mk +++ b/sw/Module_sw.mk @@ -72,6 +72,7 @@ $(eval $(call gb_Module_add_slowcheck_targets,sw,\ CppunitTest_sw_ooxmlexport10 \ CppunitTest_sw_ooxmlexport11 \ CppunitTest_sw_ooxmlexport12 \ + CppunitTest_sw_ooxmlexport_template \ CppunitTest_sw_ooxmlfieldexport \ CppunitTest_sw_ooxmllinks \ CppunitTest_sw_ooxmlw14export \ diff --git a/sw/qa/extras/ooxmlexport/data/sample.dotx b/sw/qa/extras/ooxmlexport/data/sample.dotx new file mode 100644 index 000000000000..c0f4062c1e25 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/sample.dotx differ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport_template.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport_template.cxx new file mode 100644 index 000000000000..bb1c813a733f --- /dev/null +++ b/sw/qa/extras/ooxmlexport/ooxmlexport_template.cxx @@ -0,0 +1,44 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <swmodeltestbase.hxx> +#include <string> + +class Test : public SwModelTestBase +{ +public: + Test() + : SwModelTestBase("/sw/qa/extras/ooxmlexport/data/", "Office Open XML Text Template") + { + } + +protected: + bool mustTestImportOf(const char* filename) const override + { + return OString(filename).endsWith(".dotx"); + } +}; + +DECLARE_OOXMLEXPORT_TEST(testSaveAsDotX, "sample.dotx") +{ + xmlDocPtr pXmlDocCT = parseExport("[Content_Types].xml"); + + if (!pXmlDocCT) + return; + + // Ensure that document has correct content type + assertXPath(pXmlDocCT, + "/ContentType:Types/ContentType:Override[@PartName='/word/document.xml']", + "ContentType", + "application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml"); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/filter/ww8/docxexport.cxx b/sw/source/filter/ww8/docxexport.cxx index 1e3f8b86b2b2..431d837c777c 100644 --- a/sw/source/filter/ww8/docxexport.cxx +++ b/sw/source/filter/ww8/docxexport.cxx @@ -1553,7 +1553,8 @@ void DocxExport::SetFS( ::sax_fastparser::FSHelperPtr const & pFS ) mpFS = pFS; } -DocxExport::DocxExport( DocxExportFilter *pFilter, SwDoc *pDocument, SwPaM *pCurrentPam, SwPaM *pOriginalPam, bool bDocm ) +DocxExport::DocxExport(DocxExportFilter* pFilter, SwDoc* pDocument, SwPaM* pCurrentPam, + SwPaM* pOriginalPam, bool bDocm, bool bTemplate) : MSWordExportBase( pDocument, pCurrentPam, pOriginalPam ), m_pFilter( pFilter ), m_pAttrOutput( nullptr ), @@ -1565,7 +1566,8 @@ DocxExport::DocxExport( DocxExportFilter *pFilter, SwDoc *pDocument, SwPaM *pCur m_nHeadersFootersInSection(0), m_pVMLExport( nullptr ), m_pSdrExport( nullptr ), - m_bDocm(bDocm) + m_bDocm(bDocm), + m_bTemplate(bTemplate) { // Write the document properties WriteProperties( ); @@ -1574,10 +1576,32 @@ DocxExport::DocxExport( DocxExportFilter *pFilter, SwDoc *pDocument, SwPaM *pCur m_pFilter->addRelation( oox::getRelationship(Relationship::OFFICEDOCUMENT), "word/document.xml" ); - // DOCM needs a different media type for the document.xml stream. - OUString aMediaType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"; + // Set media type depending of document type + OUString aMediaType; if (m_bDocm) - aMediaType = "application/vnd.ms-word.document.macroEnabled.main+xml"; + { + if (m_bTemplate) + { + aMediaType = "application/vnd.ms-word.template.macroEnabledTemplate.main+xml"; + } + else + { + aMediaType = "application/vnd.ms-word.document.macroEnabled.main+xml"; + } + } + else + { + if (m_bTemplate) + { + aMediaType = "application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml"; + } + else + { + aMediaType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"; + } + } + + // the actual document m_pDocumentFS = m_pFilter->openFragmentStreamWithSerializer( "word/document.xml", aMediaType ); diff --git a/sw/source/filter/ww8/docxexport.hxx b/sw/source/filter/ww8/docxexport.hxx index 1f9f188e6225..f4f9b0a1d8b9 100644 --- a/sw/source/filter/ww8/docxexport.hxx +++ b/sw/source/filter/ww8/docxexport.hxx @@ -108,6 +108,9 @@ class DocxExport : public MSWordExportBase /// If the result will be a .docm file or not. bool m_bDocm; + /// Export is done into template (.dotx) + bool const m_bTemplate; + DocxSettingsData m_aSettings; public: @@ -265,8 +268,8 @@ public: void WriteMainText(); /// Pass the pDocument, pCurrentPam and pOriginalPam to the base class. - DocxExport( DocxExportFilter *pFilter, SwDoc *pDocument, - SwPaM *pCurrentPam, SwPaM *pOriginalPam, bool bDocm ); + DocxExport( DocxExportFilter *pFilter, SwDoc *pDocument, SwPaM* pCurrentPam, SwPaM* pOriginalPam, + bool bDocm, bool bTemplate); /// Destructor. virtual ~DocxExport() override; diff --git a/sw/source/filter/ww8/docxexportfilter.cxx b/sw/source/filter/ww8/docxexportfilter.cxx index 4069289670e0..2e18a6da2969 100644 --- a/sw/source/filter/ww8/docxexportfilter.cxx +++ b/sw/source/filter/ww8/docxexportfilter.cxx @@ -82,7 +82,7 @@ bool DocxExportFilter::exportDocument() // export the document // (in a separate block so that it's destructed before the commit) { - DocxExport aExport( this, pDoc, pCurPam.get(), &aPam, bDocm ); + DocxExport aExport(this, pDoc, pCurPam.get(), &aPam, bDocm, isExportTemplate()); aExport.ExportDocument( true ); // FIXME support exporting selection only } diff --git a/writerfilter/source/filter/WriterFilter.cxx b/writerfilter/source/filter/WriterFilter.cxx index 2953c6cc3f17..3e5b197c90fc 100644 --- a/writerfilter/source/filter/WriterFilter.cxx +++ b/writerfilter/source/filter/WriterFilter.cxx @@ -93,6 +93,7 @@ class WriterFilter : public cppu::WeakImplHelper { uno::Reference<uno::XComponentContext> m_xContext; uno::Reference<lang::XComponent> m_xSrcDoc, m_xDstDoc; + uno::Sequence<uno::Any> m_xInitializationArguments; public: explicit WriterFilter(uno::Reference<uno::XComponentContext> xContext) @@ -137,7 +138,11 @@ sal_Bool WriterFilter::filter(const uno::Sequence< beans::PropertyValue >& rDesc uno::Any a(cppu::getCaughtException()); throw lang::WrappedTargetRuntimeException("wrapped " + a.getValueTypeName() + ": " + e.Message, uno::Reference<uno::XInterface>(), a); } - uno::Reference< document::XExporter > xExprtr(xIfc, uno::UNO_QUERY_THROW); + + uno::Reference<lang::XInitialization> xInit(xIfc, uno::UNO_QUERY_THROW); + xInit->initialize(m_xInitializationArguments); + + uno::Reference<document::XExporter> xExprtr(xIfc, uno::UNO_QUERY_THROW); uno::Reference< document::XFilter > xFltr(xIfc, uno::UNO_QUERY_THROW); if (!xExprtr.is() || !xFltr.is()) return false; @@ -307,8 +312,9 @@ void WriterFilter::setSourceDocument(const uno::Reference< lang::XComponent >& x m_xSrcDoc = xDoc; } -void WriterFilter::initialize(const uno::Sequence< uno::Any >& /*rArguments*/) +void WriterFilter::initialize(const uno::Sequence< uno::Any >& rArguments) { + m_xInitializationArguments = rArguments; } OUString WriterFilter::getImplementationName() _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
