include/oox/vml/vmlshape.hxx | 4 + oox/source/vml/vmlshape.cxx | 19 ++++++++ oox/source/vml/vmlshapecontext.cxx | 4 + sw/qa/extras/ooxmlexport/data/table-floating-margins.docx |binary sw/qa/extras/ooxmlexport/ooxmlexport.cxx | 30 ++++++++++++++ sw/source/filter/ww8/docxattributeoutput.cxx | 6 ++ 6 files changed, 62 insertions(+), 1 deletion(-)
New commits: commit e41ce95ca86d37af35e7725edc2f63bd6634051e Author: Miklos Vajna <vmik...@suse.cz> Date: Fri Aug 16 17:50:11 2013 +0200 DOCX export: fix bottom paragraph margin inside text frame Having non-null mpParentFrame during the export of text (not during the export of the frame properties) resulted in getting the frame margins as an SvxULSpaceItem, not the real paragraph margins. Change-Id: Icab8906ef7935a86098d7340f5469e732393663c diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx index c5b1419..2db8917 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx @@ -46,6 +46,7 @@ class Test : public SwModelTestBase { public: + Test(); void testZoom(); void defaultTabStopNotInStyles(); void testFdo38244(); @@ -125,8 +126,15 @@ private: */ xmlDocPtr parseExport(); void assertXPath(xmlDocPtr pXmlDoc, OString aXPath, OString aAttribute = OString(), OUString aExpectedValue = OUString()); + /// If the XPath test for now runs only after one export iteration, check for this variable. + bool m_bImport; }; +Test::Test() + : m_bImport(false) +{ +} + void Test::run() { MethodEntry<Test> aMethods[] = { @@ -204,9 +212,11 @@ void Test::run() { MethodEntry<Test>& rEntry = aMethods[i]; load("/sw/qa/extras/ooxmlexport/data/", rEntry.pName); + m_bImport = true; // If the testcase is stored in some other format, it's pointless to test. if (OString(rEntry.pName).endsWith(".docx") && std::find(vBlacklist.begin(), vBlacklist.end(), rEntry.pName) == vBlacklist.end()) (this->*rEntry.pMethod)(); + m_bImport = false; reload("Office Open XML Text"); (this->*rEntry.pMethod)(); finish(); @@ -242,6 +252,7 @@ void Test::assertXPath(xmlDocPtr pXmlDoc, OString aXPath, OString aAttribute, OU { xmlXPathContextPtr pXmlXpathCtx = xmlXPathNewContext(pXmlDoc); xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("w"), BAD_CAST("http://schemas.openxmlformats.org/wordprocessingml/2006/main")); + xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("v"), BAD_CAST("urn:schemas-microsoft-com:vml")); xmlXPathObjectPtr pXmlXpathObj = xmlXPathEvalExpression(BAD_CAST(aXPath.getStr()), pXmlXpathCtx); xmlNodeSetPtr pXmlNodes = pXmlXpathObj->nodesetval; CPPUNIT_ASSERT_EQUAL(1, xmlXPathNodeSetGetLength(pXmlNodes)); @@ -1156,6 +1167,13 @@ void Test::testTableFloatingMargins() // These were 0, due to lack of import/export. CPPUNIT_ASSERT_EQUAL(sal_Int32(1000), getProperty<sal_Int32>(xFrame, "TopMargin")); CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), getProperty<sal_Int32>(xFrame, "BottomMargin")); + + if (m_bImport) + { + // Paragraph bottom margin wasn't 0 in the A1 cell of the floating table. + xmlDocPtr pXmlDoc = parseExport(); + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:r/w:pict/v:rect/v:textbox/w:txbxContent/w:tbl/w:tr[1]/w:tc[1]/w:p/w:pPr/w:spacing", "after", "0"); + } } CPPUNIT_TEST_SUITE_REGISTRATION(Test); diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index dd88b38..869db45 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -330,6 +330,7 @@ void DocxAttributeOutput::EndParagraph( ww8::WW8TableNodeInfoInner::Pointer_t pT m_pTextboxAttrList = NULL; m_bTextFrameSyntax = false; m_pFlyFrameSize = 0; + m_rExport.mpParentFrame = NULL; m_pSerializer->startElementNS( XML_w, XML_r, FSEND ); m_pSerializer->startElementNS( XML_w, XML_pict, FSEND ); @@ -360,7 +361,6 @@ void DocxAttributeOutput::EndParagraph( ww8::WW8TableNodeInfoInner::Pointer_t pT m_rExport.RestoreData(); - m_rExport.mpParentFrame = NULL; } m_pSerializer->endElementNS( XML_w, XML_p ); commit cea495b0dbb6dcace3a3b46f88f7084d127c0482 Author: Miklos Vajna <vmik...@suse.cz> Date: Fri Aug 16 16:23:13 2013 +0200 DOCX export: implement wrap distance of Writer textframes Change-Id: Ia4a36f18495de9f8a2fb0d2b6691231c7bcbcce4 diff --git a/sw/qa/extras/ooxmlexport/data/table-floating-margins.docx b/sw/qa/extras/ooxmlexport/data/table-floating-margins.docx new file mode 100755 index 0000000..81f6f6c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/table-floating-margins.docx differ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx index fc55bb9..c5b1419 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx @@ -107,6 +107,7 @@ public: void testFdo64350(); void testFdo67013(); void testParaShadow(); + void testTableFloatingMargins(); CPPUNIT_TEST_SUITE(Test); #if !defined(MACOSX) && !defined(WNT) @@ -190,6 +191,7 @@ void Test::run() {"fdo64350.docx", &Test::testFdo64350}, {"fdo67013.docx", &Test::testFdo67013}, {"para-shadow.docx", &Test::testParaShadow}, + {"table-floating-margins.docx", &Test::testTableFloatingMargins}, }; // Don't test the first import of these, for some reason those tests fail const char* aBlacklist[] = { @@ -1146,6 +1148,16 @@ void Test::testParaShadow() CPPUNIT_ASSERT_EQUAL(sal_Int16(TWIP_TO_MM100(24/8*20)), aShadow.ShadowWidth); } +void Test::testTableFloatingMargins() +{ + uno::Reference<text::XTextFramesSupplier> xTextFramesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference<container::XIndexAccess> xIndexAccess(xTextFramesSupplier->getTextFrames(), uno::UNO_QUERY); + uno::Reference<beans::XPropertySet> xFrame(xIndexAccess->getByIndex(0), uno::UNO_QUERY); + // These were 0, due to lack of import/export. + CPPUNIT_ASSERT_EQUAL(sal_Int32(1000), getProperty<sal_Int32>(xFrame, "TopMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), getProperty<sal_Int32>(xFrame, "BottomMargin")); +} + CPPUNIT_TEST_SUITE_REGISTRATION(Test); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index a6904ce..dd88b38 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -4681,6 +4681,8 @@ void DocxAttributeOutput::FormatLRSpace( const SvxLRSpaceItem& rLRSpace ) if (m_bTextFrameSyntax) { + m_aTextFrameStyle.append(";mso-wrap-distance-left:").append(double(rLRSpace.GetLeft()) / 20).append("pt"); + m_aTextFrameStyle.append(";mso-wrap-distance-right:").append(double(rLRSpace.GetRight()) / 20).append("pt"); } else if ( m_rExport.bOutFlyFrmAttrs ) { @@ -4735,6 +4737,8 @@ void DocxAttributeOutput::FormatULSpace( const SvxULSpaceItem& rULSpace ) if (m_bTextFrameSyntax) { + m_aTextFrameStyle.append(";mso-wrap-distance-top:").append(double(rULSpace.GetUpper()) / 20).append("pt"); + m_aTextFrameStyle.append(";mso-wrap-distance-bottom:").append(double(rULSpace.GetLower()) / 20).append("pt"); } else if ( m_rExport.bOutFlyFrmAttrs ) { commit eeae7bf241ce34ac5b946a6b55a53c3f3a1c3d12 Author: Miklos Vajna <vmik...@suse.cz> Date: Fri Aug 16 18:28:26 2013 +0200 VML import of mso-wrap-distance-{left,right,top,bottom} Change-Id: Ib16be0bf83120ed7aeb01f29634d51421fc351c8 diff --git a/include/oox/vml/vmlshape.hxx b/include/oox/vml/vmlshape.hxx index 0312ec1..6ef4805 100644 --- a/include/oox/vml/vmlshape.hxx +++ b/include/oox/vml/vmlshape.hxx @@ -97,6 +97,10 @@ struct OOX_DLLPUBLIC ShapeTypeModel OptValue< ::rtl::OUString > moWrapType; ///< How to wrap the text around the object OptValue< ::rtl::OUString > moWrapSide; ///< On which side to wrap the text around the object OUString maVTextAnchor; ///< How the text inside the shape is anchored vertically. + OUString maWrapDistanceLeft; ///< Distance from the left side of the shape to the text that wraps around it. + OUString maWrapDistanceRight; ///< Distance from the right side of the shape to the text that wraps around it. + OUString maWrapDistanceTop; ///< Distance from the top of the shape to the text that wraps around it. + OUString maWrapDistanceBottom; ///< Distance from the bottom of the shape to the text that wraps around it. explicit ShapeTypeModel(); diff --git a/oox/source/vml/vmlshape.cxx b/oox/source/vml/vmlshape.cxx index 0c88d3f..47d8ceb 100644 --- a/oox/source/vml/vmlshape.cxx +++ b/oox/source/vml/vmlshape.cxx @@ -522,6 +522,25 @@ Reference< XShape > SimpleShape::implConvertAndInsert( const Reference< XShapes Reference< XShape > xShape = mrDrawing.createAndInsertXShape( maService, rxShapes, aShapeRect ); convertShapeProperties( xShape ); + // Handle left/right/top/bottom wrap distance. + const GraphicHelper& rGraphicHelper = mrDrawing.getFilter().getGraphicHelper(); + sal_Int32 nWrapDistanceLeft = 0; + if (!maTypeModel.maWrapDistanceLeft.isEmpty()) + nWrapDistanceLeft = ConversionHelper::decodeMeasureToHmm(rGraphicHelper, maTypeModel.maWrapDistanceLeft, 0, true, true); + PropertySet(xShape).setAnyProperty(PROP_LeftMargin, uno::makeAny(nWrapDistanceLeft)); + sal_Int32 nWrapDistanceRight = 0; + if (!maTypeModel.maWrapDistanceRight.isEmpty()) + nWrapDistanceRight = ConversionHelper::decodeMeasureToHmm(rGraphicHelper, maTypeModel.maWrapDistanceRight, 0, true, true); + PropertySet(xShape).setAnyProperty(PROP_RightMargin, uno::makeAny(nWrapDistanceRight)); + sal_Int32 nWrapDistanceTop = 0; + if (!maTypeModel.maWrapDistanceTop.isEmpty()) + nWrapDistanceTop = ConversionHelper::decodeMeasureToHmm(rGraphicHelper, maTypeModel.maWrapDistanceTop, 0, false, true); + PropertySet(xShape).setAnyProperty(PROP_TopMargin, uno::makeAny(nWrapDistanceTop)); + sal_Int32 nWrapDistanceBottom = 0; + if (!maTypeModel.maWrapDistanceBottom.isEmpty()) + nWrapDistanceBottom = ConversionHelper::decodeMeasureToHmm(rGraphicHelper, maTypeModel.maWrapDistanceBottom, 0, false, true); + PropertySet(xShape).setAnyProperty(PROP_BottomMargin, uno::makeAny(nWrapDistanceBottom)); + if ( maService.equalsAscii( "com.sun.star.text.TextFrame" ) ) { PropertySet( xShape ).setAnyProperty( PROP_FrameIsAutomaticHeight, makeAny( maTypeModel.mbAutoHeight ) ); diff --git a/oox/source/vml/vmlshapecontext.cxx b/oox/source/vml/vmlshapecontext.cxx index 3c47c66..48340d5 100644 --- a/oox/source/vml/vmlshapecontext.cxx +++ b/oox/source/vml/vmlshapecontext.cxx @@ -418,6 +418,10 @@ void ShapeTypeContext::setStyle( const OUString& rStyle ) mrTypeModel.mbVisible = !aValue.equalsAscii( "hidden" ); else if( aName == "mso-wrap-style" ) mrTypeModel.maWrapStyle = aValue; else if ( aName == "v-text-anchor" ) mrTypeModel.maVTextAnchor = aValue; + else if ( aName == "mso-wrap-distance-left" ) mrTypeModel.maWrapDistanceLeft = aValue; + else if ( aName == "mso-wrap-distance-right" ) mrTypeModel.maWrapDistanceRight = aValue; + else if ( aName == "mso-wrap-distance-top" ) mrTypeModel.maWrapDistanceTop = aValue; + else if ( aName == "mso-wrap-distance-bottom" ) mrTypeModel.maWrapDistanceBottom = aValue; } } } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits