- if ( pc == label.end() || *pc == _T('\n') )
- {
- len = curLine.length();
- if (len > 0 &&
- dc.GetPartialTextExtents(curLine, charOffsets))
- {
- wxASSERT(charOffsets.GetCount() == len);
-
- size_t totalWidth = charOffsets.Last();
- if ( totalWidth > (size_t)sz.GetWidth() )
- {
- // we need to ellipsize this row
- int excessPixels = totalWidth - sz.GetWidth() +
- replacementWidth +
- marginWidth; // security margin (NEEDED!)
-
- // remove characters in excess
- size_t initialChar, // index of first char to erase
- nChars; // how many chars do we need to erase?
- if (HasFlag(wxST_ELLIPSIZE_START))
- {
- initialChar = 0;
- for (nChars=0;
- nChars < len && charOffsets[nChars] < excessPixels;
- nChars++)
- ;
- }
- else if (HasFlag(wxST_ELLIPSIZE_MIDDLE))
- {
- // the start & end of the removed span of chars
- initialChar = len/2;
- size_t endChar = len/2;
-
- int removed = 0;
- for ( ; removed < excessPixels; )
- {
- if (initialChar > 0)
- {
- // width of the initialChar-th character
- int width = charOffsets[initialChar] -
- charOffsets[initialChar-1];
-
- // remove the initialChar-th character
- removed += width;
- initialChar--;
- }
-
- if (endChar < len - 1 &&
- removed < excessPixels)
- {
- // width of the (endChar+1)-th character
- int width = charOffsets[endChar+1] -
- charOffsets[endChar];
-
- // remove the endChar-th character
- removed += width;
- endChar++;
- }
-
- if (initialChar == 0 && endChar == len-1)
- {
- nChars = len+1;
- break;
- }
- }
-
- initialChar++;
- nChars = endChar - initialChar + 1;
- }
- else
- {
- wxASSERT(HasFlag(wxST_ELLIPSIZE_END));
- wxASSERT(len > 0);
-
- int maxWidth = totalWidth - excessPixels;
- for (initialChar=0;
- initialChar < len &&
- charOffsets[initialChar] < maxWidth;
- initialChar++)
- ;
-
- if (initialChar == 0)
- {
- nChars = len;
- }
- else
- {
- initialChar--; // go back one character
- nChars = len - initialChar;
- }
- }
-
- if (nChars > len)
- {
- // need to remove the entire row!
- curLine.clear();
- }
- else
- {
- // erase nChars characters after initialChar (included):
- curLine.erase(initialChar, nChars+1);