From 8713b52a2fee94efe86603822d3c0e0bf330c5e4 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 14 Jun 2025 22:20:43 +0200 Subject: [PATCH] Add support for wxGenericHyperlinkCtrl to XRC too Allow to create the generic version of wxHyperlinkCtrl in addition to the native one. --- docs/doxygen/overviews/xrc_format.h | 8 +++++ misc/schema/xrc_schema.rnc | 10 ++++++ src/xrc/xh_hyperlink.cpp | 49 ++++++++++++++++++++++------- 3 files changed, 55 insertions(+), 12 deletions(-) diff --git a/docs/doxygen/overviews/xrc_format.h b/docs/doxygen/overviews/xrc_format.h index e492ff579a..484b44e0a2 100644 --- a/docs/doxygen/overviews/xrc_format.h +++ b/docs/doxygen/overviews/xrc_format.h @@ -1378,6 +1378,14 @@ page. @endTable +@subsubsection xrc_wxgenerichyperlinkctrl wxGenericHyperlinkCtrl + +This handler is identical to the one for @ref xrc_wxhyperlinkctrl +"wxHyperlinkCtrl", please see it for more information. The only difference is +that, for the platforms with a native wxHyperlinkCtrl implementation, using +this handler creates a generic control rather than a native one. + + @subsubsection xrc_wxinfobar wxInfoBar @beginTable diff --git a/misc/schema/xrc_schema.rnc b/misc/schema/xrc_schema.rnc index dfb784d14c..9153f179ec 100644 --- a/misc/schema/xrc_schema.rnc +++ b/misc/schema/xrc_schema.rnc @@ -191,6 +191,7 @@ builtinWindowClasses = | wxGauge | wxGenericAnimationCtrl | wxGenericDirCtrl + | wxGenericHyperlinkCtrl | wxGrid | wxHtmlWindow | wxHyperlinkCtrl @@ -297,6 +298,7 @@ builtinClassesNames = | "wxGauge" | "wxGenericAnimationCtrl" | "wxGenericDirCtrl" + | "wxGenericHyperlinkCtrl" | "wxGrid" | "wxHtmlWindow" | "wxHyperlinkCtrl" @@ -1043,6 +1045,14 @@ wxGenericDirCtrl = [xrc:p="o"] element defaultfilter {_, t_integer }* } +wxGenericHyperlinkCtrl = + element object { + attribute class { "wxGenericHyperlinkCtrl" } & + stdObjectNodeAttributes & + stdWindowProperties & + [xrc:p="important"] element label {_, t_text }* & + [xrc:p="important"] element url {_, t_url }* + } wxGrid = element object { diff --git a/src/xrc/xh_hyperlink.cpp b/src/xrc/xh_hyperlink.cpp index 012b8ad64a..d55441357f 100644 --- a/src/xrc/xh_hyperlink.cpp +++ b/src/xrc/xh_hyperlink.cpp @@ -57,18 +57,42 @@ wxHyperlinkCtrlXmlHandler::wxHyperlinkCtrlXmlHandler() wxObject *wxHyperlinkCtrlXmlHandler::DoCreateResource() { - XRC_MAKE_INSTANCE(control, wxHyperlinkCtrl) + wxHyperlinkCtrlBase* control = nullptr; + if ( m_instance ) + control = wxStaticCast(m_instance, wxHyperlinkCtrlBase); - control->Create - ( - m_parentAsWindow, - GetID(), - GetText(wxT("label")), - GetParamValue(wxT("url")), - GetPosition(), GetSize(), - GetStyle(wxT("style"), wxHL_DEFAULT_STYLE), - GetName() - ); + if ( !control ) + { + if ( m_class == "wxHyperlinkCtrl" ) + { + control = new wxHyperlinkCtrl + ( + m_parentAsWindow, + GetID(), + GetText(wxT("label")), + GetParamValue(wxT("url")), + GetPosition(), GetSize(), + GetStyle(wxT("style"), wxHL_DEFAULT_STYLE), + GetName() + ); + } + else // m_class must be "wxGenericHyperlinkCtrl" + { + control = new wxGenericHyperlinkCtrl + ( + m_parentAsWindow, + GetID(), + GetText(wxT("label")), + GetParamValue(wxT("url")), + GetPosition(), GetSize(), + GetStyle(wxT("style"), wxHL_DEFAULT_STYLE), + GetName() + ); + } + } + + if ( GetBool("hidden", 0) == 1 ) + control->Hide(); SetupWindow(control); @@ -77,7 +101,8 @@ wxObject *wxHyperlinkCtrlXmlHandler::DoCreateResource() bool wxHyperlinkCtrlXmlHandler::CanHandle(wxXmlNode *node) { - return IsOfClass(node, wxT("wxHyperlinkCtrl")); + return IsOfClass(node, wxT("wxHyperlinkCtrl")) || + IsOfClass(node, wxT("wxGenericHyperlinkCtrl")); } #endif // wxUSE_XRC && wxUSE_HYPERLINKCTRL