Previously, Ellipsize() would always remove two characters at a time in
wxELLIPSIZE_MIDDLE mode. This was clearly a bug: it led to shortening
the text more than was strictly necessary.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@66822
c3d73ce0-8a6f-49c7-b76d-
6d57e0e08775
size_t endCharToRemove = len/2; // index of the last character to remove; valid range is [0;len-1]
int removedPx = 0;
size_t endCharToRemove = len/2; // index of the last character to remove; valid range is [0;len-1]
int removedPx = 0;
+ bool removeFromStart = true;
for ( ; removedPx < excessPx; )
{
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)
// width of the (initialCharToRemove-1)-th character
int widthPx;
if (initialCharToRemove >= 2)
// mark the (initialCharToRemove-1)-th character as removable
initialCharToRemove--;
removedPx += widthPx;
// 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];
// width of the (endCharToRemove+1)-th character
int widthPx = charOffsetsPx[endCharToRemove+1] -
charOffsetsPx[endCharToRemove];
// mark the (endCharToRemove+1)-th character as removable
endCharToRemove++;
removedPx += widthPx;
// 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