use iterators in wxStaticText wrapping and escaping code

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@46275 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Václav Slavík
2007-06-02 17:21:46 +00:00
parent ad8d42f83c
commit 5b87170050

View File

@@ -54,26 +54,26 @@ const wxChar *wxMarkupEntities[][wxMARKUP_ENTITY_MAX] =
void wxTextWrapper::Wrap(wxWindow *win, const wxString& text, int widthMax) void wxTextWrapper::Wrap(wxWindow *win, const wxString& text, int widthMax)
{ {
const wxChar *lastSpace = NULL;
wxString line; wxString line;
const wxChar *lineStart = text.c_str(); wxString::const_iterator lastSpace = text.end();
for ( const wxChar *p = lineStart; ; p++ ) wxString::const_iterator lineStart = text.begin();
for ( wxString::const_iterator p = lineStart; ; ++p )
{ {
if ( IsStartOfNewLine() ) if ( IsStartOfNewLine() )
{ {
OnNewLine(); OnNewLine();
lastSpace = NULL; lastSpace = text.end();
line.clear(); line.clear();
lineStart = p; lineStart = p;
} }
if ( *p == _T('\n') || *p == _T('\0') ) if ( p == text.end() || *p == _T('\n') )
{ {
DoOutputLine(line); DoOutputLine(line);
if ( *p == _T('\0') ) if ( p == text.end() )
break; break;
} }
else // not EOL else // not EOL
@@ -83,7 +83,7 @@ void wxTextWrapper::Wrap(wxWindow *win, const wxString& text, int widthMax)
line += *p; line += *p;
if ( widthMax >= 0 && lastSpace ) if ( widthMax >= 0 && lastSpace != text.end() )
{ {
int width; int width;
win->GetTextExtent(line, &width, NULL); win->GetTextExtent(line, &width, NULL);
@@ -161,10 +161,10 @@ wxString wxStaticTextBase::RemoveMarkup(const wxString& text)
bool inside_tag = false; bool inside_tag = false;
wxString label; wxString label;
const wxChar *source = text; for ( wxString::const_iterator source = text.begin();
for (size_t i=0, max=text.length(); i<max; i++) source != text.end(); ++source )
{ {
switch (source[i]) switch ( (*source).GetValue() )
{ {
case wxT('<'): case wxT('<'):
if (inside_tag) if (inside_tag)
@@ -186,7 +186,7 @@ wxString wxStaticTextBase::RemoveMarkup(const wxString& text)
case wxT('&'): case wxT('&'):
{ {
if (i == max-1) if ( source+1 == text.end() )
{ {
wxLogDebug(wxT("Cannot use & as last character of the string '%s'"), wxLogDebug(wxT("Cannot use & as last character of the string '%s'"),
text.c_str()); text.c_str());
@@ -195,38 +195,39 @@ wxString wxStaticTextBase::RemoveMarkup(const wxString& text)
// is this ampersand introducing a mnemonic or rather an entity? // is this ampersand introducing a mnemonic or rather an entity?
bool isMnemonic = true; bool isMnemonic = true;
size_t distanceFromEnd = text.end() - source;
for (size_t j=0; j < wxMARKUP_ENTITY_MAX; j++) for (size_t j=0; j < wxMARKUP_ENTITY_MAX; j++)
{ {
const wxChar *entity = wxMarkupEntities[wxMARKUP_ELEMENT_NAME][j]; const wxChar *entity = wxMarkupEntities[wxMARKUP_ELEMENT_NAME][j];
size_t entityLen = wxStrlen(entity); size_t entityLen = wxStrlen(entity);
if (max - i >= entityLen && if (distanceFromEnd >= entityLen &&
wxStrncmp(entity, &source[i], entityLen) == 0) wxString(source, source + entityLen) == entity)
{ {
// replace the &entity; string with the entity reference // replace the &entity; string with the entity reference
label << wxMarkupEntities[wxMARKUP_ELEMENT_VALUE][j]; label << wxMarkupEntities[wxMARKUP_ELEMENT_VALUE][j];
// little exception: when the entity reference is
// little exception: when the entity reference is "&" // "&" (i.e. when entity is "&amp;"), substitute it
// (i.e. when entity is "&amp;"), substitute it with && // with && instead of a single ampersand:
// instead of a single ampersand:
if (*wxMarkupEntities[wxMARKUP_ELEMENT_VALUE][j] == wxT('&')) if (*wxMarkupEntities[wxMARKUP_ELEMENT_VALUE][j] == wxT('&'))
label << wxT('&'); label << wxT('&');
i += entityLen - 1; // the -1 is because main for() // the -1 is because main for() loop already
// loop already increments i // increments i:
source += entityLen - 1;
isMnemonic = false; isMnemonic = false;
break; break;
} }
} }
if (isMnemonic) if (isMnemonic)
label << text[i]; label << *source;
} }
break; break;
default: default:
if (!inside_tag) if (!inside_tag)
label << text[i]; label << *source;
} }
} }
@@ -238,7 +239,8 @@ wxString wxStaticTextBase::EscapeMarkup(const wxString& text)
{ {
wxString ret; wxString ret;
for (const wxChar *source = text; *source != wxT('\0'); source++) for (wxString::const_iterator source = text.begin();
source != text.end(); ++source)
{ {
bool isEntity = false; bool isEntity = false;
@@ -328,12 +330,10 @@ wxString wxStaticTextBase::Ellipsize(const wxString& label) const
wxString curLine; wxString curLine;
wxSize reqsize; wxSize reqsize;
size_t len; size_t len;
for ( const wxChar *pc = label; ; pc++ ) for ( wxString::const_iterator pc = label.begin(); ; ++pc )
{ {
switch ( *pc ) if ( pc == label.end() || *pc == _T('\n') )
{ {
case _T('\n'):
case _T('\0'):
len = curLine.length(); len = curLine.length();
if (len > 0 && if (len > 0 &&
dc.GetPartialTextExtents(curLine, charOffsets)) dc.GetPartialTextExtents(curLine, charOffsets))
@@ -446,31 +446,34 @@ wxString wxStaticTextBase::Ellipsize(const wxString& label) const
} }
// add this (ellipsized) row to the rest of the label // add this (ellipsized) row to the rest of the label
ret << curLine << *pc; ret << curLine;
curLine.clear(); if ( pc == label.end() )
{
if ( *pc == _T('\0') )
return ret; return ret;
}
break; else
{
// we need to remove mnemonics from the label for ret << *pc;
// correct calculations curLine.clear();
case _T('&'): }
// pc+1 is safe: at worst we'll hit the \0 }
if (*(pc+1) == _T('&')) // we need to remove mnemonics from the label for correct calculations
else if ( *pc == _T('&') )
{
// pc+1 is safe: at worst we'll be at end()
wxString::const_iterator next = pc + 1;
if ( next != label.end() && *next == _T('&') )
curLine += _T('&'); // && becomes & curLine += _T('&'); // && becomes &
//else: remove this ampersand //else: remove this ampersand
}
break;
// we need also to expand tabs to properly calc their size // we need also to expand tabs to properly calc their size
case _T('\t'): else if ( *pc == _T('\t') )
{
// Windows natively expands the TABs to 6 spaces. Do the same: // Windows natively expands the TABs to 6 spaces. Do the same:
curLine += wxT(" "); curLine += wxT(" ");
break; }
else
default: {
curLine += *pc; curLine += *pc;
} }
} }