Added support DT_PATH_ELLIPSIS, DT_END_ELLIPSIS, and DT_WORD_ELLIPSIS
flags in DrawText.
diff --git a/dlls/user/text.c b/dlls/user/text.c
index b8c9b8d..31dcfc2 100644
--- a/dlls/user/text.c
+++ b/dlls/user/text.c
@@ -25,6 +25,10 @@
#define SPACE 32
#define PREFIX 38
+#define ELLIPSIS "..."
+#define FORWARD_SLASH '/'
+#define BACK_SLASH '\\'
+
#define SWAP_INT(a,b) { int t = a; a = b; b = t; }
static int tabstop = 8;
@@ -49,6 +53,12 @@
* 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 plen = 0;
int numspaces;
@@ -227,6 +237,7 @@
if (!str) return 0;
if (count == -1) count = strlen(str);
+ if (count == 0) return 0;
strPtr = str;
GetTextMetricsA(hdc, &tm);
@@ -271,6 +282,92 @@
if (flags & DT_VCENTER) y = rect->top +
(rect->bottom - rect->top) / 2 - size.cy / 2;
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))
{