tdf#137949 Fix table row heigths.

Consider "Height" property of the the table while calculating
the minimum row height.

Change-Id: I4dbb0f7f87517423fd3075515b4b9817d6a9a71a
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/105422
Tested-by: Jenkins
Tested-by: Xisco Fauli <xiscofauli@libreoffice.org>
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
Reviewed-by: Gülşah Köse <gulsah.kose@collabora.com>
diff --git a/sd/qa/uitest/impress_tests/tdf91762.py b/sd/qa/uitest/impress_tests/tdf91762.py
index 66e650b..3c52b4f 100644
--- a/sd/qa/uitest/impress_tests/tdf91762.py
+++ b/sd/qa/uitest/impress_tests/tdf91762.py
@@ -41,8 +41,7 @@ class tdf91762(UITestCase):
            xEdit.executeAction("TYPE", mkPropertyValues({"KEYCODE": "RETURN"}))

        # tdf#138011: Without the fix in place, this test would have failed with
        # AssertionError: 5504 != 3559
        self.assertEqual(5504, document.DrawPages[0].getByIndex(1).BoundRect.Height)
        self.assertEqual(5494, document.DrawPages[0].getByIndex(1).BoundRect.Height)

        self.ui_test.close_doc()

diff --git a/sd/qa/unit/data/pptx/tablescale.pptx b/sd/qa/unit/data/pptx/tablescale.pptx
new file mode 100644
index 0000000..c4d946e
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tablescale.pptx
Binary files differ
diff --git a/sd/qa/unit/import-tests.cxx b/sd/qa/unit/import-tests.cxx
index 11cbbb4..6e6b08d 100644
--- a/sd/qa/unit/import-tests.cxx
+++ b/sd/qa/unit/import-tests.cxx
@@ -1482,9 +1482,27 @@ void SdImportTest::testRowHeight()
    uno::Reference< css::table::XTableRows > xRows( xTable->getRows(), uno::UNO_SET_THROW);
    uno::Reference< beans::XPropertySet > xRefRow( xRows->getByIndex(0), uno::UNO_QUERY_THROW );
    xRefRow->getPropertyValue( "Height" ) >>= nHeight;
    CPPUNIT_ASSERT_EQUAL( sal_Int32(507), nHeight);
    CPPUNIT_ASSERT_EQUAL( sal_Int32(508), nHeight);

    xDocShRef->DoClose();

    sd::DrawDocShellRef xDocShRef2 = loadURL( m_directories.getURLFromSrc("/sd/qa/unit/data/pptx/tablescale.pptx"), PPTX );
    const SdrPage *pPage2 = GetPage( 1, xDocShRef2 );

    sdr::table::SdrTableObj *pTableObj2 = dynamic_cast<sdr::table::SdrTableObj*>(pPage2->GetObj(0));
    CPPUNIT_ASSERT( pTableObj2 );

    uno::Reference< css::table::XTable > xTable2(pTableObj2->getTable(), uno::UNO_SET_THROW);
    uno::Reference< css::table::XTableRows > xRows2( xTable2->getRows(), uno::UNO_SET_THROW);

    for(sal_Int32 nRow = 0; nRow < 7; ++nRow)
    {
        uno::Reference< beans::XPropertySet > xRefRow2( xRows2->getByIndex(nRow), uno::UNO_QUERY_THROW );
        xRefRow2->getPropertyValue( "Height" ) >>= nHeight;
        CPPUNIT_ASSERT_EQUAL( sal_Int32(800), nHeight);
    }

    xDocShRef2->DoClose();
}

void SdImportTest::testTdf93830()
diff --git a/svx/source/table/tablelayouter.cxx b/svx/source/table/tablelayouter.cxx
index 1c369e6..6859d0a 100644
--- a/svx/source/table/tablelayouter.cxx
+++ b/svx/source/table/tablelayouter.cxx
@@ -725,6 +725,7 @@ void TableLayouter::LayoutTableHeight( tools::Rectangle& rArea, bool bFit )
{
    const sal_Int32 nColCount = getColumnCount();
    const sal_Int32 nRowCount = getRowCount();

    if( nRowCount == 0 )
        return;

@@ -741,10 +742,14 @@ void TableLayouter::LayoutTableHeight( tools::Rectangle& rArea, bool bFit )
    sal_Int32 nCol, nRow;
    for( nRow = 0; nRow < nRowCount; ++nRow )
    {
        Reference< XPropertySet > xRowSet( xRows->getByIndex(nRow), UNO_QUERY_THROW );
        sal_Int32 nRowPropHeight = 0;
        xRowSet->getPropertyValue( gsSize ) >>= nRowPropHeight;
        sal_Int32 nMinHeight = 0;

        bool bIsEmpty = true; // check if all cells in this row are merged
        bool bRowHasText = false;
        bool bRowHasCellInEditMode = false;

        for( nCol = 0; nCol < nColCount; ++nCol )
        {
@@ -762,7 +767,12 @@ void TableLayouter::LayoutTableHeight( tools::Rectangle& rArea, bool bFit )
                else
                {
                    bool bCellHasText = xCell->hasText();
                    if (bRowHasText == bCellHasText)
                    bool bCellInEditMode = xCell->IsTextEditActive();

                    if (!bRowHasCellInEditMode && bCellInEditMode)
                        bRowHasCellInEditMode = true;

                    if ((bRowHasText == bCellHasText) || (bRowHasText && bCellInEditMode))
                    {
                        nMinHeight = std::max( nMinHeight, xCell->getMinimumHeight() );
                    }
@@ -771,6 +781,19 @@ void TableLayouter::LayoutTableHeight( tools::Rectangle& rArea, bool bFit )
                        bRowHasText = true;
                        nMinHeight = xCell->getMinimumHeight();
                    }

                    // tdf#137949  We should consider "Heigth" property while calculating minimum height.
                    // This control decides when we use "Heigth" property value instead of calculated minimum height
                    //     Case 1: * Row has "Heigth" property
                    //             * Calculated minimum heigth is smaller than Height propery value.
                    //     Case 2: * Row has "Heigth" property
                    //             * Calculated minimum heigth is bigger than Height propery value and
                    //             * Row has not any text of any cell in edit mode in the row (means completely empty)
                    if ((nMinHeight < nRowPropHeight && nRowPropHeight > 0 ) ||
                        (nMinHeight > nRowPropHeight && nRowPropHeight > 0 && (!bRowHasText && !bRowHasCellInEditMode)))
                    {
                        nMinHeight = nRowPropHeight;
                    }
                }
            }
        }
@@ -784,7 +807,6 @@ void TableLayouter::LayoutTableHeight( tools::Rectangle& rArea, bool bFit )
        else
        {
            sal_Int32 nRowHeight = 0;
            Reference< XPropertySet > xRowSet( xRows->getByIndex(nRow), UNO_QUERY_THROW );

            bool bOptimal = false;
            xRowSet->getPropertyValue( sOptimalSize ) >>= bOptimal;