sw/qa/extras/ooxmlimport/data/table-floating-margins.docx |binary sw/qa/extras/ooxmlimport/ooxmlimport.cxx | 16 +++++- writerfilter/source/dmapper/DomainMapperTableHandler.cxx | 37 ++++++++------ writerfilter/source/dmapper/DomainMapperTableHandler.hxx | 2 writerfilter/source/dmapper/TablePositionHandler.cxx | 33 ++++++++---- writerfilter/source/dmapper/TablePositionHandler.hxx | 6 +- writerfilter/source/ooxml/model.xml | 12 +++- 7 files changed, 71 insertions(+), 35 deletions(-)
New commits: commit 66b4bfe302e248fc1503c5c74b83f4fb5fee4026 Author: Miklos Vajna <[email protected]> Date: Thu Aug 15 17:06:57 2013 +0200 DOCX import: handle custom left cell margin for float table position Change-Id: I5bc51b739c663d3e123c9d7fb4c2a70f01f8c841 diff --git a/sw/qa/extras/ooxmlimport/data/table-floating-margins.docx b/sw/qa/extras/ooxmlimport/data/table-floating-margins.docx new file mode 100755 index 0000000..81f6f6c Binary files /dev/null and b/sw/qa/extras/ooxmlimport/data/table-floating-margins.docx differ diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx index bf7db73..3f62931 100644 --- a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx +++ b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx @@ -129,6 +129,7 @@ public: void testGroupshapeRotation(); void testBnc780044Spacing(); void testTableFloating(); + void testTableFloatingMargins(); CPPUNIT_TEST_SUITE(Test); #if !defined(MACOSX) && !defined(WNT) @@ -223,6 +224,7 @@ void Test::run() {"groupshape-rotation.docx", &Test::testGroupshapeRotation}, {"bnc780044_spacing.docx", &Test::testBnc780044Spacing}, {"table-floating.docx", &Test::testTableFloating}, + {"table-floating-margins.docx", &Test::testTableFloatingMargins}, }; header(); for (unsigned int i = 0; i < SAL_N_ELEMENTS(aMethods); ++i) @@ -1569,6 +1571,18 @@ void Test::testTableFloating() CPPUNIT_ASSERT_EQUAL(sal_Int32(250), getProperty<sal_Int32>(xFrame, "RightMargin")); } +void Test::testTableFloatingMargins() +{ + // In case the table had custom left cell margin, the horizontal position was still incorrect (too small, -199). + 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); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-499), getProperty<sal_Int32>(xFrame, "HoriOrientPosition")); + // These were 0 as well, due to lack of import. + 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/writerfilter/source/dmapper/DomainMapperTableHandler.cxx b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx index 72d7c74..3d99fa2 100644 --- a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx +++ b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx @@ -38,6 +38,8 @@ namespace dmapper { using namespace ::com::sun::star; using namespace ::std; +#define DEF_BORDER_DIST 190 //0,19cm + #ifdef DEBUG_DMAPPER_TABLE_HANDLER static void lcl_printProperties( PropertyMapPtr pProps ) { @@ -306,6 +308,22 @@ bool lcl_extractTableBorderProperty(PropertyMapPtr pTableProperties, const Prope } +void lcl_DecrementHoriOrientPosition(uno::Sequence<beans::PropertyValue>& rFrameProperties, sal_Int32 nAmount) +{ + // Shifts the frame left by the given value. + for (sal_Int32 i = 0; i < rFrameProperties.getLength(); ++i) + { + beans::PropertyValue& rPropertyValue = rFrameProperties[i]; + if (rPropertyValue.Name == "HoriOrientPosition") + { + sal_Int32 nValue = rPropertyValue.Value.get<sal_Int32>(); + nValue -= nAmount; + rPropertyValue.Value <<= nValue; + return; + } + } +} + TableStyleSheetEntry * DomainMapperTableHandler::endTableGetTableStyle(TableInfo & rInfo, uno::Sequence<beans::PropertyValue>& rFrameProperties) { // will receive the table style if any @@ -401,8 +419,10 @@ TableStyleSheetEntry * DomainMapperTableHandler::endTableGetTableStyle(TableInfo m_aTableProperties->Insert( PROP_TABLE_BORDER_DISTANCES, uno::makeAny( aDistances ) ); + if (rFrameProperties.hasElements()) + lcl_DecrementHoriOrientPosition(rFrameProperties, rInfo.nLeftBorderDistance); + // Set table above/bottom spacing to 0. - // TODO: handle 'Around' text wrapping mode m_aTableProperties->Insert( PROP_TOP_MARGIN, uno::makeAny( sal_Int32( 0 ) ) ); m_aTableProperties->Insert( PROP_BOTTOM_MARGIN, uno::makeAny( sal_Int32( 0 ) ) ); @@ -430,20 +450,7 @@ TableStyleSheetEntry * DomainMapperTableHandler::endTableGetTableStyle(TableInfo if (!rFrameProperties.hasElements()) rInfo.nLeftBorderDistance += aLeftBorder.LineWidth * 0.5; else - { - // If this is a floating table, then the position of the frame should be adjusted, instead. - for (sal_Int32 i = 0; i < rFrameProperties.getLength(); ++i) - { - beans::PropertyValue& rPropertyValue = rFrameProperties[i]; - if (rPropertyValue.Name == "HoriOrientPosition") - { - sal_Int32 nValue = rPropertyValue.Value.get<sal_Int32>(); - nValue -= aLeftBorder.LineWidth * 0.5; - rPropertyValue.Value <<= nValue; - break; - } - } - } + lcl_DecrementHoriOrientPosition(rFrameProperties, aLeftBorder.LineWidth * 0.5); } } if (lcl_extractTableBorderProperty(m_aTableProperties, PROP_RIGHT_BORDER, rInfo, aBorderLine)) diff --git a/writerfilter/source/dmapper/DomainMapperTableHandler.hxx b/writerfilter/source/dmapper/DomainMapperTableHandler.hxx index 792b978..3dc75af 100644 --- a/writerfilter/source/dmapper/DomainMapperTableHandler.hxx +++ b/writerfilter/source/dmapper/DomainMapperTableHandler.hxx @@ -45,8 +45,6 @@ typedef ::com::sun::star::uno::Sequence< RowPropertyValuesSeq_t> CellProperty typedef std::vector<PropertyMapPtr> PropertyMapVector1; typedef std::vector<PropertyMapVector1> PropertyMapVector2; -#define DEF_BORDER_DIST 190 //0,19cm - class DomainMapper_Impl; class TableStyleSheetEntry; struct TableInfo; diff --git a/writerfilter/source/dmapper/TablePositionHandler.cxx b/writerfilter/source/dmapper/TablePositionHandler.cxx index 1ecf6c6..e584a2e 100644 --- a/writerfilter/source/dmapper/TablePositionHandler.cxx +++ b/writerfilter/source/dmapper/TablePositionHandler.cxx @@ -33,8 +33,7 @@ TablePositionHandler::TablePositionHandler() : m_nLeftFromText(0), m_nRightFromText(0), m_nTopFromText(0), - m_nBottomFromText(0), - m_nLeftBorderDistance(DEF_BORDER_DIST) + m_nBottomFromText(0) { } @@ -150,7 +149,7 @@ uno::Sequence<beans::PropertyValue> TablePositionHandler::getTablePosition() con pFrameProperties[13].Name = "HoriOrientRelation"; pFrameProperties[13].Value <<= nHoriOrientRelation; pFrameProperties[14].Name = "HoriOrientPosition"; - pFrameProperties[14].Value <<= m_nX - m_nLeftBorderDistance; + pFrameProperties[14].Value <<= m_nX; // Vertical positioning diff --git a/writerfilter/source/dmapper/TablePositionHandler.hxx b/writerfilter/source/dmapper/TablePositionHandler.hxx index d68800c..a264dff 100644 --- a/writerfilter/source/dmapper/TablePositionHandler.hxx +++ b/writerfilter/source/dmapper/TablePositionHandler.hxx @@ -31,7 +31,6 @@ namespace writerfilter { sal_Int32 m_nRightFromText; sal_Int32 m_nTopFromText; sal_Int32 m_nBottomFromText; - sal_Int32 m_nLeftBorderDistance; // Properties virtual void lcl_attribute(Id Name, Value & val); commit 26d9efd36a16d2095d8fb885290c6816082ec814 Author: Miklos Vajna <[email protected]> Date: Thu Aug 15 10:40:35 2013 +0200 DOCX import: handle w:leftFromText and w:rightFromText for floating tables Left margin wasn't implemented, that's simple. Right margin of the table was set to the cell margin in commit 53d27a30ce5f2c9f7d37a4089286116854c16215, which turns out to be wrong: it's true that the right margin should be >0, but not because of the cell margin but because of the table margin. The new behavior matches what the binary import always did. Change-Id: Ifc24e4f086c49d5d575defdfca1d27e497fa03dc diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx index c85b288..bf7db73 100644 --- a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx +++ b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx @@ -1566,7 +1566,7 @@ void Test::testTableFloating() // This was 0, should be the the opposite of (left margin + half of the border width). CPPUNIT_ASSERT_EQUAL(sal_Int32(-199), getProperty<sal_Int32>(xFrame, "HoriOrientPosition")); // Was 0 as well, should be the right margin. - CPPUNIT_ASSERT_EQUAL(sal_Int32(191), getProperty<sal_Int32>(xFrame, "RightMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(250), getProperty<sal_Int32>(xFrame, "RightMargin")); } CPPUNIT_TEST_SUITE_REGISTRATION(Test); diff --git a/writerfilter/source/dmapper/TablePositionHandler.cxx b/writerfilter/source/dmapper/TablePositionHandler.cxx index 19613a0..1ecf6c6 100644 --- a/writerfilter/source/dmapper/TablePositionHandler.cxx +++ b/writerfilter/source/dmapper/TablePositionHandler.cxx @@ -30,10 +30,11 @@ TablePositionHandler::TablePositionHandler() : m_aXSpec( ), m_nY( 0 ), m_nX( 0 ), + m_nLeftFromText(0), + m_nRightFromText(0), m_nTopFromText(0), m_nBottomFromText(0), - m_nLeftBorderDistance(DEF_BORDER_DIST), - m_nRightBorderDistance(DEF_BORDER_DIST) + m_nLeftBorderDistance(DEF_BORDER_DIST) { } @@ -64,6 +65,12 @@ void TablePositionHandler::lcl_attribute(Id rName, Value& rVal) case NS_ooxml::LN_CT_TblPPr_tblpX: m_nX = rVal.getInt(); break; + case NS_ooxml::LN_CT_TblPPr_leftFromText: + m_nLeftFromText = rVal.getInt(); + break; + case NS_ooxml::LN_CT_TblPPr_rightFromText: + m_nRightFromText = rVal.getInt(); + break; case NS_ooxml::LN_CT_TblPPr_topFromText: m_nTopFromText = rVal.getInt(); break; @@ -86,7 +93,7 @@ void TablePositionHandler::lcl_sprm(Sprm& /*rSprm*/) uno::Sequence<beans::PropertyValue> TablePositionHandler::getTablePosition() const { - uno::Sequence< beans::PropertyValue > aFrameProperties(19); + uno::Sequence< beans::PropertyValue > aFrameProperties(18); beans::PropertyValue* pFrameProperties = aFrameProperties.getArray(); pFrameProperties[0].Name = "LeftBorderDistance"; @@ -99,9 +106,9 @@ uno::Sequence<beans::PropertyValue> TablePositionHandler::getTablePosition() con pFrameProperties[3].Value <<= sal_Int32(0); pFrameProperties[4].Name = "LeftMargin"; - pFrameProperties[4].Value <<= sal_Int32(0); + pFrameProperties[4].Value <<= ConversionHelper::convertTwipToMM100(m_nLeftFromText); pFrameProperties[5].Name = "RightMargin"; - pFrameProperties[5].Value <<= sal_Int32(0); + pFrameProperties[5].Value <<= ConversionHelper::convertTwipToMM100(m_nRightFromText); pFrameProperties[6].Name = "TopMargin"; pFrameProperties[6].Value <<= ConversionHelper::convertTwipToMM100(m_nTopFromText); pFrameProperties[7].Name = "BottomMargin"; @@ -172,9 +179,6 @@ uno::Sequence<beans::PropertyValue> TablePositionHandler::getTablePosition() con pFrameProperties[17].Name = "VertOrientPosition"; pFrameProperties[17].Value <<= m_nY; - pFrameProperties[18].Name = "RightMargin"; - pFrameProperties[18].Value <<= m_nRightBorderDistance; - return aFrameProperties; } diff --git a/writerfilter/source/dmapper/TablePositionHandler.hxx b/writerfilter/source/dmapper/TablePositionHandler.hxx index 366a6e4..d68800c 100644 --- a/writerfilter/source/dmapper/TablePositionHandler.hxx +++ b/writerfilter/source/dmapper/TablePositionHandler.hxx @@ -27,10 +27,11 @@ namespace writerfilter { OUString m_aXSpec; sal_Int32 m_nY; sal_Int32 m_nX; + sal_Int32 m_nLeftFromText; + sal_Int32 m_nRightFromText; sal_Int32 m_nTopFromText; sal_Int32 m_nBottomFromText; sal_Int32 m_nLeftBorderDistance; - sal_Int32 m_nRightBorderDistance; // Properties virtual void lcl_attribute(Id Name, Value & val); diff --git a/writerfilter/source/ooxml/model.xml b/writerfilter/source/ooxml/model.xml index 402323f..ea8f082 100644 --- a/writerfilter/source/ooxml/model.xml +++ b/writerfilter/source/ooxml/model.xml @@ -17985,11 +17985,11 @@ </define> <define name="CT_TblPPr"> <attribute name="leftFromText"> - <text/> + <ref name="ST_SignedTwipsMeasure"/> <xs:documentation>Distance From Left of Table to Text</xs:documentation> </attribute> <attribute name="rightFromText"> - <text/> + <ref name="ST_SignedTwipsMeasure"/> <xs:documentation>(Distance From Right of Table to Text</xs:documentation> </attribute> <attribute name="topFromText"> @@ -22913,6 +22913,8 @@ <attribute name="tblpXSpec" tokenid="ooxml:CT_TblPPr_tblpXSpec"/> <attribute name="tblpY" tokenid="ooxml:CT_TblPPr_tblpY"/> <attribute name="tblpX" tokenid="ooxml:CT_TblPPr_tblpX"/> + <attribute name="leftFromText" tokenid="ooxml:CT_TblPPr_leftFromText"/> + <attribute name="rightFromText" tokenid="ooxml:CT_TblPPr_rightFromText"/> <attribute name="topFromText" tokenid="ooxml:CT_TblPPr_topFromText"/> <attribute name="bottomFromText" tokenid="ooxml:CT_TblPPr_bottomFromText"/> </resource> commit 69fd51d606619d90f291059b1cd82ec65a2c91e5 Author: Miklos Vajna <[email protected]> Date: Thu Aug 15 10:21:00 2013 +0200 DOCX import: handle w:topFromText and w:bottomFromText for floating tables Change-Id: Ia3a95d785d19f7be750e3723c1c159395ae8476f diff --git a/writerfilter/source/dmapper/TablePositionHandler.cxx b/writerfilter/source/dmapper/TablePositionHandler.cxx index 6d32bba..19613a0 100644 --- a/writerfilter/source/dmapper/TablePositionHandler.cxx +++ b/writerfilter/source/dmapper/TablePositionHandler.cxx @@ -30,6 +30,8 @@ TablePositionHandler::TablePositionHandler() : m_aXSpec( ), m_nY( 0 ), m_nX( 0 ), + m_nTopFromText(0), + m_nBottomFromText(0), m_nLeftBorderDistance(DEF_BORDER_DIST), m_nRightBorderDistance(DEF_BORDER_DIST) { @@ -62,6 +64,12 @@ void TablePositionHandler::lcl_attribute(Id rName, Value& rVal) case NS_ooxml::LN_CT_TblPPr_tblpX: m_nX = rVal.getInt(); break; + case NS_ooxml::LN_CT_TblPPr_topFromText: + m_nTopFromText = rVal.getInt(); + break; + case NS_ooxml::LN_CT_TblPPr_bottomFromText: + m_nBottomFromText = rVal.getInt(); + break; default: #ifdef DEBUG_DOMAINMAPPER dmapper_logger->element("unhandled"); @@ -95,9 +103,9 @@ uno::Sequence<beans::PropertyValue> TablePositionHandler::getTablePosition() con pFrameProperties[5].Name = "RightMargin"; pFrameProperties[5].Value <<= sal_Int32(0); pFrameProperties[6].Name = "TopMargin"; - pFrameProperties[6].Value <<= sal_Int32(0); + pFrameProperties[6].Value <<= ConversionHelper::convertTwipToMM100(m_nTopFromText); pFrameProperties[7].Name = "BottomMargin"; - pFrameProperties[7].Value <<= sal_Int32(0); + pFrameProperties[7].Value <<= ConversionHelper::convertTwipToMM100(m_nBottomFromText); table::BorderLine2 aEmptyBorder; pFrameProperties[8].Name = "TopBorder"; diff --git a/writerfilter/source/dmapper/TablePositionHandler.hxx b/writerfilter/source/dmapper/TablePositionHandler.hxx index 43eabbc..366a6e4 100644 --- a/writerfilter/source/dmapper/TablePositionHandler.hxx +++ b/writerfilter/source/dmapper/TablePositionHandler.hxx @@ -27,6 +27,8 @@ namespace writerfilter { OUString m_aXSpec; sal_Int32 m_nY; sal_Int32 m_nX; + sal_Int32 m_nTopFromText; + sal_Int32 m_nBottomFromText; sal_Int32 m_nLeftBorderDistance; sal_Int32 m_nRightBorderDistance; diff --git a/writerfilter/source/ooxml/model.xml b/writerfilter/source/ooxml/model.xml index 64126ce..402323f 100644 --- a/writerfilter/source/ooxml/model.xml +++ b/writerfilter/source/ooxml/model.xml @@ -17993,11 +17993,11 @@ <xs:documentation>(Distance From Right of Table to Text</xs:documentation> </attribute> <attribute name="topFromText"> - <text/> + <ref name="ST_SignedTwipsMeasure"/> <xs:documentation>Distance From Top of Table to Text</xs:documentation> </attribute> <attribute name="bottomFromText"> - <text/> + <ref name="ST_SignedTwipsMeasure"/> <xs:documentation>Distance From Bottom of Table to Text</xs:documentation> </attribute> <attribute name="vertAnchor"> @@ -22913,6 +22913,8 @@ <attribute name="tblpXSpec" tokenid="ooxml:CT_TblPPr_tblpXSpec"/> <attribute name="tblpY" tokenid="ooxml:CT_TblPPr_tblpY"/> <attribute name="tblpX" tokenid="ooxml:CT_TblPPr_tblpX"/> + <attribute name="topFromText" tokenid="ooxml:CT_TblPPr_topFromText"/> + <attribute name="bottomFromText" tokenid="ooxml:CT_TblPPr_bottomFromText"/> </resource> <resource name="CT_TblGridCol" resource="Value" tag="table"> <attribute name="w" tokenid="ooxml:CT_TblGridCol_w" action="setValue"/> _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
