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"/>

Reply via email to