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.balland@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 5c60896..d953e76 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 ec10b80..7c201c1 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 4d4cffa..02c2bc8 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 cf5f7e0..13a4b98 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 bb9ff1c..c320a0f 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 bfe19b1..daedbcb 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 5d9285b..9901d48 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 5fad14f..5e9c825 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 edf0ebb..7295dd3 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 909d9fd..8b59e67 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 8eb9dc7..b170393 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 0000000..827f56b
--- /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 0000000..e38e671
--- /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 8a65b1c..766f6c7 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 5388d02..49a978a 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 0000000..93c2e72
--- /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>