sw/UITest_sw_ui_frmdlg.mk        |    2 ++
 sw/qa/uitest/ui/frmdlg/frmdlg.py |   18 ++++++++++++++++++
 sw/source/ui/frmdlg/frmpage.cxx  |    8 +++++++-
 3 files changed, 27 insertions(+), 1 deletion(-)

New commits:
commit 4f1121255ebac035a439d242b47c2f81124418c3
Author:     Miklos Vajna <vmik...@collabora.com>
AuthorDate: Tue Nov 7 08:31:29 2023 +0100
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Tue Nov 7 09:52:50 2023 +0100

    sw floattable, insert UI: fix default frame width when inserting a new one
    
    Insert -> Frame -> Frame presented a dialog which stated the width of
    the new frame will be 2cm, but the width was ~zero.
    
    This is a regression from commit
    9da7b1592e010928c26c43ee93b91cdd66403985 (sw: remove all uses of MM50
    with (added) o3tl::toTwip, 2021-07-23). Previously the code worked
    because the 2cm was speficified as MM50*4 (283*4=1132 twips), and we
    compared this to the 2cm from the UI, which had no rounding errors
    (283.46456692913387*4=1134 twips), and this 1132 vs 1134 meant the
    dialog put the unchanged size to the output item set.  Now we don't have
    rounding errors anymore, so we have 1134 everywhere, which means the
    dialog doesn't specify a default size, but no other code would do it,
    resulting in a frame with minimal width, which is clearly not wanted.
    
    Fix the problem by checking if this will be a new frame, and if so, the
    dialog should send the default size to the caller, even if the user
    didn't customize the size.  This restores the lost 2cm default width
    while keeping the rounding improvements.
    
    This requires running the test in its own process, because the
    measurement unit is only loaded once from the config and the rounding
    error is not hit with the default inches.
    
    Change-Id: I9a5945fdd0e5cd64ff8bd84f95f11be5277b8d18
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/159050
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>
    Tested-by: Jenkins

diff --git a/sw/UITest_sw_ui_frmdlg.mk b/sw/UITest_sw_ui_frmdlg.mk
index 0fae8bf25f1d..219a72ddfae3 100644
--- a/sw/UITest_sw_ui_frmdlg.mk
+++ b/sw/UITest_sw_ui_frmdlg.mk
@@ -15,4 +15,6 @@ $(eval $(call gb_UITest_set_defs,sw_ui_frmdlg, \
     TDOC="$(SRCDIR)/sw/qa/uitest/data" \
 ))
 
+$(eval $(call gb_UITest_avoid_oneprocess,sw_ui_frmdlg))
+
 # vim: set noet sw=4 ts=4:
diff --git a/sw/qa/uitest/ui/frmdlg/frmdlg.py b/sw/qa/uitest/ui/frmdlg/frmdlg.py
index e3aeb67c569c..e30b67ff5313 100644
--- a/sw/qa/uitest/ui/frmdlg/frmdlg.py
+++ b/sw/qa/uitest/ui/frmdlg/frmdlg.py
@@ -62,4 +62,22 @@ class Test(UITestCase):
                 # and floating tables.
                 self.assertEqual(get_state_as_dict(xFlysplit)['Visible'], 
"false")
 
+    def test_insert_frame_dialog(self):
+        # Change from inch to cm to hit the rounding error. 2 means 
Centimeter, see
+        # officecfg/registry/schema/org/openoffice/Office/Writer.xcs.
+        with 
self.ui_test.set_config('/org.openoffice.Office.Writer/Layout/Other/MeasureUnit',
 2):
+            # Given a Writer document:
+            with self.ui_test.create_doc_in_start_center("writer") as 
xComponent:
+                # When inserting a new frame with the default width:
+                with 
self.ui_test.execute_dialog_through_command(".uno:InsertFrame") as xDialog:
+                    xWidth = xDialog.getChild("width")
+                    frame_width = float(get_state_as_dict(xWidth)["Value"])
+                # Then make sure the width is not zero:
+                # cm -> mm100
+                expected_mm100 = frame_width * 1000
+                # Without the accompanying fix in place, this test would have 
failed with:
+                # AssertionError: 0 != 2000.0
+                # i.e. the width was empty instead of the size from the UI.
+                self.assertEqual(xComponent.TextFrames.Frame1.Size.Width, 
expected_mm100)
+
 # vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/sw/source/ui/frmdlg/frmpage.cxx b/sw/source/ui/frmdlg/frmpage.cxx
index 352dc15df463..b38ac22d0d11 100644
--- a/sw/source/ui/frmdlg/frmpage.cxx
+++ b/sw/source/ui/frmdlg/frmpage.cxx
@@ -1264,7 +1264,13 @@ bool SwFramePage::FillItemSet(SfxItemSet *rSet)
 
     pOldItem = GetOldItem(*rSet, RES_FRM_SIZE);
 
-    if ((pOldItem && aSz != *pOldItem) || (!pOldItem && !m_bFormat) ||
+    bool bSizeChanged = pOldItem && aSz != *pOldItem;
+    if (!bSizeChanged && m_bNew)
+    {
+        // If no custom size is provided, always set a size for a new frame, 
to avoid ~zero width.
+        bSizeChanged = true;
+    }
+    if (bSizeChanged || (!pOldItem && !m_bFormat) ||
             (m_bFormat &&
                 (aSz.GetWidth() > 0 || aSz.GetWidthPercent() > 0) &&
                     (aSz.GetHeight() > 0 || aSz.GetHeightPercent() > 0)))

Reply via email to