toolbar: BTNS_WHOLEDROPDOWN

Huw D M Davies h.davies1 at physics.ox.ac.uk
Tue Feb 10 06:25:44 CST 2004


        Ulrich Czekalla <ulrich at codeweavers.com>        
        add support for BTNS_WHOLEDROPDOWN
        populate button rect when sending TBN_DROPDOWN
-- 
Huw Davies
huw at codeweavers.com
Index: dlls/comctl32/toolbar.c
===================================================================
RCS file: /home/wine/wine/dlls/comctl32/toolbar.c,v
retrieving revision 1.153
diff -u -r1.153 toolbar.c
--- dlls/comctl32/toolbar.c	10 Feb 2004 01:34:47 -0000	1.153
+++ dlls/comctl32/toolbar.c	10 Feb 2004 12:23:02 -0000
@@ -684,8 +684,11 @@
 {
     TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
     DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);
-    BOOL hasDropDownArrow = TOOLBAR_HasDropDownArrows(infoPtr->dwExStyle) &&
-	                    (btnPtr->fsStyle & BTNS_DROPDOWN);
+    BOOL hasDropDownArrow = (TOOLBAR_HasDropDownArrows(infoPtr->dwExStyle) &&
+                            (btnPtr->fsStyle & BTNS_DROPDOWN)) ||
+                            (btnPtr->fsStyle & BTNS_WHOLEDROPDOWN);
+    BOOL drawSepDropDownArrow = hasDropDownArrow && 
+                            (~btnPtr->fsStyle & BTNS_WHOLEDROPDOWN);
     RECT rc, rcArrow, rcBitmap, rcText, rcFill;
     LPWSTR lpText = NULL;
     NMTBCUSTOMDRAW tbcd;
@@ -705,11 +708,17 @@
 
     if (hasDropDownArrow)
     {
+        int right;
+
 	if (dwStyle & TBSTYLE_FLAT)
-            rc.right = max(rc.left, rc.right - DDARROW_WIDTH);
+            right = max(rc.left, rc.right - DDARROW_WIDTH);
 	else
-            rc.right = max(rc.left, rc.right - DDARROW_WIDTH - 2);
-	rcArrow.left = rc.right;
+            right = max(rc.left, rc.right - DDARROW_WIDTH - 2);
+
+        if (drawSepDropDownArrow)
+           rc.right = right;
+
+	rcArrow.left = right;
     }
 
     /* copy text rect after adjusting for drop-down arrow
@@ -870,7 +879,7 @@
 	{
 	    DrawEdge (hdc, &rc, EDGE_RAISED,
 		      BF_SOFT | BF_RECT | BF_MIDDLE | BF_ADJUST);
-            if (hasDropDownArrow)
+            if (drawSepDropDownArrow)
             DrawEdge (hdc, &rcArrow, EDGE_RAISED,
 		      BF_SOFT | BF_RECT | BF_MIDDLE | BF_ADJUST);
 	}
@@ -899,13 +908,13 @@
 	    if (dwStyle & TBSTYLE_FLAT)
 	    {
 		DrawEdge (hdc, &rc, BDR_SUNKENOUTER, BF_RECT | BF_ADJUST);
-		if (hasDropDownArrow)
+		if (drawSepDropDownArrow)
 		    DrawEdge (hdc, &rcArrow, BDR_SUNKENOUTER, BF_RECT | BF_ADJUST);
 	    }
 	    else
 	    {
 		DrawEdge (hdc, &rc, EDGE_SUNKEN, BF_RECT | BF_MIDDLE | BF_ADJUST);
-		if (hasDropDownArrow)
+		if (drawSepDropDownArrow)
 		    DrawEdge (hdc, &rcArrow, EDGE_SUNKEN, BF_RECT | BF_MIDDLE | BF_ADJUST);
 	    }
 	}
@@ -989,7 +998,7 @@
 
         if (hasDropDownArrow)
 	{
-	    if (!(infoPtr->dwItemCDFlag & TBCDRF_NOEDGES))
+	    if (drawSepDropDownArrow && !(infoPtr->dwItemCDFlag & TBCDRF_NOEDGES))
 		DrawEdge (hdc, &rcArrow, EDGE_RAISED,
 			  BF_SOFT | BF_RECT | BF_MIDDLE | BF_ADJUST);
 	    TOOLBAR_DrawArrow(hdc, rcArrow.left, rcArrow.top + (rcArrow.bottom - rcArrow.top - ARROW_HEIGHT) / 2, COLOR_WINDOWFRAME);
@@ -5012,9 +5021,11 @@
 	arrowRect.left = max(btnPtr->rect.left, btnPtr->rect.right - DDARROW_WIDTH);
 
 	/* for EX_DRAWDDARROWS style,  click must be in the drop-down arrow rect */
-	if ((btnPtr->fsState & TBSTATE_ENABLED) && (btnPtr->fsStyle & BTNS_DROPDOWN) &&
-	     ((TOOLBAR_HasDropDownArrows(infoPtr->dwExStyle) && PtInRect(&arrowRect, pt)) ||
-	      (!TOOLBAR_HasDropDownArrows(infoPtr->dwExStyle))))
+	if ((btnPtr->fsState & TBSTATE_ENABLED) && 
+	     ((btnPtr->fsStyle & BTNS_WHOLEDROPDOWN) ||
+	      ((btnPtr->fsStyle & BTNS_DROPDOWN) &&
+	       ((TOOLBAR_HasDropDownArrows(infoPtr->dwExStyle) && PtInRect(&arrowRect, pt)) ||
+	       (!TOOLBAR_HasDropDownArrows(infoPtr->dwExStyle))))))
 	{
 	    LRESULT res;
 	    /*
@@ -5028,7 +5039,7 @@
 	    memset(&nmtb.tbButton, 0, sizeof(TBBUTTON));
 	    nmtb.cchText = 0;
 	    nmtb.pszText = 0;
-	    memset(&nmtb.rcButton, 0, sizeof(RECT));
+	    CopyRect(&nmtb.rcButton, &btnPtr->rect);
 	    res = TOOLBAR_SendNotify ((NMHDR *) &nmtb, infoPtr,
 				  TBN_DROPDOWN);
 	    if (res != TBDDRET_TREATPRESSED)



More information about the wine-patches mailing list