summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin Luth <justin.luth@collabora.com>2024-03-05 19:05:29 -0500
committerMiklos Vajna <vmiklos@collabora.com>2024-03-11 09:44:33 +0100
commit22adb6942a081aaadfcb04adb2bd3746d4034a68 (patch)
treea25f42e64cfbaf011d950ef7c7b4ec3edf84b742
parent18db9d334e1cafddeef53ddff435d6c059aaf803 (diff)
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 <jluth@mail.com> Reviewed-by: Miklos Vajna <vmiklos@collabora.com> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/164581 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
-rw-r--r--oox/source/vml/vmlshape.cxx17
-rw-r--r--sw/qa/extras/ooxmlexport/data/tdf160049_anchorMarginVML.docxbin0 -> 76531 bytes
-rw-r--r--sw/qa/extras/ooxmlexport/ooxmlexport21.cxx13
3 files changed, 27 insertions, 3 deletions
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
--- /dev/null
+++ b/sw/qa/extras/ooxmlexport/data/tdf160049_anchorMarginVML.docx
Binary files differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport21.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport21.cxx
index 7080199c75f5..339e54784843 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>
@@ -290,6 +291,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