sw/qa/extras/rtfimport/data/fdo47802.rtf | 46 +++++++++++++++++++++++++ sw/qa/extras/rtfimport/rtfimport.cxx | 10 +++++ writerfilter/source/rtftok/rtfdocumentimpl.cxx | 25 +++++++++---- writerfilter/source/rtftok/rtfdocumentimpl.hxx | 4 +- writerfilter/source/rtftok/rtfvalue.cxx | 32 ++++++++++++++++- writerfilter/source/rtftok/rtfvalue.hxx | 7 +++ 6 files changed, 113 insertions(+), 11 deletions(-)
New commits: commit d892671c118158490b08d24eea7398330a23599b Author: Miklos Vajna <vmik...@suse.cz> Date: Mon Jul 1 11:37:30 2013 +0200 fdo#47802 testcase Change-Id: Ib3e399efb0d1116473bc5ff0e1b858b2cfa4aec8 diff --git a/sw/qa/extras/rtfimport/data/fdo47802.rtf b/sw/qa/extras/rtfimport/data/fdo47802.rtf new file mode 100644 index 0000000..cbbf94f --- /dev/null +++ b/sw/qa/extras/rtfimport/data/fdo47802.rtf @@ -0,0 +1,46 @@ +{\rtf1 +\paperw12240\paperh15840\margl1440\margr1440\margt1440\margb1440 +\ltrrow\trowd \cellx4680\cellx9468\pard\plain \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\yts15 \rtlch\fcs1 +\af31507\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 +{\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid5924912 +{\shp +{\*\shpinst\shpleft705\shptop-130\shpright1920\shpbottom335\shpfhdr0\shpbxcolumn\shpbxignore\shpbypara\shpbyignore\shpwr3\shpwrk0\shpfblwtxt0\shpz0\shplid1026 +{\sp +{\sn shapeType} +{\sv 1} +} +{\sp +{\sn fFlipH} +{\sv 0} +} +{\sp +{\sn fFlipV} +{\sv 0} +} +{\sp +{\sn lTxid} +{\sv 65536} +} +{\sp +{\sn dhgt} +{\sv 251658240} +} +{\sp +{\sn fLayoutInCell} +{\sv 1} +} +{\shptxt \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\af31507\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 +{\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1038\langfe1033\langnp1038\insrsid5924912 C} +{\par } +} +} +} +} +{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid5924912 A\cell B\cell +} +\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 +{\row } +\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 +\par +} diff --git a/sw/qa/extras/rtfimport/rtfimport.cxx b/sw/qa/extras/rtfimport/rtfimport.cxx index 61de96e..6b628c3 100644 --- a/sw/qa/extras/rtfimport/rtfimport.cxx +++ b/sw/qa/extras/rtfimport/rtfimport.cxx @@ -149,6 +149,7 @@ public: void testN823655(); void testFdo66040(); void testN823675(); + void testFdo47802(); CPPUNIT_TEST_SUITE(Test); #if !defined(MACOSX) && !defined(WNT) @@ -283,6 +284,7 @@ void Test::run() {"n823655.rtf", &Test::testN823655}, {"fdo66040.rtf", &Test::testFdo66040}, {"n823675.rtf", &Test::testN823675}, + {"fdo47802.rtf", &Test::testFdo47802}, }; header(); for (unsigned int i = 0; i < SAL_N_ELEMENTS(aMethods); ++i) @@ -1377,6 +1379,14 @@ void Test::testN823675() CPPUNIT_ASSERT_EQUAL(OUString("Symbol"), aFont.Name); } +void Test::testFdo47802() +{ + uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference<container::XIndexAccess> xDraws(xDrawPageSupplier->getDrawPage(), uno::UNO_QUERY); + // Shape inside table was ignored. + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xDraws->getCount()); +} + CPPUNIT_TEST_SUITE_REGISTRATION(Test); CPPUNIT_PLUGIN_IMPLEMENT(); commit 818d80eb0cee65d1bcc4fdb74b32a7c42cc1336e Author: Miklos Vajna <vmik...@suse.cz> Date: Fri Jun 28 16:47:49 2013 +0200 RTF import: support shapes inside tables This is a better fix for fdo#47802, now that shape import is no longer buffered. Change-Id: Idce6d11e6774d1fe7fc04b6a52d5b77a3879381e diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx index 31cc365..96bfce6 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx @@ -1197,6 +1197,10 @@ void RTFDocumentImpl::replayBuffer(RTFBuffer_t& rBuffer) Mapper().endCharacterGroup(); else if (aPair.first == BUFFER_PAR) parBreak(); + else if (aPair.first == BUFFER_STARTSHAPE) + m_pSdrImport->resolve(aPair.second->getShape(), false); + else if (aPair.first == BUFFER_ENDSHAPE) + m_pSdrImport->close(); else SAL_WARN("writerfilter", "should not happen"); } @@ -1313,11 +1317,7 @@ int RTFDocumentImpl::dispatchDestination(RTFKeyword nKeyword) m_aStates.top().nDestinationState = DESTINATION_SHAPE; break; case RTF_SHPINST: - // Don't try to support shapes inside tables for now. - if (m_aStates.top().pCurrentBuffer != &m_aTableBuffer) - m_aStates.top().nDestinationState = DESTINATION_SHAPEINSTRUCTION; - else - m_aStates.top().nDestinationState = DESTINATION_SKIP; + m_aStates.top().nDestinationState = DESTINATION_SHAPEINSTRUCTION; break; case RTF_NESTTABLEPROPS: // Don't try to support nested tables having table styles for now. @@ -1445,7 +1445,15 @@ int RTFDocumentImpl::dispatchDestination(RTFKeyword nKeyword) dispatchFlag(RTF_PARD); m_bNeedPap = true; if (nKeyword == RTF_SHPTXT) - m_pSdrImport->resolve(m_aStates.top().aShape, false); + { + if (!m_aStates.top().pCurrentBuffer) + m_pSdrImport->resolve(m_aStates.top().aShape, false); + else + { + RTFValue::Pointer_t pValue(new RTFValue(m_aStates.top().aShape)); + m_aStates.top().pCurrentBuffer->push_back(make_pair(BUFFER_STARTSHAPE, pValue)); + } + } break; case RTF_FORMFIELD: if (m_aStates.top().nDestinationState == DESTINATION_FIELDINSTRUCTION) @@ -4602,7 +4610,10 @@ int RTFDocumentImpl::popState() if (m_aStates.top().nDestinationState != DESTINATION_SHAPETEXT && !m_aStates.top().aDrawingObject.bHadShapeText) { m_aStates.top().bHadShapeText = true; - m_pSdrImport->close(); + if (!m_aStates.top().pCurrentBuffer) + m_pSdrImport->close(); + else + m_aStates.top().pCurrentBuffer->push_back(make_pair(BUFFER_ENDSHAPE, RTFValue::Pointer_t())); } break; default: diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.hxx b/writerfilter/source/rtftok/rtfdocumentimpl.hxx index e48fe5d..0d77b6e 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.hxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.hxx @@ -195,7 +195,9 @@ namespace writerfilter { BUFFER_TEXT, BUFFER_UTEXT, BUFFER_ENDRUN, - BUFFER_PAR + BUFFER_PAR, + BUFFER_STARTSHAPE, + BUFFER_ENDSHAPE }; /// Form field types commit 7a8f720cc0b1e84339341919f9520cb25ce5df34 Author: Miklos Vajna <vmik...@suse.cz> Date: Fri Jun 28 16:39:48 2013 +0200 RTFValue: support storing RTFShape Change-Id: Ia24fe7556598ad88f3b72a62bef2361a3fd0a712 diff --git a/writerfilter/source/rtftok/rtfvalue.cxx b/writerfilter/source/rtftok/rtfvalue.cxx index a9f31f8..b786b09 100644 --- a/writerfilter/source/rtftok/rtfvalue.cxx +++ b/writerfilter/source/rtftok/rtfvalue.cxx @@ -8,6 +8,7 @@ */ #include <rtfreferenceproperties.hxx> +#include <rtfdocumentimpl.hxx> namespace writerfilter { namespace rtftok { @@ -15,7 +16,8 @@ namespace rtftok { RTFValue::RTFValue(int nValue, OUString sValue, RTFSprms rAttributes, RTFSprms rSprms, uno::Reference<drawing::XShape> xShape, - uno::Reference<io::XInputStream> xStream, uno::Reference<embed::XEmbeddedObject> xObject, bool bForceString) + uno::Reference<io::XInputStream> xStream, uno::Reference<embed::XEmbeddedObject> xObject, bool bForceString, + RTFShape aShape) : m_nValue(nValue), m_sValue(sValue), m_xShape(xShape), @@ -25,6 +27,7 @@ RTFValue::RTFValue(int nValue, OUString sValue, RTFSprms rAttributes, { m_pAttributes.reset(new RTFSprms(rAttributes)); m_pSprms.reset(new RTFSprms(rSprms)); + m_pShape.reset(new RTFShape(aShape)); } RTFValue::RTFValue(int nValue) @@ -37,6 +40,7 @@ RTFValue::RTFValue(int nValue) { m_pAttributes.reset(new RTFSprms()); m_pSprms.reset(new RTFSprms()); + m_pShape.reset(new RTFShape()); } RTFValue::RTFValue(OUString sValue, bool bForce) @@ -49,6 +53,7 @@ RTFValue::RTFValue(OUString sValue, bool bForce) { m_pAttributes.reset(new RTFSprms()); m_pSprms.reset(new RTFSprms()); + m_pShape.reset(new RTFShape()); } RTFValue::RTFValue(RTFSprms rAttributes) @@ -61,6 +66,7 @@ RTFValue::RTFValue(RTFSprms rAttributes) { m_pAttributes.reset(new RTFSprms(rAttributes)); m_pSprms.reset(new RTFSprms()); + m_pShape.reset(new RTFShape()); } RTFValue::RTFValue(RTFSprms rAttributes, RTFSprms rSprms) @@ -73,6 +79,7 @@ RTFValue::RTFValue(RTFSprms rAttributes, RTFSprms rSprms) { m_pAttributes.reset(new RTFSprms(rAttributes)); m_pSprms.reset(new RTFSprms(rSprms)); + m_pShape.reset(new RTFShape()); } RTFValue::RTFValue(uno::Reference<drawing::XShape> rShape) @@ -85,6 +92,7 @@ RTFValue::RTFValue(uno::Reference<drawing::XShape> rShape) { m_pAttributes.reset(new RTFSprms()); m_pSprms.reset(new RTFSprms()); + m_pShape.reset(new RTFShape()); } RTFValue::RTFValue(uno::Reference<io::XInputStream> rStream) @@ -97,6 +105,7 @@ RTFValue::RTFValue(uno::Reference<io::XInputStream> rStream) { m_pAttributes.reset(new RTFSprms()); m_pSprms.reset(new RTFSprms()); + m_pShape.reset(new RTFShape()); } RTFValue::RTFValue(uno::Reference<embed::XEmbeddedObject> xObject) @@ -109,6 +118,20 @@ RTFValue::RTFValue(uno::Reference<embed::XEmbeddedObject> xObject) { m_pAttributes.reset(new RTFSprms()); m_pSprms.reset(new RTFSprms()); + m_pShape.reset(new RTFShape()); +} + +RTFValue::RTFValue(RTFShape aShape) + : m_nValue(), + m_sValue(), + m_xShape(), + m_xStream(), + m_xObject(), + m_bForceString(false) +{ + m_pAttributes.reset(new RTFSprms()); + m_pSprms.reset(new RTFSprms()); + m_pShape.reset(new RTFShape(aShape)); } RTFValue::~RTFValue() @@ -149,6 +172,11 @@ uno::Any RTFValue::getAny() const return ret; } +RTFShape& RTFValue::getShape() const +{ + return *m_pShape; +} + writerfilter::Reference<Properties>::Pointer_t RTFValue::getProperties() { writerfilter::Reference<Properties>::Pointer_t const pProperties( @@ -177,7 +205,7 @@ std::string RTFValue::toString() const RTFValue* RTFValue::Clone() { - return new RTFValue(m_nValue, m_sValue, *m_pAttributes, *m_pSprms, m_xShape, m_xStream, m_xObject, m_bForceString); + return new RTFValue(m_nValue, m_sValue, *m_pAttributes, *m_pSprms, m_xShape, m_xStream, m_xObject, m_bForceString, *m_pShape); } bool RTFValue::equals(RTFValue& rOther) diff --git a/writerfilter/source/rtftok/rtfvalue.hxx b/writerfilter/source/rtftok/rtfvalue.hxx index 02bf931..d42be11 100644 --- a/writerfilter/source/rtftok/rtfvalue.hxx +++ b/writerfilter/source/rtftok/rtfvalue.hxx @@ -17,6 +17,7 @@ namespace writerfilter { namespace rtftok { class RTFSprms; + class RTFShape; /// Value of an RTF keyword class RTFValue : public Value @@ -24,7 +25,8 @@ namespace writerfilter { public: typedef boost::shared_ptr<RTFValue> Pointer_t; RTFValue(int nValue, OUString sValue, RTFSprms rAttributes, RTFSprms rSprms, uno::Reference<drawing::XShape> rShape, - uno::Reference<io::XInputStream> rStream, uno::Reference<embed::XEmbeddedObject> rObject, bool bForceString); + uno::Reference<io::XInputStream> rStream, uno::Reference<embed::XEmbeddedObject> rObject, bool bForceString, + RTFShape aShape); RTFValue(int nValue); RTFValue(OUString sValue, bool bForce = false); RTFValue(RTFSprms rAttributes); @@ -32,6 +34,7 @@ namespace writerfilter { RTFValue(uno::Reference<drawing::XShape> rShape); RTFValue(uno::Reference<io::XInputStream> rStream); RTFValue(uno::Reference<embed::XEmbeddedObject> rObject); + RTFValue(RTFShape aShape); virtual ~RTFValue(); void setString(OUString sValue); virtual int getInt() const; @@ -44,6 +47,7 @@ namespace writerfilter { virtual RTFValue* Clone(); RTFSprms& getAttributes(); RTFSprms& getSprms(); + RTFShape& getShape() const; bool equals(RTFValue& rOther); private: RTFValue& operator=(RTFValue const& rOther); @@ -55,6 +59,7 @@ namespace writerfilter { uno::Reference<io::XInputStream> m_xStream; uno::Reference<embed::XEmbeddedObject> m_xObject; bool m_bForceString; + boost::shared_ptr<RTFShape> m_pShape; }; } // namespace rtftok } // namespace writerfilter _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits