Remove chars one-by-one with wxELLIPSIZE_MIDDLE.

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
This commit is contained in:
Václav Slavík
2011-01-31 18:23:29 +00:00
parent 3999336cb9
commit 3433de6e63

View File

@@ -307,11 +307,30 @@ wxString wxControlBase::DoEllipsizeSingleLine(const wxString& curLine, const wxD
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; )
{
// 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
}
}