officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu | 5 + sc/inc/sc.hrc | 1 sc/sdi/cellsh.sdi | 1 sc/sdi/scalc.sdi | 17 +++ sc/source/ui/inc/dbfunc.hxx | 1 sc/source/ui/view/cellsh2.cxx | 45 ++++++++++ sc/source/ui/view/dbfunc.cxx | 26 +++++ sc/source/ui/view/tabview3.cxx | 1 sc/uiconfig/scalc/menubar/menubar.xml | 1 sc/uiconfig/scalc/popupmenu/cell.xml | 1 10 files changed, 99 insertions(+)
New commits: commit 6b67355f1275ea296a6a74c8f4d6a9060ff2f8a1 Author: Ujjawal Kumar <randomfores...@gmail.com> AuthorDate: Tue Mar 11 02:12:59 2025 +0530 Commit: Heiko Tietze <heiko.tie...@documentfoundation.org> CommitDate: Thu Mar 20 17:56:24 2025 +0100 tdf#164322 Add "Clear AutoFilter" option in context menu of cells Change-Id: Id0555f0e89e3e21010b36559bec0caefe63fe8d6 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182755 Tested-by: Jenkins Reviewed-by: Heiko Tietze <heiko.tie...@documentfoundation.org> diff --git a/officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu b/officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu index 9d8ddf9d7f04..ae76759617f4 100644 --- a/officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu +++ b/officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu @@ -933,6 +933,11 @@ <value xml:lang="en-US">Selection List</value> </prop> </node> + <node oor:name=".uno:ClearAutoFilter" oor:op="replace"> + <prop oor:name="Label" oor:type="xs:string"> + <value xml:lang="en-US">Clear AutoFilter</value> + </prop> + </node> <node oor:name=".uno:DeleteCell" oor:op="replace"> <prop oor:name="Label" oor:type="xs:string"> <value xml:lang="en-US">Delete C~ells...</value> diff --git a/sc/inc/sc.hrc b/sc/inc/sc.hrc index a1a8be63f46a..1749b87de475 100644 --- a/sc/inc/sc.hrc +++ b/sc/inc/sc.hrc @@ -629,6 +629,7 @@ static_assert(SID_PREVIEW_END < SID_KEYFUNC_START, "calc slots ids trampling inf #define SID_UNGROUP_SPARKLINES (SID_NEW_SLOTS+115) #define SID_EDIT_SPARKLINE (SID_NEW_SLOTS+116) #define SID_SC_OPT_LINKS TypedWhichId<SfxBoolItem>(SID_NEW_SLOTS + 117) +#define SID_CLEAR_AUTO_FILTER (SID_NEW_SLOTS+118) // idl parameter diff --git a/sc/sdi/cellsh.sdi b/sc/sdi/cellsh.sdi index 44e87cd69119..0f16536d1c42 100644 --- a/sc/sdi/cellsh.sdi +++ b/sc/sdi/cellsh.sdi @@ -63,6 +63,7 @@ interface CellSelection FID_VALIDATION [ ExecMethod = ExecuteDB; StateMethod = GetBlockState; ] FID_CURRENTVALIDATION [ ExecMethod = ExecuteDB; StateMethod = GetBlockState; ] SID_TEXT_TO_COLUMNS [ ExecMethod = ExecuteDB; StateMethod = GetDBState; ] + SID_CLEAR_AUTO_FILTER [ ExecMethod = ExecuteDB; StateMethod = GetDBState; ] // } database operations diff --git a/sc/sdi/scalc.sdi b/sc/sdi/scalc.sdi index 7fd2dd68b09e..e93e78e125e2 100644 --- a/sc/sdi/scalc.sdi +++ b/sc/sdi/scalc.sdi @@ -1069,6 +1069,23 @@ SfxVoidItem DataFilterRemoveFilter SID_UNFILTER GroupId = SfxGroupId::Data; ] +SfxVoidItem ClearAutoFilter SID_CLEAR_AUTO_FILTER +() +[ + AutoUpdate = FALSE, + FastCall = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + + AccelConfig = TRUE, + MenuConfig = TRUE, + ToolBoxConfig = TRUE, + GroupId = SfxGroupId::Data; +] + SfxVoidItem DataFilterSpecialFilter SID_SPECIAL_FILTER () diff --git a/sc/source/ui/inc/dbfunc.hxx b/sc/source/ui/inc/dbfunc.hxx index 9d9f5481121d..5f99c763b47a 100644 --- a/sc/source/ui/inc/dbfunc.hxx +++ b/sc/source/ui/inc/dbfunc.hxx @@ -58,6 +58,7 @@ public: void ToggleAutoFilter(); void HideAutoFilter(); + void ClearAutoFilter(); void RepeatDB( bool bRecord = true ); diff --git a/sc/source/ui/view/cellsh2.cxx b/sc/source/ui/view/cellsh2.cxx index 29d6f126b4e6..a89d1f75e245 100644 --- a/sc/source/ui/view/cellsh2.cxx +++ b/sc/source/ui/view/cellsh2.cxx @@ -684,6 +684,11 @@ void ScCellShell::ExecuteDB( SfxRequest& rReq ) } break; + case SID_CLEAR_AUTO_FILTER: + pTabViewShell->ClearAutoFilter(); + rReq.Done(); + break; + case SID_AUTO_FILTER: pTabViewShell->ToggleAutoFilter(); rReq.Done(); @@ -1301,6 +1306,46 @@ void ScCellShell::GetDBState( SfxItemSet& rSet ) } break; + case SID_CLEAR_AUTO_FILTER: + { + const ScTableProtection* pTabProt = rDoc.GetTabProtection(nTab); + if (pTabProt && pTabProt->isProtected() && !pTabProt->isOptionEnabled(ScTableProtection::AUTOFILTER)) + { + rSet.DisableItem(nWhich); + } + else + { + if (!bAutoFilterTested) + { + bAutoFilter = rDoc.HasAutoFilter(nPosX, nPosY, nTab); + bAutoFilterTested = true; + } + + SCCOL nStartCol = GetViewData().GetCurX(); + SCROW nStartRow = GetViewData().GetCurY(); + SCTAB nStartTab = GetViewData().GetTabNo(); + bool bAnyQuery = false; + + ScQueryParam aParam; + ScDBData* pDBData = rDoc.GetDBAtCursor( nStartCol, nStartRow, nStartTab, ScDBDataPortion::AREA ); + + if(pDBData) + { + pDBData->GetQueryParam(aParam); + std::vector<ScQueryEntry*> aEntries = aParam.FindAllEntriesByField(nStartCol); + if(aEntries.size()) + { + bAnyQuery = true; + } + } + + + if(!bAutoFilter || !bAnyQuery) + rSet.DisableItem(nWhich); + } + } + break; + case SID_DEFINE_DBNAME: { if ( pDocSh->IsDocShared() ) diff --git a/sc/source/ui/view/dbfunc.cxx b/sc/source/ui/view/dbfunc.cxx index b330c89e662c..69ac967d2364 100644 --- a/sc/source/ui/view/dbfunc.cxx +++ b/sc/source/ui/view/dbfunc.cxx @@ -446,6 +446,32 @@ void ScDBFunc::HideAutoFilter() rBindings.Invalidate( SID_AUTOFILTER_HIDE ); } +void ScDBFunc::ClearAutoFilter() +{ + ScDocShell* pDocSh = GetViewData().GetDocShell(); + ScDocument& rDoc = pDocSh->GetDocument(); + + SCCOL nCol = GetViewData().GetCurX(); + SCROW nRow = GetViewData().GetCurY(); + SCTAB nTab = GetViewData().GetTabNo(); + + ScDBData* pDBData = rDoc.GetDBAtCursor(nCol, nRow, nTab, ScDBDataPortion::AREA); + + ScQueryParam aParam; + pDBData->GetQueryParam(aParam); + + aParam.RemoveAllEntriesByField(nCol); + aParam.eSearchType = utl::SearchParam::SearchType::Normal; + aParam.bCaseSens = false; + aParam.bDuplicate = true; + aParam.bInplace = true; + + Query(aParam, nullptr, true); + + SfxBindings& rBindings = GetViewData().GetBindings(); + rBindings.Invalidate( SID_CLEAR_AUTO_FILTER ); +} + // Re-Import bool ScDBFunc::ImportData( const ScImportParam& rParam ) diff --git a/sc/source/ui/view/tabview3.cxx b/sc/source/ui/view/tabview3.cxx index dbb3f7d9ac7c..e7159559ecf0 100644 --- a/sc/source/ui/view/tabview3.cxx +++ b/sc/source/ui/view/tabview3.cxx @@ -638,6 +638,7 @@ void ScTabView::SelectionChanged(bool bFromPaste) rBindings.Invalidate( SID_SORT_ASCENDING ); rBindings.Invalidate( SID_SORT_DESCENDING ); rBindings.Invalidate( SID_SELECT_UNPROTECTED_CELLS ); + rBindings.Invalidate( SID_CLEAR_AUTO_FILTER ); if (!comphelper::LibreOfficeKit::isActive()) rBindings.Invalidate( SID_LANGUAGE_STATUS ); diff --git a/sc/uiconfig/scalc/menubar/menubar.xml b/sc/uiconfig/scalc/menubar/menubar.xml index a96b557d1e18..0d1e186f1dcf 100644 --- a/sc/uiconfig/scalc/menubar/menubar.xml +++ b/sc/uiconfig/scalc/menubar/menubar.xml @@ -602,6 +602,7 @@ <menu:menuseparator/> <menu:menuitem menu:id=".uno:DataFilterRemoveFilter"/> <menu:menuitem menu:id=".uno:DataFilterHideAutoFilter"/> + <menu:menuitem menu:id=".uno:ClearAutoFilter"/> </menu:menupopup> </menu:menu> <menu:menuitem menu:id=".uno:HandleDuplicateRecords"/> diff --git a/sc/uiconfig/scalc/popupmenu/cell.xml b/sc/uiconfig/scalc/popupmenu/cell.xml index 163c54b09bc6..a5de57e54d3a 100644 --- a/sc/uiconfig/scalc/popupmenu/cell.xml +++ b/sc/uiconfig/scalc/popupmenu/cell.xml @@ -27,6 +27,7 @@ <menu:menuseparator/> <menu:menuitem menu:id=".uno:DataSelect"/> <menu:menuitem menu:id=".uno:CurrentValidation"/> + <menu:menuitem menu:id=".uno:ClearAutoFilter"/> <menu:menuitem menu:id=".uno:DefineCurrentName"/> <menu:menuseparator/> <menu:menuitem menu:id=".uno:InsertCell"/>