diff options
author | Tamás Zolnai <tamas.zolnai@collabora.com> | 2018-11-29 16:21:28 +0100 |
---|---|---|
committer | Jan Holesovsky <kendy@collabora.com> | 2018-12-10 13:02:01 +0100 |
commit | b0789a2cd82f8bf1e16fb9212a608068d99a2344 (patch) | |
tree | 73976f8bf603397356a93446c0e0e72516d858d5 | |
parent | fae96c0b8ccc17a47833e7eb8ef5bea7b11bebcf (diff) |
Implement SVG export of selected Writer imagecp-6.0-17CODE-4-RC1
A Writer image does not behave similar to other
shapes, so we need to generate a shape to get the
export code working.
Change-Id: Icfb25ceb40f73f1018d379863b836d8303e539f3
-rw-r--r-- | filter/source/svg/svgexport.cxx | 58 | ||||
-rw-r--r-- | filter/source/svg/svgfilter.cxx | 38 | ||||
-rw-r--r-- | filter/source/svg/svgfilter.hxx | 8 |
3 files changed, 93 insertions, 11 deletions
diff --git a/filter/source/svg/svgexport.cxx b/filter/source/svg/svgexport.cxx index 852411d0e380..49e52bf6af27 100644 --- a/filter/source/svg/svgexport.cxx +++ b/filter/source/svg/svgexport.cxx @@ -32,6 +32,8 @@ #include <com/sun/star/text/textfield/Type.hpp> #include <com/sun/star/util/MeasureUnit.hpp> #include <com/sun/star/xml/sax/Writer.hpp> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/drawing/ShapeCollection.hpp> #include <comphelper/lok.hxx> #include <rtl/bootstrap.hxx> @@ -52,6 +54,8 @@ #include <xmloff/xmlnmspe.hxx> #include <xmloff/xmltoken.hxx> #include <xmloff/animationexport.hxx> +#include <svx/svdograf.hxx> +#include <svx/svdpage.hxx> #include <memory> @@ -519,7 +523,7 @@ bool SVGFilter::implExport( const Sequence< PropertyValue >& rDescriptor ) } } - if(mbWriterOrCalcFilter) + if(mbWriterFilter || mbCalcFilter) return implExportWriterOrCalc(xOStm); return implExportImpressOrDraw(xOStm); @@ -663,6 +667,40 @@ bool SVGFilter::implExportWriterOrCalc( const Reference< XOutputStream >& rxOStm return bRet; } +bool SVGFilter::implExportWriterTextGraphic( const Reference< view::XSelectionSupplier >& xSelectionSupplier ) +{ + Any selection = xSelectionSupplier->getSelection(); + uno::Reference<lang::XServiceInfo> xSelection; + selection >>= xSelection; + if (xSelection.is() && xSelection->supportsService("com.sun.star.text.TextGraphicObject")) + { + uno::Reference<beans::XPropertySet> xPropertySet(xSelection, uno::UNO_QUERY); + uno::Reference<graphic::XGraphic> xGraphic; + xPropertySet->getPropertyValue("Graphic") >>= xGraphic; + + if (!xGraphic.is()) + return false; + + const Graphic aGraphic(xGraphic); + + // Calculate size from Graphic + Point aPos( OutputDevice::LogicToLogic(aGraphic.GetPrefMapMode().GetOrigin(), aGraphic.GetPrefMapMode(), MapMode(MapUnit::Map100thMM)) ); + Size aSize( OutputDevice::LogicToLogic(aGraphic.GetPrefSize(), aGraphic.GetPrefMapMode(), MapMode(MapUnit::Map100thMM)) ); + + SdrGrafObj* pGraphicObj = new SdrGrafObj(aGraphic, tools::Rectangle( aPos, aSize )); + uno::Reference< drawing::XShape > xShape = GetXShapeForSdrObject(pGraphicObj); + uno::Reference< XPropertySet > xShapePropSet(xShape, uno::UNO_QUERY); + css::awt::Rectangle aBoundRect (aPos.X(), aPos.Y(), aSize.Width(), aSize.Height()); + xShapePropSet->setPropertyValue("BoundRect", uno::Any(aBoundRect)); + xShapePropSet->setPropertyValue("Graphic", uno::Any(xGraphic)); + + maShapeSelection = drawing::ShapeCollection::create(comphelper::getProcessComponentContext()); + maShapeSelection->add(xShape); + } + + return true; +} + Reference< XWriter > SVGFilter::implCreateExportDocumentHandler( const Reference< XOutputStream >& rxOStm ) { @@ -776,7 +814,7 @@ bool SVGFilter::implExportDocument() } } - if(mbWriterOrCalcFilter) + if(mbWriterFilter || mbCalcFilter) implExportDocumentHeaderWriterOrCalc(nDocX, nDocY, nDocWidth, nDocHeight); else implExportDocumentHeaderImpressOrDraw(nDocX, nDocY, nDocWidth, nDocHeight); @@ -2050,6 +2088,22 @@ bool SVGFilter::implCreateObjectsFromShape( const Reference< XDrawPage > & rxPag { Graphic aGraphic( SdrExchangeView::GetObjGraphic( pObj->GetModel(), pObj ) ); + // Writer graphic shapes are handled differently + if( mbWriterFilter && aGraphic.GetType() == GraphicType::NONE ) + { + if (rxShape->getShapeType() == "com.sun.star.drawing.GraphicObjectShape") + { + uno::Reference<beans::XPropertySet> xPropertySet(rxShape, uno::UNO_QUERY); + uno::Reference<graphic::XGraphic> xGraphic; + xPropertySet->getPropertyValue("Graphic") >>= xGraphic; + + if (!xGraphic.is()) + return false; + + aGraphic = Graphic(xGraphic); + } + } + if( aGraphic.GetType() != GraphicType::NONE ) { if( aGraphic.GetType() == GraphicType::Bitmap ) diff --git a/filter/source/svg/svgfilter.cxx b/filter/source/svg/svgfilter.cxx index 40c8490a43cd..c6650d3bd798 100644 --- a/filter/source/svg/svgfilter.cxx +++ b/filter/source/svg/svgfilter.cxx @@ -78,7 +78,9 @@ SVGFilter::SVGFilter( const Reference< XComponentContext >& rxCtx ) : mbExportShapeSelection(false), maFilterData(), mxDefaultPage(), - mbWriterOrCalcFilter(false), + mbWriterFilter(false), + mbCalcFilter(false), + mbImpressFilter(false), mpDefaultSdrPage( nullptr ), mpSdrModel( nullptr ), mbPresentation( false ), @@ -97,7 +99,9 @@ SVGFilter::~SVGFilter() sal_Bool SAL_CALL SVGFilter::filter( const Sequence< PropertyValue >& rDescriptor ) { - mbWriterOrCalcFilter = false; + mbWriterFilter = false; + mbCalcFilter = false; + mbImpressFilter = false; if(mxDstDoc.is()) // Import works for Impress / draw only return filterImpressOrDraw(rDescriptor); @@ -110,9 +114,19 @@ sal_Bool SAL_CALL SVGFilter::filter( const Sequence< PropertyValue >& rDescripto { OUString sFilterName; rDescriptor[nInd].Value >>= sFilterName; - if(sFilterName != "impress_svg_Export") + if(sFilterName == "impress_svg_Export") { - mbWriterOrCalcFilter = true; + mbImpressFilter = true; + return filterImpressOrDraw(rDescriptor); + } + else if(sFilterName == "writer_svg_Export") + { + mbWriterFilter = true; + return filterWriterOrCalc(rDescriptor); + } + else if(sFilterName == "calc_svg_Export") + { + mbCalcFilter = true; return filterWriterOrCalc(rDescriptor); } break; @@ -327,7 +341,7 @@ sal_Bool SVGFilter::filterWriterOrCalc( const Sequence< PropertyValue >& rDescri } } - if(!bSelectionOnly) // For Writer onéy the selection-only mode is supported + if(!bSelectionOnly) // For Writer only the selection-only mode is supported return false; uno::Reference<frame::XDesktop2> xDesktop(frame::Desktop::create(mxContext)); @@ -342,10 +356,18 @@ sal_Bool SVGFilter::filterWriterOrCalc( const Sequence< PropertyValue >& rDescri if (!xSelection.is()) return false; - xSelection->getSelection() >>= maShapeSelection; + bool bGotSelection = xSelection->getSelection() >>= maShapeSelection; - if (!maShapeSelection) - return false; + if (!bGotSelection) + { + if (mbWriterFilter) + { + // For Writer we might have a non-shape graphic + bGotSelection = implExportWriterTextGraphic(xSelection); + } + if (!bGotSelection) + return false; + } // Select only one draw page uno::Reference< drawing::XDrawPagesSupplier > xDrawPagesSupplier( mxSrcDoc, uno::UNO_QUERY ); diff --git a/filter/source/svg/svgfilter.hxx b/filter/source/svg/svgfilter.hxx index bd7589cb5f20..5131dfe1c330 100644 --- a/filter/source/svg/svgfilter.hxx +++ b/filter/source/svg/svgfilter.hxx @@ -30,6 +30,7 @@ #include <com/sun/star/lang/XComponent.hpp> #include <cppuhelper/implbase.hxx> #include <com/sun/star/xml/sax/XWriter.hpp> +#include <com/sun/star/view/XSelectionSupplier.hpp> #include <osl/diagnose.h> #include <sal/log.hxx> @@ -60,6 +61,7 @@ using namespace ::com::sun::star::drawing; using namespace ::com::sun::star::io; using namespace ::com::sun::star::lang; using namespace ::com::sun::star::uno; +using namespace ::com::sun::star; using namespace ::com::sun::star::xml::sax; #define SVG_EXPORT_ALLPAGES ((sal_Int32)-1) @@ -215,7 +217,9 @@ private: Reference< XDrawPage > mxDefaultPage; std::vector< Reference< XDrawPage > > mSelectedPages; - bool mbWriterOrCalcFilter; + bool mbWriterFilter; + bool mbCalcFilter; + bool mbImpressFilter; /// Impress / draw only members @@ -242,6 +246,8 @@ private: bool implExport( const Sequence< PropertyValue >& rDescriptor ); bool implExportImpressOrDraw( const Reference< XOutputStream >& rxOStm ); bool implExportWriterOrCalc( const Reference< XOutputStream >& rxOStm ); + bool implExportWriterTextGraphic( const Reference< view::XSelectionSupplier >& xSelectionSupplier ); + static Reference< XWriter > implCreateExportDocumentHandler( const Reference< XOutputStream >& rxOStm ); void implGetPagePropSet( const Reference< XDrawPage > & rxPage ); |