diff options
author | Tamás Zolnai <tamas.zolnai@collabora.com> | 2018-12-14 17:50:18 +0100 |
---|---|---|
committer | Tamás Zolnai <tamas.zolnai@collabora.com> | 2018-12-14 19:52:48 +0100 |
commit | b052974a6574e4074794ffa590fe60f7c1726768 (patch) | |
tree | c6d03687cb870a4e034f7e6167565ceb19e4650b | |
parent | Update git submodules (diff) | |
download | core-b052974a6574e4074794ffa590fe60f7c1726768.tar.gz core-b052974a6574e4074794ffa590fe60f7c1726768.zip |
lok: Implement SVG export for Writer (SelectionOnly mode)
Separate generic code from Impress / Draw specific code
and implement shape selection handling in case of Writer.
This is an internal filter, so it can be called only from
the code.
Change-Id: I807e04a0949530d6029037bb964c10c80197ff33
Reviewed-on: https://gerrit.libreoffice.org/65174
Tested-by: Jenkins
Reviewed-by: Tamás Zolnai <tamas.zolnai@collabora.com>
-rw-r--r-- | desktop/source/lib/init.cxx | 9 | ||||
-rw-r--r-- | filter/Configuration_filter.mk | 2 | ||||
-rw-r--r-- | filter/source/config/fragments/filters/writer_svg_Export.xcu | 30 | ||||
-rw-r--r-- | filter/source/svg/svgexport.cxx | 245 | ||||
-rw-r--r-- | filter/source/svg/svgfilter.cxx | 82 | ||||
-rw-r--r-- | filter/source/svg/svgfilter.hxx | 42 |
6 files changed, 312 insertions, 98 deletions
diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx index 90994a92c257..65ccfdf4a411 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -2618,7 +2618,14 @@ static size_t doc_renderShapeSelection(LibreOfficeKitDocument* pThis, char** pOu uno::Reference<io::XOutputStream> xOut = new utl::OOutputStreamWrapper(aOutStream); utl::MediaDescriptor aMediaDescriptor; - aMediaDescriptor["FilterName"] <<= OUString("impress_svg_Export"); + if (doc_getDocumentType(pThis) == LOK_DOCTYPE_PRESENTATION) + { + aMediaDescriptor["FilterName"] <<= OUString("impress_svg_Export"); + } + else if(doc_getDocumentType(pThis) == LOK_DOCTYPE_TEXT) + { + aMediaDescriptor["FilterName"] <<= OUString("writer_svg_Export"); + } aMediaDescriptor["SelectionOnly"] <<= true; aMediaDescriptor["OutputStream"] <<= xOut; diff --git a/filter/Configuration_filter.mk b/filter/Configuration_filter.mk index d7a6322e5564..b56e0ae39bc8 100644 --- a/filter/Configuration_filter.mk +++ b/filter/Configuration_filter.mk @@ -790,11 +790,13 @@ $(eval $(call filter_Configuration_add_filters,fcfg_langpack,fcfg_impressgraphic $(eval $(call filter_Configuration_add_types,fcfg_langpack,fcfg_writergraphics_types.xcu,filter/source/config/fragments/types,\ jpg_JPEG \ png_Portable_Network_Graphic \ + svg_Scalable_Vector_Graphics \ )) $(eval $(call filter_Configuration_add_filters,fcfg_langpack,fcfg_writergraphics_filters.xcu,filter/source/config/fragments/filters,\ writer_jpg_Export \ writer_png_Export \ + writer_svg_Export \ )) # fcfg_calcgraphics diff --git a/filter/source/config/fragments/filters/writer_svg_Export.xcu b/filter/source/config/fragments/filters/writer_svg_Export.xcu new file mode 100644 index 000000000000..c08576cdd69b --- /dev/null +++ b/filter/source/config/fragments/filters/writer_svg_Export.xcu @@ -0,0 +1,30 @@ +<!-- + * 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/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> + <node oor:name="writer_svg_Export" oor:op="replace"> + <prop oor:name="Flags"><value>EXPORT ALIEN 3RDPARTYFILTER INTERNAL NOTINFILEDIALOG</value></prop> + <prop oor:name="UIComponent"/> + <prop oor:name="FilterService"><value>com.sun.star.comp.Draw.SVGFilter</value></prop> + <prop oor:name="UserData"><value></value></prop> + <prop oor:name="UIName"> + <value xml:lang="en-US">SVG - Scalable Vector Graphics</value> + </prop> + <prop oor:name="FileFormatVersion"><value>0</value></prop> + <prop oor:name="Type"><value>svg_Scalable_Vector_Graphics</value></prop> + <prop oor:name="TemplateName"/> + <prop oor:name="DocumentService"><value>com.sun.star.text.TextDocument</value></prop> + </node> diff --git a/filter/source/svg/svgexport.cxx b/filter/source/svg/svgexport.cxx index babf682a024f..729fd2e29c2c 100644 --- a/filter/source/svg/svgexport.cxx +++ b/filter/source/svg/svgexport.cxx @@ -504,12 +504,10 @@ bool EqualityBitmap::operator()( const ObjectRepresentation& rObjRep1, bool SVGFilter::implExport( const Sequence< PropertyValue >& rDescriptor ) { - Reference< XComponentContext > xContext( ::comphelper::getProcessComponentContext() ) ; Reference< XOutputStream > xOStm; std::unique_ptr<SvStream> pOStm; sal_Int32 nLength = rDescriptor.getLength(); const PropertyValue* pValue = rDescriptor.getConstArray(); - bool bRet = false; maFilterData.realloc( 0 ); @@ -533,11 +531,22 @@ bool SVGFilter::implExport( const Sequence< PropertyValue >& rDescriptor ) } } - if( xOStm.is() ) + if(mbWriterFilter) + return implExportWriter(xOStm); + + return implExportImpressDraw(xOStm); +} + +bool SVGFilter::implExportImpressDraw( const Reference< XOutputStream >& rxOStm) +{ + Reference< XComponentContext > xContext( ::comphelper::getProcessComponentContext() ) ; + bool bRet = false; + + if( rxOStm.is() ) { if( !mSelectedPages.empty() && !mMasterPageTargets.empty() ) { - Reference< XDocumentHandler > xDocHandler( implCreateExportDocumentHandler( xOStm ), UNO_QUERY ); + Reference< XDocumentHandler > xDocHandler( implCreateExportDocumentHandler( rxOStm ), UNO_QUERY ); if( xDocHandler.is() ) { @@ -616,7 +625,51 @@ bool SVGFilter::implExport( const Sequence< PropertyValue >& rDescriptor ) } } } + return bRet; +} + + +bool SVGFilter::implExportWriter( const Reference< XOutputStream >& rxOStm ) +{ + Reference< XComponentContext > xContext( ::comphelper::getProcessComponentContext() ) ; + bool bRet = false; + + if( rxOStm.is() ) + { + Reference< XDocumentHandler > xDocHandler( implCreateExportDocumentHandler( rxOStm ), UNO_QUERY ); + + if( xDocHandler.is() ) + { + mpObjects = new ObjectMap; + + // mpSVGExport = new SVGExport( xDocHandler ); + mpSVGExport = new SVGExport( xContext, xDocHandler, maFilterData ); + + // xSVGExport is set up only to manage the life-time of the object pointed by mpSVGExport, + // and in order to prevent that it is destroyed when passed to AnimationExporter. + Reference< XInterface > xSVGExport = static_cast< css::document::XFilter* >( mpSVGExport ); + try + { + mxDefaultPage = mSelectedPages[0]; + bRet = implExportDocument(); + } + catch( ... ) + { + delete mpSVGDoc; + mpSVGDoc = nullptr; + OSL_FAIL( "Exception caught" ); + } + + delete mpSVGWriter; + mpSVGWriter = nullptr; + mpSVGExport = nullptr; // pointed object is released by xSVGExport dtor at the end of this scope + delete mpSVGFontExport; + mpSVGFontExport = nullptr; + delete mpObjects; + mpObjects = nullptr; + } + } return bRet; } @@ -639,6 +692,11 @@ bool SVGFilter::implLookForFirstVisiblePage() { sal_Int32 nCurPage = 0, nLastPage = mSelectedPages.size() - 1; + if(!mbPresentation || mbSinglePage) + { + mnVisiblePage = nCurPage; + } + while( ( nCurPage <= nLastPage ) && ( -1 == mnVisiblePage ) ) { const Reference< css::drawing::XDrawPage > & xDrawPage = mSelectedPages[nCurPage]; @@ -651,8 +709,7 @@ bool SVGFilter::implLookForFirstVisiblePage() { bool bVisible = false; - if( !mbPresentation || mbSinglePage || - ( ( xPropSet->getPropertyValue( "Visible" ) >>= bVisible ) && bVisible ) ) + if( ( xPropSet->getPropertyValue( "Visible" ) >>= bVisible ) && bVisible ) { mnVisiblePage = nCurPage; } @@ -667,17 +724,15 @@ bool SVGFilter::implLookForFirstVisiblePage() bool SVGFilter::implExportDocument() { - OUString aAttr; sal_Int32 nDocX = 0, nDocY = 0; // #i124608# sal_Int32 nDocWidth = 0, nDocHeight = 0; - bool bRet = false; + bool bRet = false; sal_Int32 nLastPage = mSelectedPages.size() - 1; mbSinglePage = (nLastPage == 0); mnVisiblePage = -1; const Reference< XPropertySet > xDefaultPagePropertySet( mxDefaultPage, UNO_QUERY ); - const Reference< XExtendedDocumentHandler > xExtDocHandler( mpSVGExport->GetDocHandler(), UNO_QUERY ); // #i124608# mbExportShapeSelection = mbSinglePage && maShapeSelection.is() && maShapeSelection->getCount(); @@ -693,33 +748,18 @@ bool SVGFilter::implExportDocument() // #i124608# create BoundRange and set nDocX, nDocY, nDocWidth and nDocHeight basegfx::B2DRange aShapeRange; - uno::Reference< XPrimitiveFactory2D > xPrimitiveFactory = PrimitiveFactory2D::create( mxContext ); - - // use XPrimitiveFactory2D and go the way over getting the primitives; this - // will give better precision (doubles) and be based on the true object - // geometry. If needed aViewInformation may be expanded to carry a view - // resolution for which to prepare the geometry. - if(xPrimitiveFactory.is()) + for(sal_Int32 a(0); a < maShapeSelection->getCount(); a++) { Reference< css::drawing::XShape > xShapeCandidate; - const Sequence< PropertyValue > aViewInformation; - const Sequence< PropertyValue > aParams; - - for(sal_Int32 a(0); a < maShapeSelection->getCount(); a++) + if((maShapeSelection->getByIndex(a) >>= xShapeCandidate) && xShapeCandidate.is()) { - if((maShapeSelection->getByIndex(a) >>= xShapeCandidate) && xShapeCandidate.is()) + Reference< XPropertySet > xShapePropSet( xShapeCandidate, UNO_QUERY ); + css::awt::Rectangle aBoundRect; + if( xShapePropSet.is() && ( xShapePropSet->getPropertyValue( "BoundRect" ) >>= aBoundRect )) { - const Sequence< Reference< XPrimitive2D > > aPrimitiveSequence( - xPrimitiveFactory->createPrimitivesFromXShape( xShapeCandidate, aParams )); - const sal_Int32 nCount(aPrimitiveSequence.getLength()); - - for(sal_Int32 nIndex = 0; nIndex < nCount; nIndex++) - { - const RealRectangle2D aRect(aPrimitiveSequence[nIndex]->getRange(aViewInformation)); - - aShapeRange.expand(basegfx::B2DTuple(aRect.X1, aRect.Y1)); - aShapeRange.expand(basegfx::B2DTuple(aRect.X2, aRect.Y2)); - } + aShapeRange.expand(basegfx::B2DTuple(aBoundRect.X, aBoundRect.Y)); + aShapeRange.expand(basegfx::B2DTuple(aBoundRect.X + aBoundRect.Width, + aBoundRect.Y + aBoundRect.Height)); } } } @@ -733,6 +773,72 @@ bool SVGFilter::implExportDocument() } } + if(mbWriterFilter) + implExportDocumentHeaderWriter(nDocX, nDocY, nDocWidth, nDocHeight); + else + implExportDocumentHeaderImpressDraw(nDocX, nDocY, nDocWidth, nDocHeight); + + + if( implLookForFirstVisiblePage() ) // OK! We found at least one visible page. + { + if( mbPresentation && !mbExportShapeSelection ) + { + implGenerateMetaData(); + implExportAnimations(); + } + else + { + implGetPagePropSet( mSelectedPages[0] ); + } + + // Create the (Shape, GDIMetaFile) map + if( implCreateObjects() ) + { + ::std::vector< ObjectRepresentation > aObjects( mpObjects->size() ); + sal_uInt32 nPos = 0; + + for (auto const& elem : *mpObjects) + { + aObjects[ nPos++ ] = elem.second; + } + + mpSVGFontExport = new SVGFontExport( *mpSVGExport, aObjects ); + mpSVGWriter = new SVGActionWriter( *mpSVGExport, *mpSVGFontExport ); + + if( mpSVGExport->IsEmbedFonts() ) + { + mpSVGFontExport->EmbedFonts(); + } + if( !mpSVGExport->IsUsePositionedCharacters() ) + { + implExportTextShapeIndex(); + implEmbedBulletGlyphs(); + implExportTextEmbeddedBitmaps(); + } + + // #i124608# export a given object selection, so no MasterPage export at all + if (!mbExportShapeSelection) + implExportMasterPages( mMasterPageTargets, 0, mMasterPageTargets.size() - 1 ); + implExportDrawPages( mSelectedPages, 0, nLastPage ); + + if( mbPresentation && !mbExportShapeSelection ) + { + implGenerateScript(); + } + + delete mpSVGDoc; + mpSVGDoc = nullptr; + bRet = true; + } + } + + return bRet; +} + +void SVGFilter::implExportDocumentHeaderImpressDraw(sal_Int32 nDocX, sal_Int32 nDocY, + sal_Int32 nDocWidth, sal_Int32 nDocHeight) +{ + const Reference< XExtendedDocumentHandler > xExtDocHandler( mpSVGExport->GetDocHandler(), UNO_QUERY ); if( xExtDocHandler.is() && !mpSVGExport->IsUseTinyProfile() ) { xExtDocHandler->unknown( SVG_DTD_STRING ); @@ -746,6 +852,7 @@ bool SVGFilter::implExportDocument() // The following if block means that the slide size is not adapted // to the size of the browser window, moreover the slide is top left aligned // instead of centered: + OUString aAttr; if( !mbPresentation ) { aAttr = OUString::number( nDocWidth * 0.01 ) + "mm"; @@ -819,64 +926,40 @@ bool SVGFilter::implExportDocument() } } } +} - if( implLookForFirstVisiblePage() ) // OK! We found at least one visible page. - { - if( mbPresentation && !mbExportShapeSelection ) - { - implGenerateMetaData(); - implExportAnimations(); - } - else - { - implGetPagePropSet( mSelectedPages[0] ); - } - - // Create the (Shape, GDIMetaFile) map - if( implCreateObjects() ) - { - ::std::vector< ObjectRepresentation > aObjects( mpObjects->size() ); - sal_uInt32 nPos = 0; - - for (auto const& elem : *mpObjects) - { - aObjects[ nPos++ ] = elem.second; - } +void SVGFilter::implExportDocumentHeaderWriter(sal_Int32 nDocX, sal_Int32 nDocY, + sal_Int32 nDocWidth, sal_Int32 nDocHeight) +{ + OUString aAttr; + mpSVGExport->AddAttribute( XML_NAMESPACE_NONE, "version", "1.2" ); - mpSVGFontExport = new SVGFontExport( *mpSVGExport, aObjects ); - mpSVGWriter = new SVGActionWriter( *mpSVGExport, *mpSVGFontExport ); + aAttr = OUString::number( nDocWidth * 0.01 ) + "mm"; + mpSVGExport->AddAttribute( XML_NAMESPACE_NONE, "width", aAttr ); - if( mpSVGExport->IsEmbedFonts() ) - { - mpSVGFontExport->EmbedFonts(); - } - if( !mpSVGExport->IsUsePositionedCharacters() ) - { - implExportTextShapeIndex(); - implEmbedBulletGlyphs(); - implExportTextEmbeddedBitmaps(); - } + aAttr = OUString::number( nDocHeight * 0.01 ) + "mm"; + mpSVGExport->AddAttribute( XML_NAMESPACE_NONE, "height", aAttr ); - // #i124608# export a given object selection, so no MasterPage export at all - if (!mbExportShapeSelection) - implExportMasterPages( mMasterPageTargets, 0, mMasterPageTargets.size() - 1 ); - implExportDrawPages( mSelectedPages, 0, nLastPage ); + aAttr = OUString::number(nDocX) + " " + OUString::number(nDocY) + " "; + aAttr += OUString::number(nDocWidth) + " " + OUString::number(nDocHeight); - if( mbPresentation && !mbExportShapeSelection ) - { - implGenerateScript(); - } + mpSVGExport->AddAttribute( XML_NAMESPACE_NONE, "viewBox", aAttr ); + mpSVGExport->AddAttribute( XML_NAMESPACE_NONE, "preserveAspectRatio", "xMidYMid" ); + mpSVGExport->AddAttribute( XML_NAMESPACE_NONE, "fill-rule", "evenodd" ); - delete mpSVGDoc; - mpSVGDoc = nullptr; - bRet = true; - } - } + // standard line width is based on 1 pixel on a 90 DPI device (0.28222mmm) + mpSVGExport->AddAttribute( XML_NAMESPACE_NONE, "stroke-width", OUString::number( 28.222 ) ); + mpSVGExport->AddAttribute( XML_NAMESPACE_NONE, "stroke-linejoin", "round" ); + mpSVGExport->AddAttribute( XML_NAMESPACE_NONE, "xmlns", constSvgNamespace ); + mpSVGExport->AddAttribute( XML_NAMESPACE_NONE, "xmlns:ooo", "http://xml.openoffice.org/svg/export" ); + mpSVGExport->AddAttribute( XML_NAMESPACE_NONE, "xmlns:xlink", "http://www.w3.org/1999/xlink" ); + mpSVGExport->AddAttribute( XML_NAMESPACE_NONE, "xmlns:office", "urn:oasis:names:tc:opendocument:xmlns:office:1.0" ); + mpSVGExport->AddAttribute( XML_NAMESPACE_NONE, "xmlns:smil", "urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0" ); + mpSVGExport->AddAttribute( XML_NAMESPACE_NONE, "xml:space", "preserve" ); - return bRet; + mpSVGDoc = new SvXMLElementExport( *mpSVGExport, XML_NAMESPACE_NONE, "svg", true, true ); } - /// Append aField to aFieldSet if it is not already present in the set and create the field id sFieldId template< typename TextFieldType > static OUString implGenerateFieldId( std::vector< TextField* > & aFieldSet, diff --git a/filter/source/svg/svgfilter.cxx b/filter/source/svg/svgfilter.cxx index ebcc522fbbca..539891c8b5ae 100644 --- a/filter/source/svg/svgfilter.cxx +++ b/filter/source/svg/svgfilter.cxx @@ -24,6 +24,7 @@ #include <comphelper/lok.hxx> #include <comphelper/servicedecl.hxx> #include <uno/environment.h> +#include <com/sun/star/text/XTextDocument.hpp> #include <com/sun/star/drawing/XDrawPage.hpp> #include <com/sun/star/drawing/XDrawPagesSupplier.hpp> #include <com/sun/star/drawing/XDrawView.hpp> @@ -78,17 +79,19 @@ SVGFilter::SVGFilter( const Reference< XComponentContext >& rxCtx ) : mpSVGExport( nullptr ), mpSVGFontExport( nullptr ), mpSVGWriter( nullptr ), - mpDefaultSdrPage( nullptr ), - mbPresentation( false ), mbSinglePage( false ), mnVisiblePage( -1 ), mpObjects( nullptr ), mxSrcDoc(), mxDstDoc(), - mxDefaultPage(), - maFilterData(), maShapeSelection(), mbExportShapeSelection(false), + maFilterData(), + mxDefaultPage(), + mbWriterFilter(false), + mpDefaultSdrPage( nullptr ), + mpSdrModel( nullptr ), + mbPresentation( false ), maOldFieldHdl() { } @@ -104,6 +107,34 @@ SVGFilter::~SVGFilter() sal_Bool SAL_CALL SVGFilter::filter( const Sequence< PropertyValue >& rDescriptor ) { + mbWriterFilter = false; + + if(mxDstDoc.is()) // Import works for Impress / draw only + return filterImpressDraw(rDescriptor); + + if(mxSrcDoc.is()) + { + for (sal_Int32 nInd = 0; nInd < rDescriptor.getLength(); nInd++) + { + if (rDescriptor[nInd].Name == "FilterName") + { + OUString sFilterName; + rDescriptor[nInd].Value >>= sFilterName; + if(sFilterName == "writer_svg_Export") + { + mbWriterFilter = true; + return filterWriter(rDescriptor); + } + break; + } + } + return filterImpressDraw(rDescriptor); + } + return false; +} + +bool SVGFilter::filterImpressDraw( const Sequence< PropertyValue >& rDescriptor ) +{ SolarMutexGuard aGuard; vcl::Window* pFocusWindow(Application::GetFocusWindow()); bool bRet(false); @@ -505,6 +536,49 @@ sal_Bool SAL_CALL SVGFilter::filter( const Sequence< PropertyValue >& rDescripto return bRet; } +bool SVGFilter::filterWriter( const Sequence< PropertyValue >& rDescriptor ) +{ + bool bSelectionOnly = false; + + for (sal_Int32 nInd = 0; nInd < rDescriptor.getLength(); nInd++) + { + if (rDescriptor[nInd].Name == "SelectionOnly") + { + rDescriptor[nInd].Value >>= bSelectionOnly; + break; + } + } + + if(!bSelectionOnly) // For Writer onéy the selection-only mode is supported + return false; + + uno::Reference<frame::XDesktop2> xDesktop(frame::Desktop::create(mxContext)); + uno::Reference<frame::XController > xController; + if (xDesktop->getCurrentFrame().is()) + { + uno::Reference<frame::XFrame> xFrame(xDesktop->getCurrentFrame(), uno::UNO_QUERY_THROW); + xController.set(xFrame->getController(), uno::UNO_QUERY_THROW); + } + + Reference< view::XSelectionSupplier > xSelection (xController, UNO_QUERY); + if (!xSelection.is()) + return false; + + xSelection->getSelection() >>= maShapeSelection; + + if (!maShapeSelection) + return false; + + // Select only one draw page + uno::Reference< drawing::XDrawPagesSupplier > xDrawPagesSupplier( mxSrcDoc, uno::UNO_QUERY ); + uno::Reference<drawing::XDrawPages> xDrawPages = xDrawPagesSupplier->getDrawPages(); + uno::Reference< drawing::XDrawPage > xDrawPage( xDrawPages->getByIndex(0), uno::UNO_QUERY ); + mSelectedPages.resize( 1 ); + mSelectedPages[0] = xDrawPage; + + return implExport( rDescriptor ); +} + void SAL_CALL SVGFilter::cancel( ) { } diff --git a/filter/source/svg/svgfilter.hxx b/filter/source/svg/svgfilter.hxx index 1b5254e25469..5a70c3c63679 100644 --- a/filter/source/svg/svgfilter.hxx +++ b/filter/source/svg/svgfilter.hxx @@ -192,31 +192,40 @@ public: private: + /// Generally use members + Reference< XComponentContext > mxContext; SvXMLElementExport* mpSVGDoc; SVGExport* mpSVGExport; SVGFontExport* mpSVGFontExport; SVGActionWriter* mpSVGWriter; - SdrPage* mpDefaultSdrPage; - bool mbPresentation; - bool mbSinglePage; + bool mbSinglePage; sal_Int32 mnVisiblePage; - PagePropertySet mVisiblePagePropSet; - OUString msClipPathId; - UCharSetMapMap mTextFieldCharSets; - Reference< XInterface > mCreateOjectsCurrentMasterPage; - UOStringMap mTextShapeIdListMap; - MetaBitmapActionSet mEmbeddedBitmapActionSet; - ObjectMap mEmbeddedBitmapActionMap; ObjectMap* mpObjects; Reference< XComponent > mxSrcDoc; Reference< XComponent > mxDstDoc; - Reference< css::drawing::XDrawPage > mxDefaultPage; - Sequence< PropertyValue > maFilterData; // #i124608# explicit ShapeSelection for export when export of the selection is wanted Reference< css::drawing::XShapes > maShapeSelection; bool mbExportShapeSelection; + Sequence< PropertyValue > maFilterData; + Reference< css::drawing::XDrawPage > mxDefaultPage; std::vector< Reference< css::drawing::XDrawPage > > mSelectedPages; + + bool mbWriterFilter; + + + /// Impress / draw only members + + SdrPage* mpDefaultSdrPage; + SdrModel* mpSdrModel; + bool mbPresentation; + PagePropertySet mVisiblePagePropSet; + OUString msClipPathId; + UCharSetMapMap mTextFieldCharSets; + Reference< XInterface > mCreateOjectsCurrentMasterPage; + UOStringMap mTextShapeIdListMap; + MetaBitmapActionSet mEmbeddedBitmapActionSet; + ObjectMap mEmbeddedBitmapActionMap; std::vector< Reference< css::drawing::XDrawPage > > mMasterPageTargets; Link<EditFieldInfo*,void> maOldFieldHdl; @@ -224,6 +233,8 @@ private: /// @throws css::uno::RuntimeException bool implExport( const Sequence< PropertyValue >& rDescriptor ); + bool implExportImpressDraw( const Reference< XOutputStream >& rxOStm ); + bool implExportWriter( const Reference< XOutputStream >& rxOStm ); static Reference< XWriter > implCreateExportDocumentHandler( const Reference< XOutputStream >& rxOStm ); void implGetPagePropSet( const Reference< css::drawing::XDrawPage > & rxPage ); @@ -235,6 +246,10 @@ private: void implGenerateScript(); bool implExportDocument(); + void implExportDocumentHeaderImpressDraw(sal_Int32 nDocX, sal_Int32 nDocY, + sal_Int32 nDocWidth, sal_Int32 nDocHeight); + void implExportDocumentHeaderWriter(sal_Int32 nDocX, sal_Int32 nDocY, + sal_Int32 nDocWidth, sal_Int32 nDocHeight); void implExportAnimations(); bool implExportMasterPages( const std::vector< Reference< css::drawing::XDrawPage > >& rxPages, @@ -266,6 +281,9 @@ private: const Reference< XPropertySetInfo > & rxPropSetInfo ); DECL_LINK( CalcFieldHdl, EditFieldInfo*, void ); + bool filterImpressDraw( const Sequence< PropertyValue >& rDescriptor ); + bool filterWriter( const Sequence< PropertyValue >& rDescriptor ); + protected: // XFilter |