From 3d3066b124b23d18a06fbd14938e18696dc5c9cd Mon Sep 17 00:00:00 2001 From: Miklos Vajna Date: Wed, 27 May 2020 14:04:58 +0200 Subject: oox smartart import, composite alg: implement vertical centering The bugdoc's case was that the total height would be used by 2 shapes, but then a constraint decreases the height of one shape, so not all vertical space is used. We used to just count from the top, need to center vertically, as PowerPoint does it. Change-Id: I436019e9e837b73130e387c9bcd309e20045b0f9 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/94948 Reviewed-by: Miklos Vajna Tested-by: Jenkins (cherry picked from commit acdde3c643fde015214c546b1567727272ea799e) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/94962 --- .../drawingml/diagram/diagramlayoutatoms.cxx | 23 ++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'oox') diff --git a/oox/source/drawingml/diagram/diagramlayoutatoms.cxx b/oox/source/drawingml/diagram/diagramlayoutatoms.cxx index 5e36f08d06ab..36b361db9a3b 100644 --- a/oox/source/drawingml/diagram/diagramlayoutatoms.cxx +++ b/oox/source/drawingml/diagram/diagramlayoutatoms.cxx @@ -478,6 +478,11 @@ void AlgAtom::layoutShape( const ShapePtr& rShape, LayoutProperty& rParent = aProperties[""]; sal_Int32 nParentXOffset = 0; + + // Track min/max vertical positions, so we can center everything at the end, if needed. + sal_Int32 nVertMin = std::numeric_limits::max(); + sal_Int32 nVertMax = 0; + if (mfAspectRatio != 1.0) { rParent[XML_w] = rShape->getSize().Width; @@ -613,6 +618,24 @@ void AlgAtom::layoutShape( const ShapePtr& rShape, aCurrShape->setSize(aSize); aCurrShape->setChildSize(aSize); aCurrShape->setPosition(aPos); + + nVertMin = std::min(aPos.Y, nVertMin); + nVertMax = std::max(aPos.Y + aSize.Height, nVertMax); + } + + // See if all vertical space is used or we have to center the content. + if (nVertMin >= 0 && nVertMax <= rParent[XML_h]) + { + sal_Int32 nDiff = rParent[XML_h] - (nVertMax - nVertMin); + if (nDiff > 0) + { + for (auto& aCurrShape : rShape->getChildren()) + { + awt::Point aPosition = aCurrShape->getPosition(); + aPosition.Y += nDiff / 2; + aCurrShape->setPosition(aPosition); + } + } } break; } -- cgit