Added support DT_PATH_ELLIPSIS, DT_END_ELLIPSIS, and DT_WORD_ELLIPSIS
flags in DrawText.
This commit is contained in:
parent
7096384d14
commit
196daf815e
|
@ -25,6 +25,10 @@ DEFAULT_DEBUG_CHANNEL(text);
|
||||||
#define SPACE 32
|
#define SPACE 32
|
||||||
#define PREFIX 38
|
#define PREFIX 38
|
||||||
|
|
||||||
|
#define ELLIPSIS "..."
|
||||||
|
#define FORWARD_SLASH '/'
|
||||||
|
#define BACK_SLASH '\\'
|
||||||
|
|
||||||
#define SWAP_INT(a,b) { int t = a; a = b; b = t; }
|
#define SWAP_INT(a,b) { int t = a; a = b; b = t; }
|
||||||
|
|
||||||
static int tabstop = 8;
|
static int tabstop = 8;
|
||||||
|
@ -49,6 +53,12 @@ static const char *TEXT_NextLine( HDC hdc, const char *str, int *count,
|
||||||
* or NULL if end of str reached.
|
* or NULL if end of str reached.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* FIXME:
|
||||||
|
* GetTextExtentPoint is used to get the width of each character,
|
||||||
|
* rather than GetCharABCWidth... So the whitespace between
|
||||||
|
* characters is ignored, and the reported len is too great.
|
||||||
|
*/
|
||||||
|
|
||||||
int i = 0, j = 0, k;
|
int i = 0, j = 0, k;
|
||||||
int plen = 0;
|
int plen = 0;
|
||||||
int numspaces;
|
int numspaces;
|
||||||
|
@ -227,6 +237,7 @@ INT WINAPI DrawTextA( HDC hdc, LPCSTR str, INT i_count, LPRECT rect, UINT flags
|
||||||
|
|
||||||
if (!str) return 0;
|
if (!str) return 0;
|
||||||
if (count == -1) count = strlen(str);
|
if (count == -1) count = strlen(str);
|
||||||
|
if (count == 0) return 0;
|
||||||
strPtr = str;
|
strPtr = str;
|
||||||
|
|
||||||
GetTextMetricsA(hdc, &tm);
|
GetTextMetricsA(hdc, &tm);
|
||||||
|
@ -271,6 +282,92 @@ INT WINAPI DrawTextA( HDC hdc, LPCSTR str, INT i_count, LPRECT rect, UINT flags
|
||||||
if (flags & DT_VCENTER) y = rect->top +
|
if (flags & DT_VCENTER) y = rect->top +
|
||||||
(rect->bottom - rect->top) / 2 - size.cy / 2;
|
(rect->bottom - rect->top) / 2 - size.cy / 2;
|
||||||
else if (flags & DT_BOTTOM) y = rect->bottom - size.cy;
|
else if (flags & DT_BOTTOM) y = rect->bottom - size.cy;
|
||||||
|
|
||||||
|
if (flags & (DT_PATH_ELLIPSIS | DT_END_ELLIPSIS | DT_WORD_ELLIPSIS))
|
||||||
|
{
|
||||||
|
char swapStr[sizeof(line)];
|
||||||
|
char* fnameDelim = NULL;
|
||||||
|
int totalLen = i_count >= 0 ? i_count : strlen(str);
|
||||||
|
|
||||||
|
if (size.cx > width)
|
||||||
|
{
|
||||||
|
int fnameLen = totalLen;
|
||||||
|
|
||||||
|
/* allow room for '...' */
|
||||||
|
count = min(totalLen+3, sizeof(line)-3);
|
||||||
|
|
||||||
|
if (flags & DT_WORD_ELLIPSIS)
|
||||||
|
flags |= DT_WORDBREAK;
|
||||||
|
|
||||||
|
if (flags & DT_PATH_ELLIPSIS)
|
||||||
|
{
|
||||||
|
char* lastBkSlash = NULL;
|
||||||
|
char* lastFwdSlash = NULL;
|
||||||
|
strncpy(line, str, totalLen); line[totalLen] = '\0';
|
||||||
|
lastBkSlash = strrchr(line, BACK_SLASH);
|
||||||
|
lastFwdSlash = strrchr(line, FORWARD_SLASH);
|
||||||
|
fnameDelim = lastFwdSlash ? lastFwdSlash : lastBkSlash;
|
||||||
|
if (lastBkSlash && lastFwdSlash) /* which is last? */
|
||||||
|
if (lastBkSlash > lastFwdSlash)
|
||||||
|
fnameDelim = lastBkSlash;
|
||||||
|
|
||||||
|
if (fnameDelim)
|
||||||
|
fnameLen = &line[totalLen] - fnameDelim;
|
||||||
|
else
|
||||||
|
fnameDelim = (char*)str;
|
||||||
|
|
||||||
|
strcpy(swapStr, ELLIPSIS);
|
||||||
|
strncat(swapStr, fnameDelim, fnameLen);
|
||||||
|
swapStr[fnameLen+3] = '\0';
|
||||||
|
strncat(swapStr, str, totalLen - fnameLen);
|
||||||
|
swapStr[totalLen+3] = '\0';
|
||||||
|
}
|
||||||
|
else /* DT_END_ELLIPSIS | DT_WORD_ELLIPSIS */
|
||||||
|
{
|
||||||
|
strcpy(swapStr, ELLIPSIS);
|
||||||
|
strncat(swapStr, str, totalLen);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEXT_NextLine(hdc, swapStr, &count, line, &len, width, flags);
|
||||||
|
|
||||||
|
/* if only the ELLIPSIS will fit, just let it be clipped */
|
||||||
|
len = max(3, len);
|
||||||
|
GetTextExtentPointA(hdc, line, len, &size);
|
||||||
|
|
||||||
|
/* FIXME:
|
||||||
|
* NextLine uses GetTextExtentPoint for each character,
|
||||||
|
* rather than GetCharABCWidth... So the whitespace between
|
||||||
|
* characters is ignored in the width measurement, and the
|
||||||
|
* reported len is too great. To compensate, we must get
|
||||||
|
* the width of the entire line and adjust len accordingly.
|
||||||
|
*/
|
||||||
|
while ((size.cx > width) && (len > 3))
|
||||||
|
{
|
||||||
|
line[--len] = '\0';
|
||||||
|
GetTextExtentPointA(hdc, line, len, &size);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fnameLen < len-3) /* some of the path will fit */
|
||||||
|
{
|
||||||
|
/* put the ELLIPSIS between the path and filename */
|
||||||
|
strncpy(swapStr, &line[fnameLen+3], len-3-fnameLen);
|
||||||
|
swapStr[len-3-fnameLen] = '\0';
|
||||||
|
strcat(swapStr, ELLIPSIS);
|
||||||
|
strncat(swapStr, &line[3], fnameLen);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* move the ELLIPSIS to the end */
|
||||||
|
strncpy(swapStr, &line[3], len-3);
|
||||||
|
swapStr[len-3] = '\0';
|
||||||
|
strcat(swapStr, ELLIPSIS);
|
||||||
|
}
|
||||||
|
|
||||||
|
strncpy(line, swapStr, len);
|
||||||
|
line[len] = '\0';
|
||||||
|
strPtr = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (!(flags & DT_CALCRECT))
|
if (!(flags & DT_CALCRECT))
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue