Mikołaj Zalewski : comctl32: toolbar: Add a LayoutToolbar that works like CalcToolbar but doesn' t overwrite the button sizes.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Nov 2 05:46:49 CST 2006


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

Author: Mikołaj Zalewski <mikolaj at zalewski.pl>
Date:   Wed Nov  1 23:00:35 2006 +0100

comctl32: toolbar: Add a LayoutToolbar that works like CalcToolbar but doesn't overwrite the button sizes.

---

 dlls/comctl32/toolbar.c |   59 +++++++++++++++++++++++++++++++---------------
 1 files changed, 40 insertions(+), 19 deletions(-)

diff --git a/dlls/comctl32/toolbar.c b/dlls/comctl32/toolbar.c
index 22ba6c9..99c329e 100644
--- a/dlls/comctl32/toolbar.c
+++ b/dlls/comctl32/toolbar.c
@@ -247,6 +247,7 @@ static VOID TOOLBAR_DeleteImageList(PIML
 static HIMAGELIST TOOLBAR_InsertImageList(PIMLENTRY **pies, INT *cies, HIMAGELIST himl, INT id);
 static LRESULT TOOLBAR_LButtonDown(HWND hwnd, WPARAM wParam, LPARAM lParam);
 static void TOOLBAR_SetHotItemEx (TOOLBAR_INFO *infoPtr, INT nHit, DWORD dwReason);
+static void TOOLBAR_LayoutToolbar(HWND hwnd);
 static LRESULT TOOLBAR_AutoSize(HWND hwnd);
 static void TOOLBAR_CheckImageListIconSize(TOOLBAR_INFO *infoPtr);
 static void TOOLBAR_TooltipSetRect(TOOLBAR_INFO *infoPtr, TBUTTON_INFO *button);
@@ -1615,14 +1616,8 @@ static void
 TOOLBAR_CalcToolbar (HWND hwnd)
 {
     TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(hwnd);
-    DWORD dwStyle = infoPtr->dwStyle;
-    TBUTTON_INFO *btnPtr;
-    INT i, nRows, nSepRows;
-    INT x, y, cx, cy;
     SIZE  sizeString, sizeButton;
-    BOOL bWrap;
     BOOL validImageList = FALSE;
-    BOOL hasDropDownArrows = TOOLBAR_HasDropDownArrows(infoPtr->dwExStyle);
 
     TOOLBAR_CalcStrings (hwnd, &sizeString);
 
@@ -1639,15 +1634,25 @@ TOOLBAR_CalcToolbar (HWND hwnd)
     if ( infoPtr->cxMax > 0 && infoPtr->nButtonWidth > infoPtr->cxMax )
         infoPtr->nButtonWidth = infoPtr->cxMax;
 
-    TOOLBAR_WrapToolbar( hwnd, dwStyle );
+    TOOLBAR_LayoutToolbar(hwnd);
+}
 
-    x  = infoPtr->nIndent;
-    if (infoPtr->dwStyle & TBSTYLE_FLAT)
-        y = 0;
-    else
-        y = TOP_BORDER;
+static void
+TOOLBAR_LayoutToolbar(HWND hwnd)
+{
+    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(hwnd);
+    TBUTTON_INFO *btnPtr;
+    SIZE sizeButton;
+    INT i, nRows, nSepRows;
+    INT x, y, cx, cy;
+    BOOL bWrap;
+    BOOL validImageList = TOOLBAR_IsValidImageList(infoPtr, 0);
+    BOOL hasDropDownArrows = TOOLBAR_HasDropDownArrows(infoPtr->dwExStyle);
+
+    TOOLBAR_WrapToolbar(hwnd, infoPtr->dwStyle);
 
-    /* from above, minimum is a button, and possible text */
+    x  = infoPtr->nIndent;
+    y  = (infoPtr->dwStyle & TBSTYLE_FLAT ? 0 : TOP_BORDER);
     cx = infoPtr->nButtonWidth;
     cy = infoPtr->nButtonHeight;
 
@@ -2867,6 +2872,7 @@ TOOLBAR_AddButtonsT(HWND hwnd, WPARAM wP
     TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
     LPTBBUTTON lpTbb = (LPTBBUTTON)lParam;
     INT nOldButtons, nNewButtons, nAddButtons, nCount;
+    BOOL fHasString = FALSE;
 
     TRACE("adding %d buttons (unicode=%d)!\n", wParam, fUnicode);
 
@@ -2892,6 +2898,7 @@ TOOLBAR_AddButtonsT(HWND hwnd, WPARAM wP
                 Str_SetPtrW ((LPWSTR*)&btnPtr->iString, (LPWSTR)lpTbb[nCount].iString );
             else
                 Str_SetPtrAtoW((LPWSTR*)&btnPtr->iString, (LPSTR)lpTbb[nCount].iString);
+            fHasString = TRUE;
         }
         else
             btnPtr->iString   = lpTbb[nCount].iString;
@@ -2899,7 +2906,10 @@ TOOLBAR_AddButtonsT(HWND hwnd, WPARAM wP
         TOOLBAR_TooltipAddTool(infoPtr, btnPtr);
     }
 
-    TOOLBAR_CalcToolbar (hwnd);
+    if (infoPtr->nNumStrings > 0 || fHasString)
+        TOOLBAR_CalcToolbar(hwnd);
+    else
+        TOOLBAR_LayoutToolbar(hwnd);
     TOOLBAR_AutoSize (hwnd);
 
     TOOLBAR_DumpToolbar (infoPtr, __LINE__);
@@ -2915,6 +2925,7 @@ TOOLBAR_AddStringW (HWND hwnd, WPARAM wP
 {
 #define MAX_RESOURCE_STRING_LENGTH 512
     TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
+    BOOL fFirstString = (infoPtr->nNumStrings == 0);
     INT nIndex = infoPtr->nNumStrings;
 
     if ((wParam) && (HIWORD(lParam) == 0)) {
@@ -2971,6 +2982,8 @@ #define MAX_RESOURCE_STRING_LENGTH 512
 	}
     }
 
+    if (fFirstString)
+        TOOLBAR_CalcToolbar(hwnd);
     return nIndex;
 }
 
@@ -2979,6 +2992,7 @@ static LRESULT
 TOOLBAR_AddStringA (HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
     TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
+    BOOL fFirstString = (infoPtr->nNumStrings == 0);
     LPSTR p;
     INT nIndex;
     INT len;
@@ -3003,6 +3017,8 @@ TOOLBAR_AddStringA (HWND hwnd, WPARAM wP
         p += (len+1);
     }
 
+    if (fFirstString)
+        TOOLBAR_CalcToolbar(hwnd);
     return nIndex;
 }
 
@@ -3035,7 +3051,7 @@ TOOLBAR_AutoSize (HWND hwnd)
 
     if ((infoPtr->dwStyle & TBSTYLE_WRAPABLE) || (infoPtr->dwExStyle & TBSTYLE_EX_UNDOC1))
     {
-        TOOLBAR_CalcToolbar(hwnd);
+        TOOLBAR_LayoutToolbar(hwnd);
         InvalidateRect( hwnd, NULL, TRUE );
     }
 
@@ -3261,7 +3277,7 @@ TOOLBAR_DeleteButton (HWND hwnd, WPARAM
 	Free (oldButtons);
     }
 
-    TOOLBAR_CalcToolbar (hwnd);
+    TOOLBAR_LayoutToolbar(hwnd);
 
     InvalidateRect (hwnd, NULL, TRUE);
 
@@ -3864,7 +3880,10 @@ TOOLBAR_InsertButtonT(HWND hwnd, WPARAM
 
     TOOLBAR_TooltipAddTool(infoPtr, &infoPtr->buttons[nIndex]);
 
-    TOOLBAR_CalcToolbar (hwnd);
+    if (infoPtr->nNumStrings > 0)
+        TOOLBAR_CalcToolbar(hwnd);
+    else
+        TOOLBAR_LayoutToolbar(hwnd);
     TOOLBAR_AutoSize (hwnd);
 
     InvalidateRect (hwnd, NULL, TRUE);
@@ -4483,6 +4502,7 @@ TOOLBAR_SetBitmapSize (HWND hwnd, WPARAM
             infoPtr->nBitmapHeight);
     }
 
+    TOOLBAR_CalcToolbar(hwnd);
     InvalidateRect(infoPtr->hwndSelf, NULL, FALSE);
     return TRUE;
 }
@@ -5387,8 +5407,6 @@ TOOLBAR_Create (HWND hwnd, WPARAM wParam
 
     TOOLBAR_CheckStyle (hwnd, dwStyle);
 
-    TOOLBAR_CalcToolbar(hwnd);
-
     return 0;
 }
 
@@ -6589,6 +6607,9 @@ TOOLBAR_StyleChanged (HWND hwnd, INT nTy
 
         infoPtr->dwStyle = lpStyle->styleNew;
 
+        if ((dwOldStyle ^ lpStyle->styleNew) & (TBSTYLE_WRAPABLE | CCS_VERT))
+            TOOLBAR_LayoutToolbar(hwnd);
+
         /* only resize if one of the CCS_* styles was changed */
         if ((dwOldStyle ^ lpStyle->styleNew) & COMMON_STYLES)
         {




More information about the wine-cvs mailing list