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

@@ -1,40 +0,0 @@
/////////////////////////////////////////////////////////////////////////////
// Name: wx/private/stattext.h
// Purpose: Internal declarations for dlgcmn.cpp and stattextcmn.cpp
// Author: Francesco Montorsi
// Created: 2007-01-07 (extracted from dlgcmn.cpp)
// RCS-ID: $Id$
// Copyright: (c) 1999 Vadim Zeitlin
// (c) 2007 wxWidgets team
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_STATTEXT_H_
#define _WX_PRIVATE_STATTEXT_H_
enum
{
wxMARKUP_ENTITY_AMP,
wxMARKUP_ENTITY_LT,
wxMARKUP_ENTITY_GT,
wxMARKUP_ENTITY_APOS,
wxMARKUP_ENTITY_QUOT,
wxMARKUP_ENTITY_MAX
};
enum
{
wxMARKUP_ELEMENT_NAME,
wxMARKUP_ELEMENT_VALUE,
wxMARKUP_ELEMENT_MAX
};
// these are the only entities treated in a special way by wxStaticText::SetLabel()
// when the wxST_MARKUP style is used; use as:
//
// wxMarkupEntities[wxMARKUP_ELEMENT_NAME][wxMARKUP_ENTITY_GT] == ">"
// wxMarkupEntities[wxMARKUP_ELEMENT_VALUE][wxMARKUP_ENTITY_GT] == ">"
//
extern const wxChar *const wxMarkupEntities[wxMARKUP_ELEMENT_MAX][wxMARKUP_ENTITY_MAX];
#endif // _WX_PRIVATE_STATTEXT_H_

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);
}

View File

@@ -24,10 +24,23 @@
#endif
#include "wx/log.h"
#include "wx/private/stattext.h" // for wxMarkupEntities
#include "wx/gtk/private/mnemonics.h"
namespace
{
// ----------------------------------------------------------------------------
// constants
// ----------------------------------------------------------------------------
// Names of the standard XML entities.
const char *const entitiesNames[] =
{
"&amp;", "&lt;", "&gt;", "&apos;", "&quot;"
};
} // anonymous namespace
// ============================================================================
// implementation
// ============================================================================
@@ -67,9 +80,9 @@ static wxString GTKProcessMnemonics(const wxString& label, MnemonicsFlag flag)
size_t distanceFromEnd = label.end() - i;
// is this ampersand introducing a mnemonic or rather an entity?
for (size_t j=0; j < wxMARKUP_ENTITY_MAX; j++)
for (size_t j=0; j < WXSIZEOF(entitiesNames); j++)
{
const wxChar *entity = wxMarkupEntities[wxMARKUP_ELEMENT_NAME][j];
const char *entity = entitiesNames[j];
size_t entityLen = wxStrlen(entity);
if (distanceFromEnd >= entityLen &&

View File

@@ -24,10 +24,23 @@
#endif
#include "wx/log.h"
#include "wx/private/stattext.h" // for wxMarkupEntities
#include "wx/gtk1/private/mnemonics.h"
namespace
{
// ----------------------------------------------------------------------------
// constants
// ----------------------------------------------------------------------------
// Names of the standard XML entities.
const char *const entitiesNames[] =
{
"&amp;", "&lt;", "&gt;", "&apos;", "&quot;"
};
} // anonymous namespace
// ============================================================================
// implementation
// ============================================================================
@@ -67,9 +80,9 @@ static wxString GTKProcessMnemonics(const wxString& label, MnemonicsFlag flag)
size_t distanceFromEnd = label.end() - i;
// is this ampersand introducing a mnemonic or rather an entity?
for (size_t j=0; j < wxMARKUP_ENTITY_MAX; j++)
for (size_t j=0; j < WXSIZEOF(entitiesNames); j++)
{
const wxChar *entity = wxMarkupEntities[wxMARKUP_ELEMENT_NAME][j];
const char *entity = entitiesNames[j];
size_t entityLen = wxStrlen(entity);
if (distanceFromEnd >= entityLen &&