tdf#132976 DOCX import: fix shape width relative to left margin
using UNO API RelativeWidthRelation and the associated
lo-ext attribute for OpenDocument export.
See commit 43d7f4e3640c5e370fd1204739c2b0c7eb5f40e4
(offapi: document the 4 new properties which are no longer read-only).
Co-authored-by: Balázs Regényi
Change-Id: I2dada8ad764a1fba33d241117cc4bc5eddae74ca
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/95525
Tested-by: László Németh <nemeth@numbertext.org>
Reviewed-by: László Németh <nemeth@numbertext.org>
(cherry picked from commit 7380905abc0833d9e4c4fe731d76174db8a8724c)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/96998
Tested-by: Jenkins
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
diff --git a/sw/qa/extras/ooxmlexport/data/tdf132976_testRelativeAnchorWidthFromLeftMargin.docx b/sw/qa/extras/ooxmlexport/data/tdf132976_testRelativeAnchorWidthFromLeftMargin.docx
new file mode 100644
index 0000000..2f1c556
--- /dev/null
+++ b/sw/qa/extras/ooxmlexport/data/tdf132976_testRelativeAnchorWidthFromLeftMargin.docx
Binary files differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport3.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport3.cxx
index 4df9baf..80ca3e8 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport3.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport3.cxx
@@ -1153,6 +1153,20 @@ DECLARE_OOXMLEXPORT_TEST(testShapeLineWidth, "tdf92526_ShapeLineWidth.odt")
"/wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:ln", "w", "0");
}
DECLARE_OOXMLEXPORT_TEST(testRelativeAnchorWidthFromLeftMargin, "tdf132976_testRelativeAnchorWidthFromLeftMargin.docx")
{
// TODO: Fix export.
if (mbExported)
return;
// tdf#132976 The size of the width of this shape should come from the size of the left margin.
// It was set to the size of the width of the entire page before.
xmlDocUniquePtr pXmlDoc = parseLayoutDump();
const sal_Int32 nAnchoredWidth
= getXPath(pXmlDoc, "//SwAnchoredDrawObject/bounds", "width").toInt32();
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1133), nAnchoredWidth);
}
CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/layout/anchoreddrawobject.cxx b/sw/source/core/layout/anchoreddrawobject.cxx
index 5f60d76..4789ae8 100644
--- a/sw/source/core/layout/anchoreddrawobject.cxx
+++ b/sw/source/core/layout/anchoreddrawobject.cxx
@@ -632,13 +632,18 @@ SwRect SwAnchoredDrawObject::GetObjBoundRect() const
long nTargetWidth = aCurrObjRect.GetWidth( );
if ( GetDrawObj( )->GetRelativeWidth( ) )
{
tools::Rectangle aPageRect;
long nWidth = 0;
if (GetDrawObj()->GetRelativeWidthRelation() == text::RelOrientation::FRAME)
// Exclude margins.
aPageRect = GetPageFrame()->getFramePrintArea().SVRect();
nWidth = GetPageFrame()->getFramePrintArea().SVRect().GetWidth();
// Here we handle the relative size of the width of some shape.
// The size of the shape's width is going to be relative to the size of the left margin.
// E.g.: (left margin = 8 && relative size = 150%) -> width of some shape = 12.
else if (GetDrawObj()->GetRelativeWidthRelation() == text::RelOrientation::PAGE_LEFT)
nWidth = GetPageFrame()->GetLeftMargin();
else
aPageRect = GetPageFrame( )->GetBoundRect( GetPageFrame()->getRootFrame()->GetCurrShell()->GetOut() ).SVRect();
nTargetWidth = aPageRect.GetWidth( ) * (*GetDrawObj( )->GetRelativeWidth());
nWidth = GetPageFrame( )->GetBoundRect( GetPageFrame()->getRootFrame()->GetCurrShell()->GetOut() ).SVRect().GetWidth();
nTargetWidth = nWidth * (*GetDrawObj( )->GetRelativeWidth());
}
long nTargetHeight = aCurrObjRect.GetHeight( );
diff --git a/writerfilter/source/dmapper/GraphicImport.cxx b/writerfilter/source/dmapper/GraphicImport.cxx
index 73333b2..d712808 100644
--- a/writerfilter/source/dmapper/GraphicImport.cxx
+++ b/writerfilter/source/dmapper/GraphicImport.cxx
@@ -945,6 +945,16 @@ void GraphicImport::lcl_attribute(Id nName, Value& rValue)
xPropertySet->setPropertyValue("RelativeWidthRelation", uno::makeAny(text::RelOrientation::FRAME));
}
break;
case NS_ooxml::LN_ST_SizeRelFromH_leftMargin:
if (m_xShape.is())
{
// Here we handle the relative size of the width of some shape.
// The size of the shape's width is going to be relative to the size of the left margin.
// E.g.: (left margin = 8 && relative size = 150%) -> width of some shape = 12.
uno::Reference<beans::XPropertySet> xPropertySet(m_xShape, uno::UNO_QUERY);
xPropertySet->setPropertyValue("RelativeWidthRelation", uno::makeAny(text::RelOrientation::PAGE_LEFT));
}
break;
case NS_ooxml::LN_ST_SizeRelFromH_page:
if (m_xShape.is())
{