summaryrefslogtreecommitdiff
path: root/svx
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.com>2021-10-21 16:49:53 +0200
committerMike Kaganski <mike.kaganski@collabora.com>2021-10-22 11:37:09 +0200
commit7e74c6cf8d0a56cc061f48e1c6f397d393165220 (patch)
tree0264da3a1b6522e272f6ae3659b3e2f6717a21e1 /svx
parentadd784844f736bb92728b1dcc7a2af0b4a54f787 (diff)
tdf#140022 sd: fix inteaction between multi-col shape text and automatic height
Multi-column shape text works by assuming a fixed height, then flowing content to a next column once the current one is full. Automatic height works by first laying out the text and then resizing the shape to have a matching height. When both are enabled, then we used to first calculate the automatic height and then lay out the multi-col text using that height. PowerPoint takes the height from the file format and lays out the multi-col text using that fixed height, and only editing modifies the automatic height. Fix the problem by not updating the automatic height when we have multiple columns, this is meant to improve the stability of the layout anyway. Manual testing shows that editing the text on the UI still updates the automatic height, as probably expected. Based on Mike Kaganski's research - thanks! :-) Change-Id: Iaf46c6008018b4bf26310322f25788a49c1d27f0 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/124048 Tested-by: Mike Kaganski <mike.kaganski@collabora.com> Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
Diffstat (limited to 'svx')
-rw-r--r--svx/qa/unit/data/auto-height-multi-col-shape.pptxbin0 -> 16350 bytes
-rw-r--r--svx/qa/unit/svdraw.cxx28
-rw-r--r--svx/source/svdraw/svdoashp.cxx11
3 files changed, 39 insertions, 0 deletions
diff --git a/svx/qa/unit/data/auto-height-multi-col-shape.pptx b/svx/qa/unit/data/auto-height-multi-col-shape.pptx
new file mode 100644
index 000000000000..12f232b0f236
--- /dev/null
+++ b/svx/qa/unit/data/auto-height-multi-col-shape.pptx
Binary files differ
diff --git a/svx/qa/unit/svdraw.cxx b/svx/qa/unit/svdraw.cxx
index fa344d80acb4..eace4d82131b 100644
--- a/svx/qa/unit/svdraw.cxx
+++ b/svx/qa/unit/svdraw.cxx
@@ -241,6 +241,34 @@ CPPUNIT_TEST_FIXTURE(SvdrawTest, testTextEditEmptyGrabBag)
// old text.
CPPUNIT_ASSERT(!aGrabBag.hasElements());
}
+
+CPPUNIT_TEST_FIXTURE(SvdrawTest, testAutoHeightMultiColShape)
+{
+ // Given a document containing a shape that has:
+ // 1) automatic height (resize shape to fix text)
+ // 2) multiple columns (2)
+ OUString aURL
+ = m_directories.getURLFromSrc(u"svx/qa/unit/data/auto-height-multi-col-shape.pptx");
+
+ // When loading that document:
+ getComponent().set(loadFromDesktop(aURL, "com.sun.star.presentation.PresentationDocument"));
+
+ // Make sure the in-file shape height is kept, even if nominally the the shape height is
+ // automatic:
+ uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(getComponent(), uno::UNO_QUERY);
+ uno::Reference<drawing::XDrawPage> xDrawPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0),
+ uno::UNO_QUERY);
+ uno::Reference<drawing::XShape> xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY);
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected: 6882
+ // - Actual : 3452
+ // i.e. the shape height was smaller than expected, leading to a 2 columns layout instead of
+ // laying out all the text in the first column.
+ // 2477601 is from slide1.xml, <a:ext cx="4229467" cy="2477601"/>.
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(
+ static_cast<sal_Int32>(o3tl::convert(2477601, o3tl::Length::emu, o3tl::Length::mm100)),
+ xShape->getSize().Height, 1);
+}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svx/source/svdraw/svdoashp.cxx b/svx/source/svdraw/svdoashp.cxx
index ea304efdcb6d..86819350e946 100644
--- a/svx/source/svdraw/svdoashp.cxx
+++ b/svx/source/svdraw/svdoashp.cxx
@@ -2331,7 +2331,18 @@ bool SdrObjCustomShape::AdjustTextFrameWidthAndHeight(tools::Rectangle& rR, bool
nHgt=aSiz2.Height()+1; // a little more tolerance
}
else
+ {
nHgt = rOutliner.GetTextHeight()+1; // a little more tolerance
+
+ sal_Int16 nColumns = GetMergedItem(SDRATTR_TEXTCOLUMNS_NUMBER).GetValue();
+ if (bHgtGrow && nColumns > 1)
+ {
+ // Both 'resize shape to fix text' and multiple columns are enabled. The
+ // first means a dynamic height, the second expects a fixed height.
+ // Resolve this conflict by going with the original height.
+ nHgt = rR.getHeight();
+ }
+ }
rOutliner.Clear();
}
}