officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu |    8 
 osx/soffice.xcodeproj/project.pbxproj                             |    1 
 sc/Library_scui.mk                                                |    1 
 sc/UIConfig_scalc.mk                                              |    1 
 sc/inc/helpids.h                                                  |    2 
 sc/inc/pch/precompiled_scui.hxx                                   |    1 
 sc/inc/scabstdlg.hxx                                              |   13 
 sc/inc/strings.hrc                                                |    3 
 sc/sdi/scalc.sdi                                                  |    4 
 sc/source/ui/attrdlg/scdlgfact.cxx                                |   32 +
 sc/source/ui/attrdlg/scdlgfact.hxx                                |   18 
 sc/source/ui/inc/gototabdlg.hxx                                   |   43 ++
 sc/source/ui/miscdlgs/gototabdlg.cxx                              |   81 ++++
 sc/source/ui/view/tabvwsh3.cxx                                    |   48 ++
 sc/uiconfig/scalc/menubar/menubar.xml                             |    1 
 sc/uiconfig/scalc/ui/gotosheetdialog.ui                           |  201 
++++++++++
 16 files changed, 451 insertions(+), 7 deletions(-)

New commits:
commit d93e9430bfbf6fa8a679ea2d4d98f955774026f6
Author:     Laurent BP <laurent.balland-poir...@laposte.net>
AuthorDate: Mon May 16 22:47:25 2022 +0200
Commit:     Laurent Balland-Poirier <laurent.ball...@mailo.fr>
CommitDate: Tue Jun 7 13:43:20 2022 +0200

    tdf#129674 Add GoTo Sheet command
    
    Insert command in menu Sheet > Navigate
    (alongs with To Previous/Next Sheet)
    Use .uno:JumpToTable command from Navigator
    Use its own Go To Sheet dialog
    Add a Search entry to type partial name of sheet
    Menu translation missing?
    
    Change-Id: I16b8b56a688c8396159617f04a2a7e034721ce31
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/134714
    Tested-by: Jenkins
    Reviewed-by: Laurent Balland-Poirier <laurent.ball...@mailo.fr>

diff --git a/officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu 
b/officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu
index 5c608969da64..d953e76d552f 100644
--- a/officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu
+++ b/officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu
@@ -557,6 +557,14 @@
           <value>1</value>
         </prop>
       </node>
+      <node oor:name=".uno:JumpToTable" oor:op="replace">
+        <prop oor:name="Label" oor:type="xs:string">
+          <value xml:lang="en-US">~Go to Sheet...</value>
+        </prop>
+        <prop oor:name="Properties" oor:type="xs:int">
+          <value>1</value>
+        </prop>
+      </node>
       <node oor:name=".uno:StarChartDialog" oor:op="replace">
         <prop oor:name="Label" oor:type="xs:string">
           <value xml:lang="en-US">Ch~art...</value>
diff --git a/osx/soffice.xcodeproj/project.pbxproj 
b/osx/soffice.xcodeproj/project.pbxproj
index ec10b807a1ec..7c201c130e24 100644
--- a/osx/soffice.xcodeproj/project.pbxproj
+++ b/osx/soffice.xcodeproj/project.pbxproj
@@ -124,6 +124,7 @@
                BE017BF925AF568900244ED8 /* mtrindlg.cxx */ = {isa = 
PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = mtrindlg.cxx; 
path = ../sc/source/ui/miscdlgs/mtrindlg.cxx; sourceTree = "<group>"; };
                BE017BFA25AF568900244ED8 /* linkarea.cxx */ = {isa = 
PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = linkarea.cxx; 
path = ../sc/source/ui/miscdlgs/linkarea.cxx; sourceTree = "<group>"; };
                BE017BFB25AF568900244ED8 /* shtabdlg.cxx */ = {isa = 
PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = shtabdlg.cxx; 
path = ../sc/source/ui/miscdlgs/shtabdlg.cxx; sourceTree = "<group>"; };
+               BE017BFB25AF568900244ED8 /* gototabdlg.cxx */ = {isa = 
PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = 
gototabdlg.cxx; path = ../sc/source/ui/miscdlgs/gototabdlg.cxx; sourceTree = 
"<group>"; };
                BE017BFC25AF568900244ED8 /* inscodlg.cxx */ = {isa = 
PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = inscodlg.cxx; 
path = ../sc/source/ui/miscdlgs/inscodlg.cxx; sourceTree = "<group>"; };
                BE017BFD25AF568A00244ED8 /* crdlg.cxx */ = {isa = 
PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = crdlg.cxx; 
path = ../sc/source/ui/miscdlgs/crdlg.cxx; sourceTree = "<group>"; };
                BE017BFE25AF568A00244ED8 /* datafdlg.cxx */ = {isa = 
PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = datafdlg.cxx; 
path = ../sc/source/ui/miscdlgs/datafdlg.cxx; sourceTree = "<group>"; };
diff --git a/sc/Library_scui.mk b/sc/Library_scui.mk
index 4d4cffa12bd4..02c2bc8244d1 100644
--- a/sc/Library_scui.mk
+++ b/sc/Library_scui.mk
@@ -95,6 +95,7 @@ $(eval $(call gb_Library_add_exception_objects,scui,\
     sc/source/ui/miscdlgs/delcldlg \
     sc/source/ui/miscdlgs/delcodlg \
     sc/source/ui/miscdlgs/filldlg \
+    sc/source/ui/miscdlgs/gototabdlg \
     sc/source/ui/miscdlgs/groupdlg \
     sc/source/ui/miscdlgs/inscldlg \
     sc/source/ui/miscdlgs/inscodlg \
diff --git a/sc/UIConfig_scalc.mk b/sc/UIConfig_scalc.mk
index cf5f7e0951bf..13a4b98a6c7c 100644
--- a/sc/UIConfig_scalc.mk
+++ b/sc/UIConfig_scalc.mk
@@ -139,6 +139,7 @@ $(eval $(call gb_UIConfig_add_uifiles,modules/scalc,\
        sc/uiconfig/scalc/ui/floatinglinestyle \
        sc/uiconfig/scalc/ui/functionpanel \
        sc/uiconfig/scalc/ui/goalseekdlg \
+       sc/uiconfig/scalc/ui/gotosheetdialog \
        sc/uiconfig/scalc/ui/groupdialog \
        sc/uiconfig/scalc/ui/groupbydate \
        sc/uiconfig/scalc/ui/groupbynumber \
diff --git a/sc/inc/helpids.h b/sc/inc/helpids.h
index bb9ff1c2faed..c320a0f94bd0 100644
--- a/sc/inc/helpids.h
+++ b/sc/inc/helpids.h
@@ -63,6 +63,8 @@ inline constexpr OStringLiteral HID_PASSWD_DOC_CONFIRM = 
"SC_HID_PASSWD_DOC_CONF
 
 // Other help IDs (max.70) ---------------------------------------------------
 inline constexpr OStringLiteral HID_SELECTTABLES = "SC_HID_SELECTTABLES";
+inline constexpr OStringLiteral HID_GOTOTABLE  = "SC_HID_GOTOTABLE";
+inline constexpr OStringLiteral HID_GOTOTABLEMASK  = "SC_HID_GOTOTABLEMASK";
 
 
 // Analysis Addin Functions (max.120) ----------------------------------------
diff --git a/sc/inc/pch/precompiled_scui.hxx b/sc/inc/pch/precompiled_scui.hxx
index bfe19b1ba147..daedbcbd231e 100644
--- a/sc/inc/pch/precompiled_scui.hxx
+++ b/sc/inc/pch/precompiled_scui.hxx
@@ -141,6 +141,7 @@
 #include <formulaopt.hxx>
 #include <global.hxx>
 #include <globalnames.hxx>
+#include <gototabdlg.hxx>
 #include <groupdlg.hxx>
 #include <helpids.h>
 #include <hfedtdlg.hxx>
diff --git a/sc/inc/scabstdlg.hxx b/sc/inc/scabstdlg.hxx
index 5d9285b5017a..9901d48bd610 100644
--- a/sc/inc/scabstdlg.hxx
+++ b/sc/inc/scabstdlg.hxx
@@ -396,6 +396,17 @@ public:
     virtual bool IsKeepAskingSet() const = 0;
 };
 
+class AbstractScGoToTabDlg : public VclAbstractDialog
+{
+protected:
+    virtual             ~AbstractScGoToTabDlg() override = default;
+public:
+    virtual void Insert( const OUString& rString, bool bSelected ) = 0;
+    virtual void SetDescription(const OUString& rTitle, const OUString& 
rEntryLabel, const OUString& rListLabel,
+                                const OString& rDlgHelpId, const OString& 
rEnHelpId, const OString& rLbHelpId) = 0;
+    virtual OUString GetSelectedEntry() const = 0;
+};
+
 class ScAbstractDialogFactory
 {
 public:
@@ -526,6 +537,8 @@ public:
                                                                         bool   
                 bOnlyDbtoolsEncodings,
                                                                         bool   
                 bImport = true ) = 0;
 
+    virtual VclPtr<AbstractScGoToTabDlg> CreateScGoToTabDlg(weld::Window* 
pParent) = 0;
+
     virtual VclPtr<SfxAbstractTabDialog> CreateScAttrDlg(weld::Window* pParent,
                                                     const SfxItemSet* 
pCellAttrs) = 0;
 
diff --git a/sc/inc/strings.hrc b/sc/inc/strings.hrc
index 5fad14fbc4c1..5e9c82592e68 100644
--- a/sc/inc/strings.hrc
+++ b/sc/inc/strings.hrc
@@ -87,8 +87,11 @@
 #define STR_CAPTION_DEFAULT_TEXT                    
NC_("STR_CAPTION_DEFAULT_TEXT", "Text")
 // Select tables dialog title
 #define STR_DLG_SELECTTABLES_TITLE                  
NC_("STR_DLG_SELECTTABLES_TITLE", "Select Sheets")
+#define STR_DLG_SELECTTABLE_TITLE                   
NC_("STR_DLG_SELECTTABLE_TITLE", "Go to Sheet")
+#define STR_DLG_SELECTTABLE_MASK                    
NC_("STR_DLG_SELECTTABLE_MASK", "~Type a Sheet Name")
 // Select tables dialog listbox
 #define STR_DLG_SELECTTABLES_LBNAME                 
NC_("STR_DLG_SELECTTABLES_LBNAME", "~Selected sheets")
+#define STR_DLG_SELECTTABLE_LBNAME                  
NC_("STR_DLG_SELECTTABLE_LBNAME", "~Sheets")
 #define STR_ACC_CSVRULER_NAME                       
NC_("STR_ACC_CSVRULER_NAME", "Ruler")
 #define STR_ACC_CSVRULER_DESCR                      
NC_("STR_ACC_CSVRULER_DESCR", "This ruler manages objects at fixed positions.")
 #define STR_ACC_CSVGRID_NAME                        
NC_("STR_ACC_CSVGRID_NAME", "Preview")
diff --git a/sc/sdi/scalc.sdi b/sc/sdi/scalc.sdi
index edf0ebb7134d..7295dd3ef978 100644
--- a/sc/sdi/scalc.sdi
+++ b/sc/sdi/scalc.sdi
@@ -3487,8 +3487,8 @@ SfxVoidItem JumpToTable SID_CURRENTTAB
     RecordAbsolute = FALSE,
     RecordPerSet;
 
-    AccelConfig = FALSE,
-    MenuConfig = FALSE,
+    AccelConfig = TRUE,
+    MenuConfig = TRUE,
     ToolBoxConfig = FALSE,
     GroupId = SfxGroupId::Navigator;
 ]
diff --git a/sc/source/ui/attrdlg/scdlgfact.cxx 
b/sc/source/ui/attrdlg/scdlgfact.cxx
index 909d9fd85a43..8b59e672ca12 100644
--- a/sc/source/ui/attrdlg/scdlgfact.cxx
+++ b/sc/source/ui/attrdlg/scdlgfact.cxx
@@ -275,6 +275,16 @@ bool 
AbstractScShowTabDlg_Impl::StartExecuteAsync(VclAbstractDialog::AsyncContex
     return weld::DialogController::runAsync(m_xDlg, rCtx.maEndDialogFn);
 }
 
+short AbstractScGoToTabDlg_Impl::Execute()
+{
+    return m_xDlg->run();
+}
+
+bool 
AbstractScGoToTabDlg_Impl::StartExecuteAsync(VclAbstractDialog::AsyncContext 
&rCtx)
+{
+    return weld::DialogController::runAsync(m_xDlg, rCtx.maEndDialogFn);
+}
+
 short AbstractScSortWarningDlg_Impl::Execute()
 {
     return m_xDlg->run();
@@ -839,6 +849,23 @@ OUString AbstractScShowTabDlg_Impl::GetEntry(sal_Int32 
nPos) const
     return m_xDlg->GetEntry(nPos);
 }
 
+void AbstractScGoToTabDlg_Impl::Insert( const OUString& rString, bool 
bSelected )
+{
+    m_xDlg->Insert(rString, bSelected);
+}
+
+void    AbstractScGoToTabDlg_Impl::SetDescription(
+                const OUString& rTitle, const OUString& rEntryLabel, const 
OUString& rListLabel,
+                const OString& rDlgHelpId, const OString& rEnHelpId, const 
OString& rLbHelpId )
+{
+    m_xDlg->SetDescription( rTitle, rEntryLabel, rListLabel, rDlgHelpId, 
rEnHelpId, rLbHelpId );
+}
+
+OUString AbstractScGoToTabDlg_Impl::GetSelectedEntry() const
+{
+    return m_xDlg->GetSelectedEntry();
+}
+
 short AbstractScStringInputDlg_Impl::Execute()
 {
     return m_xDlg->run();
@@ -1183,6 +1210,11 @@ VclPtr<AbstractScShowTabDlg> 
ScAbstractDialogFactory_Impl::CreateScShowTabDlg(we
     return 
VclPtr<AbstractScShowTabDlg_Impl>::Create(std::make_shared<ScShowTabDlg>(pParent));
 }
 
+VclPtr<AbstractScGoToTabDlg> 
ScAbstractDialogFactory_Impl::CreateScGoToTabDlg(weld::Window* pParent)
+{
+    return 
VclPtr<AbstractScGoToTabDlg_Impl>::Create(std::make_shared<ScGoToTabDlg>(pParent));
+}
+
 VclPtr<AbstractScStringInputDlg> 
ScAbstractDialogFactory_Impl::CreateScStringInputDlg(weld::Window* pParent,
         const OUString& rTitle, const OUString& rEditTitle, const OUString& 
rDefault, const OString& rHelpId,
         const OString& rEditHelpId)
diff --git a/sc/source/ui/attrdlg/scdlgfact.hxx 
b/sc/source/ui/attrdlg/scdlgfact.hxx
index 8eb9dc7a5976..b1703930c584 100644
--- a/sc/source/ui/attrdlg/scdlgfact.hxx
+++ b/sc/source/ui/attrdlg/scdlgfact.hxx
@@ -30,6 +30,7 @@
 #include <delcldlg.hxx>
 #include <dpgroupdlg.hxx>
 #include <filldlg.hxx>
+#include <gototabdlg.hxx>
 #include <groupdlg.hxx>
 #include <linkarea.hxx>
 #include <lbseldlg.hxx>
@@ -517,6 +518,22 @@ public:
     virtual std::vector<sal_Int32> GetSelectedRows() const override;
 };
 
+class AbstractScGoToTabDlg_Impl : public AbstractScGoToTabDlg
+{
+    std::shared_ptr<ScGoToTabDlg> m_xDlg;
+public:
+    explicit AbstractScGoToTabDlg_Impl(std::shared_ptr<ScGoToTabDlg> p)
+        : m_xDlg(std::move(p))
+    {
+    }
+    virtual short Execute() override;
+    virtual bool StartExecuteAsync(VclAbstractDialog::AsyncContext &rCtx) 
override;
+    virtual void Insert( const OUString& rString, bool bSelected ) override;
+    virtual void SetDescription(const OUString& rTitle, const OUString& 
rEntryLabel, const OUString& rListLabel,
+                                const OString& rDlgHelpId, const OString& 
rEnHelpId, const OString& rLbHelpId) override;
+    virtual OUString GetSelectedEntry() const override;
+};
+
 class AbstractScSortWarningDlg_Impl : public AbstractScSortWarningDlg
 {
     std::unique_ptr<ScSortWarningDlg> m_xDlg;
@@ -739,6 +756,7 @@ public:
     virtual VclPtr<AbstractScNewScenarioDlg> 
CreateScNewScenarioDlg(weld::Window* pParent, const OUString& rName,
                                                                     bool 
bEdit, bool bSheetProtected) override;
     virtual VclPtr<AbstractScShowTabDlg> CreateScShowTabDlg(weld::Window* 
pParent) override;
+    virtual VclPtr<AbstractScGoToTabDlg> CreateScGoToTabDlg(weld::Window* 
pParent) override;
 
     virtual VclPtr<AbstractScStringInputDlg> 
CreateScStringInputDlg(weld::Window* pParent,
                                                                     const 
OUString& rTitle,
diff --git a/sc/source/ui/inc/gototabdlg.hxx b/sc/source/ui/inc/gototabdlg.hxx
new file mode 100644
index 000000000000..827f56b17760
--- /dev/null
+++ b/sc/source/ui/inc/gototabdlg.hxx
@@ -0,0 +1,43 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-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/.
+ *
+ */
+
+#pragma once
+
+#include <vcl/weld.hxx>
+
+class ScGoToTabDlg : public weld::GenericDialogController
+{
+private:
+    std::vector<OUString> maCacheSheetsNames;
+
+    std::unique_ptr<weld::Frame> m_xFrameMask;
+    std::unique_ptr<weld::Entry> m_xEnNameMask;
+    std::unique_ptr<weld::Frame> m_xFrameSheets;
+    std::unique_ptr<weld::TreeView> m_xLb;
+
+    DECL_LINK(DblClkHdl, weld::TreeView&, bool);
+    DECL_LINK(FindNameHdl, weld::Entry&, void);
+
+public:
+    ScGoToTabDlg(weld::Window* pParent);
+    virtual ~ScGoToTabDlg() override;
+
+    /** Sets dialog title, label texts and help IDs. */
+    void SetDescription(const OUString& rTitle, const OUString& rEntryLabel,
+                        const OUString& rListLabel, const OString& rDlgHelpId,
+                        const OString& rEnHelpId, const OString& rLbHelpId);
+
+    /** Inserts a string into the weld::TreeView. */
+    void Insert(const OUString& rString, bool bSelected);
+
+    OUString GetSelectedEntry() const;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/ui/miscdlgs/gototabdlg.cxx 
b/sc/source/ui/miscdlgs/gototabdlg.cxx
new file mode 100644
index 000000000000..e38e671009ee
--- /dev/null
+++ b/sc/source/ui/miscdlgs/gototabdlg.cxx
@@ -0,0 +1,81 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-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/.
+ *
+ */
+
+#undef SC_DLLIMPLEMENTATION
+
+#include <gototabdlg.hxx>
+
+ScGoToTabDlg::ScGoToTabDlg(weld::Window* pParent)
+    : GenericDialogController(pParent, "modules/scalc/ui/gotosheetdialog.ui", 
"GoToSheetDialog")
+    , m_xFrameMask(m_xBuilder->weld_frame("frame-mask"))
+    , m_xEnNameMask(m_xBuilder->weld_entry("entry-mask"))
+    , m_xFrameSheets(m_xBuilder->weld_frame("frame-sheets"))
+    , m_xLb(m_xBuilder->weld_tree_view("treeview"))
+{
+    m_xLb->set_selection_mode(SelectionMode::Single);
+    m_xLb->set_size_request(-1, m_xLb->get_height_rows(10));
+    m_xLb->connect_row_activated(LINK(this, ScGoToTabDlg, DblClkHdl));
+    m_xEnNameMask->connect_changed(LINK(this, ScGoToTabDlg, FindNameHdl));
+}
+
+ScGoToTabDlg::~ScGoToTabDlg() {}
+
+void ScGoToTabDlg::SetDescription(const OUString& rTitle, const OUString& 
rEntryLabel,
+                                  const OUString& rListLabel, const OString& 
rDlgHelpId,
+                                  const OString& rEnHelpId, const OString& 
rLbHelpId)
+{
+    m_xDialog->set_title(rTitle);
+    m_xFrameMask->set_label(rEntryLabel);
+    m_xFrameSheets->set_label(rListLabel);
+    m_xDialog->set_help_id(rDlgHelpId);
+    m_xEnNameMask->set_help_id(rEnHelpId);
+    m_xLb->set_help_id(rLbHelpId);
+}
+
+void ScGoToTabDlg::Insert(const OUString& rString, bool bSelected)
+{
+    maCacheSheetsNames.push_back(rString);
+    m_xLb->append_text(rString);
+    if (bSelected)
+        m_xLb->select(m_xLb->n_children() - 1);
+}
+
+OUString ScGoToTabDlg::GetSelectedEntry() const { return 
m_xLb->get_selected_text(); }
+
+IMPL_LINK_NOARG(ScGoToTabDlg, DblClkHdl, weld::TreeView&, bool)
+{
+    m_xDialog->response(RET_OK);
+    return true;
+}
+
+IMPL_LINK_NOARG(ScGoToTabDlg, FindNameHdl, weld::Entry&, void)
+{
+    const OUString aMask = m_xEnNameMask->get_text();
+    m_xLb->clear();
+    if (aMask.isEmpty())
+    {
+        for (const OUString& s : maCacheSheetsNames)
+        {
+            m_xLb->append_text(s);
+        }
+    }
+    else
+    {
+        for (const OUString& s : maCacheSheetsNames)
+        {
+            if (s.indexOf(aMask) >= 0)
+            {
+                m_xLb->append_text(s);
+            }
+        }
+    }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/ui/view/tabvwsh3.cxx b/sc/source/ui/view/tabvwsh3.cxx
index 8a65b1c7b917..766f6c7621d4 100644
--- a/sc/source/ui/view/tabvwsh3.cxx
+++ b/sc/source/ui/view/tabvwsh3.cxx
@@ -516,12 +516,50 @@ void ScTabViewShell::Execute( SfxRequest& rReq )
             break;
 
         case SID_CURRENTTAB:
-            if ( pReqArgs )
             {
-                // sheet for basic is one-based
-                SCTAB nTab = static_cast<const 
SfxUInt16Item&>(pReqArgs->Get(nSlot)).GetValue() - 1;
-                ScDocument& rDoc = GetViewData().GetDocument();
-                if ( nTab < rDoc.GetTableCount() )
+                SCTAB nTab;
+                ScViewData& rViewData = GetViewData();
+                ScDocument& rDoc = rViewData.GetDocument();
+                SCTAB nTabCount = rDoc.GetTableCount();
+                if ( pReqArgs ) // command from Navigator with nTab
+                {
+                    // sheet for basic is one-based
+                    nTab = static_cast<const 
SfxUInt16Item&>(pReqArgs->Get(nSlot)).GetValue() - 1;
+                }
+                else            // command from Menu: ask for nTab
+                {
+                    ScAbstractDialogFactory* pFact = 
ScAbstractDialogFactory::Create();
+
+                    ScopedVclPtr<AbstractScGoToTabDlg> 
pDlg(pFact->CreateScGoToTabDlg(GetFrameWeld()));
+                    pDlg->SetDescription(
+                        ScResId( STR_DLG_SELECTTABLE_TITLE ),
+                        ScResId( STR_DLG_SELECTTABLE_MASK ),
+                        ScResId( STR_DLG_SELECTTABLE_LBNAME ),
+                        
GetStaticInterface()->GetSlot(SID_CURRENTTAB)->GetCommand(), HID_GOTOTABLEMASK, 
HID_GOTOTABLE );
+
+                    // fill all table names and select current tab
+                    OUString aTabName;
+                    for( nTab = 0; nTab < nTabCount; ++nTab )
+                    {
+                        if( rDoc.IsVisible( nTab ) )
+                        {
+                            rDoc.GetName( nTab, aTabName );
+                            pDlg->Insert( aTabName, rViewData.GetTabNo() == 
nTab );
+                        }
+                    }
+
+                    if( pDlg->Execute() == RET_OK )
+                    {
+                        if( !rDoc.GetTable( pDlg->GetSelectedEntry(), nTab ) )
+                            nTab = nTabCount;
+                        pDlg.disposeAndClear();
+                    }
+                    else
+                    {
+                        rReq.Ignore();
+                    }
+                }
+                if ( nTab < nTabCount )
                 {
                     SetTabNo( nTab );
                     rBindings.Update( nSlot );
diff --git a/sc/uiconfig/scalc/menubar/menubar.xml 
b/sc/uiconfig/scalc/menubar/menubar.xml
index 5388d021e96b..49a978aa4f29 100644
--- a/sc/uiconfig/scalc/menubar/menubar.xml
+++ b/sc/uiconfig/scalc/menubar/menubar.xml
@@ -591,6 +591,7 @@
       <menu:menuitem menu:id=".uno:DuplicateSheet"/>
       <menu:menu menu:id=".uno:NavigateMenu">
         <menu:menupopup>
+          <menu:menuitem menu:id=".uno:JumpToTable"/>
           <menu:menuitem menu:id=".uno:JumpToPrevTable"/>
           <menu:menuitem menu:id=".uno:JumpToNextTable"/>
         </menu:menupopup>
diff --git a/sc/uiconfig/scalc/ui/gotosheetdialog.ui 
b/sc/uiconfig/scalc/ui/gotosheetdialog.ui
new file mode 100644
index 000000000000..93c2e72a0e10
--- /dev/null
+++ b/sc/uiconfig/scalc/ui/gotosheetdialog.ui
@@ -0,0 +1,201 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.2 -->
+<interface domain="sc">
+  <requires lib="gtk+" version="3.20"/>
+  <object class="GtkTreeStore" id="liststore1">
+    <columns>
+      <!-- column-name text -->
+      <column type="gchararray"/>
+      <!-- column-name id -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
+  <object class="GtkDialog" id="GoToSheetDialog">
+    <property name="can_focus">False</property>
+    <property name="border_width">6</property>
+    <property name="title" translatable="yes" 
context="gotosheetdialog|GoToSheetDialog">Go to Sheet</property>
+    <property name="resizable">False</property>
+    <property name="modal">True</property>
+    <property name="default_width">0</property>
+    <property name="default_height">0</property>
+    <property name="type_hint">dialog</property>
+    <child type="titlebar">
+      <placeholder/>
+    </child>
+    <child internal-child="vbox">
+      <object class="GtkBox" id="dialog-vbox1">
+        <property name="can_focus">False</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">12</property>
+        <child internal-child="action_area">
+          <object class="GtkButtonBox" id="dialog-action_area1">
+            <property name="can_focus">False</property>
+            <property name="layout_style">end</property>
+            <child>
+              <object class="GtkButton" id="ok">
+                <property name="label" translatable="yes" 
context="stock">_OK</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="can_default">True</property>
+                <property name="has_default">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_underline">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="cancel">
+                <property name="label" translatable="yes" 
context="stock">_Cancel</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_underline">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="help">
+                <property name="label" translatable="yes" 
context="stock">_Help</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_underline">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">2</property>
+                <property name="secondary">True</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkFrame" id="frame-mask">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="hexpand">True</property>
+            <property name="vexpand">True</property>
+            <property name="label_xalign">0</property>
+            <property name="shadow_type">none</property>
+            <child>
+              <object class="GtkEntry" id="entry-mask">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="truncate-multiline">True</property>
+                <property name="activates_default">True</property>
+                <child internal-child="accessible">
+                  <object class="AtkObject" id="name-mask-atkobject">
+                    <property name="AtkObject::accessible-description" 
translatable="yes" context="gotosheetdialog|extended_tip|entry-mask">Type some 
letters of sheet name to find it.</property>
+                  </object>
+                </child>
+              </object>
+            </child>
+            <child type="label">
+              <object class="GtkLabel" id="label-mask">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes" 
context="gotosheetdialog|label-mask">_Type a sheet name</property>
+                <property name="use_underline">True</property>
+                <attributes>
+                  <attribute name="weight" value="bold"/>
+                </attributes>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkFrame" id="frame-sheets">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="hexpand">True</property>
+            <property name="vexpand">True</property>
+            <property name="label_xalign">0</property>
+            <property name="shadow_type">none</property>
+            <child>
+              <object class="GtkScrolledWindow">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="margin_start">12</property>
+                <property name="margin_top">6</property>
+                <property name="hexpand">True</property>
+                <property name="vexpand">True</property>
+                <property name="shadow_type">in</property>
+                <child>
+                  <object class="GtkTreeView" id="treeview">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="vexpand">True</property>
+                    <property name="model">liststore1</property>
+                    <property name="headers_visible">False</property>
+                    <property name="headers_clickable">False</property>
+                    <property name="search_column">0</property>
+                    <property name="show_expanders">False</property>
+                    <child internal-child="selection">
+                      <object class="GtkTreeSelection" 
id="treeview-selection1"/>
+                    </child>
+                    <child>
+                      <object class="GtkTreeViewColumn" id="treeviewcolumn1">
+                        <child>
+                          <object class="GtkCellRendererText" 
id="cellrenderertext1"/>
+                          <attributes>
+                            <attribute name="text">0</attribute>
+                          </attributes>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+            </child>
+            <child type="label">
+              <object class="GtkLabel" id="label-sheets">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes" 
context="gotosheetdialog|label-sheets">_Sheets</property>
+                <property name="use_underline">True</property>
+                <attributes>
+                  <attribute name="weight" value="bold"/>
+                </attributes>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+    <action-widgets>
+      <action-widget response="-5">ok</action-widget>
+      <action-widget response="-6">cancel</action-widget>
+      <action-widget response="-11">help</action-widget>
+    </action-widgets>
+    <child internal-child="accessible">
+      <object class="AtkObject" id="GoToSheetDialog-atkobject">
+        <property name="AtkObject::accessible-description" translatable="yes" 
context="gotosheetdialog|GoToSheetDialog">Displays a list of all visible sheets 
in your spreadsheet document.</property>
+      </object>
+    </child>
+  </object>
+</interface>

Reply via email to