Listview report mode mods, take 2

Duane Clark dclark at akamail.com
Thu Feb 28 14:45:43 CST 2002


Please use this one instead of the one yesterday. The only difference is 
better handling of small icon images when autoresizing.


Log message:
	LISTVIEW_InsertColumnT can be called with a width of
	 LVSCW_AUTOSIZE_USEHEADER.
	Use the correct strings when column autosizing on columns
	 other than column 0.
	LVSCW_AUTOSIZE_USEHEADER uses both item and header strings.


-------------- next part --------------
Index: dlls/comctl32/listview.c
===================================================================
RCS file: /home/wine/wine/dlls/comctl32/listview.c,v
retrieving revision 1.120
diff -u -r1.120 listview.c
--- dlls/comctl32/listview.c	2002/02/27 01:24:39	1.120
+++ dlls/comctl32/listview.c	2002/02/28 18:39:18
@@ -6689,7 +6689,33 @@
     if (lpColumn->mask & LVCF_WIDTH) 
     {
       hdi.mask |= HDI_WIDTH;
-      hdi.cxy = lpColumn->cx;
+      if(lpColumn->cx == LVSCW_AUTOSIZE_USEHEADER)
+      {
+        /* make it fill the remainder of the controls width */
+        HDITEMW hdit;
+        RECT rcHeader;
+        INT item_index;
+        
+        ZeroMemory(&hdit, sizeof(hdit));
+  
+        /* get the width of every item except the current one */
+        hdit.mask = HDI_WIDTH;
+        hdi.cxy = 0;
+        
+        for(item_index = 0; item_index < (nColumn - 1); item_index++) {
+          Header_GetItemW(infoPtr->hwndHeader, item_index, (LPARAM)(&hdit));
+          hdi.cxy+=hdit.cxy;
+        }
+
+        /* retrieve the layout of the header */
+        GetClientRect(hwnd, &rcHeader);
+/*        GetWindowRect(infoPtr->hwndHeader, &rcHeader);*/
+        TRACE("start cxy=%d left=%d right=%d\n", hdi.cxy, rcHeader.left, rcHeader.right);
+
+        hdi.cxy = (rcHeader.right - rcHeader.left) - hdi.cxy;
+      }
+      else
+        hdi.cxy = lpColumn->cx;
     }
   
     if (lpColumn->mask & LVCF_TEXT) 
@@ -7114,8 +7140,10 @@
     WCHAR text_buffer[DISP_TEXT_SIZE];
     INT header_item_count;
     INT item_index;
+    INT nLabelWidth;
     RECT rcHeader;
-
+    LVITEMW lvItem;
+    WCHAR szDispText[DISP_TEXT_SIZE];
 
     /* make sure we can get the listview info */
     if (!(infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0)))
@@ -7128,6 +7156,8 @@
     if ((uView != LVS_REPORT) && (uView != LVS_LIST))
       return (FALSE);            
 
+    TRACE("(hwnd=%x, iCol=%d, cx=%d\n", hwnd, iCol, cx);
+    
     /* take care of invalid cx values */
     if((uView == LVS_REPORT) && (cx < -2))
       cx = LVSCW_AUTOSIZE;
@@ -7144,12 +7174,38 @@
     /* autosize based on listview items width */
     if(cx == LVSCW_AUTOSIZE)
     {
-      /* set the width of the header to the width of the widest item */
-      for(item_index = 0; item_index < GETITEMCOUNT(infoPtr); item_index++)
+      /* set the width of the column to the width of the widest item */
+      if (iCol == 0 || uView == LVS_LIST)
+      {
+        cx = 0;
+        for(item_index = 0; item_index < GETITEMCOUNT(infoPtr); item_index++)
+        {
+          nLabelWidth = LISTVIEW_GetLabelWidth(hwnd, item_index);
+          cx = (nLabelWidth>cx)?nLabelWidth:cx;
+        }
+        /* I had to add the '3' to prevent clipping of the end of the
+           line. Probably one of these padding numbers is incorrect. */
+        if (infoPtr->himlSmall)
+          cx += WIDTH_PADDING + IMAGE_PADDING + 3;
+      }
+      else
       {
-        if(cx < LISTVIEW_GetLabelWidth(hwnd, item_index))
-          cx = LISTVIEW_GetLabelWidth(hwnd, item_index);
-      } 
+        ZeroMemory(&lvItem, sizeof(lvItem));
+        lvItem.iSubItem = iCol;
+        lvItem.mask = LVIF_TEXT;
+        lvItem.cchTextMax = DISP_TEXT_SIZE;
+        lvItem.pszText = szDispText;
+        *lvItem.pszText = '\0';
+        cx = 0;
+        for(item_index = 0; item_index < GETITEMCOUNT(infoPtr); item_index++)
+        {
+          lvItem.iItem = item_index;
+          LISTVIEW_GetItemT(hwnd, &lvItem, FALSE, TRUE);
+          nLabelWidth = LISTVIEW_GetStringWidthT(hwnd, lvItem.pszText, TRUE);
+          cx = (nLabelWidth>cx)?nLabelWidth:cx;
+        }
+      }
+      cx += TRAILING_PADDING;
     } /* autosize based on listview header width */
     else if(cx == LVSCW_AUTOSIZE_USEHEADER)
     {
@@ -7173,6 +7229,13 @@
       }                                  
       else
       {
+        /* Despite what the MS docs say, if this is not the last
+           column, then MS resizes the column to the width of the
+           largest text string in the column, including headers
+           and items. This is different from LVSCW_AUTOSIZE in that
+           LVSCW_AUTOSIZE ignores the header string length.
+           */
+           
         /* retrieve header font */
         header_font = SendMessageW(infoPtr->hwndHeader, WM_GETFONT, 0L, 0L);
  
@@ -7192,8 +7255,28 @@
         SelectObject(hdc, old_font); /* restore the old font */    
         ReleaseDC(hwnd, hdc);
  
-        /* set the width of this column to the width of the text */
+        ZeroMemory(&lvItem, sizeof(lvItem));
+        lvItem.iSubItem = iCol;
+        lvItem.mask = LVIF_TEXT;
+        lvItem.cchTextMax = DISP_TEXT_SIZE;
+        lvItem.pszText = szDispText;
+        *lvItem.pszText = '\0';
         cx = size.cx;
+        for(item_index = 0; item_index < GETITEMCOUNT(infoPtr); item_index++)
+        {
+          lvItem.iItem = item_index;
+          LISTVIEW_GetItemT(hwnd, &lvItem, FALSE, TRUE);
+          nLabelWidth = LISTVIEW_GetStringWidthT(hwnd, lvItem.pszText, TRUE);
+          nLabelWidth += TRAILING_PADDING;
+          /* While it is possible for subitems to have icons, even MS messes
+             up the positioning, so I suspect no applications actually use
+             them. */
+          if (item_index == 0 && infoPtr->himlSmall)
+            /* I had to add the '3' to prevent clipping of the end of the
+               line. Probably one of these padding numbers is incorrect. */
+            nLabelWidth += WIDTH_PADDING + IMAGE_PADDING + 3;
+          cx = (nLabelWidth>cx)?nLabelWidth:cx;
+        }
       }
   }
 


More information about the wine-patches mailing list