tdf#36466 sc UI: add new options to deselect hidden cells

Implement "Select Visible Rows Only" option to deselect
the cells of the hidden rows in the actual selection.

Implement "Select Visible Columns Only" option to deselect
the cells of the hidden columns in the actual selection.

Test e.g. on some data on A1:C1:

1) hide column B (don't try to test with autofilter,
   because copying of the filtered cells has already
   worked this way).
2) Select A1:C1 (2 visible cells)
3) Choose Edit->Select->Select Visible Columns Only
   (no visual feedback)
4) Copy the selection.
5) Paste it e.g. in D2: only A1 and C1 are copied,
   but not B1.

Change-Id: I354ebdf6be6bddae4440f3e9b4929c6e82abc1df
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/111100
Tested-by: László Németh <nemeth@numbertext.org>
Reviewed-by: László Németh <nemeth@numbertext.org>
diff --git a/officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu b/officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu
index 9192379..77a9015 100644
--- a/officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu
+++ b/officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu
@@ -585,9 +585,17 @@
          <value>1</value>
        </prop>
      </node>
      <node oor:name=".uno:SelectVisibleCells" oor:op="replace">
      <node oor:name=".uno:SelectVisibleRows" oor:op="replace">
        <prop oor:name="Label" oor:type="xs:string">
          <value xml:lang="en-US">Select Visible Cells Only</value>
          <value xml:lang="en-US">Select Visible Rows Only</value>
        </prop>
        <prop oor:name="Properties" oor:type="xs:int">
          <value>1</value>
        </prop>
      </node>
      <node oor:name=".uno:SelectVisibleColumns" oor:op="replace">
        <prop oor:name="Label" oor:type="xs:string">
          <value xml:lang="en-US">Select Visible Columns Only</value>
        </prop>
        <prop oor:name="Properties" oor:type="xs:int">
          <value>1</value>
diff --git a/sc/inc/sc.hrc b/sc/inc/sc.hrc
index 55be197..4e0001d 100644
--- a/sc/inc/sc.hrc
+++ b/sc/inc/sc.hrc
@@ -603,8 +603,9 @@
#define FID_DELETE_ALL_NOTES    (SID_NEW_SLOTS+104)
#define SID_SCATTR_CELLPROTECTION    (SID_NEW_SLOTS+105)
#define SID_SELECT_UNPROTECTED_CELLS (SID_NEW_SLOTS+106)
#define SID_SELECT_VISIBLE_CELLS     (SID_NEW_SLOTS+107)
#define SID_CURRENT_FORMULA_RANGE    (SID_NEW_SLOTS+108)
#define SID_SELECT_VISIBLE_ROWS      (SID_NEW_SLOTS+107)
#define SID_SELECT_VISIBLE_COLUMNS   (SID_NEW_SLOTS+108)
#define SID_CURRENT_FORMULA_RANGE    (SID_NEW_SLOTS+109)
// idl parameter

#define SID_SORT_BYROW          (SC_PARAM_START)
diff --git a/sc/sdi/cellsh.sdi b/sc/sdi/cellsh.sdi
index cbc20f2..e75d9b3 100644
--- a/sc/sdi/cellsh.sdi
+++ b/sc/sdi/cellsh.sdi
@@ -230,7 +230,8 @@ interface CellSelection
    SID_DEC_INDENT                      [ ExecMethod = ExecuteEdit; StateMethod = GetState; ]
    SID_INC_INDENT                      [ ExecMethod = ExecuteEdit; StateMethod = GetState; ]
    SID_SELECT_UNPROTECTED_CELLS        [ ExecMethod = ExecuteEdit;]
    SID_SELECT_VISIBLE_CELLS            [ ExecMethod = ExecuteEdit;]
    SID_SELECT_VISIBLE_ROWS             [ ExecMethod = ExecuteEdit;]
    SID_SELECT_VISIBLE_COLUMNS          [ ExecMethod = ExecuteEdit;]
    SID_CURRENT_FORMULA_RANGE           [ ExecMethod = ExecuteEdit;]

    SID_THESAURUS   [ ExecMethod = ExecuteEdit; StateMethod = GetCellState; ]
diff --git a/sc/sdi/scalc.sdi b/sc/sdi/scalc.sdi
index fae369f..fbbbe18 100644
--- a/sc/sdi/scalc.sdi
+++ b/sc/sdi/scalc.sdi
@@ -4453,7 +4453,24 @@ SfxVoidItem SelectUnprotectedCells SID_SELECT_UNPROTECTED_CELLS
    GroupId = SfxGroupId::Edit;
]

SfxVoidItem SelectVisibleCells SID_SELECT_VISIBLE_CELLS
SfxVoidItem SelectVisibleRows SID_SELECT_VISIBLE_ROWS
()
[
    AutoUpdate = FALSE,
    FastCall = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    RecordAbsolute = FALSE,
    RecordPerSet;

    AccelConfig = FALSE,
    MenuConfig = TRUE,
    ToolBoxConfig = FALSE,
    GroupId = SfxGroupId::Edit;
]

SfxVoidItem SelectVisibleColumns SID_SELECT_VISIBLE_COLUMNS
()
[
    AutoUpdate = FALSE,
diff --git a/sc/source/ui/view/cellsh1.cxx b/sc/source/ui/view/cellsh1.cxx
index f529e34..d619b46 100644
--- a/sc/source/ui/view/cellsh1.cxx
+++ b/sc/source/ui/view/cellsh1.cxx
@@ -2768,7 +2768,7 @@ void ScCellShell::ExecuteEdit( SfxRequest& rReq )
            }
            break;

        case SID_SELECT_VISIBLE_CELLS:
        case SID_SELECT_VISIBLE_ROWS:
            {
                ScViewData& rData = GetViewData();
                ScMarkData& rMark = rData.GetMarkData();
@@ -2806,6 +2806,44 @@ void ScCellShell::ExecuteEdit( SfxRequest& rReq )
            }
            break;

        case SID_SELECT_VISIBLE_COLUMNS:
            {
                ScViewData& rData = GetViewData();
                ScMarkData& rMark = rData.GetMarkData();
                ScDocument& rDoc = rData.GetDocument();

                rMark.MarkToMulti();

                ScRange aMultiArea;
                rMark.GetMultiMarkArea(aMultiArea);
                SCCOL nStartCol = aMultiArea.aStart.Col();
                SCROW nStartRow = aMultiArea.aStart.Row();
                SCCOL nEndCol = aMultiArea.aEnd.Col();
                SCROW nEndRow = aMultiArea.aEnd.Row();

                bool bChanged = false;
                for (const SCTAB& nTab : rMark)
                {
                    for (SCCOL nCol = nStartCol; nCol <= nEndCol; ++nCol)
                    {
                        SCCOL nLastCol = nCol;
                        if (rDoc.ColHidden(nCol, nTab, nullptr, &nLastCol))
                        {
                            rMark.SetMultiMarkArea(
                                ScRange(nCol, nStartRow, nTab, nLastCol, nEndRow, nTab), false);
                            bChanged = true;
                            nCol = nLastCol;
                        }
                    }
                }

                if (bChanged && !rMark.HasAnyMultiMarks())
                    rMark.ResetMark();

                rMark.MarkToSimple();
            }
            break;

        case SID_CURRENT_FORMULA_RANGE:
            {
                const SfxInt32Item* param1 = rReq.GetArg<SfxInt32Item>(FN_PARAM_1);
diff --git a/sc/uiconfig/scalc/menubar/menubar.xml b/sc/uiconfig/scalc/menubar/menubar.xml
index f413f7a..ee65272 100644
--- a/sc/uiconfig/scalc/menubar/menubar.xml
+++ b/sc/uiconfig/scalc/menubar/menubar.xml
@@ -110,7 +110,8 @@
          <menu:menuitem menu:id=".uno:SelectColumn"/>
          <menu:menuitem menu:id=".uno:SelectData"/>
          <menu:menuitem menu:id=".uno:SelectUnprotectedCells"/>
          <menu:menuitem menu:id=".uno:SelectVisibleCells"/>
          <menu:menuitem menu:id=".uno:SelectVisibleRows"/>
          <menu:menuitem menu:id=".uno:SelectVisibleColumns"/>
        </menu:menupopup>
      </menu:menu>
      <menu:menuseparator/>