Listview X0

Dimitrie O. Paun dpaun at rogers.com
Wed Oct 23 22:58:24 CDT 2002


ChangeLog
  Rewrite the UpdateScroll function: simpler, faster.
  Add debugging helper for SCROLLINFO.
  Fix potential bug in debugging helpers.

Index: dlls/comctl32/listview.c
===================================================================
RCS file: /var/cvs/wine/dlls/comctl32/listview.c,v
retrieving revision 1.299
diff -u -r1.299 listview.c
--- dlls/comctl32/listview.c	23 Oct 2002 23:32:50 -0000	1.299
+++ dlls/comctl32/listview.c	24 Oct 2002 03:52:58 -0000
@@ -549,6 +549,38 @@
     } else return "(null)";
 }
 
+static char * debugscrollinfo(const SCROLLINFO *pScrollInfo)
+{
+    char* buf = debug_getbuf(), *text = buf;
+    int len, size = DEBUG_BUFFER_SIZE;
+    
+    if (pScrollInfo == NULL) return "(null)";
+    len = snprintf(buf, size, "{cbSize=%d, ", pScrollInfo->cbSize);
+    if (len == -1) goto end; buf += len; size -= len;
+    if (pScrollInfo->fMask & SIF_RANGE)
+	len = snprintf(buf, size, "nMin=%d, nMax=%d, ", pScrollInfo->nMin, pScrollInfo->nMax);
+    else len = 0;
+    if (len == -1) goto end; buf += len; size -= len;
+    if (pScrollInfo->fMask & SIF_PAGE)
+	len = snprintf(buf, size, "nPage=%u, ", pScrollInfo->nPage);
+    else len = 0;
+    if (len == -1) goto end; buf += len; size -= len;
+    if (pScrollInfo->fMask & SIF_POS)
+	len = snprintf(buf, size, "nPos=%d, ", pScrollInfo->nPos);
+    else len = 0;
+    if (len == -1) goto end; buf += len; size -= len;
+    if (pScrollInfo->fMask & SIF_TRACKPOS)
+	len = snprintf(buf, size, "nTrackPos=%d, ", pScrollInfo->nTrackPos);
+    else len = 0;
+    if (len == -1) goto end; buf += len; size -= len;
+    goto undo;
+end:
+    buf = text + strlen(text);
+undo:
+    if (buf - text > 2) { buf[-2] = '}'; buf[-1] = 0; }
+    return text;
+} 
+
 static char* debugnmlistview(LPNMLISTVIEW plvnm)
 {
     if (plvnm)
@@ -594,7 +626,7 @@
 end:
     buf = text + strlen(text);
 undo:
-    if (buf - text > 2) buf[-2] = '}'; buf[-1] = 0;
+    if (buf - text > 2) { buf[-2] = '}'; buf[-1] = 0; }
     return text;
 }
 
@@ -634,7 +666,7 @@
 end:
     buf = text + strlen(text);
 undo:
-    if (buf - text > 2) buf[-2] = '}'; buf[-1] = 0;
+    if (buf - text > 2) { buf[-2] = '}'; buf[-1] = 0; }
     return text;
 }
 
@@ -1423,103 +1455,61 @@
  */
 static void LISTVIEW_UpdateScroll(LISTVIEW_INFO *infoPtr)
 {
-  UINT uView =  infoPtr->dwStyle & LVS_TYPEMASK;
-  INT nListHeight = infoPtr->rcList.bottom - infoPtr->rcList.top;
-  INT nListWidth = infoPtr->rcList.right - infoPtr->rcList.left;
-  SCROLLINFO scrollInfo;
-
-  if (infoPtr->dwStyle & LVS_NOSCROLL) return;
-  /*if (!is_redrawing(infoPtr)) return;*/
-
-  scrollInfo.cbSize = sizeof(SCROLLINFO);
-
-  if (uView == LVS_LIST)
-  {
-    /* update horizontal scrollbar */
-    INT nCountPerColumn = LISTVIEW_GetCountPerColumn(infoPtr);
-    INT nCountPerRow = LISTVIEW_GetCountPerRow(infoPtr);
-
-    TRACE("items=%d, perColumn=%d, perRow=%d\n",
-	  infoPtr->nItemCount, nCountPerColumn, nCountPerRow);
-   
-    scrollInfo.nMin = 0; 
-    scrollInfo.nMax = infoPtr->nItemCount / nCountPerColumn;
-    if((infoPtr->nItemCount % nCountPerColumn) == 0)
-        scrollInfo.nMax--;
-    if (scrollInfo.nMax < 0) scrollInfo.nMax = 0;
-    scrollInfo.nPos = ListView_GetTopIndex(infoPtr->hwndSelf) / nCountPerColumn;
-    scrollInfo.nPage = nCountPerRow;
-    scrollInfo.fMask = SIF_RANGE | SIF_POS | SIF_PAGE;
-    SetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &scrollInfo, TRUE);
-    ShowScrollBar(infoPtr->hwndSelf, SB_VERT, FALSE);
-  }
-  else if (uView == LVS_REPORT)
-  {
-    BOOL test;
-
-    /* update vertical scrollbar */
-    scrollInfo.nMin = 0;
-    scrollInfo.nMax = infoPtr->nItemCount - 1;
-    scrollInfo.nPos = ListView_GetTopIndex(infoPtr->hwndSelf);
-    scrollInfo.nPage = LISTVIEW_GetCountPerColumn(infoPtr);
-    scrollInfo.fMask = SIF_RANGE | SIF_POS | SIF_PAGE;
-    test = (scrollInfo.nMin >= scrollInfo.nMax - max((INT)scrollInfo.nPage - 1, 0));
-    TRACE("LVS_REPORT Vert. nMax=%d, nPage=%d, test=%d\n",
-	  scrollInfo.nMax, scrollInfo.nPage, test);
-    SetScrollInfo(infoPtr->hwndSelf, SB_VERT, &scrollInfo, TRUE);
-    ShowScrollBar(infoPtr->hwndSelf, SB_VERT, (test) ? FALSE : TRUE);
-
-    /* update horizontal scrollbar */
-    scrollInfo.fMask = SIF_POS;
-    if (!GetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &scrollInfo))
-      scrollInfo.nPos = 0;
-    scrollInfo.nMin = 0;
-    scrollInfo.nMax = max(infoPtr->nItemWidth, 0)-1;
-    scrollInfo.nPage = nListWidth;
-    scrollInfo.fMask = SIF_RANGE | SIF_POS | SIF_PAGE  ;
-    test = (scrollInfo.nMin >= scrollInfo.nMax - max((INT)scrollInfo.nPage - 1, 0));
-    TRACE("LVS_REPORT Horz. nMax=%d, nPage=%d, test=%d\n",
-	  scrollInfo.nMax, scrollInfo.nPage, test);
-    SetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &scrollInfo, TRUE);
-    ShowScrollBar(infoPtr->hwndSelf, SB_HORZ, (test) ? FALSE : TRUE);
+    UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
+    SCROLLINFO horzInfo, vertInfo;
+
+    if (infoPtr->dwStyle & LVS_NOSCROLL) return;
+    /*if (!is_redrawing(infoPtr)) return;*/
+
+    ZeroMemory(&horzInfo, sizeof(SCROLLINFO));
+    horzInfo.cbSize = sizeof(SCROLLINFO);
+    horzInfo.nPage = infoPtr->rcList.right - infoPtr->rcList.left;
+
+    ZeroMemory(&vertInfo, sizeof(SCROLLINFO));
+    vertInfo.cbSize = sizeof(SCROLLINFO);
+    vertInfo.nPage = infoPtr->rcList.bottom - infoPtr->rcList.top;
+
+    /* for now, we'll set info.nMax to the _count_, and adjust it later */
+    if (uView == LVS_LIST)
+    {
+	INT nPerCol = LISTVIEW_GetCountPerColumn(infoPtr);
+	horzInfo.nMax = (infoPtr->nItemCount + nPerCol - 1) / nPerCol;
+	horzInfo.nPage /= infoPtr->nItemWidth;
+    }
+    else if (uView == LVS_REPORT)
+    {
+	horzInfo.nMax = infoPtr->nItemWidth;
+	vertInfo.nMax = infoPtr->nItemCount;
+	vertInfo.nPage /= infoPtr->nItemHeight;
+    }
+    else /* LVS_ICON, or LVS_SMALLICON */
+    {
+	RECT rcView;
+
+	if (LISTVIEW_GetViewRect(infoPtr, &rcView))
+	{
+	    horzInfo.nMax = rcView.right - rcView.left;
+	    vertInfo.nMax = rcView.bottom - rcView.top;
+	}
+    }
+  
+    horzInfo.fMask = SIF_RANGE | SIF_PAGE;
+    horzInfo.nMax = max(horzInfo.nMax - 1, 0);
+    SetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &horzInfo, TRUE);
+    TRACE("horzInfo=%s\n", debugscrollinfo(&horzInfo));
+
+    vertInfo.fMask = SIF_RANGE | SIF_PAGE;
+    vertInfo.nMax = max(vertInfo.nMax - 1, 0);
+    SetScrollInfo(infoPtr->hwndSelf, SB_VERT, &vertInfo, TRUE);
+    TRACE("vertInfo=%s\n", debugscrollinfo(&vertInfo));
 
     /* Update the Header Control */
-    scrollInfo.fMask = SIF_POS;
-    GetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &scrollInfo);
-    LISTVIEW_UpdateHeaderSize(infoPtr, scrollInfo.nPos);
-
-  }
-  else
-  {
-    RECT rcView;
-
-    if (LISTVIEW_GetViewRect(infoPtr, &rcView))
-    {
-      TRACE("rcView=%s, rcList=%s\n", debugrect(&rcView), debugrect(&infoPtr->rcList));
-
-      /* Update Horizontal Scrollbar */
-      scrollInfo.fMask = SIF_POS;
-      if (!GetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &scrollInfo))
-        scrollInfo.nPos = 0;
-      scrollInfo.nMin = 0;
-      scrollInfo.nMax = max(rcView.right - rcView.left - 1, 0);
-      scrollInfo.nPage = nListWidth;
-      scrollInfo.fMask = SIF_RANGE | SIF_POS | SIF_PAGE;
-      TRACE("LVS_ICON/SMALLICON Horz.\n");
-      SetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &scrollInfo, TRUE);
-
-      /* Update Vertical Scrollbar */
-      scrollInfo.fMask = SIF_POS;
-      if (!GetScrollInfo(infoPtr->hwndSelf, SB_VERT, &scrollInfo))
-        scrollInfo.nPos = 0;
-      scrollInfo.nMin = 0;
-      scrollInfo.nMax = max(rcView.bottom - rcView.top - 1, 0);
-      scrollInfo.nPage = nListHeight;
-      scrollInfo.fMask = SIF_RANGE | SIF_POS | SIF_PAGE;
-      TRACE("LVS_ICON/SMALLICON Vert.\n");
-      SetScrollInfo(infoPtr->hwndSelf, SB_VERT, &scrollInfo, TRUE);
+    if (uView == LVS_REPORT)
+    {
+	horzInfo.fMask = SIF_POS;
+	GetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &horzInfo);
+	LISTVIEW_UpdateHeaderSize(infoPtr, horzInfo.nPos);
     }
-  }
 }
 
 


-- 
Dimi.




More information about the wine-patches mailing list