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:
@@ -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 "&"), substitute it
|
||||||
// (i.e. when entity is "&"), 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
|
||||||
|
else if ( *pc == _T('\t') )
|
||||||
// we need also to expand tabs to properly calc their size
|
{
|
||||||
case _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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user