cui/source/tabpages/swpossizetabpage.cxx | 4 - oox/source/vml/vmlshape.cxx | 8 +- sw/qa/core/objectpositioning/data/vml-vertical-alignment.docx |binary sw/qa/core/objectpositioning/objectpositioning.cxx | 40 ++++++++++ 4 files changed, 48 insertions(+), 4 deletions(-)
New commits: commit cf0c04d5fc85acbe6cbeb090de6a739a0d5a8d30 Author: Tibor Nagy <nagy.tib...@nisz.hu> AuthorDate: Thu Sep 10 14:13:37 2020 +0200 Commit: László Németh <nem...@numbertext.org> CommitDate: Tue Sep 15 12:11:39 2020 +0200 tdf#103611 sw: fix vertical alignment to page bottom margin Allow to align objects to page bottom margin vertically in Position and Size settings. Fix also DOCX import of VML shapes. Co-authored-by: Attila Szűcs (NISZ) Change-Id: I78db2553ee9d963b18a2d580b1cbb76c1917ac0b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/102379 Tested-by: László Németh <nem...@numbertext.org> Reviewed-by: László Németh <nem...@numbertext.org> diff --git a/cui/source/tabpages/swpossizetabpage.cxx b/cui/source/tabpages/swpossizetabpage.cxx index e78826bc5105..803b56081007 100644 --- a/cui/source/tabpages/swpossizetabpage.cxx +++ b/cui/source/tabpages/swpossizetabpage.cxx @@ -308,7 +308,7 @@ static FrmMap aHCharHtmlAbsMap[] = // #i18732# - allow vertical alignment at page areas // #i22341# - handle <LB::RelChar> on its own constexpr auto VERT_CHAR_REL = LB::VertFrame|LB::VertPrintArea| - LB::RelPageFrame|LB::RelPagePrintArea; + LB::RelPageFrame|LB::RelPagePrintArea|LB::RelPagePrintAreaBottom; static FrmMap aVCharMap[] = { @@ -323,7 +323,7 @@ static FrmMap aVCharMap[] = {SvxSwFramePosString::BOTTOM, SvxSwFramePosString::BOTTOM, VertOrientation::BOTTOM, VERT_CHAR_REL|LB::RelChar}, {SvxSwFramePosString::BELOW, SvxSwFramePosString::BELOW, VertOrientation::CHAR_BOTTOM, LB::RelChar}, {SvxSwFramePosString::CENTER_VERT, SvxSwFramePosString::CENTER_VERT, VertOrientation::CENTER, VERT_CHAR_REL|LB::RelChar}, - {SvxSwFramePosString::FROMTOP, SvxSwFramePosString::FROMTOP, VertOrientation::NONE, VERT_CHAR_REL|LB::RelPagePrintAreaBottom}, + {SvxSwFramePosString::FROMTOP, SvxSwFramePosString::FROMTOP, VertOrientation::NONE, VERT_CHAR_REL}, {SvxSwFramePosString::FROMBOTTOM, SvxSwFramePosString::FROMBOTTOM, VertOrientation::NONE, LB::RelChar|LB::VertLine}, {SvxSwFramePosString::TOP, SvxSwFramePosString::TOP, VertOrientation::LINE_TOP, LB::VertLine}, {SvxSwFramePosString::BOTTOM, SvxSwFramePosString::BOTTOM, VertOrientation::LINE_BOTTOM, LB::VertLine}, diff --git a/oox/source/vml/vmlshape.cxx b/oox/source/vml/vmlshape.cxx index 905548bafb9e..eb0f886c32b6 100644 --- a/oox/source/vml/vmlshape.cxx +++ b/oox/source/vml/vmlshape.cxx @@ -608,6 +608,10 @@ static void lcl_SetAnchorType(PropertySet& rPropSet, const ShapeTypeModel& rType { rPropSet.setProperty(PROP_VertOrientRelation, text::RelOrientation::PAGE_PRINT_AREA); } + else if (rTypeModel.maPositionVerticalRelative == "bottom-margin-area") + { + rPropSet.setProperty(PROP_VertOrientRelation, text::RelOrientation::PAGE_PRINT_AREA_BOTTOM); + } else { rPropSet.setProperty(PROP_VertOrientRelation, text::RelOrientation::FRAME); @@ -663,9 +667,9 @@ static void lcl_SetAnchorType(PropertySet& rPropSet, const ShapeTypeModel& rType else if ( rTypeModel.maPositionVertical == "bottom" ) rPropSet.setAnyProperty(PROP_VertOrient, makeAny(text::VertOrientation::BOTTOM)); else if ( rTypeModel.maPositionVertical == "inside" ) - rPropSet.setAnyProperty(PROP_VertOrient, makeAny(text::VertOrientation::LINE_TOP)); + rPropSet.setAnyProperty(PROP_VertOrient, makeAny(text::VertOrientation::TOP)); else if ( rTypeModel.maPositionVertical == "outside" ) - rPropSet.setAnyProperty(PROP_VertOrient, makeAny(text::VertOrientation::LINE_BOTTOM)); + rPropSet.setAnyProperty(PROP_VertOrient, makeAny(text::VertOrientation::BOTTOM)); lcl_setSurround( rPropSet, rTypeModel, rGraphicHelper ); } diff --git a/sw/qa/core/objectpositioning/data/vml-vertical-alignment.docx b/sw/qa/core/objectpositioning/data/vml-vertical-alignment.docx new file mode 100644 index 000000000000..36ed5fdfb063 Binary files /dev/null and b/sw/qa/core/objectpositioning/data/vml-vertical-alignment.docx differ diff --git a/sw/qa/core/objectpositioning/objectpositioning.cxx b/sw/qa/core/objectpositioning/objectpositioning.cxx index b6d06022fd7c..13a936500329 100644 --- a/sw/qa/core/objectpositioning/objectpositioning.cxx +++ b/sw/qa/core/objectpositioning/objectpositioning.cxx @@ -231,6 +231,46 @@ CPPUNIT_TEST_FIXTURE(SwCoreObjectpositioningTest, testInsideOutsideVertAlignBott // Verify that the distance between the bottom of body and top of second shape is around 0cm. (align=inside) CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(10), nBodyBottom - nSecondShapeInside); } + +CPPUNIT_TEST_FIXTURE(SwCoreObjectpositioningTest, testVMLVertAlignBottomMargin) +{ + // Load a document, with five shapes. + // The shapes align the top,center,bottom,outside and inside of page print area bottom. + // The height of page print area bottom is 4320 ~ 7.62cm. + // The size of shapes are 442 ~ 0.78cm + load(DATA_DIRECTORY, "vml-vertical-alignment.docx"); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + sal_Int32 nBodyBottom = getXPath(pXmlDoc, "//body/infos/bounds", "bottom").toInt32(); //11803 + sal_Int32 nPageBottom = getXPath(pXmlDoc, "//page/infos/bounds", "bottom").toInt32(); //16123 + + sal_Int32 nFirstVMLShapeInside + = getXPath(pXmlDoc, "//SwAnchoredDrawObject[1]/bounds", "top").toInt32(); //11802 + sal_Int32 nSecondVMLShapeBottom + = getXPath(pXmlDoc, "//SwAnchoredDrawObject[2]/bounds", "bottom").toInt32(); //16124 + sal_Int32 nThirdVMLShapeCenterBottom + = getXPath(pXmlDoc, "//SwAnchoredDrawObject[3]/bounds", "bottom").toInt32(); //14185 + sal_Int32 nThirdVMLShapeCenterTop + = getXPath(pXmlDoc, "//SwAnchoredDrawObject[3]/bounds", "top").toInt32(); //13741 + sal_Int32 nFourthVMLShapeTop + = getXPath(pXmlDoc, "//SwAnchoredDrawObject[4]/bounds", "top").toInt32(); //11802 + sal_Int32 nFifthVMLShapeOutside + = getXPath(pXmlDoc, "//SwAnchoredDrawObject[5]/bounds", "bottom").toInt32(); //16124 + + // Verify that the distance between the bottom of body and top of first VMLshape is around 0cm. (align=inside) + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), nBodyBottom - nFirstVMLShapeInside); + // Verify that the distance between the bottom of page and bottom of second VMLshape is around 0cm. (align=bottom) + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), nSecondVMLShapeBottom - nPageBottom); + // Verify that the distance between the bottom of page and bottom of third VMLshape is around 3.4cm and + // verify that the distance between the bottom of body and top of third shape is around 3.4cm.(align=center) + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1938), nPageBottom - nThirdVMLShapeCenterBottom); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1938), nThirdVMLShapeCenterTop - nBodyBottom); + // Verify that the distance between the bottom of body and top of fourth VMLshape is around 0cm. (align=top) + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), nBodyBottom - nFourthVMLShapeTop); + // Verify that the distance between the bottom of page and bottom of fifth shape is around 0cm. (align=outside) + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), nFifthVMLShapeOutside - nPageBottom); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits