tdf#161457 - Fix autofilter result is wrong when cells contain

formatted rounded values.

Filtered formatted values were not sorted with the rounded values
but with the original values and the duplicated values caused wrong
filter results.

Regression from commit: 2d1df9f3dccc10f13b8585ad18afce1542ebc4d1
(tdf#117276 sc: Show hidden filter elements as inactive elements)

Change-Id: I7540ba5fa98e6bbe0b014448bf2449432261d542
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/168592
Tested-by: Jenkins
Reviewed-by: Balazs Varga <balazs.varga.extern@allotropia.de>
diff --git a/sc/qa/uitest/autofilter2/tdf161457.py b/sc/qa/uitest/autofilter2/tdf161457.py
new file mode 100644
index 0000000..400f4df
--- /dev/null
+++ b/sc/qa/uitest/autofilter2/tdf161457.py
@@ -0,0 +1,42 @@
# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*-
#
# This file is part of the LibreOffice project.
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
from uitest.framework import UITestCase
from uitest.uihelper.common import get_state_as_dict, get_url_for_data_file
from libreoffice.uno.propertyvalue import mkPropertyValues

class tdf161457(UITestCase):

    def test_tdf161457(self):

        with self.ui_test.load_file(get_url_for_data_file("tdf161457.ods")) as calc_doc:

            xCalcDoc = self.xUITest.getTopFocusWindow()
            xGridWin = xCalcDoc.getChild("grid_window")

            # Click the autofilter dropdown in column B
            xGridWin.executeAction("LAUNCH", mkPropertyValues({"AUTOFILTER": "", "COL": "1", "ROW": "0"}))
            xFloatWindow = self.xUITest.getFloatWindow()
            xCheckListMenu = xFloatWindow.getChild("FilterDropDown")
            xTreeList = xCheckListMenu.getChild("check_list_box")

            self.assertEqual(2, len(xTreeList.getChildren()))

            xEntry1 = xTreeList.getChild(0)
            self.assertEqual("1.00", get_state_as_dict(xEntry1)['Text'])
            self.assertEqual("true", get_state_as_dict(xEntry1)['IsChecked'])
            self.assertEqual("false", get_state_as_dict(xEntry1)['IsSemiTransparent'])

            xEntry2 = xTreeList.getChild(1)
            self.assertEqual("5.00", get_state_as_dict(xEntry2)['Text'])
            self.assertEqual("true", get_state_as_dict(xEntry2)['IsChecked'])
            # Without the fix in place, this test would have failed with
            # AssertionError: 'true' != 'false'
            self.assertEqual("false", get_state_as_dict(xEntry2)['IsSemiTransparent'])

# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/sc/qa/uitest/autofilter2/tdf46184.py b/sc/qa/uitest/autofilter2/tdf46184.py
old mode 100755
new mode 100644
diff --git a/sc/qa/uitest/data/autofilter/tdf161457.ods b/sc/qa/uitest/data/autofilter/tdf161457.ods
new file mode 100644
index 0000000..6580b1d
--- /dev/null
+++ b/sc/qa/uitest/data/autofilter/tdf161457.ods
Binary files differ
diff --git a/sc/source/core/tool/typedstrdata.cxx b/sc/source/core/tool/typedstrdata.cxx
index 4e3f862..14ea33a 100644
--- a/sc/source/core/tool/typedstrdata.cxx
+++ b/sc/source/core/tool/typedstrdata.cxx
@@ -26,7 +26,7 @@ bool ScTypedStrData::LessCaseSensitive::operator() (const ScTypedStrData& left, 

    if (left.meStrType == Value)
    {
        if (left.mfValue == right.mfValue)
        if (left.mfRoundedValue == right.mfRoundedValue)
            return left.mbIsHiddenByFilter < right.mbIsHiddenByFilter;
        return left.mfValue < right.mfValue;
    }
@@ -50,7 +50,7 @@ bool ScTypedStrData::LessSortCaseSensitive::operator() (const ScTypedStrData& le

    if (left.meStrType == Value)
    {
        if (left.mfValue == right.mfValue)
        if (left.mfRoundedValue == right.mfRoundedValue)
            return left.mbIsHiddenByFilter < right.mbIsHiddenByFilter;
        return left.mfValue < right.mfValue;
    }
@@ -73,7 +73,7 @@ bool ScTypedStrData::LessCaseInsensitive::operator() (const ScTypedStrData& left

    if (left.meStrType == Value)
    {
        if (left.mfValue == right.mfValue)
        if (left.mfRoundedValue == right.mfRoundedValue)
            return left.mbIsHiddenByFilter < right.mbIsHiddenByFilter;
        return left.mfValue < right.mfValue;
    }
@@ -97,7 +97,7 @@ bool ScTypedStrData::LessSortCaseInsensitive::operator() (const ScTypedStrData& 

    if (left.meStrType == Value)
    {
        if (left.mfValue == right.mfValue)
        if (left.mfRoundedValue == right.mfRoundedValue)
            return left.mbIsHiddenByFilter < right.mbIsHiddenByFilter;
        return left.mfValue < right.mfValue;
    }