tdf#36383 - sc AutoFilter: fix changing row height
Changing row height showed the rows hidden
by AutoFilter, removing the result of the filtering.
Change-Id: Iecc8eb03ed563de126e7a376dad41a4ab2434f0e
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/139883
Tested-by: Jenkins
Reviewed-by: Eike Rathke <erack@redhat.com>
diff --git a/sc/qa/uitest/autofilter/autofilter.py b/sc/qa/uitest/autofilter/autofilter.py
index 8f6db29..f792c0f 100644
--- a/sc/qa/uitest/autofilter/autofilter.py
+++ b/sc/qa/uitest/autofilter/autofilter.py
@@ -376,6 +376,45 @@ class AutofilterTest(UITestCase):
self.assertFalse(is_row_hidden(doc, 6))
self.assertFalse(is_row_hidden(doc, 7))
def test_tdf36383_row_height(self):
with self.ui_test.create_doc_in_start_center("calc") as document:
calcDoc = self.xUITest.getTopFocusWindow()
gridwin = calcDoc.getChild("grid_window")
enter_text_to_cell(gridwin, "A1", "A")
enter_text_to_cell(gridwin, "A2", "1")
enter_text_to_cell(gridwin, "A3", "2")
enter_text_to_cell(gridwin, "A4", "3")
gridwin.executeAction("SELECT", mkPropertyValues({"RANGE": "A1:A4"}))
self.xUITest.executeCommand(".uno:DataFilterAutoFilter")
gridwin.executeAction("LAUNCH", mkPropertyValues({"AUTOFILTER": "", "COL": "0", "ROW": "0"}))
xFloatWindow = self.xUITest.getFloatWindow()
xCheckListMenu = xFloatWindow.getChild("FilterDropDown")
xTreeList = xCheckListMenu.getChild("check_list_box")
xEntry = xTreeList.getChild("1")
xEntry.executeAction("CLICK", tuple())
xOkButton = xFloatWindow.getChild("ok")
xOkButton.executeAction("CLICK", tuple())
self.assertTrue(is_row_hidden(document, 2))
# row height
with self.ui_test.execute_dialog_through_command(".uno:RowHeight") as xDialog:
xvalue = xDialog.getChild("value")
xvalue.executeAction("TYPE", mkPropertyValues({"KEYCODE":"CTRL+A"}))
xvalue.executeAction("TYPE", mkPropertyValues({"KEYCODE":"BACKSPACE"}))
xvalue.executeAction("TYPE", mkPropertyValues({"TEXT":"1 cm"}))
self.assertTrue(is_row_hidden(document, 2))
# optimal row height
with self.ui_test.execute_dialog_through_command(".uno:SetOptimalRowHeight"):
pass
self.assertTrue(is_row_hidden(document, 2))
def test_tdf142350(self):
with self.ui_test.create_doc_in_start_center("calc") as document:
calcDoc = self.xUITest.getTopFocusWindow()
diff --git a/sc/source/ui/view/viewfunc.cxx b/sc/source/ui/view/viewfunc.cxx
index c5341aa..423c66a 100644
--- a/sc/source/ui/view/viewfunc.cxx
+++ b/sc/source/ui/view/viewfunc.cxx
@@ -80,6 +80,19 @@
#include <memory>
static void ShowFilteredRows(ScDocument& rDoc, SCTAB nTab, SCCOLROW nStartNo, SCCOLROW nEndNo,
bool bShow)
{
SCROW nFirstRow = nStartNo;
SCROW nLastRow = nStartNo;
do
{
if (!rDoc.RowFiltered(nFirstRow, nTab, nullptr, &nLastRow))
rDoc.ShowRows(nFirstRow, nLastRow < nEndNo ? nLastRow : nEndNo, nTab, bShow);
nFirstRow = nLastRow + 1;
} while (nFirstRow <= nEndNo);
}
static void lcl_PostRepaintCondFormat( const ScConditionalFormat *pCondFmt, ScDocShell *pDocSh )
{
if( pCondFmt )
@@ -2202,6 +2215,7 @@ void ScViewFunc::SetWidthOrHeight(
if ( eMode==SC_SIZE_OPTIMAL || eMode==SC_SIZE_VISOPT )
{
bool bAll = ( eMode==SC_SIZE_OPTIMAL );
bool bFiltered = false;
if (!bAll)
{
// delete CRFlags::ManualSize for all in range,
@@ -2220,6 +2234,14 @@ void ScViewFunc::SetWidthOrHeight(
rDoc.SetRowFlags(nRow, nTab, nOld & ~CRFlags::ManualSize);
}
}
else
{
SCROW nLastRow = nStartNo;
if (rDoc.RowFiltered(nStartNo, nTab, nullptr, &nLastRow)
|| nLastRow < nEndNo)
bFiltered = true;
}
double nPPTX = GetViewData().GetPPTX();
double nPPTY = GetViewData().GetPPTY();
@@ -2239,6 +2261,9 @@ void ScViewFunc::SetWidthOrHeight(
aCxt.setExtraHeight(nSizeTwips);
rDoc.SetOptimalHeight(aCxt, nStartNo, nEndNo, nTab, true);
if (bFiltered)
ShowFilteredRows(rDoc, nTab, nStartNo, nEndNo, bShow);
// Manual-Flag already (re)set in SetOptimalHeight in case of bAll=sal_True
// (set for Extra-Height, else reset).
}
@@ -2250,7 +2275,8 @@ void ScViewFunc::SetWidthOrHeight(
rDoc.SetManualHeight( nStartNo, nEndNo, nTab, true ); // height was set manually
}
rDoc.ShowRows( nStartNo, nEndNo, nTab, nSizeTwips != 0 );
// tdf#36383 - Skip consecutive rows hidden by AutoFilter
ShowFilteredRows(rDoc, nTab, nStartNo, nEndNo, nSizeTwips != 0);
if (!bShow && nStartNo <= nCurY && nCurY <= nEndNo && nTab == nCurTab)
{