summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--vcl/source/app/salvtables.cxx86
-rw-r--r--vcl/unx/gtk3/gtk3gtkinst.cxx62
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;