tdf#137494 Add Select Cycle uno command

Assign F8 for toggling SelWrd > SelSentence > SelPara > Unselect.
Reassign Extend Selection to Alt+F8.

Change-Id: I2fc03c70a5786a629169178e64a0b0fd85ba2742
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/112326
Tested-by: Jenkins
Reviewed-by: Jim Raykowski <raykowj@gmail.com>
diff --git a/officecfg/registry/data/org/openoffice/Office/Accelerators.xcu b/officecfg/registry/data/org/openoffice/Office/Accelerators.xcu
index 967aa98..fbccb8a 100644
--- a/officecfg/registry/data/org/openoffice/Office/Accelerators.xcu
+++ b/officecfg/registry/data/org/openoffice/Office/Accelerators.xcu
@@ -2329,12 +2329,18 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for some emoji thing
            <value xml:lang="en-US">.uno:ThesaurusDialog</value>
          </prop>
        </node>
        <node oor:name="F8" oor:op="replace">
        <node oor:name="F8_MOD2" oor:op="replace">
          <prop oor:name="Command">
            <value xml:lang="x-no-translate">I10N SHORTCUTS - NO TRANSLATE</value>
            <value xml:lang="en-US">.uno:SetExtSelection</value>
          </prop>
        </node>
        <node oor:name="F8" oor:op="replace">
          <prop oor:name="Command">
            <value xml:lang="x-no-translate">I10N SHORTCUTS - NO TRANSLATE</value>
            <value xml:lang="en-US">.uno:SelectionCycle</value>
          </prop>
        </node>
        <node oor:name="F8_MOD1" oor:op="replace">
          <prop oor:name="Command">
            <value xml:lang="x-no-translate">I10N SHORTCUTS - NO TRANSLATE</value>
@@ -3740,12 +3746,18 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for some emoji thing
            <value xml:lang="en-US">.uno:ThesaurusDialog</value>
          </prop>
        </node>
        <node oor:name="F8" oor:op="replace">
        <node oor:name="F8_MOD2" oor:op="replace">
          <prop oor:name="Command">
            <value xml:lang="x-no-translate">I10N SHORTCUTS - NO TRANSLATE</value>
            <value xml:lang="en-US">.uno:SetExtSelection</value>
          </prop>
        </node>
        <node oor:name="F8" oor:op="replace">
          <prop oor:name="Command">
            <value xml:lang="x-no-translate">I10N SHORTCUTS - NO TRANSLATE</value>
            <value xml:lang="en-US">.uno:SelectionCycle</value>
          </prop>
        </node>
        <node oor:name="F8_MOD1" oor:op="replace">
          <prop oor:name="Command">
            <value xml:lang="x-no-translate">I10N SHORTCUTS - NO TRANSLATE</value>
@@ -4521,12 +4533,18 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for some emoji thing
            <value xml:lang="en-US">.uno:ThesaurusDialog</value>
          </prop>
        </node>
        <node oor:name="F8" oor:op="replace">
        <node oor:name="F8_MOD2" oor:op="replace">
          <prop oor:name="Command">
            <value xml:lang="x-no-translate">I10N SHORTCUTS - NO TRANSLATE</value>
            <value xml:lang="en-US">.uno:SetExtSelection</value>
          </prop>
        </node>
        <node oor:name="F8" oor:op="replace">
          <prop oor:name="Command">
            <value xml:lang="x-no-translate">I10N SHORTCUTS - NO TRANSLATE</value>
            <value xml:lang="en-US">.uno:SelectionCycle</value>
          </prop>
        </node>
        <node oor:name="F8_MOD1" oor:op="replace">
          <prop oor:name="Command">
            <value xml:lang="x-no-translate">I10N SHORTCUTS - NO TRANSLATE</value>
@@ -5301,12 +5319,18 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for some emoji thing
            <value xml:lang="en-US">.uno:ThesaurusDialog</value>
          </prop>
        </node>
        <node oor:name="F8" oor:op="replace">
        <node oor:name="F8_MOD2" oor:op="replace">
          <prop oor:name="Command">
            <value xml:lang="x-no-translate">I10N SHORTCUTS - NO TRANSLATE</value>
            <value xml:lang="en-US">.uno:SetExtSelection</value>
          </prop>
        </node>
        <node oor:name="F8" oor:op="replace">
          <prop oor:name="Command">
            <value xml:lang="x-no-translate">I10N SHORTCUTS - NO TRANSLATE</value>
            <value xml:lang="en-US">.uno:SelectionCycle</value>
          </prop>
        </node>
        <node oor:name="F8_MOD1" oor:op="replace">
          <prop oor:name="Command">
            <value xml:lang="x-no-translate">I10N SHORTCUTS - NO TRANSLATE</value>
@@ -6107,12 +6131,18 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for some emoji thing
            <value xml:lang="en-US">.uno:ThesaurusDialog</value>
          </prop>
        </node>
        <node oor:name="F8" oor:op="replace">
        <node oor:name="F8_MOD2" oor:op="replace">
          <prop oor:name="Command">
            <value xml:lang="x-no-translate">I10N SHORTCUTS - NO TRANSLATE</value>
            <value xml:lang="en-US">.uno:SetExtSelection</value>
          </prop>
        </node>
        <node oor:name="F8" oor:op="replace">
          <prop oor:name="Command">
            <value xml:lang="x-no-translate">I10N SHORTCUTS - NO TRANSLATE</value>
            <value xml:lang="en-US">.uno:SelectionCycle</value>
          </prop>
        </node>
        <node oor:name="F8_MOD1" oor:op="replace">
          <prop oor:name="Command">
            <value xml:lang="x-no-translate">I10N SHORTCUTS - NO TRANSLATE</value>
@@ -6933,12 +6963,18 @@ Ctrl+Shift+e aka E_SHIFT_MOD1 under GTK/IBUS is for some emoji thing
            <value xml:lang="en-US">.uno:ThesaurusDialog</value>
          </prop>
        </node>
        <node oor:name="F8" oor:op="replace">
        <node oor:name="F8_MOD2" oor:op="replace">
          <prop oor:name="Command">
            <value xml:lang="x-no-translate">I10N SHORTCUTS - NO TRANSLATE</value>
            <value xml:lang="en-US">.uno:SetExtSelection</value>
          </prop>
        </node>
        <node oor:name="F8" oor:op="replace">
          <prop oor:name="Command">
            <value xml:lang="x-no-translate">I10N SHORTCUTS - NO TRANSLATE</value>
            <value xml:lang="en-US">.uno:SelectionCycle</value>
          </prop>
        </node>
        <node oor:name="F8_MOD1" oor:op="replace">
          <prop oor:name="Command">
            <value xml:lang="x-no-translate">I10N SHORTCUTS - NO TRANSLATE</value>
diff --git a/officecfg/registry/data/org/openoffice/Office/UI/WriterCommands.xcu b/officecfg/registry/data/org/openoffice/Office/UI/WriterCommands.xcu
index d90b820..3bab821 100644
--- a/officecfg/registry/data/org/openoffice/Office/UI/WriterCommands.xcu
+++ b/officecfg/registry/data/org/openoffice/Office/UI/WriterCommands.xcu
@@ -2586,6 +2586,14 @@
          <value xml:lang="en-US">Select Paragraph</value>
        </prop>
      </node>
      <node oor:name=".uno:SelectionCycle" oor:op="replace">
        <prop oor:name="Label" oor:type="xs:string">
          <value xml:lang="en-US">Select Cycle</value>
        </prop>
        <prop oor:name="Properties" oor:type="xs:int">
          <value>1</value>
        </prop>
      </node>
      <node oor:name=".uno:GoToNextPara" oor:op="replace">
        <prop oor:name="Label" oor:type="xs:string">
          <value xml:lang="en-US">To Next Paragraph</value>
diff --git a/sw/inc/cmdid.h b/sw/inc/cmdid.h
index c47002b..3b8194f 100644
--- a/sw/inc/cmdid.h
+++ b/sw/inc/cmdid.h
@@ -726,6 +726,7 @@

#define FN_TO_NEXT_PAGE             (FN_SELECTION + 95)
#define FN_TO_PREV_PAGE             (FN_SELECTION + 96)
#define FN_SELECTION_CYCLE          (FN_SELECTION + 97)

// QUERY-Block
#define FN_TXTATR_INET              (FN_QUERY +29)      /* INet-Attribute */
diff --git a/sw/inc/view.hxx b/sw/inc/view.hxx
index f51a80a..2b7fe95 100644
--- a/sw/inc/view.hxx
+++ b/sw/inc/view.hxx
@@ -148,6 +148,18 @@ class SW_DLLPUBLIC SwView: public SfxViewShell
    friend class SwView_Impl;
    friend class SwClipboardChangeListener;

    // selection cycle
    struct SelectCycle
    {
        Point m_pInitialCursor;
        Point m_MarkPt;
        Point m_PointPt;
        sal_uInt16 nStep;

        SelectCycle() :
            nStep(0) {}
    };

    // search & replace
    static SvxSearchItem           *s_pSrchItem;

@@ -253,6 +265,7 @@ class SW_DLLPUBLIC SwView: public SfxViewShell
    /// functionality based on the user's view, instead of using the m_aVisArea.
    SwTwips         m_nLOKPageUpDownOffset;

    SelectCycle m_aSelectCycle;
    // methods for searching
    // set search context
    SAL_DLLPRIVATE bool          SearchAndWrap(bool bApi);
diff --git a/sw/sdi/_viewsh.sdi b/sw/sdi/_viewsh.sdi
index f55496e..3e14394f 100644
--- a/sw/sdi/_viewsh.sdi
+++ b/sw/sdi/_viewsh.sdi
@@ -45,6 +45,10 @@ interface BaseTextEditView
    [
        ExecMethod = Execute ;
    ]
    FN_SELECTION_CYCLE
    [
        ExecMethod = Execute ;
    ]
    FN_PAGEUP // status(final|play)
    [
        ExecMethod = Execute ;
diff --git a/sw/sdi/swriter.sdi b/sw/sdi/swriter.sdi
index da34afb..c560b85 100644
--- a/sw/sdi/swriter.sdi
+++ b/sw/sdi/swriter.sdi
@@ -4692,6 +4692,22 @@ SfxVoidItem GoToNextPage FN_TO_NEXT_PAGE
    GroupId = SfxGroupId::Navigator;
]

SfxVoidItem SelectionCycle FN_SELECTION_CYCLE
()
[
    AutoUpdate = FALSE,
    FastCall = TRUE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    RecordAbsolute = FALSE,
    RecordPerSet;

    AccelConfig = TRUE,
    MenuConfig = TRUE,
    ToolBoxConfig = TRUE,
    GroupId = SfxGroupId::Navigator;
]
SfxUInt16Item PageOffsetDialog FN_CHANGE_PAGENUM
(SfxUInt16Item nOffset FN_CHANGE_PAGENUM)
[
diff --git a/sw/source/uibase/uiview/view2.cxx b/sw/source/uibase/uiview/view2.cxx
index bf756f9..83ea79d 100644
--- a/sw/source/uibase/uiview/view2.cxx
+++ b/sw/source/uibase/uiview/view2.cxx
@@ -632,6 +632,44 @@ void SwView::Execute(SfxRequest &rReq)
            }
        }
        break;
        case FN_SELECTION_CYCLE:
        {
            if (m_pWrtShell->IsSelFrameMode())
                break;
            if (!m_pWrtShell->IsStdMode())
                m_pWrtShell->EnterStdMode();
            SwShellCursor *pCursor = m_pWrtShell->SwCursorShell::GetCursor_();
            Point CurrMarkPt = pCursor->GetMkPos();
            Point CurrPointPt = pCursor->GetPtPos();
            sal_uInt16 nStep = m_aSelectCycle.nStep;
            if (nStep && (CurrMarkPt != m_aSelectCycle.m_MarkPt || CurrPointPt != m_aSelectCycle.m_PointPt))
                nStep = 0;
            switch(nStep)
            {
                case 0:
                    m_aSelectCycle.m_pInitialCursor = CurrPointPt;
                    m_pWrtShell->SwCursorShell::ClearMark();
                    m_pWrtShell->SelWrd(&CurrPointPt);
                    break;
                case 1:
                    m_pWrtShell->SelSentence(&CurrPointPt);
                    break;
                case 2:
                    m_pWrtShell->SelPara(&CurrPointPt);
                    break;
                case 3:
                    m_pWrtShell->SwCursorShell::ClearMark();
                    m_pWrtShell->SwCursorShell::SetCursor(m_aSelectCycle.m_pInitialCursor);
                    break;
            }
            nStep++;
            nStep %= 4;
            pCursor = m_pWrtShell->SwCursorShell::GetCursor_();
            m_aSelectCycle.m_MarkPt = pCursor->GetMkPos();
            m_aSelectCycle.m_PointPt = pCursor->GetPtPos();
            m_aSelectCycle.nStep = nStep;
        }
        break;
        case FN_REDLINE_ON:
        {
            if( pArgs &&