diff options
-rw-r--r-- | vcl/source/app/salvtables.cxx | 86 | ||||
-rw-r--r-- | vcl/unx/gtk3/gtk3gtkinst.cxx | 62 |
2 files changed, 97 insertions, 51 deletions
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx index dd3a7f26bbe0..9b4ce8144916 100644 --- a/vcl/source/app/salvtables.cxx +++ b/vcl/source/app/salvtables.cxx @@ -765,27 +765,7 @@ public: return m_xWindow->GetText(); } - void help() - { - //show help for widget with keyboard focus - vcl::Window* pWidget = ImplGetSVData()->maWinData.mpFocusWin; - if (!pWidget) - pWidget = m_xWindow; - OString sHelpId = pWidget->GetHelpId(); - while (sHelpId.isEmpty()) - { - pWidget = pWidget->GetParent(); - if (!pWidget) - break; - sHelpId = pWidget->GetHelpId(); - } - std::unique_ptr<weld::Widget> xTemp(pWidget != m_xWindow ? new SalInstanceWidget(pWidget, m_pBuilder, false) : nullptr); - weld::Widget* pSource = xTemp ? xTemp.get() : this; - bool bRunNormalHelpRequest = !m_aHelpRequestHdl.IsSet() || m_aHelpRequestHdl.Call(*pSource); - Help* pHelp = bRunNormalHelpRequest ? Application::GetHelp() : nullptr; - if (pHelp) - pHelp->Start(OStringToOUString(sHelpId, RTL_TEXTENCODING_UTF8), pSource); - } + void help(); virtual void set_busy_cursor(bool bBusy) override { @@ -3718,6 +3698,17 @@ public: return o3tl::make_unique<SalInstanceSizeGroup>(); } + OString get_current_page_help_id() + { + TabControl *pCtrl = get_builder().get<TabControl>("tabcontrol"); + TabPage* pTabPage = pCtrl ? pCtrl->GetTabPage(pCtrl->GetCurPageId()) : nullptr; + vcl::Window *pTabChild = pTabPage ? pTabPage->GetWindow(GetWindowType::FirstChild) : nullptr; + pTabChild = pTabChild ? pTabChild->GetWindow(GetWindowType::FirstChild) : nullptr; + if (pTabChild) + return pTabChild->GetHelpId(); + return OString(); + } + virtual ~SalInstanceBuilder() override { if (VclBuilderContainer* pOwnedToplevel = dynamic_cast<VclBuilderContainer*>(m_aOwnedToplevel.get())) @@ -3747,6 +3738,43 @@ weld::Builder* Application::CreateInterimBuilder(weld::Widget* pParent, const OU return Application::CreateInterimBuilder(pParentWidget, rUIFile); } +void SalInstanceWindow::help() +{ + //show help for widget with keyboard focus + vcl::Window* pWidget = ImplGetSVData()->maWinData.mpFocusWin; + if (!pWidget) + pWidget = m_xWindow; + OString sHelpId = pWidget->GetHelpId(); + while (sHelpId.isEmpty()) + { + pWidget = pWidget->GetParent(); + if (!pWidget) + break; + sHelpId = pWidget->GetHelpId(); + } + std::unique_ptr<weld::Widget> xTemp(pWidget != m_xWindow ? new SalInstanceWidget(pWidget, m_pBuilder, false) : nullptr); + weld::Widget* pSource = xTemp ? xTemp.get() : this; + bool bRunNormalHelpRequest = !m_aHelpRequestHdl.IsSet() || m_aHelpRequestHdl.Call(*pSource); + Help* pHelp = bRunNormalHelpRequest ? Application::GetHelp() : nullptr; + if (pHelp) + { + // tdf#126007, there's a nice fallback route for offline help where + // the current page of a notebook will get checked when the help + // button is pressed and there was no help for the dialog found. + // + // But for online help that route doesn't get taken, so bodge this here + // by using the page help id if available and if the help button itself + // was the original id + if (m_pBuilder && sHelpId.endsWith("/help")) + { + OString sPageId = m_pBuilder->get_current_page_help_id(); + if (!sPageId.isEmpty()) + sHelpId = sPageId; + } + pHelp->Start(OStringToOUString(sHelpId, RTL_TEXTENCODING_UTF8), pSource); + } +} + //iterate upwards through the hierarchy from this widgets through its parents //calling func with their helpid until func returns true or we run out of parents void SalInstanceWidget::help_hierarchy_foreach(const std::function<bool(const OString&)>& func) @@ -3756,17 +3784,11 @@ void SalInstanceWidget::help_hierarchy_foreach(const std::function<bool(const OS { if (m_pBuilder && pParent->IsDialog()) { - // tdf#122355 During help fallback, before we ask a dialog for its help - // see if it has a TabControl and ask the active tab of that for help - TabControl *pCtrl = m_pBuilder->get_builder().get<TabControl>("tabcontrol"); - TabPage* pTabPage = pCtrl ? pCtrl->GetTabPage(pCtrl->GetCurPageId()) : nullptr; - vcl::Window *pTabChild = pTabPage ? pTabPage->GetWindow(GetWindowType::FirstChild) : nullptr; - pTabChild = pTabChild ? pTabChild->GetWindow(GetWindowType::FirstChild) : nullptr; - if (pTabChild) - { - if (func(pTabChild->GetHelpId())) - return; - } + // tdf#122355 before trying dialog help, check to see if there is a notebook + // called tabcontrol, and try the help for the current page of that first + OString sPageHelpId(m_pBuilder->get_current_page_help_id()); + if (!sPageHelpId.isEmpty() && func(sPageHelpId)) + return; } if (func(pParent->GetHelpId())) return; diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx index 9831762f4a43..532ec11ffe27 100644 --- a/vcl/unx/gtk3/gtk3gtkinst.cxx +++ b/vcl/unx/gtk3/gtk3gtkinst.cxx @@ -7851,6 +7851,31 @@ public: m_aMnemonicButtons.clear(); } + OString get_current_page_help_id() + { + OString sPageHelpId; + // check to see if there is a notebook called tabcontrol and get the + // helpid for the current page of that + std::unique_ptr<weld::Notebook> xNotebook(weld_notebook("tabcontrol", false)); + if (xNotebook) + { + if (GtkInstanceContainer* pPage = dynamic_cast<GtkInstanceContainer*>(xNotebook->get_page(xNotebook->get_current_page_ident()))) + { + GtkWidget* pContainer = pPage->getWidget(); + GList* pChildren = gtk_container_get_children(GTK_CONTAINER(pContainer)); + GList* pChild = g_list_first(pChildren); + if (pChild) + { + GtkWidget* pPageWidget = static_cast<GtkWidget*>(pChild->data); + sPageHelpId = ::get_help_id(pPageWidget); + } + g_list_free(pChildren); + } + } + return sPageHelpId; + } + + virtual ~GtkInstanceBuilder() override { g_slist_free(m_pObjectList); @@ -8147,7 +8172,22 @@ void GtkInstanceWindow::help() bool bRunNormalHelpRequest = !m_aHelpRequestHdl.IsSet() || m_aHelpRequestHdl.Call(*pSource); Help* pHelp = bRunNormalHelpRequest ? Application::GetHelp() : nullptr; if (pHelp) + { + // tdf#126007, there's a nice fallback route for offline help where + // the current page of a notebook will get checked when the help + // button is pressed and there was no help for the dialog found. + // + // But for online help that route doesn't get taken, so bodge this here + // by using the page help id if available and if the help button itself + // was the original id + if (m_pBuilder && sHelpId.endsWith("/help")) + { + OString sPageId = m_pBuilder->get_current_page_help_id(); + if (!sPageId.isEmpty()) + sHelpId = sPageId; + } pHelp->Start(OStringToOUString(sHelpId, RTL_TEXTENCODING_UTF8), pSource); + } } //iterate upwards through the hierarchy from this widgets through its parents @@ -8161,25 +8201,9 @@ void GtkInstanceWidget::help_hierarchy_foreach(const std::function<bool(const OS // called tabcontrol, and try the help for the current page of that first if (m_pBuilder && GTK_IS_DIALOG(pParent)) { - std::unique_ptr<weld::Notebook> xNotebook(m_pBuilder->weld_notebook("tabcontrol", false)); - if (xNotebook) - { - if (GtkInstanceContainer* pPage = dynamic_cast<GtkInstanceContainer*>(xNotebook->get_page(xNotebook->get_current_page_ident()))) - { - bool bFinished = false; - GtkWidget* pContainer = pPage->getWidget(); - GList* pChildren = gtk_container_get_children(GTK_CONTAINER(pContainer)); - GList* pChild = g_list_first(pChildren); - if (pChild) - { - GtkWidget* pPageWidget = static_cast<GtkWidget*>(pChild->data); - bFinished = func(::get_help_id(pPageWidget)); - } - g_list_free(pChildren); - if (bFinished) - return; - } - } + OString sPageHelpId(m_pBuilder->get_current_page_help_id()); + if (!sPageHelpId.isEmpty() && func(sPageHelpId)) + return; } if (func(::get_help_id(pParent))) return; |