sw/source/uibase/inc/navipi.hxx   |    1 +
 sw/source/uibase/utlui/navipi.cxx |   33 +++++++++++++++++++++++++++++++--
 2 files changed, 32 insertions(+), 2 deletions(-)

New commits:
commit 7019eef453954785ad039bebd8c8a00183992584
Author:     Matt K <matt...@gmail.com>
AuthorDate: Fri Jul 7 00:15:02 2023 -0500
Commit:     Heiko Tietze <heiko.tie...@documentfoundation.org>
CommitDate: Mon Jul 10 16:41:26 2023 +0200

    tdf#146273 Do not allow non-numeric values for Navigator "Go to"
    
    This change modifies "SwNavigationPI::EditAction" and adds a new
    "connect_changed" handler "PageModifiedHdl" to the spin control
    (needed to intercept text handling).  In both functions we
    perform checks to ensure that only numeric values can be entered
    and only values within the page range of the document.  This
    now matches the behavior of the "Go to Page" feature.  To go
    to the first page, just enter a character input.  To go to
    the last page, just enter a value higher than the total number
    of pages.
    
    Change-Id: Ia020d72f4bed5b98b668ba95888bc4bc1d65e07d
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/154156
    Tested-by: Jenkins
    Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com>
    Reviewed-by: Heiko Tietze <heiko.tie...@documentfoundation.org>

diff --git a/sw/source/uibase/inc/navipi.hxx b/sw/source/uibase/inc/navipi.hxx
index 5b9862101254..f87474ab7cba 100644
--- a/sw/source/uibase/inc/navipi.hxx
+++ b/sw/source/uibase/inc/navipi.hxx
@@ -113,6 +113,7 @@ class SwNavigationPI final : public PanelLayout
     DECL_LINK( EditActionHdl, weld::Entry&, bool );
     DECL_LINK( SetFocusChildHdl, weld::Container&, void );
     DECL_LINK( NavigateByComboBoxSelectHdl, weld::ComboBox&, void );
+    DECL_LINK( PageModifiedHdl, weld::Entry&, void );
 
     bool EditAction();
     void UsePage();
diff --git a/sw/source/uibase/utlui/navipi.cxx 
b/sw/source/uibase/utlui/navipi.cxx
index 399e3824bf76..2506b5c83793 100644
--- a/sw/source/uibase/utlui/navipi.cxx
+++ b/sw/source/uibase/utlui/navipi.cxx
@@ -404,8 +404,17 @@ bool SwNavigationPI::EditAction()
     if (pView->GetEditWin().HasFocus())
         return false;
 
-    SwWrtShell &rSh = m_pCreateView->GetWrtShell();
-    sal_uInt16 nNewPage = m_xEdit->get_value();
+    if (m_xEdit->get_text().isEmpty())
+        return false;
+    sal_Int64 nNewPage = m_xEdit->get_text().toInt32();
+    SwWrtShell& rSh = m_pCreateView->GetWrtShell();
+    sal_Int64 max = rSh.GetPageCnt();
+    if (nNewPage <= 0)
+        nNewPage = 1;
+    else if (nNewPage > max)
+        nNewPage = max;
+    m_xEdit->set_value(nNewPage);
+    m_xEdit->set_position(-1);
 
     rSh.GotoPage(nNewPage, true);
     m_pCreateView->GetViewFrame().GetBindings().Invalidate(FN_STAT_PAGE);
@@ -500,6 +509,25 @@ std::unique_ptr<PanelLayout> 
SwNavigationPI::Create(weld::Widget* pParent,
     return std::make_unique<SwNavigationPI>(pParent, rxFrame, pBindings, 
nullptr);
 }
 
+IMPL_LINK_NOARG(SwNavigationPI, PageModifiedHdl, weld::Entry&, void)
+{
+    SwView* pView = GetCreateView();
+    if (!pView)
+        return;
+    if (m_xEdit->get_text().isEmpty())
+        return;
+    sal_Int64 page_value = m_xEdit->get_text().toInt32();
+    SwWrtShell& rSh = m_pCreateView->GetWrtShell();
+    sal_Int64 max = rSh.GetPageCnt();
+    if (page_value <= 0)
+        m_xEdit->set_value(1);
+    else if (page_value > max)
+        m_xEdit->set_value(max);
+    else
+        m_xEdit->set_value(page_value);
+    m_xEdit->set_position(-1);
+}
+
 SwNavigationPI::SwNavigationPI(weld::Widget* pParent,
     const css::uno::Reference<css::frame::XFrame>& rxFrame,
     SfxBindings* _pBindings, SfxNavigator* pNavigatorDlg)
@@ -590,6 +618,7 @@ SwNavigationPI::SwNavigationPI(weld::Widget* pParent,
     m_xEdit->set_width_chars(3);
     m_xEdit->connect_activate(LINK(this, SwNavigationPI, EditActionHdl));
     m_xEdit->connect_value_changed(LINK(this, SwNavigationPI, 
PageEditModifyHdl));
+    m_xEdit->connect_changed(LINK(this, SwNavigationPI, PageModifiedHdl));
     m_xEdit->set_help_id("modules/swriter/ui/navigatorpanel/numericfield");
 
     if (!IsGlobalDoc())

Reply via email to