X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/523b9ce4fdf8e5a8d0033dc46aac19ca1b99c39f..fcdd53359135f790b85728c4254b97095a56dad8:/src/common/stattextcmn.cpp diff --git a/src/common/stattextcmn.cpp b/src/common/stattextcmn.cpp index d9092155c2..b2ac7a044c 100644 --- a/src/common/stattextcmn.cpp +++ b/src/common/stattextcmn.cpp @@ -37,8 +37,6 @@ #include "wx/containr.h" #endif -#if wxUSE_STATTEXT - const wxChar *wxMarkupEntities[][wxMARKUP_ENTITY_MAX] = { // the entities handled by SetLabel() when wxST_MARKUP is used and their referenced string @@ -47,6 +45,7 @@ const wxChar *wxMarkupEntities[][wxMARKUP_ENTITY_MAX] = { wxT("&"), wxT("<"), wxT(">"), wxT("'"), wxT("\"") } }; +#if wxUSE_STATTEXT // ---------------------------------------------------------------------------- // wxTextWrapper @@ -54,26 +53,26 @@ const wxChar *wxMarkupEntities[][wxMARKUP_ENTITY_MAX] = void wxTextWrapper::Wrap(wxWindow *win, const wxString& text, int widthMax) { - const wxChar *lastSpace = NULL; wxString line; - const wxChar *lineStart = text.c_str(); - for ( const wxChar *p = lineStart; ; p++ ) + wxString::const_iterator lastSpace = text.end(); + wxString::const_iterator lineStart = text.begin(); + for ( wxString::const_iterator p = lineStart; ; ++p ) { if ( IsStartOfNewLine() ) { OnNewLine(); - lastSpace = NULL; + lastSpace = text.end(); line.clear(); lineStart = p; } - if ( *p == _T('\n') || *p == _T('\0') ) + if ( p == text.end() || *p == _T('\n') ) { DoOutputLine(line); - if ( *p == _T('\0') ) + if ( p == text.end() ) break; } else // not EOL @@ -83,7 +82,7 @@ void wxTextWrapper::Wrap(wxWindow *win, const wxString& text, int widthMax) line += *p; - if ( widthMax >= 0 && lastSpace ) + if ( widthMax >= 0 && lastSpace != text.end() ) { int width; win->GetTextExtent(line, &width, NULL); @@ -154,6 +153,14 @@ wxString wxStaticTextBase::GetLabelText() const return RemoveMnemonics(ret); } +/*static*/ +wxString wxStaticTextBase::GetLabelText(const wxString& label) +{ + // remove markup + wxString ret = RemoveMarkup(label); + return RemoveMnemonics(ret); +} + /*static*/ wxString wxStaticTextBase::RemoveMarkup(const wxString& text) { @@ -161,10 +168,10 @@ wxString wxStaticTextBase::RemoveMarkup(const wxString& text) bool inside_tag = false; wxString label; - const wxChar *source = text; - for (size_t i=0, max=text.length(); i= entityLen && - wxStrncmp(entity, &source[i], entityLen) == 0) + 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 "&"), substitute it with && - // instead of a single ampersand: + // little exception: when the entity reference is + // "&" (i.e. when entity is "&"), substitute it + // with && instead of a single ampersand: if (*wxMarkupEntities[wxMARKUP_ELEMENT_VALUE][j] == wxT('&')) label << wxT('&'); - i += entityLen - 1; // the -1 is because main for() - // loop already increments i + // the -1 is because main for() loop already + // increments i: + source += entityLen - 1; isMnemonic = false; break; } } if (isMnemonic) - label << text[i]; + label << *source; } break; default: if (!inside_tag) - label << text[i]; + label << *source; } } @@ -238,7 +246,8 @@ wxString wxStaticTextBase::EscapeMarkup(const wxString& text) { 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; @@ -314,7 +323,7 @@ wxString wxStaticTextBase::Ellipsize(const wxString& label) const return label; } - wxClientDC dc(wx_const_cast(wxStaticTextBase*, this)); + wxClientDC dc(const_cast(this)); dc.SetFont(GetFont()); wxArrayInt charOffsets; @@ -328,12 +337,10 @@ wxString wxStaticTextBase::Ellipsize(const wxString& label) const wxString curLine; wxSize reqsize; 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(); if (len > 0 && dc.GetPartialTextExtents(curLine, charOffsets)) @@ -446,31 +453,34 @@ wxString wxStaticTextBase::Ellipsize(const wxString& label) const } // add this (ellipsized) row to the rest of the label - ret << curLine << *pc; - curLine.clear(); - - if ( *pc == _T('\0') ) + ret << curLine; + if ( pc == label.end() ) + { return ret; - - break; - - // we need to remove mnemonics from the label for - // correct calculations - case _T('&'): - // pc+1 is safe: at worst we'll hit the \0 - if (*(pc+1) == _T('&')) + } + else + { + ret << *pc; + curLine.clear(); + } + } + // 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 & //else: remove this ampersand - - break; - - // we need also to expand tabs to properly calc their size - case _T('\t'): + } + // we need also to expand tabs to properly calc their size + else if ( *pc == _T('\t') ) + { // Windows natively expands the TABs to 6 spaces. Do the same: curLine += wxT(" "); - break; - - default: + } + else + { curLine += *pc; } }