X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ce00f59b5b169752d2f05ce3bb1a88ddc1b38b4c..e4c903b2ea42fe104ef50d0ea6028f14d8309dfa:/src/common/ctrlcmn.cpp diff --git a/src/common/ctrlcmn.cpp b/src/common/ctrlcmn.cpp index 9d782d7f18..c1b4fa67a7 100644 --- a/src/common/ctrlcmn.cpp +++ b/src/common/ctrlcmn.cpp @@ -95,7 +95,7 @@ void wxControlBase::Command(wxCommandEvent& event) void wxControlBase::InitCommandEvent(wxCommandEvent& event) const { - event.SetEventObject((wxControlBase *)this); // const_cast + event.SetEventObject(const_cast(this)); // event.SetId(GetId()); -- this is usuall done in the event ctor @@ -303,15 +303,34 @@ wxString wxControlBase::DoEllipsizeSingleLine(const wxString& curLine, const wxD // - the second one to remove, valid range [initialCharToRemove;endCharToRemove] // - the third one to preserve, valid range [endCharToRemove+1;len-1] or the empty range if endCharToRemove==len-1 // NOTE: empty range != range [0;0] since the range [0;0] contains 1 character (the zero-th one)! - initialCharToRemove = len/2; - size_t endCharToRemove = len/2; // index of the last character to remove; valid range is [0;len-1] + initialCharToRemove = len/2; // index of the last character to remove; valid range is [0;len-1] + size_t endCharToRemove = initialCharToRemove - 1; // initial removal range is empty int removedPx = 0; + bool removeFromStart = true; for ( ; removedPx < excessPx; ) { - // try to remove the last character of the first part of the string - if (initialCharToRemove > 0) + const bool canRemoveFromStart = initialCharToRemove > 0; + const bool canRemoveFromEnd = endCharToRemove < len - 1; + + if ( !canRemoveFromStart && !canRemoveFromEnd ) { + // we need to remove all the characters of the string! + break; + } + + // Remove from the beginning in even steps and from the end + // in odd steps, unless we exhausted one side already: + removeFromStart = !removeFromStart; + if ( removeFromStart && !canRemoveFromStart ) + removeFromStart = false; + else if ( !removeFromStart && !canRemoveFromEnd ) + removeFromStart = true; + + if ( removeFromStart ) + { + // try to remove the last character of the first part of the string + // width of the (initialCharToRemove-1)-th character int widthPx; if (initialCharToRemove >= 2) @@ -325,12 +344,13 @@ wxString wxControlBase::DoEllipsizeSingleLine(const wxString& curLine, const wxD // mark the (initialCharToRemove-1)-th character as removable initialCharToRemove--; removedPx += widthPx; - } - // try to remove the first character of the last part of the string - if (endCharToRemove < len - 1 && - removedPx < excessPx) + continue; // don't remove anything else + } + else // !removeFromStart { + // try to remove the first character of the last part of the string + // width of the (endCharToRemove+1)-th character int widthPx = charOffsetsPx[endCharToRemove+1] - charOffsetsPx[endCharToRemove]; @@ -340,12 +360,8 @@ wxString wxControlBase::DoEllipsizeSingleLine(const wxString& curLine, const wxD // mark the (endCharToRemove+1)-th character as removable endCharToRemove++; removedPx += widthPx; - } - if (initialCharToRemove == 0 && endCharToRemove == len-1) - { - // we need to remove all the characters of the string! - break; + continue; // don't remove anything else } } @@ -372,15 +388,7 @@ wxString wxControlBase::DoEllipsizeSingleLine(const wxString& curLine, const wxD return curLine; } -#ifdef __VMS -#pragma message disable unscomzer - // suppress warnings on comparison of unsigned numbers -#endif - wxASSERT(initialCharToRemove >= 0 && initialCharToRemove <= len-1); // see valid range for initialCharToRemove above -#ifdef __VMS -#pragma message enable unscomzer - // suppress warnings on comparison of unsigned numbers -#endif + wxASSERT(initialCharToRemove <= len-1); // see valid range for initialCharToRemove above wxASSERT(nCharsToRemove >= 1 && nCharsToRemove <= len-initialCharToRemove); // see valid range for nCharsToRemove above // erase nCharsToRemove characters after initialCharToRemove (included);