Use wxMarkupParser in wxStaticText for dealing with markup.

No real changes, just remove markup parsing code from wxStaticText
implementation and reuse wxMarkupParser methods there instead.

This makes include/wx/private/stattext.h file unnecessary as it is used only
in a single place now so remove it and move its remaining contents to
src/gtk/mnemonics.cpp.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@67050 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2011-02-27 12:46:55 +00:00
parent 5eb051a73b
commit 0d0fdaacf8
4 changed files with 38 additions and 156 deletions

View File

@@ -24,16 +24,6 @@
#pragma hdrstop
#endif
#include "wx/private/stattext.h"
const wxChar *const wxMarkupEntities[][wxMARKUP_ENTITY_MAX] =
{
// the entities handled by SetLabel() when wxST_MARKUP is used and their referenced string
{ wxT("&"), wxT("<"), wxT(">"), wxT("'"), wxT(""") },
{ wxT("&"), wxT("<"), wxT(">"), wxT("'"), wxT("\"") }
};
#if wxUSE_STATTEXT
#ifndef WX_PRECOMP
@@ -49,6 +39,8 @@ const wxChar *const wxMarkupEntities[][wxMARKUP_ENTITY_MAX] =
#include "wx/textwrapper.h"
#include "wx/private/markupparser.h"
extern WXDLLEXPORT_DATA(const char) wxStaticTextNameStr[] = "staticText";
// ----------------------------------------------------------------------------
@@ -236,109 +228,13 @@ wxString wxStaticTextBase::GetLabelText(const wxString& label)
/* static */
wxString wxStaticTextBase::RemoveMarkup(const wxString& text)
{
// strip out of "text" the markup for platforms which don't support it natively
bool inside_tag = false;
wxString label;
for ( wxString::const_iterator source = text.begin();
source != text.end(); ++source )
{
switch ( (*source).GetValue() )
{
case wxT('<'):
if (inside_tag)
{
wxLogDebug(wxT("Invalid markup !"));
return wxEmptyString;
}
inside_tag = true;
break;
case wxT('>'):
if (!inside_tag)
{
wxLogDebug(wxT("Invalid markup !"));
return wxEmptyString;
}
inside_tag = false;
break;
case wxT('&'):
{
if ( source+1 == text.end() )
{
wxLogDebug(wxT("Cannot use & as last character of the string '%s'"),
text.c_str());
return wxEmptyString;
}
// is this ampersand introducing a mnemonic or rather an entity?
bool isMnemonic = true;
size_t distanceFromEnd = text.end() - source;
for (size_t j=0; j < wxMARKUP_ENTITY_MAX; j++)
{
const wxChar *entity = wxMarkupEntities[wxMARKUP_ELEMENT_NAME][j];
size_t entityLen = wxStrlen(entity);
if (distanceFromEnd >= entityLen &&
wxString(source, source + entityLen) == entity)
{
// replace the &entity; string with the entity reference
label << wxMarkupEntities[wxMARKUP_ELEMENT_VALUE][j];
// little exception: when the entity reference is
// "&" (i.e. when entity is "&amp;"), substitute it
// with && instead of a single ampersand:
if (*wxMarkupEntities[wxMARKUP_ELEMENT_VALUE][j] == wxT('&'))
label << wxT('&');
// the -1 is because main for() loop already
// increments i:
source += entityLen - 1;
isMnemonic = false;
break;
}
}
if (isMnemonic)
label << *source;
}
break;
default:
if (!inside_tag)
label << *source;
}
}
return label;
return wxMarkupParser::Strip(text);
}
/* static */
wxString wxStaticTextBase::EscapeMarkup(const wxString& text)
{
wxString ret;
for (wxString::const_iterator source = text.begin();
source != text.end(); ++source)
{
bool isEntity = false;
// search in the list of the entities and eventually escape this character
for (size_t j=0; j < wxMARKUP_ENTITY_MAX; j++)
{
if (*source == *wxMarkupEntities[wxMARKUP_ELEMENT_VALUE][j])
{
ret << wxMarkupEntities[wxMARKUP_ELEMENT_NAME][j];
isEntity = true;
break;
}
}
if (!isEntity)
ret << *source; // this character does not need to be escaped
}
return ret;
return wxMarkupParser::Quote(text);
}