sw/qa/extras/layout/data/tdf164907_rowHeightAtLeast.docx |binary
 sw/qa/extras/layout/layout4.cxx                          |    7 +++++
 sw/source/core/layout/tabfrm.cxx                         |   21 ++++++++++++++-
 3 files changed, 27 insertions(+), 1 deletion(-)

New commits:
commit 2a47fa27a1ce9bf115ab9f060c61217a51da644a
Author:     Justin Luth <justin.l...@collabora.com>
AuthorDate: Mon Feb 24 18:54:08 2025 -0500
Commit:     Christian Lohmaier <lohmaier+libreoff...@googlemail.com>
CommitDate: Fri Mar 7 14:22:13 2025 +0100

    tdf#164907 sw: Calculate row height adds border if 'atLeast' set #2
    
    The idea in 25.2 commit 4f5b896d004af023f210f235aeafa9abc50068d2
    was to add the border line's width to the atLeast row height.
    However, the function used also included the border spacing,
    which is not (really) correct.
    
    [It appears that the BOTTOM border padding should be added,
     but that is true for both the atLeast and the 'exact' cases,
     so that change should be handled separately.]
    
    In MS Word, the bottom border of one row
    is also the top border of the next row (IsCollapsedBorders()).
    The bottom border line width seems to be irrelvant
    in regards to the height of the row,
    so the fact that the code only adds the top border seems correct.
    The last row puts the bottom border _below_ the row.
    
    make CppunitTest_sw_layoutwriter4 \
        CPPUNIT_TEST_NAME=TestTdf164907_rowHeightAtLeast
    
    Change-Id: I756d38109a724d06e6230f5607b80a0bdc059bc6
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182139
    Tested-by: Jenkins
    Reviewed-by: Justin Luth <jl...@mail.com>
    (cherry picked from commit e9ed6f1d2cc145e7514bf0a27b8c77f370ceab2d)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182379
    Tested-by: Christian Lohmaier <lohmaier+libreoff...@googlemail.com>
    Reviewed-by: Christian Lohmaier <lohmaier+libreoff...@googlemail.com>

diff --git a/sw/qa/extras/layout/data/tdf164907_rowHeightAtLeast.docx 
b/sw/qa/extras/layout/data/tdf164907_rowHeightAtLeast.docx
new file mode 100644
index 000000000000..e42a7e34d405
Binary files /dev/null and 
b/sw/qa/extras/layout/data/tdf164907_rowHeightAtLeast.docx differ
diff --git a/sw/qa/extras/layout/layout4.cxx b/sw/qa/extras/layout/layout4.cxx
index 36af7e749aae..eb9abea5a538 100644
--- a/sw/qa/extras/layout/layout4.cxx
+++ b/sw/qa/extras/layout/layout4.cxx
@@ -1610,6 +1610,13 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter4, 
TestTdf155229RowAtLeast)
     CPPUNIT_ASSERT_EQUAL(sal_Int32(15494), nTableHeight);
 }
 
+CPPUNIT_TEST_FIXTURE(SwLayoutWriter4, TestTdf164907_rowHeightAtLeast)
+{
+    createSwDoc("tdf164907_rowHeightAtLeast.docx");
+
+    CPPUNIT_ASSERT_EQUAL(1, getPages());
+}
+
 CPPUNIT_TEST_FIXTURE(SwLayoutWriter4, TestTdf157829LTR)
 {
     // Verify that line breaking inside a bidi portion triggers underflow to 
previous bidi portions
diff --git a/sw/source/core/layout/tabfrm.cxx b/sw/source/core/layout/tabfrm.cxx
index 9588dc60f073..7195dd82392e 100644
--- a/sw/source/core/layout/tabfrm.cxx
+++ b/sw/source/core/layout/tabfrm.cxx
@@ -213,6 +213,7 @@ static bool lcl_InnerCalcLayout( SwFrame *pFrame,
 // cell height.
 static SwTwips lcl_CalcMinRowHeight( const SwRowFrame *pRow,
                                      const bool _bConsiderObjs );
+static sal_uInt16 lcl_GetLineWidth(const SwRowFrame& rRow, const 
SvxBoxItemLine& rLine);
 static sal_uInt16 lcl_GetTopSpace( const SwRowFrame& rRow );
 
 static SwTwips lcl_CalcTopAndBottomMargin( const SwLayoutFrame&, const 
SwBorderAttrs& );
@@ -4994,7 +4995,7 @@ static SwTwips lcl_CalcMinRowHeight( const SwRowFrame* 
_pRow,
             if (bMinRowHeightInclBorder)
             {
                 //get horizontal border(s)
-                nHeight += lcl_GetTopSpace(*_pRow);
+                nHeight += lcl_GetLineWidth(*_pRow, SvxBoxItemLine::TOP);
             }
         }
     }
@@ -5040,6 +5041,24 @@ static SwTwips lcl_CalcMinRowHeight( const SwRowFrame* 
_pRow,
     return nHeight;
 }
 
+// Calculate the maximum border-line thickness (CalcLineWidth) of all the 
cells in the row
+static sal_uInt16 lcl_GetLineWidth(const SwRowFrame& rRow, const 
SvxBoxItemLine& rLine)
+{
+    sal_uInt16 nBorderThickness = 0;
+    for (const SwCellFrame* pCell = static_cast<const 
SwCellFrame*>(rRow.Lower()); pCell;
+          pCell = static_cast<const SwCellFrame*>(pCell->GetNext()))
+    {
+        sal_uInt16 nTmpWidth = 0;
+        const SwFrame* pLower = pCell->Lower();
+        if (pLower && pLower->IsRowFrame())
+            nTmpWidth = lcl_GetLineWidth(*static_cast<const 
SwRowFrame*>(pLower), rLine);
+        else
+            nTmpWidth = 
pCell->GetFormat()->GetAttrSet().GetBox().CalcLineWidth(rLine);
+        nBorderThickness = std::max(nBorderThickness, nTmpWidth);
+    }
+    return nBorderThickness;
+}
+
 // #i29550#
 
 // Calculate the maximum of (TopLineSize + TopLineDist) over all lowers:

Reply via email to