Mikołaj Zalewski : comctl32: header: Put the new item in place of the hot divider instead of swapping.

Alexandre Julliard julliard at wine.codeweavers.com
Fri May 26 05:42:15 CDT 2006


Module: wine
Branch: master
Commit: ee430bf7b8093940640d8c03b4c8fdcc6c623b82
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=ee430bf7b8093940640d8c03b4c8fdcc6c623b82

Author: Mikołaj Zalewski <mikolaj at zalewski.pl>
Date:   Fri May 26 00:01:25 2006 +0200

comctl32: header: Put the new item in place of the hot divider instead of swapping.

---

 dlls/comctl32/header.c |   89 ++++++++++++++++++++++++++----------------------
 1 files changed, 49 insertions(+), 40 deletions(-)

diff --git a/dlls/comctl32/header.c b/dlls/comctl32/header.c
index dccc6a2..d47e7f5 100644
--- a/dlls/comctl32/header.c
+++ b/dlls/comctl32/header.c
@@ -195,6 +195,32 @@ HEADER_OrderToIndex(HWND hwnd, WPARAM wP
     return infoPtr->order[iorder];
 }
 
+static void
+HEADER_ChangeItemOrder(HEADER_INFO *infoPtr, INT iItem, INT iNewOrder)
+{
+    HEADER_ITEM *lpItem = &infoPtr->items[iItem];
+    INT i, nMin, nMax;
+
+    TRACE("%d: %d->%d\n", iItem, lpItem->iOrder, iNewOrder);
+    if (lpItem->iOrder < iNewOrder)
+    {
+        memmove(&infoPtr->order[lpItem->iOrder],
+               &infoPtr->order[lpItem->iOrder + 1],
+               (iNewOrder - lpItem->iOrder) * sizeof(INT));
+    }
+    if (iNewOrder < lpItem->iOrder)
+    {
+        memmove(&infoPtr->order[iNewOrder + 1],
+                &infoPtr->order[iNewOrder],
+                (lpItem->iOrder - iNewOrder) * sizeof(INT));
+    }
+    infoPtr->order[iNewOrder] = iItem;
+    nMin = min(lpItem->iOrder, iNewOrder);
+    nMax = max(lpItem->iOrder, iNewOrder);
+    for (i = nMin; i <= nMax; i++)
+        infoPtr->items[infoPtr->order[i]].iOrder = i;
+}
+
 /* Note: if iItem is the last item then this function returns infoPtr->uNumItem */
 static INT
 HEADER_NextItem(HWND hwnd, INT iItem)
@@ -1434,30 +1460,9 @@ HEADER_SetItemT (HWND hwnd, INT nItem, L
     lpItem = &infoPtr->items[nItem];
     HEADER_StoreHDItemInHeader(lpItem, phdi->mask, phdi, bUnicode);
 
+    /* FIXME: check it order is not out of bound */
     if (phdi->mask & HDI_ORDER)
-      {
-        INT i, nMin, nMax;
-        
-        if (lpItem->iOrder < phdi->iOrder)
-        {
-            memmove(&infoPtr->order[lpItem->iOrder],
-                   &infoPtr->order[lpItem->iOrder + 1],
-                   (phdi->iOrder - lpItem->iOrder) * sizeof(INT));
-        }
-        if (phdi->iOrder < lpItem->iOrder)
-        {
-            memmove(&infoPtr->order[phdi->iOrder + 1],
-                    &infoPtr->order[phdi->iOrder],
-                    (lpItem->iOrder - phdi->iOrder) * sizeof(INT));
-        }
-        infoPtr->order[phdi->iOrder] = nItem;
-        nMin = min(lpItem->iOrder, phdi->iOrder);
-        nMax = max(lpItem->iOrder, phdi->iOrder);
-        for (i = nMin; i <= nMax; i++)
-        {
-            infoPtr->items[infoPtr->order[i]].iOrder = infoPtr->order[i];
-        }
-      }
+        HEADER_ChangeItemOrder(infoPtr, nItem, phdi->iOrder);
 
     HEADER_SendHeaderNotifyT (hwnd, HDN_ITEMCHANGEDW, nItem, phdi->mask, &hdNotify);
 
@@ -1667,32 +1672,36 @@ HEADER_LButtonUp (HWND hwnd, WPARAM wPar
     if (infoPtr->bPressed) {
 	if (infoPtr->bDragging)
 	{
+            HEADER_ITEM *lpItem = &infoPtr->items[infoPtr->iMoveItem];
+            INT iNewOrder;
+            
 	    ImageList_DragShowNolock(FALSE);
 	    ImageList_EndDrag();
-	    infoPtr->items[infoPtr->iMoveItem].bDown=FALSE;
-	    /* FIXME: the new order field should be sent, not the old one */
-	    if (!HEADER_SendHeaderNotifyT(hwnd, HDN_ENDDRAG, infoPtr->iMoveItem, HDI_ORDER, NULL))
+            lpItem->bDown=FALSE;
+            
+            if (infoPtr->iHotDivider == -1)
+                iNewOrder = -1;
+            else if (infoPtr->iHotDivider == infoPtr->uNumItem)
+                iNewOrder = infoPtr->uNumItem-1;
+            else
 	    {
-		HEADER_ITEM *lpItem;
-		INT newindex = HEADER_IndexToOrder(hwnd,nItem);
-		INT oldindex = HEADER_IndexToOrder(hwnd,infoPtr->iMoveItem);
-
-		TRACE("Exchanging [index:order] [%d:%d] [%d:%d]\n",
-		    infoPtr->iMoveItem,oldindex,nItem,newindex);
-        	lpItem= &infoPtr->items[nItem];
-		lpItem->iOrder=oldindex;
-
-        	lpItem= &infoPtr->items[infoPtr->iMoveItem];
-		lpItem->iOrder = newindex;
-
-        	infoPtr->order[oldindex] = nItem;
-        	infoPtr->order[newindex] = infoPtr->iMoveItem;
+                iNewOrder = HEADER_IndexToOrder(hwnd, infoPtr->iHotDivider);
+                if (iNewOrder > lpItem->iOrder)
+                    iNewOrder--;
+            }
 
+            /* FIXME: the new order field should be sent, not the old one */
+            if (iNewOrder != -1 &&
+                !HEADER_SendHeaderNotifyT(hwnd, HDN_ENDDRAG, infoPtr->iMoveItem, HDI_ORDER, NULL))
+            {
+                HEADER_ChangeItemOrder(infoPtr, infoPtr->iMoveItem, iNewOrder);
 		infoPtr->bRectsValid = FALSE;
 		InvalidateRect(hwnd, NULL, FALSE);
 	    }
 	    else
 		InvalidateRect(hwnd, &infoPtr->items[infoPtr->iMoveItem].rect, FALSE);
+                
+            HEADER_SetHotDivider(hwnd, FALSE, -1);
 	}
 	else if (!(dwStyle&HDS_DRAGDROP) || !HEADER_IsDragDistance(infoPtr, &pt))
 	{




More information about the wine-cvs mailing list