summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.com>2023-05-16 08:31:21 +0200
committerMiklos Vajna <vmiklos@collabora.com>2023-05-16 09:42:18 +0200
commitd9cd177b9b08d454882dd77ffeb825a184a1b540 (patch)
tree7eba3da817fbbb7c09f2717d6082826402789d68
parentbb0edd05b5595e8b795db6ce521491716661a09a (diff)
sw floattable: disable UI if the frame is chained already
TextFrames can be chained and we look at those fly frames as shapes. In this case, we should not offer the "split fly" functionality, which makes sense only when the fly frame is considered as a floating table. The combination of these two features have no use-case and it would just cause trouble when exporting to Word formats. Fix the problem by making SwFramePage::Reset() more strict: it already only allowed fly split for the case when the content was a single table, but now it also requires no chaining. The other way around (split fly -> no chain) still needs doing. Change-Id: I06c240209a3a26519a5df953e22c9ee1b54aed34 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/151822 Reviewed-by: Miklos Vajna <vmiklos@collabora.com> Tested-by: Jenkins
-rw-r--r--sw/qa/uitest/data/chained-frames.odtbin0 -> 10241 bytes
-rw-r--r--sw/qa/uitest/ui/frmdlg/frmdlg.py17
-rw-r--r--sw/source/ui/frmdlg/frmpage.cxx23
3 files changed, 29 insertions, 11 deletions
diff --git a/sw/qa/uitest/data/chained-frames.odt b/sw/qa/uitest/data/chained-frames.odt
new file mode 100644
index 000000000000..281e06520e27
--- /dev/null
+++ b/sw/qa/uitest/data/chained-frames.odt
Binary files differ
diff --git a/sw/qa/uitest/ui/frmdlg/frmdlg.py b/sw/qa/uitest/ui/frmdlg/frmdlg.py
index cfa2dd8ba954..e3aeb67c569c 100644
--- a/sw/qa/uitest/ui/frmdlg/frmdlg.py
+++ b/sw/qa/uitest/ui/frmdlg/frmdlg.py
@@ -13,6 +13,7 @@ import time
from libreoffice.uno.propertyvalue import mkPropertyValues
from uitest.framework import UITestCase
from uitest.uihelper.common import get_state_as_dict
+from uitest.uihelper.common import get_url_for_data_file
class Test(UITestCase):
@@ -44,5 +45,21 @@ class Test(UITestCase):
# Then make sure the doc model is updated correctly:
self.assertEqual(xComponent.TextFrames.Frame1.IsSplitAllowed, True)
+ def test_chained_fly_split(self):
+ # Given a document with 2 chained fly frames:
+ with self.ui_test.load_file(get_url_for_data_file("chained-frames.odt")):
+ # When selecting the first and opening the fly frame properties dialog:
+ self.xUITest.executeCommand(".uno:JumpToNextFrame")
+ # Wait until SwTextShell is replaced with SwDrawShell after 120 ms, as set in the SwView
+ # ctor.
+ time.sleep(0.2)
+ with self.ui_test.execute_dialog_through_command(".uno:FrameDialog") as xDialog:
+ # Then make sure that the 'split' checkbox is hidden:
+ xFlysplit = xDialog.getChild("flysplit")
+ # Without the accompanying fix in place, this test would have failed with:
+ # AssertionError: 'true' != 'false'
+ # i.e. the UI didn't hide this option, leading to some weird mix of chained shapes
+ # and floating tables.
+ self.assertEqual(get_state_as_dict(xFlysplit)['Visible'], "false")
# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/sw/source/ui/frmdlg/frmpage.cxx b/sw/source/ui/frmdlg/frmpage.cxx
index 74ccc1a51809..82bb86e7a095 100644
--- a/sw/source/ui/frmdlg/frmpage.cxx
+++ b/sw/source/ui/frmdlg/frmpage.cxx
@@ -798,15 +798,9 @@ namespace
};
/// Checks if the current fly frame contains exactly one table.
-bool ContainsSingleTable(SwWrtShell* pWrtShell)
+bool ContainsSingleTable(const SwFrameFormat& rFlyFormat)
{
- const SwFrameFormat* pFlyFormat = pWrtShell->GetFlyFrameFormat();
- if (!pFlyFormat)
- {
- return false;
- }
-
- const SwNodeIndex* pStartNode = pFlyFormat->GetContent().GetContentIdx();
+ const SwNodeIndex* pStartNode = rFlyFormat.GetContent().GetContentIdx();
if (!pStartNode)
{
return false;
@@ -830,6 +824,12 @@ bool ContainsSingleTable(SwWrtShell* pWrtShell)
return true;
}
+
+bool ContainsChain(const SwFrameFormat& rFlyFormat)
+{
+ const SwFormatChain& rChain = rFlyFormat.GetChain();
+ return rChain.GetPrev() || rChain.GetNext();
+}
}
void SwFramePage::setOptimalRelWidth()
@@ -1047,10 +1047,11 @@ void SwFramePage::Reset( const SfxItemSet *rSet )
m_xFlySplitCB->set_sensitive(m_xAnchorAtParaRB->get_active());
}
- if (!ContainsSingleTable(pSh))
+ const SwFrameFormat* pFlyFormat = pSh->GetFlyFrameFormat();
+ if (!pFlyFormat || !ContainsSingleTable(*pFlyFormat) || ContainsChain(*pFlyFormat))
{
- // Only allow fly split if the frame contains a single table, otherwise it would be hard the
- // resulting model to Word formats.
+ // Only allow fly split if the frame contains a single table, otherwise it would be hard to
+ // save the resulting model to Word formats.
m_xFlySplitCB->hide();
}