sc/qa/uitest/calc_tests/autofill.py |   30 ++++++++++++++++++++++++++++++
 sc/qa/uitest/data/autofill.ods      |binary
 sc/source/core/data/table2.cxx      |    7 +++++--
 3 files changed, 35 insertions(+), 2 deletions(-)

New commits:
commit bda200a5e9c4592bd61b7924fa171ec3265bfd24
Author:     Justin Luth <[email protected]>
AuthorDate: Wed Feb 9 20:17:53 2022 +0200
Commit:     Justin Luth <[email protected]>
CommitDate: Thu Feb 10 10:04:18 2022 +0100

    tdf#113785 sc: IsDataFiltered must be normalized
    
    I can't believe this hasn't caused major issues
    and has survived as a bug for so long.
    
    Due to the way IsDataFiltered is coded,
    it is required that the range is normalized
    in order to get any kind of meaningful result,
    so lets ensure that.
    
    Change-Id: I2ede77f738fbaeb05a0f1425a2e88e59fca08e9e
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/129735
    Tested-by: Jenkins
    Reviewed-by: Justin Luth <[email protected]>

diff --git a/sc/qa/uitest/calc_tests/autofill.py 
b/sc/qa/uitest/calc_tests/autofill.py
index bdb45d00c9c9..294d60fd7102 100644
--- a/sc/qa/uitest/calc_tests/autofill.py
+++ b/sc/qa/uitest/calc_tests/autofill.py
@@ -49,6 +49,36 @@ class CalcAutofill(UITestCase):
             self.assertEqual(get_cell_by_position(calc_doc, 0, 0, 
10).getValue(), 17.34)
             self.assertEqual(get_cell_by_position(calc_doc, 0, 0, 
11).getValue(), 18.34)
 
+            #Test that hidden cells are not affected / skipped in the 
increment process.
+            #Simulate selecting cell A26 and dragging the fill handle in the 
bottom right corner of the cell down to A32
+            gridwin.executeAction("SELECT", mkPropertyValues({"RANGE": 
"A26:A32"}))
+            with 
self.ui_test.execute_dialog_through_command(".uno:FillSeries"):
+                pass
+            self.assertEqual(get_cell_by_position(calc_doc, 0, 0, 
25).getValue(), 18.34)
+            self.assertEqual(get_cell_by_position(calc_doc, 0, 0, 
26).getValue(), 19.34)
+            self.assertEqual(get_cell_by_position(calc_doc, 0, 0, 
27).getValue(), 5.0) #hidden
+            self.assertEqual(get_cell_by_position(calc_doc, 0, 0, 
28).getValue(), 5.0) #hidden
+            self.assertEqual(get_cell_by_position(calc_doc, 0, 0, 
29).getString(), "hiddenA30")
+            self.assertEqual(get_cell_by_position(calc_doc, 0, 0, 
30).getValue(), 20.34) #overwrite "rows"
+            self.assertEqual(get_cell_by_position(calc_doc, 0, 0, 
31).getValue(), 21.34)
+            #Simulate selecting cell A26 and dragging the fill handle in the 
bottom right corner of the cell up to A19
+            #   Note: start at empty cell A19 so Sheet - Fill Cells - Fill 
Series has good defaults
+            gridwin.executeAction("SELECT", mkPropertyValues({"RANGE": 
"A19:A26"}))
+            with 
self.ui_test.execute_dialog_through_command(".uno:FillSeries") as xDialog:
+                xup = xDialog.getChild("up")
+                xincrement = xDialog.getChild("increment")
+                xup.executeAction("CLICK", tuple())
+                xincrement.executeAction("TYPE", 
mkPropertyValues({"KEYCODE":"CTRL+A"}))
+                xincrement.executeAction("TYPE", 
mkPropertyValues({"KEYCODE":"BACKSPACE"}))
+                xincrement.executeAction("TYPE", 
mkPropertyValues({"TEXT":"-1"}))
+            self.assertEqual(get_cell_by_position(calc_doc, 0, 0, 
19).getString(), "hiddenA20")
+            self.assertEqual(get_cell_by_position(calc_doc, 0, 0, 
20).getValue(), 15.34)
+            self.assertEqual(get_cell_by_position(calc_doc, 0, 0, 
21).getValue(), 5.0) #hidden
+            self.assertEqual(get_cell_by_position(calc_doc, 0, 0, 
22).getValue(), 16.34) #overwrite "testing"
+            self.assertEqual(get_cell_by_position(calc_doc, 0, 0, 
23).getValue(), 5.0) #hidden
+            self.assertEqual(get_cell_by_position(calc_doc, 0, 0, 
24).getValue(), 17.34) #overwrite "hidden"
+            self.assertEqual(get_cell_by_position(calc_doc, 0, 0, 
25).getValue(), 18.34)
+
             #Continue with the next cells with grey background
             gridwin.executeAction("SELECT", mkPropertyValues({"RANGE": 
"M12:M18"}))
             with 
self.ui_test.execute_dialog_through_command(".uno:FillSeries"):
diff --git a/sc/qa/uitest/data/autofill.ods b/sc/qa/uitest/data/autofill.ods
index 4456e33338c8..90bf933c0c26 100644
Binary files a/sc/qa/uitest/data/autofill.ods and 
b/sc/qa/uitest/data/autofill.ods differ
diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx
index fa322f333821..a19549e89f9d 100644
--- a/sc/source/core/data/table2.cxx
+++ b/sc/source/core/data/table2.cxx
@@ -3666,6 +3666,8 @@ void ScTable::ShowRows(SCROW nRow1, SCROW nRow2, bool 
bShow)
 
 bool ScTable::IsDataFiltered(SCCOL nColStart, SCROW nRowStart, SCCOL nColEnd, 
SCROW nRowEnd) const
 {
+    assert(nColStart <= nColEnd && nRowStart <= nRowEnd
+           && "range must be normalized to obtain a valid result");
     for (SCROW i = nRowStart; i <= nRowEnd; ++i)
     {
         if (RowHidden(i))
@@ -3681,8 +3683,9 @@ bool ScTable::IsDataFiltered(SCCOL nColStart, SCROW 
nRowStart, SCCOL nColEnd, SC
 
 bool ScTable::IsDataFiltered(const ScRange& rRange) const
 {
-    return IsDataFiltered(rRange.aStart.Col(), rRange.aStart.Row(),
-                rRange.aEnd.Col(), rRange.aEnd.Row());
+    ScRange aNormalized(rRange.aStart, rRange.aEnd);
+    return IsDataFiltered(aNormalized.aStart.Col(), aNormalized.aStart.Row(),
+                          aNormalized.aEnd.Col(), aNormalized.aEnd.Row());
 }
 
 void ScTable::SetRowFlags( SCROW nRow, CRFlags nNewFlags )

Reply via email to