oox/source/vml/vmlshape.cxx | 17 +++++++++-- sw/qa/extras/ooxmlexport/data/tdf160049_anchorMarginVML.docx |binary sw/qa/extras/ooxmlexport/ooxmlexport21.cxx | 13 ++++++++ 3 files changed, 27 insertions(+), 3 deletions(-)
New commits: commit e0ef7d54b4e4ccbaaada5d2c4a42ba41d961ea69 Author: Justin Luth <justin.l...@collabora.com> AuthorDate: Tue Mar 5 19:05:29 2024 -0500 Commit: Miklos Vajna <vmik...@collabora.com> CommitDate: Wed Mar 6 11:22:31 2024 +0100 tdf#160049 oox import: use margins with left/right HoriOrientRelation I'm really surprised this wasn't found much earlier. Even DOC format isn't handling this. make CppunitTest_sw_ooxmlexport21 \ CPPUNIT_TEST_NAME=testTdf160049_anchorMarginVML Change-Id: I92ee8eceb6c6bab5f027663bae94d7acdf01be3d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/164442 Tested-by: Jenkins Reviewed-by: Justin Luth <jl...@mail.com> Reviewed-by: Miklos Vajna <vmik...@collabora.com> diff --git a/oox/source/vml/vmlshape.cxx b/oox/source/vml/vmlshape.cxx index 5284de176839..8f16c6267211 100644 --- a/oox/source/vml/vmlshape.cxx +++ b/oox/source/vml/vmlshape.cxx @@ -647,8 +647,13 @@ static void lcl_SetAnchorType(PropertySet& rPropSet, const ShapeTypeModel& rType rPropSet.setAnyProperty(PROP_VertOrient, Any(text::VertOrientation::TOP)); } + // if the anchor is not inline, and is relative to left or right, then apply the margins + bool bHonorMargins = rTypeModel.maPosition == "relative" || rTypeModel.maPosition == "absolute"; if ( rTypeModel.maPositionHorizontal == "center" ) + { rPropSet.setAnyProperty(PROP_HoriOrient, Any(text::HoriOrientation::CENTER)); + bHonorMargins = false; + } else if ( rTypeModel.maPositionHorizontal == "left" ) rPropSet.setAnyProperty(PROP_HoriOrient, Any(text::HoriOrientation::LEFT)); else if ( rTypeModel.maPositionHorizontal == "right" ) @@ -663,6 +668,8 @@ static void lcl_SetAnchorType(PropertySet& rPropSet, const ShapeTypeModel& rType rPropSet.setAnyProperty(PROP_HoriOrient, Any(text::HoriOrientation::RIGHT)); rPropSet.setAnyProperty(PROP_PageToggle, Any(true)); } + else + bHonorMargins = false; if ( rTypeModel.maPositionHorizontalRelative == "page" ) rPropSet.setAnyProperty(PROP_HoriOrientRelation, Any(text::RelOrientation::PAGE_FRAME)); @@ -674,9 +681,13 @@ static void lcl_SetAnchorType(PropertySet& rPropSet, const ShapeTypeModel& rType else if (rTypeModel.maPositionHorizontalRelative == "left-margin-area" || rTypeModel.maPositionHorizontalRelative == "outer-margin-area") rPropSet.setProperty(PROP_HoriOrientRelation, text::RelOrientation::PAGE_LEFT); - else if ( rTypeModel.maPositionHorizontalRelative == "text" ) - rPropSet.setProperty(PROP_HoriOrientRelation, text::RelOrientation::FRAME); - + else // "text" + { + if (bHonorMargins) + rPropSet.setProperty(PROP_HoriOrientRelation, text::RelOrientation::PRINT_AREA); + else + rPropSet.setProperty(PROP_HoriOrientRelation, text::RelOrientation::FRAME); + } if ( rTypeModel.maPositionVertical == "center" ) rPropSet.setAnyProperty(PROP_VertOrient, Any(text::VertOrientation::CENTER)); else if ( rTypeModel.maPositionVertical == "top" ) diff --git a/sw/qa/extras/ooxmlexport/data/tdf160049_anchorMarginVML.docx b/sw/qa/extras/ooxmlexport/data/tdf160049_anchorMarginVML.docx new file mode 100644 index 000000000000..f8cb262f53c8 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf160049_anchorMarginVML.docx differ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport21.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport21.cxx index 2e6c10c99031..d045e18efa32 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport21.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport21.cxx @@ -13,6 +13,7 @@ #include <com/sun/star/awt/Gradient2.hpp> #include <com/sun/star/beans/XPropertyState.hpp> #include <com/sun/star/drawing/FillStyle.hpp> +#include <com/sun/star/text/RelOrientation.hpp> #include <com/sun/star/text/XDocumentIndex.hpp> #include <com/sun/star/text/XTextTable.hpp> #include <com/sun/star/style/LineSpacing.hpp> @@ -292,6 +293,18 @@ DECLARE_OOXMLEXPORT_TEST(testTdf158597, "tdf158597.docx") } } +DECLARE_OOXMLEXPORT_TEST(testTdf160049_anchorMarginVML, "tdf160049_anchorMarginVML.docx") +{ + // given a VML (Word 2003) document with a LEFT "column/text" anchored image + // (which will import as DML compat12 on the round-trip) + if (isExported()) + return; + // The image takes into account the margin, so it looks like it is in the middle of the doc, + // which is "Paragraph text area"/PRINT_AREA/1, not "Entire paragraph area"/FRAME/0 + CPPUNIT_ASSERT_EQUAL(css::text::RelOrientation::PRINT_AREA, + getProperty<sal_Int16>(getShape(1), "HoriOrientRelation")); +} + DECLARE_OOXMLEXPORT_TEST(testTdf153909_followTextFlow, "tdf153909_followTextFlow.docx") { // Although MSO's UI reports "layoutInCell" for the rectangle, it isn't specified or honored