summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTamás Zolnai <tamas.zolnai@collabora.com>2018-11-29 16:21:28 +0100
committerJan Holesovsky <kendy@collabora.com>2018-12-10 13:02:01 +0100
commitb0789a2cd82f8bf1e16fb9212a608068d99a2344 (patch)
tree73976f8bf603397356a93446c0e0e72516d858d5
parentfae96c0b8ccc17a47833e7eb8ef5bea7b11bebcf (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.cxx58
-rw-r--r--filter/source/svg/svgfilter.cxx38
-rw-r--r--filter/source/svg/svgfilter.hxx8
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 );