tdf#173673 dbaccess: allow changing the filter while "Apply Filter" is off

Instead of using getFilter and getHavingClause that report an empty filter/
having whenever "Apply Filter" is unchecked, use the raw Filter/HavingClause
properties. Add UITest.

Change-Id: Id0995217c48aba77c4e89327ede990bc31d19c1a
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/211413
Tested-by: Jenkins
Reviewed-by: Vissarion Fisikopoulos <vfisikop@libreoffice.org>
This commit is contained in:
Vissarion Fisikopoulos
2026-09-24 13:28:20 +02:00
parent 3e131896fc
commit 1d0c317229
2 changed files with 81 additions and 4 deletions
@@ -0,0 +1,63 @@
# -*- 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_url_for_data_file, select_pos
from libreoffice.uno.propertyvalue import mkPropertyValues
# Bug 173673 - Tablefilter: Resetting impossible when "Apply Filter" is unchecked
class tdf173673(UITestCase):
def test_tdf173673(self):
with self.ui_test.load_file(get_url_for_data_file("tdf75509.odb")) as document:
xConnection = document.DataSource.getConnection("", "")
xStatement = xConnection.createStatement()
xStatement.executeUpdate('INSERT INTO "Table1" ("FrenchField", "EnglishField") VALUES (1, 1)')
xStatement.executeUpdate('INSERT INTO "Table1" ("FrenchField", "EnglishField") VALUES (2, 2)')
xConnection.close()
self.xUITest.executeCommand(".uno:DBViewTables")
xToolkit = self.xContext.ServiceManager.createInstance('com.sun.star.awt.Toolkit')
xToolkit.waitUntilAllIdlesDispatched()
self.xUITest.executeCommand(".uno:SelectAll")
with self.ui_test.open_subcomponent_through_command(".uno:DBTableOpen") as xTableFrame:
xTableWindow = self.xUITest.getWindow(xTableFrame.getContainerWindow())
xGrid = xTableWindow.getChild("DBGrid")
xForm = xTableFrame.getController().CurrentControl.getModel().getParent()
self.assertEqual(2, xForm.RowCount)
# AutoFilter on the first row's FrenchField cell (value 1)
xGrid.executeAction("FOCUS", tuple())
xGrid.executeAction("TYPE", mkPropertyValues({"KEYCODE": "TAB"}))
self.xUITest.executeCommandForProvider(".uno:AutoFilter", xTableFrame)
xToolkit.waitUntilAllIdlesDispatched()
self.assertNotEqual("", xForm.Filter)
self.assertTrue(xForm.ApplyFilter)
self.assertEqual(1, xForm.RowCount)
# Uncheck "Apply Filter": the filter is kept, but no longer applied
self.xUITest.executeCommandForProvider(".uno:FormFiltered", xTableFrame)
xToolkit.waitUntilAllIdlesDispatched()
self.assertNotEqual("", xForm.Filter)
self.assertFalse(xForm.ApplyFilter)
self.assertEqual(2, xForm.RowCount)
# Clear the condition in the Standard Filter dialog
with self.ui_test.execute_blocking_action(
self.xUITest.executeCommandForProvider,
args=(".uno:FilterCrit", xTableFrame)) as xDialog:
xDialog.getChild("field1").executeAction("SELECT", mkPropertyValues({"TEXT": "- none -"}))
xToolkit.waitUntilAllIdlesDispatched()
# Check that the old filter is removed
self.assertEqual("", xForm.Filter)
self.assertEqual(2, xForm.RowCount)
# vim: set shiftwidth=4 softtabstop=4 expandtab:
+18 -4
View File
@@ -1361,8 +1361,14 @@ FeatureState SbaXDataBrowserController::GetState(sal_uInt16 nId) const
aReturn.bEnabled = false;
return aReturn;
}
// any filter or sort order set ?
aReturn.bEnabled = m_xParser->getFilter().getLength() || m_xParser->getHavingClause().getLength() || m_xParser->getOrder().getLength();
{
Reference< XPropertySet > xFormSet(getRowSet(), UNO_QUERY);
OUString sFilter, sHaving;
xFormSet->getPropertyValue(PROPERTY_FILTER) >>= sFilter;
xFormSet->getPropertyValue(PROPERTY_HAVING_CLAUSE) >>= sHaving;
// any filter or sort order set ?
aReturn.bEnabled = !sFilter.isEmpty() || !sHaving.isEmpty() || m_xParser->getOrder().getLength();
}
return aReturn;
}
// no chance without valid models
@@ -1705,8 +1711,16 @@ void SbaXDataBrowserController::ExecuteFilterSortCrit(bool bFilter)
Reference< XPropertySet > xFormSet(getRowSet(), UNO_QUERY);
const OUString sOldVal = bFilter ? m_xParser->getFilter() : m_xParser->getOrder();
const OUString sOldHaving = m_xParser->getHavingClause();
OUString sOldVal, sOldHaving;
if (bFilter)
{
xFormSet->getPropertyValue(PROPERTY_FILTER) >>= sOldVal;
xFormSet->getPropertyValue(PROPERTY_HAVING_CLAUSE) >>= sOldHaving;
}
else
{
sOldVal = m_xParser->getOrder();
}
Reference< XSingleSelectQueryComposer > xParser = createParser_nothrow();
try
{