no real changes, just rename the variables to make the code more readable and to prepare everything for the next commit:

- add postfix "Px" to all variables containing numbers of pixels
- add postfix "ToRemove" to initialChar and nChars vars to make it clear what they are for

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63659 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Francesco Montorsi
2010-03-10 11:07:57 +00:00
parent 5d7792236f
commit 8ab11e46c0

View File

@@ -233,14 +233,14 @@ wxControlBase::GetCompositeControlsDefaultAttributes(wxWindowVariant WXUNUSED(va
// wxControlBase - ellipsization code
// ----------------------------------------------------------------------------
#define wxELLIPSE_REPLACEMENT wxT("...")
#define wxELLIPSE_REPLACEMENT wxS("...")
/* static and protected */
wxString wxControlBase::DoEllipsizeSingleLine(const wxString& curLine, const wxDC& dc,
wxEllipsizeMode mode, int maxFinalWidth,
int replacementWidth, int marginWidth)
wxEllipsizeMode mode, int maxFinalWidthPx,
int replacementWidthPx, int marginWidthPx)
{
wxASSERT_MSG(replacementWidth > 0 && marginWidth > 0,
wxASSERT_MSG(replacementWidthPx > 0 && marginWidthPx > 0,
"Invalid parameters");
wxASSERT_MSG(!curLine.Contains('\n'),
"Use Ellipsize() instead!");
@@ -250,81 +250,81 @@ wxString wxControlBase::DoEllipsizeSingleLine(const wxString& curLine, const wxD
// NOTE: this function assumes that any mnemonic/tab character has already
// been handled if it was necessary to handle them (see Ellipsize())
if (maxFinalWidth <= 0)
if (maxFinalWidthPx <= 0)
return wxEmptyString;
wxArrayInt charOffsets;
wxArrayInt charOffsetsPx;
size_t len = curLine.length();
if (len == 0 ||
!dc.GetPartialTextExtents(curLine, charOffsets))
!dc.GetPartialTextExtents(curLine, charOffsetsPx))
return curLine;
wxASSERT(charOffsets.GetCount() == len);
wxASSERT(charOffsetsPx.GetCount() == len);
size_t totalWidth = charOffsets.Last();
if ( totalWidth <= (size_t)maxFinalWidth )
size_t totalWidthPx = charOffsetsPx.Last();
if ( totalWidthPx <= (size_t)maxFinalWidthPx )
return curLine; // we don't need to do any ellipsization!
int excessPixels = totalWidth - maxFinalWidth +
replacementWidth +
marginWidth; // security margin (NEEDED!)
wxASSERT(excessPixels>0);
int excessPx = totalWidthPx - maxFinalWidthPx +
replacementWidthPx +
marginWidthPx; // security margin (NEEDED!)
wxASSERT(excessPx>0);
// remove characters in excess
size_t initialChar, // index of first char to erase
nChars; // how many chars do we need to erase?
size_t initialCharToRemove, // index of first char to erase
nCharsToRemove; // how many chars do we need to erase?
switch (mode)
{
case wxELLIPSIZE_START:
initialChar = 0;
for ( nChars=0;
nChars < len && charOffsets[nChars] < excessPixels;
nChars++ )
initialCharToRemove = 0;
for ( nCharsToRemove=0;
nCharsToRemove < len && charOffsetsPx[nCharsToRemove] < excessPx;
nCharsToRemove++ )
;
break;
case wxELLIPSIZE_MIDDLE:
{
// the start & end of the removed span of chars
initialChar = len/2;
initialCharToRemove = len/2;
size_t endChar = len/2;
int removed = 0;
for ( ; removed < excessPixels; )
int removedPx = 0;
for ( ; removedPx < excessPx; )
{
if (initialChar > 0)
if (initialCharToRemove > 0)
{
// width of the initialChar-th character
int width = charOffsets[initialChar] -
charOffsets[initialChar-1];
// widthPx of the initialCharToRemove-th character
int widthPx = charOffsetsPx[initialCharToRemove] -
charOffsetsPx[initialCharToRemove-1];
// remove the initialChar-th character
removed += width;
initialChar--;
// remove the initialCharToRemove-th character
removedPx += widthPx;
initialCharToRemove--;
}
if (endChar < len - 1 &&
removed < excessPixels)
removedPx < excessPx)
{
// width of the (endChar+1)-th character
int width = charOffsets[endChar+1] -
charOffsets[endChar];
// widthPx of the (endChar+1)-th character
int widthPx = charOffsetsPx[endChar+1] -
charOffsetsPx[endChar];
// remove the endChar-th character
removed += width;
removedPx += widthPx;
endChar++;
}
if (initialChar == 0 && endChar == len-1)
if (initialCharToRemove == 0 && endChar == len-1)
{
nChars = len+1;
nCharsToRemove = len+1;
break;
}
}
initialChar++;
nChars = endChar - initialChar + 1;
initialCharToRemove++;
nCharsToRemove = endChar - initialCharToRemove + 1;
}
break;
@@ -332,20 +332,20 @@ wxString wxControlBase::DoEllipsizeSingleLine(const wxString& curLine, const wxD
{
wxASSERT(len > 0);
int maxWidth = totalWidth - excessPixels;
for ( initialChar = 0;
initialChar < len && charOffsets[initialChar] < maxWidth;
initialChar++ )
int maxWidthPx = totalWidthPx - excessPx;
for ( initialCharToRemove = 0;
initialCharToRemove < len && charOffsetsPx[initialCharToRemove] < maxWidthPx;
initialCharToRemove++ )
;
if (initialChar == 0)
if (initialCharToRemove == 0)
{
nChars = len;
nCharsToRemove = len;
}
else
{
//initialChar--; // go back one character
nChars = len - initialChar;
//initialCharToRemove--; // go back one character
nCharsToRemove = len - initialCharToRemove;
}
}
break;
@@ -357,24 +357,24 @@ wxString wxControlBase::DoEllipsizeSingleLine(const wxString& curLine, const wxD
}
wxString ret(curLine);
if (nChars >= len)
if (nCharsToRemove >= len)
{
// need to remove the entire row!
ret.clear();
}
else
{
// erase nChars characters after initialChar (included):
ret.erase(initialChar, nChars+1);
// erase nCharsToRemove characters after initialCharToRemove (included):
ret.erase(initialCharToRemove, nCharsToRemove+1);
// if there is space for the replacement dots, add them
if (maxFinalWidth > replacementWidth)
ret.insert(initialChar, wxELLIPSE_REPLACEMENT);
if (maxFinalWidthPx > replacementWidthPx)
ret.insert(initialCharToRemove, wxELLIPSE_REPLACEMENT);
}
// if everything was ok, we should have shortened this line
// enough to make it fit in maxFinalWidth:
wxASSERT(dc.GetTextExtent(ret).GetWidth() < maxFinalWidth);
// enough to make it fit in maxFinalWidthPx:
wxASSERT(dc.GetTextExtent(ret).GetWidth() < maxFinalWidthPx);
return ret;
}