diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2015-04-21 12:17:27 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2015-04-21 13:02:16 +0200 |
commit | 7546a904265cc0d0a0e3795cdb411cbb945a39fe (patch) | |
tree | ed6870b3998d89c0ecca8b5240287447fe5ba86e /writerfilter/source | |
parent | 59cea45ec247df1acb691308c940ff97673e4c48 (diff) |
RTF import: handle d{x,y}WrapDist* picture properties
Commit e789c7f0f15a6b571de95b81e77e3a323e9f540e (RTF import of
d{x,y}WrapDist* shape properties, 2013-04-09) added support for wrap
distance of shapes, but that was ignored for shapes, as dmapper later
overwrote the set margins.
Fix this by generating the expected tokens in case of pictures, then
dmapper will take care of the rest.
Also add testcases for the original shape wrap distance feature that was
missing.
Change-Id: I6f219ee6fef71328368409d142897dbae77a0f2f
Diffstat (limited to 'writerfilter/source')
-rw-r--r-- | writerfilter/source/rtftok/rtfdocumentimpl.cxx | 5 | ||||
-rw-r--r-- | writerfilter/source/rtftok/rtfdocumentimpl.hxx | 2 | ||||
-rw-r--r-- | writerfilter/source/rtftok/rtfsdrimport.cxx | 19 | ||||
-rw-r--r-- | writerfilter/source/rtftok/rtfsdrimport.hxx | 2 |
4 files changed, 21 insertions, 7 deletions
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx index d8e5d6ab9fb8..cfa7992e7d4f 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx @@ -926,8 +926,7 @@ RTFError RTFDocumentImpl::resolvePict(bool const bInline, uno::Reference<drawing { // wrap sprm RTFSprms aAnchorWrapAttributes; - RTFSprms aAnchorAttributes; - aAnchorAttributes.set(NS_ooxml::LN_CT_Anchor_behindDoc, std::make_shared<RTFValue>((m_aStates.top().aShape.bInBackground) ? 1 : 0)); + m_aStates.top().aShape.aAnchorAttributes.set(NS_ooxml::LN_CT_Anchor_behindDoc, std::make_shared<RTFValue>((m_aStates.top().aShape.bInBackground) ? 1 : 0)); RTFSprms aAnchorSprms; for (RTFSprms::Iterator_t i = m_aStates.top().aCharacterAttributes.begin(); i != m_aStates.top().aCharacterAttributes.end(); ++i) { @@ -979,7 +978,7 @@ RTFError RTFDocumentImpl::resolvePict(bool const bInline, uno::Reference<drawing aAnchorSprms.set(NS_ooxml::LN_CT_Anchor_docPr, pDocprValue); aAnchorSprms.set(NS_ooxml::LN_graphic_graphic, pGraphicValue); // anchor sprm - auto pValue = std::make_shared<RTFValue>(aAnchorAttributes, aAnchorSprms); + auto pValue = std::make_shared<RTFValue>(m_aStates.top().aShape.aAnchorAttributes, aAnchorSprms); aSprms.set(NS_ooxml::LN_anchor_anchor, pValue); } writerfilter::Reference<Properties>::Pointer_t pProperties = std::make_shared<RTFReferenceProperties>(aAttributes, aSprms); diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.hxx b/writerfilter/source/rtftok/rtfdocumentimpl.hxx index dddd0eeb6509..45d3f6fa9018 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.hxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.hxx @@ -142,6 +142,8 @@ public: bool bInBackground; /// Wrap polygon, written by RTFSdrImport::resolve(), read by RTFDocumentImpl::resolvePict(). RTFSprms aWrapPolygonSprms; + /// Anchor attributes like wrap distance, written by RTFSdrImport::resolve(), read by RTFDocumentImpl::resolvePict(). + RTFSprms aAnchorAttributes; }; /// Stores the properties of a drawing object. diff --git a/writerfilter/source/rtftok/rtfsdrimport.cxx b/writerfilter/source/rtftok/rtfsdrimport.cxx index aad5c01b0758..400a26b017dc 100644 --- a/writerfilter/source/rtftok/rtfsdrimport.cxx +++ b/writerfilter/source/rtftok/rtfsdrimport.cxx @@ -45,6 +45,7 @@ RTFSdrImport::RTFSdrImport(RTFDocumentImpl& rDocument, uno::Reference<lang::XComponent> const& xDstDoc) : m_rImport(rDocument) , m_bTextFrame(false) + , m_bTextGraphicObject(false) , m_bFakePict(false) { uno::Reference<drawing::XDrawPageSupplier> xDrawings(xDstDoc, uno::UNO_QUERY); @@ -257,6 +258,7 @@ int RTFSdrImport::initShape(uno::Reference<drawing::XShape>& o_xShape, { case ESCHER_ShpInst_PictureFrame: createShape("com.sun.star.drawing.GraphicObjectShape", o_xShape, o_xPropSet); + m_bTextGraphicObject = true; break; case ESCHER_ShpInst_Line: createShape("com.sun.star.drawing.LineShape", o_xShape, o_xPropSet); @@ -293,6 +295,7 @@ void RTFSdrImport::resolve(RTFShape& rShape, bool bClose, ShapeOrPict const shap { bool bPib = false; m_bTextFrame = false; + m_bTextGraphicObject = false; uno::Reference<drawing::XShape> xShape; uno::Reference<beans::XPropertySet> xPropertySet; @@ -524,22 +527,30 @@ void RTFSdrImport::resolve(RTFShape& rShape, bool bClose, ShapeOrPict const shap } else if (i->first == "dxWrapDistLeft") { - if (xPropertySet.is()) + if (m_bTextGraphicObject) + rShape.aAnchorAttributes.set(NS_ooxml::LN_CT_Anchor_distL, std::make_shared<RTFValue>(i->second.toInt32())); + else if (xPropertySet.is()) xPropertySet->setPropertyValue("LeftMargin", uno::makeAny(i->second.toInt32() / 360)); } else if (i->first == "dyWrapDistTop") { - if (xPropertySet.is()) + if (m_bTextGraphicObject) + rShape.aAnchorAttributes.set(NS_ooxml::LN_CT_Anchor_distT, std::make_shared<RTFValue>(i->second.toInt32())); + else if (xPropertySet.is()) xPropertySet->setPropertyValue("TopMargin", uno::makeAny(i->second.toInt32() / 360)); } else if (i->first == "dxWrapDistRight") { - if (xPropertySet.is()) + if (m_bTextGraphicObject) + rShape.aAnchorAttributes.set(NS_ooxml::LN_CT_Anchor_distR, std::make_shared<RTFValue>(i->second.toInt32())); + else if (xPropertySet.is()) xPropertySet->setPropertyValue("RightMargin", uno::makeAny(i->second.toInt32() / 360)); } else if (i->first == "dyWrapDistBottom") { - if (xPropertySet.is()) + if (m_bTextGraphicObject) + rShape.aAnchorAttributes.set(NS_ooxml::LN_CT_Anchor_distB, std::make_shared<RTFValue>(i->second.toInt32())); + else if (xPropertySet.is()) xPropertySet->setPropertyValue("BottomMargin", uno::makeAny(i->second.toInt32() / 360)); } else if (i->first == "fillType") diff --git a/writerfilter/source/rtftok/rtfsdrimport.hxx b/writerfilter/source/rtftok/rtfsdrimport.hxx index 8cdaabb3f92e..f6a94e8deeb0 100644 --- a/writerfilter/source/rtftok/rtfsdrimport.hxx +++ b/writerfilter/source/rtftok/rtfsdrimport.hxx @@ -67,6 +67,8 @@ private: css::uno::Reference<css::drawing::XShape> m_xShape; /// If m_xShape is imported as a Writer text frame (instead of a drawinglayer rectangle). bool m_bTextFrame; + /// If m_xShape is imported as a Writer text graphic object (instead of a drawinglayer shape). + bool m_bTextGraphicObject; /// if inside \pict, but actually it's a shape (not a picture) bool m_bFakePict; writerfilter::dmapper::GraphicZOrderHelper m_aGraphicZOrderHelper; |