diff --git a/include/wx/xrc/xmlres.h b/include/wx/xrc/xmlres.h index de31ea27a4..bde64138a5 100644 --- a/include/wx/xrc/xmlres.h +++ b/include/wx/xrc/xmlres.h @@ -513,7 +513,10 @@ public: // - replaces \n, \r, \t by respective chars (according to C syntax) // - replaces _ by & and __ by _ (needed for _File => &File because of XML) // - calls wxGetTranslations (unless disabled in wxXmlResource) - wxString GetText(const wxString& param, bool translate = true) wxOVERRIDE; + // + // The first two conversions can be disabled by using wxXRC_TEXT_NO_ESCAPE + // in flags and the last one -- by using wxXRC_TEXT_NO_TRANSLATE. + wxString GetNodeText(const wxXmlNode *node, int flags = 0) wxOVERRIDE; // Returns the XRCID. int GetID() wxOVERRIDE; diff --git a/include/wx/xrc/xmlreshandler.h b/include/wx/xrc/xmlreshandler.h index 5c2f6b4be1..cdf7f0ab17 100644 --- a/include/wx/xrc/xmlreshandler.h +++ b/include/wx/xrc/xmlreshandler.h @@ -32,6 +32,13 @@ class WXDLLIMPEXP_FWD_CORE wxXmlResourceHandler; // by wxXmlResourceHandler implementation itself. #define XRC_ADD_STYLE(style) AddStyle(wxT(#style), style) +// Flags for GetNodeText(). +enum +{ + wxXRC_TEXT_NO_TRANSLATE = 1, + wxXRC_TEXT_NO_ESCAPE = 2 +}; + // Abstract base class for the implementation object used by // wxXmlResourceHandlerImpl. The real implementation is in // wxXmlResourceHandlerImpl class in the "xrc" library while this class is in @@ -61,7 +68,7 @@ public: virtual wxString GetParamValue(const wxString& param) = 0; virtual wxString GetParamValue(const wxXmlNode* node) = 0; virtual int GetStyle(const wxString& param = wxT("style"), int defaults = 0) = 0; - virtual wxString GetText(const wxString& param, bool translate = true) = 0; + virtual wxString GetNodeText(const wxXmlNode *node, int flags = 0) = 0; virtual int GetID() = 0; virtual wxString GetName() = 0; virtual bool GetBool(const wxString& param, bool defaultv = false) = 0; @@ -254,9 +261,14 @@ protected: { return GetImpl()->GetStyle(param, defaults); } + wxString GetNodeText(const wxXmlNode *node, int flags = 0) + { + return GetImpl()->GetNodeText(node, flags); + } wxString GetText(const wxString& param, bool translate = true) { - return GetImpl()->GetText(param, translate); + return GetImpl()->GetNodeText(GetImpl()->GetParamNode(param), + translate ? 0 : wxXRC_TEXT_NO_TRANSLATE); } int GetID() const { diff --git a/src/xrc/xh_chckl.cpp b/src/xrc/xh_chckl.cpp index fddfcf97c2..61675db8f4 100644 --- a/src/xrc/xh_chckl.cpp +++ b/src/xrc/xh_chckl.cpp @@ -94,10 +94,7 @@ wxObject *wxCheckListBoxXmlHandler::DoCreateResource() // handle Label // add to the list - wxString str = GetNodeContent(m_node); - if (m_resource->GetFlags() & wxXRC_USE_LOCALE) - str = wxGetTranslation(str, m_resource->GetDomain()); - strList.Add(str); + strList.Add(GetNodeText(m_node, wxXRC_TEXT_NO_ESCAPE)); return NULL; } } diff --git a/src/xrc/xh_choic.cpp b/src/xrc/xh_choic.cpp index 445ec6b43a..52a3358cac 100644 --- a/src/xrc/xh_choic.cpp +++ b/src/xrc/xh_choic.cpp @@ -70,10 +70,7 @@ wxObject *wxChoiceXmlHandler::DoCreateResource() // handle Label // add to the list - wxString str = GetNodeContent(m_node); - if (m_resource->GetFlags() & wxXRC_USE_LOCALE) - str = wxGetTranslation(str, m_resource->GetDomain()); - strList.Add(str); + strList.Add(GetNodeText(m_node, wxXRC_TEXT_NO_ESCAPE)); return NULL; } diff --git a/src/xrc/xh_combo.cpp b/src/xrc/xh_combo.cpp index a11d24bef9..e0f672ebe4 100644 --- a/src/xrc/xh_combo.cpp +++ b/src/xrc/xh_combo.cpp @@ -77,10 +77,7 @@ wxObject *wxComboBoxXmlHandler::DoCreateResource() // handle Label // add to the list - wxString str = GetNodeContent(m_node); - if (m_resource->GetFlags() & wxXRC_USE_LOCALE) - str = wxGetTranslation(str, m_resource->GetDomain()); - strList.Add(str); + strList.Add(GetNodeText(m_node, wxXRC_TEXT_NO_ESCAPE)); return NULL; } diff --git a/src/xrc/xh_editlbox.cpp b/src/xrc/xh_editlbox.cpp index 32ab05f525..48a57847d4 100644 --- a/src/xrc/xh_editlbox.cpp +++ b/src/xrc/xh_editlbox.cpp @@ -99,10 +99,7 @@ wxObject *wxEditableListBoxXmlHandler::DoCreateResource() } else if ( m_insideBox && m_node->GetName() == EDITLBOX_ITEM_NAME ) { - wxString str = GetNodeContent(m_node); - if ( m_resource->GetFlags() & wxXRC_USE_LOCALE ) - str = wxGetTranslation(str, m_resource->GetDomain()); - m_items.push_back(str); + m_items.push_back(GetNodeText(m_node, wxXRC_TEXT_NO_ESCAPE)); return NULL; } diff --git a/src/xrc/xh_htmllbox.cpp b/src/xrc/xh_htmllbox.cpp index 2b310e4c4e..82c01f10ad 100644 --- a/src/xrc/xh_htmllbox.cpp +++ b/src/xrc/xh_htmllbox.cpp @@ -69,10 +69,7 @@ wxObject *wxSimpleHtmlListBoxXmlHandler::DoCreateResource() // handle Label // add to the list - wxString str = GetNodeContent(m_node); - if (m_resource->GetFlags() & wxXRC_USE_LOCALE) - str = wxGetTranslation(str, m_resource->GetDomain()); - strList.Add(str); + strList.Add(GetNodeText(m_node, wxXRC_TEXT_NO_ESCAPE)); return NULL; } diff --git a/src/xrc/xh_listb.cpp b/src/xrc/xh_listb.cpp index f496023095..e74eb99e2c 100644 --- a/src/xrc/xh_listb.cpp +++ b/src/xrc/xh_listb.cpp @@ -77,10 +77,7 @@ wxObject *wxListBoxXmlHandler::DoCreateResource() // handle Label // add to the list - wxString str = GetNodeContent(m_node); - if (m_resource->GetFlags() & wxXRC_USE_LOCALE) - str = wxGetTranslation(str, m_resource->GetDomain()); - strList.Add(str); + strList.Add(GetNodeText(m_node, wxXRC_TEXT_NO_ESCAPE)); return NULL; } diff --git a/src/xrc/xh_odcombo.cpp b/src/xrc/xh_odcombo.cpp index 955ac1d826..293e7c5d30 100644 --- a/src/xrc/xh_odcombo.cpp +++ b/src/xrc/xh_odcombo.cpp @@ -85,10 +85,7 @@ wxObject *wxOwnerDrawnComboBoxXmlHandler::DoCreateResource() // handle Label // add to the list - wxString str = GetNodeContent(m_node); - if (m_resource->GetFlags() & wxXRC_USE_LOCALE) - str = wxGetTranslation(str, m_resource->GetDomain()); - strList.Add(str); + strList.Add(GetNodeText(m_node, wxXRC_TEXT_NO_ESCAPE)); return NULL; } diff --git a/src/xrc/xh_radbx.cpp b/src/xrc/xh_radbx.cpp index 12c9e02a25..762f31b2e0 100644 --- a/src/xrc/xh_radbx.cpp +++ b/src/xrc/xh_radbx.cpp @@ -107,30 +107,15 @@ wxObject *wxRadioBoxXmlHandler::DoCreateResource() // we handle handle Label constructs here, and the item // tag can have tooltip, helptext, enabled and hidden attributes - wxString label = GetNodeContent(m_node); - - wxString tooltip; - m_node->GetAttribute(wxT("tooltip"), &tooltip); - - wxString helptext; - bool hasHelptext = m_node->GetAttribute(wxT("helptext"), &helptext); - - if (m_resource->GetFlags() & wxXRC_USE_LOCALE) - { - label = wxGetTranslation(label, m_resource->GetDomain()); - if ( !tooltip.empty() ) - tooltip = wxGetTranslation(tooltip, m_resource->GetDomain()); - if ( hasHelptext ) - helptext = wxGetTranslation(helptext, m_resource->GetDomain()); - } - - m_labels.push_back(label); + m_labels.push_back(GetNodeText(m_node, wxXRC_TEXT_NO_ESCAPE)); #if wxUSE_TOOLTIPS - m_tooltips.push_back(tooltip); + m_tooltips.push_back(GetNodeText(GetParamNode(wxT("tooltip")), + wxXRC_TEXT_NO_ESCAPE)); #endif // wxUSE_TOOLTIPS #if wxUSE_HELP - m_helptexts.push_back(helptext); - m_helptextSpecified.push_back(hasHelptext); + const wxXmlNode* const nodeHelp = GetParamNode(wxT("helptext")); + m_helptexts.push_back(GetNodeText(nodeHelp, wxXRC_TEXT_NO_ESCAPE)); + m_helptextSpecified.push_back(nodeHelp != NULL); #endif // wxUSE_HELP m_isEnabled.push_back(GetBoolAttr("enabled", 1)); m_isShown.push_back(!GetBoolAttr("hidden", 0)); diff --git a/src/xrc/xmlres.cpp b/src/xrc/xmlres.cpp index 6a1e813c26..1963ba9d73 100644 --- a/src/xrc/xmlres.cpp +++ b/src/xrc/xmlres.cpp @@ -1506,73 +1506,83 @@ int wxXmlResourceHandlerImpl::GetStyle(const wxString& param, int defaults) -wxString wxXmlResourceHandlerImpl::GetText(const wxString& param, bool translate) +wxString wxXmlResourceHandlerImpl::GetNodeText(const wxXmlNode* node, int flags) { - wxXmlNode *parNode = GetParamNode(param); - wxString str1(GetNodeContent(parNode)); + wxString str1(GetNodeContent(node)); + if ( str1.empty() ) + return str1; + wxString str2; - // "\\" wasn't translated to "\" prior to 2.5.3.0: - const bool escapeBackslash = (m_handler->m_resource->CompareVersion(2,5,3,0) >= 0); - - // VS: First version of XRC resources used $ instead of & (which is - // illegal in XML), but later I realized that '_' fits this purpose - // much better (because &File means "File with F underlined"). - const wxChar amp_char = (m_handler->m_resource->CompareVersion(2,3,0,1) < 0) - ? '$' : '_'; - - for ( wxString::const_iterator dt = str1.begin(); dt != str1.end(); ++dt ) + if ( !(flags & wxXRC_TEXT_NO_ESCAPE) ) { - // Remap amp_char to &, map double amp_char to amp_char (for things - // like "&File..." -- this is illegal in XML, so we use "_File..."): - if ( *dt == amp_char ) + // "\\" wasn't translated to "\" prior to 2.5.3.0: + const bool escapeBackslash = (m_handler->m_resource->CompareVersion(2,5,3,0) >= 0); + + // VS: First version of XRC resources used $ instead of & (which is + // illegal in XML), but later I realized that '_' fits this purpose + // much better (because &File means "File with F underlined"). + const wxChar amp_char = (m_handler->m_resource->CompareVersion(2,3,0,1) < 0) + ? '$' : '_'; + + for ( wxString::const_iterator dt = str1.begin(); dt != str1.end(); ++dt ) { - if ( dt+1 == str1.end() || *(++dt) == amp_char ) - str2 << amp_char; - else - str2 << wxT('&') << *dt; - } - // Remap \n to CR, \r to LF, \t to TAB, \\ to \: - else if ( *dt == wxT('\\') ) - { - switch ( (*(++dt)).GetValue() ) + // Remap amp_char to &, map double amp_char to amp_char (for things + // like "&File..." -- this is illegal in XML, so we use "_File..."): + if ( *dt == amp_char ) { - case wxT('n'): - str2 << wxT('\n'); - break; - - case wxT('t'): - str2 << wxT('\t'); - break; - - case wxT('r'): - str2 << wxT('\r'); - break; - - case wxT('\\') : - // "\\" wasn't translated to "\" prior to 2.5.3.0: - if ( escapeBackslash ) - { - str2 << wxT('\\'); + if ( dt+1 == str1.end() || *(++dt) == amp_char ) + str2 << amp_char; + else + str2 << wxT('&') << *dt; + } + // Remap \n to CR, \r to LF, \t to TAB, \\ to \: + else if ( *dt == wxT('\\') ) + { + switch ( (*(++dt)).GetValue() ) + { + case wxT('n'): + str2 << wxT('\n'); break; - } - wxFALLTHROUGH;// else fall-through to default: branch below - default: - str2 << wxT('\\') << *dt; - break; + case wxT('t'): + str2 << wxT('\t'); + break; + + case wxT('r'): + str2 << wxT('\r'); + break; + + case wxT('\\') : + // "\\" wasn't translated to "\" prior to 2.5.3.0: + if ( escapeBackslash ) + { + str2 << wxT('\\'); + break; + } + wxFALLTHROUGH;// else fall-through to default: branch below + + default: + str2 << wxT('\\') << *dt; + break; + } + } + else + { + str2 << *dt; } } - else - { - str2 << *dt; - } + } + else // Don't escape anything in this string. + { + // We won't use str1 at all, so move its contents to str2. + str2.swap(str1); } if (m_handler->m_resource->GetFlags() & wxXRC_USE_LOCALE) { - if (translate && parNode && - parNode->GetAttribute(wxT("translate"), wxEmptyString) != wxT("0")) + if (!(flags & wxXRC_TEXT_NO_TRANSLATE) && node && + node->GetAttribute(wxT("translate"), wxEmptyString) != wxT("0")) { return wxGetTranslation(str2, m_handler->m_resource->GetDomain()); } @@ -2508,14 +2518,14 @@ void wxXmlResourceHandlerImpl::SetupWindow(wxWindow *wnd) wnd->SetFocus(); #if wxUSE_TOOLTIPS if (HasParam(wxT("tooltip"))) - wnd->SetToolTip(GetText(wxT("tooltip"))); + wnd->SetToolTip(GetNodeText(GetParamNode(wxT("tooltip")))); #endif if (HasParam(wxT("font"))) wnd->SetFont(GetFont(wxT("font"), wnd)); if (HasParam(wxT("ownfont"))) wnd->SetOwnFont(GetFont(wxT("ownfont"), wnd)); if (HasParam(wxT("help"))) - wnd->SetHelpText(GetText(wxT("help"))); + wnd->SetHelpText(GetNodeText(GetParamNode(wxT("help")))); }