Lisview ellipsification

Dimitrie O. Paun dimi at cs.toronto.edu
Sat Jan 26 01:18:46 CST 2002


This patch fixes a potential bug in the previous version submitted by Bill
when we were'n 0-terminating the string if less then 3 chars fitted in the
label.

ChangeLog:
  Simplify and fix lisview ellipsification of large text labels.

--
Dimi.
-------------- next part --------------
Index: dlls/comctl32/listview.c
===================================================================
RCS file: /var/cvs/wine/dlls/comctl32/listview.c,v
retrieving revision 1.108
diff -u -r1.108 listview.c
--- dlls/comctl32/listview.c	18 Jan 2002 19:05:35 -0000	1.108
+++ dlls/comctl32/listview.c	26 Jan 2002 06:07:21 -0000
@@ -3187,22 +3187,17 @@
   rcWidth = max(0, rcItem.right - rcItem.left);
   if (nLabelWidth > rcWidth)
   {
-      INT i, len, eos, nCharsFit;
       /* give or take a couple, how many average sized chars would fit? */
-      nCharsFit = tm.tmAveCharWidth > 0 ? (rcWidth/tm.tmAveCharWidth)+2 : 0; 
-      /* place the ellipse accordingly, without overrunning the buffer */
-      len = strlenW(szDispText);
-      eos = min((nCharsFit > 1 && nCharsFit < len) ? nCharsFit+3 : len+2,
-                sizeof(szDispText)/sizeof(WCHAR)-1);
-      
-      nLabelWidth = ListView_GetStringWidthW(hwnd, szDispText);
-      while ((nLabelWidth > rcWidth) && (eos > 3))
+      INT nCharsFit = tm.tmAveCharWidth > 0 ? rcWidth/tm.tmAveCharWidth+2 : 0;
+      INT eos = min(strlenW(lvItem.pszText), nCharsFit);
+      if (eos > 0) lvItem.pszText[eos-1] = '.';
+      if (eos > 1) lvItem.pszText[eos-2] = '.';
+      if (eos < 3) lvItem.pszText[eos] = '\0'; 
+      for ( ; eos > 2; eos--) 
       {
-	 for (i = 1; i < 4; i++)
-	    szDispText[eos-i] = '.'; 
-         /* shift the ellipse one char to the left for each iteration */
-         szDispText[eos--] = '\0'; 
-         nLabelWidth = ListView_GetStringWidthW(hwnd, szDispText);
+ 	 lvItem.pszText[eos - 3] = '.';
+ 	 lvItem.pszText[eos] = '\0';
+ 	 if (ListView_GetStringWidthW(hwnd, lvItem.pszText) <= rcWidth) break;
       }
   }
 


More information about the wine-patches mailing list