5 * Copyright 1998 Eric Kohl
8 * - A little bug in TOOLBAR_DrawMasked()
9 * - Button wrapping (under construction).
13 * - Tooltip support (almost complete).
15 * - Internal COMMCTL32 bitmaps.
16 * - Fix TOOLBAR_SetButtonInfo32A.
17 * - Fix TOOLBAR_Customize. (Customize dialog.)
20 * - Run tests using Waite Group Windows95 API Bible Volume 2.
21 * The second cdrom contains executables addstr.exe, btncount.exe,
22 * btnstate.exe, butstrsz.exe, chkbtn.exe, chngbmp.exe, customiz.exe,
23 * enablebtn.exe, getbmp.exe, getbtn.exe, getflags.exe, hidebtn.exe,
24 * indetbtn.exe, insbtn.exe, pressbtn.exe, setbtnsz.exe, setcmdid.exe,
25 * setparnt.exe, setrows.exe, toolwnd.exe.
26 * - Microsofts controlspy examples.
33 #include "sysmetrics.h"
38 DEFAULT_DEBUG_CHANNEL(toolbar)
40 /* #define __NEW_WRAP_CODE__ */
42 #define SEPARATOR_WIDTH 8
43 #define SEPARATOR_HEIGHT 5
45 #define BOTTOM_BORDER 2
49 #define TOOLBAR_GetInfoPtr(wndPtr) ((TOOLBAR_INFO *)GetWindowLongA(hwnd,0))
53 TOOLBAR_DrawFlatSeparator (LPRECT lpRect, HDC hdc)
55 INT x = (lpRect->left + lpRect->right) / 2 - 1;
56 INT yBottom = lpRect->bottom - 3;
57 INT yTop = lpRect->top + 1;
59 SelectObject ( hdc, GetSysColorPen (COLOR_3DSHADOW));
60 MoveToEx (hdc, x, yBottom, NULL);
61 LineTo (hdc, x, yTop);
63 SelectObject ( hdc, GetSysColorPen (COLOR_3DHILIGHT));
64 MoveToEx (hdc, x, yBottom, NULL);
65 LineTo (hdc, x, yTop);
70 TOOLBAR_DrawString (TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr,
73 RECT rcText = btnPtr->rect;
79 if ((btnPtr->iString > -1) && (btnPtr->iString < infoPtr->nNumStrings)) {
80 InflateRect (&rcText, -3, -3);
81 rcText.top += infoPtr->nBitmapHeight;
82 if (nState & (TBSTATE_PRESSED | TBSTATE_CHECKED))
83 OffsetRect (&rcText, 1, 1);
85 hOldFont = SelectObject (hdc, infoPtr->hFont);
86 nOldBkMode = SetBkMode (hdc, TRANSPARENT);
87 if (!(nState & TBSTATE_ENABLED)) {
88 clrOld = SetTextColor (hdc, GetSysColor (COLOR_3DHILIGHT));
89 OffsetRect (&rcText, 1, 1);
90 DrawTextW (hdc, infoPtr->strings[btnPtr->iString], -1,
91 &rcText, infoPtr->dwDTFlags);
92 SetTextColor (hdc, GetSysColor (COLOR_3DSHADOW));
93 OffsetRect (&rcText, -1, -1);
94 DrawTextW (hdc, infoPtr->strings[btnPtr->iString], -1,
95 &rcText, infoPtr->dwDTFlags);
97 else if (nState & TBSTATE_INDETERMINATE) {
98 clrOld = SetTextColor (hdc, GetSysColor (COLOR_3DSHADOW));
99 DrawTextW (hdc, infoPtr->strings[btnPtr->iString], -1,
100 &rcText, infoPtr->dwDTFlags);
103 clrOld = SetTextColor (hdc, GetSysColor (COLOR_BTNTEXT));
104 DrawTextW (hdc, infoPtr->strings[btnPtr->iString], -1,
105 &rcText, infoPtr->dwDTFlags);
108 SetTextColor (hdc, clrOld);
109 SelectObject (hdc, hOldFont);
110 if (nOldBkMode != TRANSPARENT)
111 SetBkMode (hdc, nOldBkMode);
117 TOOLBAR_DrawPattern (HDC hdc, LPRECT lpRect)
119 HBRUSH hbr = SelectObject (hdc, CACHE_GetPattern55AABrush ());
120 INT cx = lpRect->right - lpRect->left;
121 INT cy = lpRect->bottom - lpRect->top;
122 PatBlt (hdc, lpRect->left, lpRect->top, cx, cy, 0x00FA0089);
123 SelectObject (hdc, hbr);
128 TOOLBAR_DrawMasked (TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr,
129 HDC hdc, INT x, INT y)
131 /* FIXME: this function is a hack since it uses image list
132 internals directly */
134 HDC hdcImageList = CreateCompatibleDC (0);
135 HDC hdcMask = CreateCompatibleDC (0);
136 HIMAGELIST himl = infoPtr->himlStd;
139 /* create new bitmap */
140 hbmMask = CreateBitmap (himl->cx, himl->cy, 1, 1, NULL);
141 SelectObject (hdcMask, hbmMask);
143 /* copy the mask bitmap */
144 SelectObject (hdcImageList, himl->hbmMask);
145 SetBkColor (hdcImageList, RGB(255, 255, 255));
146 SetTextColor (hdcImageList, RGB(0, 0, 0));
147 BitBlt (hdcMask, 0, 0, himl->cx, himl->cy,
148 hdcImageList, himl->cx * btnPtr->iBitmap, 0, SRCCOPY);
151 /* add white mask from image */
152 SelectObject (hdcImageList, himl->hbmImage);
153 SetBkColor (hdcImageList, RGB(0, 0, 0));
154 BitBlt (hdcMask, 0, 0, himl->cx, himl->cy,
155 hdcImageList, himl->cx * btnPtr->iBitmap, 0, MERGEPAINT);
158 /* draw the new mask */
159 SelectObject (hdc, GetSysColorBrush (COLOR_3DHILIGHT));
160 BitBlt (hdc, x+1, y+1, himl->cx, himl->cy,
161 hdcMask, 0, 0, 0xB8074A);
163 SelectObject (hdc, GetSysColorBrush (COLOR_3DSHADOW));
164 BitBlt (hdc, x, y, himl->cx, himl->cy,
165 hdcMask, 0, 0, 0xB8074A);
167 DeleteObject (hbmMask);
169 DeleteDC (hdcImageList);
174 TOOLBAR_DrawButton (HWND hwnd, TBUTTON_INFO *btnPtr, HDC hdc)
176 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
177 DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);
180 if (btnPtr->fsState & TBSTATE_HIDDEN)
184 if (btnPtr->fsStyle & TBSTYLE_SEP) {
185 if ((dwStyle & TBSTYLE_FLAT) && (btnPtr->idCommand == 0))
186 TOOLBAR_DrawFlatSeparator (&btnPtr->rect, hdc);
191 if (!(btnPtr->fsState & TBSTATE_ENABLED)) {
192 DrawEdge (hdc, &rc, EDGE_RAISED,
193 BF_SOFT | BF_RECT | BF_MIDDLE | BF_ADJUST);
195 if (dwStyle & TBSTYLE_FLAT) {
196 /* if (infoPtr->himlDis) */
197 ImageList_Draw (infoPtr->himlDis, btnPtr->iBitmap, hdc,
198 rc.left+1, rc.top+1, ILD_NORMAL);
200 /* TOOLBAR_DrawMasked (infoPtr, btnPtr, hdc, rc.left+1, rc.top+1); */
203 TOOLBAR_DrawMasked (infoPtr, btnPtr, hdc, rc.left+1, rc.top+1);
205 TOOLBAR_DrawString (infoPtr, btnPtr, hdc, btnPtr->fsState);
209 /* pressed TBSTYLE_BUTTON */
210 if (btnPtr->fsState & TBSTATE_PRESSED) {
211 DrawEdge (hdc, &rc, EDGE_SUNKEN, BF_RECT | BF_MIDDLE | BF_ADJUST);
212 ImageList_Draw (infoPtr->himlStd, btnPtr->iBitmap, hdc,
213 rc.left+2, rc.top+2, ILD_NORMAL);
214 TOOLBAR_DrawString (infoPtr, btnPtr, hdc, btnPtr->fsState);
218 /* checked TBSTYLE_CHECK*/
219 if ((btnPtr->fsStyle & TBSTYLE_CHECK) &&
220 (btnPtr->fsState & TBSTATE_CHECKED)) {
221 if (dwStyle & TBSTYLE_FLAT)
222 DrawEdge (hdc, &rc, BDR_SUNKENOUTER,
223 BF_RECT | BF_MIDDLE | BF_ADJUST);
225 DrawEdge (hdc, &rc, EDGE_SUNKEN,
226 BF_RECT | BF_MIDDLE | BF_ADJUST);
228 TOOLBAR_DrawPattern (hdc, &rc);
229 if (dwStyle & TBSTYLE_FLAT)
231 if (infoPtr->himlDef != NULL)
232 ImageList_Draw (infoPtr->himlDef, btnPtr->iBitmap, hdc,
233 rc.left+2, rc.top+2, ILD_NORMAL);
235 ImageList_Draw (infoPtr->himlStd, btnPtr->iBitmap, hdc,
236 rc.left+2, rc.top+2, ILD_NORMAL);
239 ImageList_Draw (infoPtr->himlStd, btnPtr->iBitmap, hdc,
240 rc.left+2, rc.top+2, ILD_NORMAL);
241 TOOLBAR_DrawString (infoPtr, btnPtr, hdc, btnPtr->fsState);
246 if (btnPtr->fsState & TBSTATE_INDETERMINATE) {
247 DrawEdge (hdc, &rc, EDGE_RAISED,
248 BF_SOFT | BF_RECT | BF_MIDDLE | BF_ADJUST);
250 TOOLBAR_DrawPattern (hdc, &rc);
251 TOOLBAR_DrawMasked (infoPtr, btnPtr, hdc, rc.left+1, rc.top+1);
252 TOOLBAR_DrawString (infoPtr, btnPtr, hdc, btnPtr->fsState);
256 if (dwStyle & TBSTYLE_FLAT)
259 DrawEdge (hdc, &rc, BDR_RAISEDINNER,
260 BF_RECT | BF_MIDDLE | BF_SOFT);
262 if(infoPtr->himlDef != NULL)
263 ImageList_Draw (infoPtr->himlDef, btnPtr->iBitmap, hdc,
264 rc.left +2, rc.top +2, ILD_NORMAL);
266 ImageList_Draw (infoPtr->himlStd, btnPtr->iBitmap, hdc,
267 rc.left +2, rc.top +2, ILD_NORMAL);
271 DrawEdge (hdc, &rc, EDGE_RAISED,
272 BF_SOFT | BF_RECT | BF_MIDDLE | BF_ADJUST);
274 ImageList_Draw (infoPtr->himlStd, btnPtr->iBitmap, hdc,
275 rc.left+1, rc.top+1, ILD_NORMAL);
278 TOOLBAR_DrawString (infoPtr, btnPtr, hdc, btnPtr->fsState);
283 TOOLBAR_Refresh (HWND hwnd, HDC hdc)
285 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
286 TBUTTON_INFO *btnPtr;
290 btnPtr = infoPtr->buttons;
291 for (i = 0; i < infoPtr->nNumButtons; i++, btnPtr++)
292 TOOLBAR_DrawButton (hwnd, btnPtr, hdc);
297 TOOLBAR_CalcStrings (HWND hwnd, LPSIZE lpSize)
299 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
300 TBUTTON_INFO *btnPtr;
309 hOldFont = SelectObject (hdc, infoPtr->hFont);
311 btnPtr = infoPtr->buttons;
312 for (i = 0; i < infoPtr->nNumButtons; i++, btnPtr++) {
313 if (!(btnPtr->fsState & TBSTATE_HIDDEN) &&
314 (btnPtr->iString > -1) &&
315 (btnPtr->iString < infoPtr->nNumStrings)) {
316 LPWSTR lpText = infoPtr->strings[btnPtr->iString];
317 GetTextExtentPoint32W (hdc, lpText, lstrlenW (lpText), &sz);
318 if (sz.cx > lpSize->cx)
320 if (sz.cy > lpSize->cy)
325 SelectObject (hdc, hOldFont);
328 TRACE (toolbar, "string size %d x %d!\n", lpSize->cx, lpSize->cy);
333 TOOLBAR_CalcToolbar (HWND hwnd)
335 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
336 DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);
337 TBUTTON_INFO *btnPtr;
343 #ifdef __NEW_WRAP_CODE__
346 TBUTTON_INFO *grpPtr;
348 /* --- end new --- */
350 TOOLBAR_CalcStrings (hwnd, &sizeString);
352 if (sizeString.cy > 0)
353 infoPtr->nButtonHeight = sizeString.cy + infoPtr->nBitmapHeight + 6;
354 else if (infoPtr->nButtonHeight < infoPtr->nBitmapHeight + 6)
355 infoPtr->nButtonHeight = infoPtr->nBitmapHeight + 6;
357 if (sizeString.cx > infoPtr->nBitmapWidth)
358 infoPtr->nButtonWidth = sizeString.cx + 6;
359 else if (infoPtr->nButtonWidth < infoPtr->nBitmapWidth + 6)
360 infoPtr->nButtonWidth = infoPtr->nBitmapWidth + 6;
362 x = infoPtr->nIndent;
364 cx = infoPtr->nButtonWidth;
365 cy = infoPtr->nButtonHeight;
368 /* calculate the size of each button according to it's style */
369 /* TOOLBAR_CalcButtons (hwnd); */
371 infoPtr->rcBound.top = y;
372 infoPtr->rcBound.left = x;
373 infoPtr->rcBound.bottom = y + cy;
374 infoPtr->rcBound.right = x;
376 btnPtr = infoPtr->buttons;
377 for (i = 0; i < infoPtr->nNumButtons; i++, btnPtr++) {
380 if (btnPtr->fsState & TBSTATE_HIDDEN) {
381 SetRectEmpty (&btnPtr->rect);
385 #ifdef __NEW_WRAP_CODE__
387 if (btnPtr->fsStyle & TBSTYLE_SEP) {
388 /* UNDOCUMENTED: If a separator has a non zero bitmap index, */
389 /* it is the actual width of the separator. This is used for */
390 /* custom controls in toolbars. */
391 if ((dwStyle & TBSTYLE_WRAPABLE) &&
392 (btnPtr->fsState & TBSTATE_WRAP)) {
395 cx = infoPtr->nWidth;
396 cy = ((btnPtr->iBitmap > 0) ?
397 btnPtr->iBitmap : SEPARATOR_WIDTH) * 2 / 3;
402 cx = (btnPtr->iBitmap > 0) ?
403 btnPtr->iBitmap : SEPARATOR_WIDTH;
406 /* this must be a button */
407 cx = infoPtr->nButtonWidth;
411 /* --- begin test --- */
412 if ((i >= nGrpCount) && (btnPtr->fsStyle & TBSTYLE_GROUP)) {
413 for (j = i, grpX = x, nGrpCount = 0; j < infoPtr->nNumButtons; j++) {
414 grpPtr = &infoPtr->buttons[j];
415 if (grpPtr->fsState & TBSTATE_HIDDEN)
420 if ((grpPtr->fsStyle & TBSTYLE_SEP) ||
421 !(grpPtr->fsStyle & TBSTYLE_GROUP) ||
422 (grpX > infoPtr->nWidth)) {
426 else if (grpX + x > infoPtr->nWidth) {
434 bWrap = ((bWrap || (x + cx > infoPtr->nWidth)) &&
435 (dwStyle & TBSTYLE_WRAPABLE));
439 x = infoPtr->nIndent;
443 SetRect (&btnPtr->rect, x, y, x + cx, y + cy);
445 btnPtr->nRow = nRows;
448 if (btnPtr->fsState & TBSTATE_WRAP) {
450 y += (cy + SEPARATOR_HEIGHT);
451 x = infoPtr->nIndent;
454 infoPtr->nRows = nRows + 1;
456 /* --- end test --- */
458 if (btnPtr->fsStyle & TBSTYLE_SEP) {
459 /* UNDOCUMENTED: If a separator has a non zero bitmap index, */
460 /* it is the actual width of the separator. This is used for */
461 /* custom controls in toolbars. */
462 if ((dwStyle & TBSTYLE_WRAPABLE) &&
463 (btnPtr->fsState & TBSTATE_WRAP)) {
466 cx = infoPtr->nWidth;
467 cy = ((btnPtr->iBitmap > 0) ?
468 btnPtr->iBitmap : SEPARATOR_WIDTH) * 2 / 3;
473 cx = (btnPtr->iBitmap > 0) ?
474 btnPtr->iBitmap : SEPARATOR_WIDTH;
477 /* this must be a button */
478 cx = infoPtr->nButtonWidth;
481 btnPtr->rect.left = x;
482 btnPtr->rect.top = y;
483 btnPtr->rect.right = x + cx;
484 btnPtr->rect.bottom = y + cy;
486 if (infoPtr->rcBound.left > x)
487 infoPtr->rcBound.left = x;
488 if (infoPtr->rcBound.right < x + cx)
489 infoPtr->rcBound.right = x + cx;
490 if (infoPtr->rcBound.bottom < y + cy)
491 infoPtr->rcBound.bottom = y + cy;
493 if (infoPtr->hwndToolTip) {
496 ZeroMemory (&ti, sizeof(TTTOOLINFOA));
497 ti.cbSize = sizeof(TTTOOLINFOA);
499 ti.uId = btnPtr->idCommand;
500 ti.rect = btnPtr->rect;
501 SendMessageA (infoPtr->hwndToolTip, TTM_NEWTOOLRECTA,
508 if (i < infoPtr->nNumButtons)
516 infoPtr->nHeight = y + cy + BOTTOM_BORDER;
517 TRACE (toolbar, "toolbar height %d\n", infoPtr->nHeight);
522 TOOLBAR_InternalHitTest (HWND hwnd, LPPOINT lpPt)
524 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
525 TBUTTON_INFO *btnPtr;
528 btnPtr = infoPtr->buttons;
529 for (i = 0; i < infoPtr->nNumButtons; i++, btnPtr++) {
530 if (btnPtr->fsState & TBSTATE_HIDDEN)
533 if (btnPtr->fsStyle & TBSTYLE_SEP) {
534 if (PtInRect (&btnPtr->rect, *lpPt)) {
535 TRACE (toolbar, " ON SEPARATOR %d!\n", i);
540 if (PtInRect (&btnPtr->rect, *lpPt)) {
541 TRACE (toolbar, " ON BUTTON %d!\n", i);
547 TRACE (toolbar, " NOWHERE!\n");
553 TOOLBAR_GetButtonIndex (TOOLBAR_INFO *infoPtr, INT idCommand)
555 TBUTTON_INFO *btnPtr;
558 btnPtr = infoPtr->buttons;
559 for (i = 0; i < infoPtr->nNumButtons; i++, btnPtr++) {
560 if (btnPtr->idCommand == idCommand) {
561 TRACE (toolbar, "command=%d index=%d\n", idCommand, i);
565 TRACE (toolbar, "no index found for command=%d\n", idCommand);
571 TOOLBAR_GetCheckedGroupButtonIndex (TOOLBAR_INFO *infoPtr, INT nIndex)
573 TBUTTON_INFO *btnPtr;
576 if ((nIndex < 0) || (nIndex > infoPtr->nNumButtons))
579 /* check index button */
580 btnPtr = &infoPtr->buttons[nIndex];
581 if ((btnPtr->fsStyle & TBSTYLE_CHECKGROUP) == TBSTYLE_CHECKGROUP) {
582 if (btnPtr->fsState & TBSTATE_CHECKED)
586 /* check previous buttons */
587 nRunIndex = nIndex - 1;
588 while (nRunIndex >= 0) {
589 btnPtr = &infoPtr->buttons[nRunIndex];
590 if ((btnPtr->fsStyle & TBSTYLE_CHECKGROUP) == TBSTYLE_CHECKGROUP) {
591 if (btnPtr->fsState & TBSTATE_CHECKED)
599 /* check next buttons */
600 nRunIndex = nIndex + 1;
601 while (nRunIndex < infoPtr->nNumButtons) {
602 btnPtr = &infoPtr->buttons[nRunIndex];
603 if ((btnPtr->fsStyle & TBSTYLE_CHECKGROUP) == TBSTYLE_CHECKGROUP) {
604 if (btnPtr->fsState & TBSTATE_CHECKED)
617 TOOLBAR_RelayEvent (HWND hwndTip, HWND hwndMsg, UINT uMsg,
618 WPARAM wParam, LPARAM lParam)
626 msg.time = GetMessageTime ();
627 msg.pt.x = LOWORD(GetMessagePos ());
628 msg.pt.y = HIWORD(GetMessagePos ());
630 SendMessageA (hwndTip, TTM_RELAYEVENT, 0, (LPARAM)&msg);
633 /***********************************************************************
634 * TOOLBAR_AddBitmap: Add the bitmaps to the default image list.
638 TOOLBAR_AddBitmap (HWND hwnd, WPARAM wParam, LPARAM lParam)
640 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
641 LPTBADDBITMAP lpAddBmp = (LPTBADDBITMAP)lParam;
644 if ((!lpAddBmp) || ((INT)wParam <= 0))
647 TRACE (toolbar, "adding %d bitmaps!\n", wParam);
649 if (!(infoPtr->himlStd)) {
650 /* create new standard image list */
652 TRACE (toolbar, "creating standard image list!\n");
655 /* Windows resize all the buttons to the size of a newly added STandard Image*/
656 /* TODO: The resizing should be done each time a standard image is added*/
657 if (lpAddBmp->hInst == HINST_COMMCTRL)
660 if (lpAddBmp->nID & 1)
662 SendMessageA (hwnd, TB_SETBITMAPSIZE, 0,
663 MAKELPARAM((WORD)26, (WORD)26));
664 SendMessageA (hwnd, TB_SETBUTTONSIZE, 0,
665 MAKELPARAM((WORD)33, (WORD)33));
669 SendMessageA (hwnd, TB_SETBITMAPSIZE, 0,
670 MAKELPARAM((WORD)16, (WORD)16));
672 SendMessageA (hwnd, TB_SETBUTTONSIZE, 0,
673 MAKELPARAM((WORD)22, (WORD)22));
676 TOOLBAR_CalcToolbar (hwnd);
680 ImageList_Create (infoPtr->nBitmapWidth, infoPtr->nBitmapHeight,
681 ILC_COLOR | ILC_MASK, (INT)wParam, 2);
684 /* Add bitmaps to the standard image list */
685 if (lpAddBmp->hInst == (HINSTANCE)0) {
687 ImageList_AddMasked (infoPtr->himlStd, (HBITMAP)lpAddBmp->nID,
690 else if (lpAddBmp->hInst == HINST_COMMCTRL) {
691 /* add internal bitmaps */
693 FIXME (toolbar, "internal bitmaps not supported!\n");
694 /* TODO: Resize all the buttons when a new standard image is added */
696 /* Hack to "add" some reserved images within the image list
697 to get the right image indices */
698 nIndex = ImageList_GetImageCount (infoPtr->himlStd);
699 ImageList_SetImageCount (infoPtr->himlStd, nIndex + (INT)wParam);
704 LoadBitmapA (lpAddBmp->hInst, (LPSTR)lpAddBmp->nID);
705 nIndex = ImageList_AddMasked (infoPtr->himlStd, hBmp, CLR_DEFAULT);
710 infoPtr->nNumBitmaps += (INT)wParam;
717 TOOLBAR_AddButtonsA (HWND hwnd, WPARAM wParam, LPARAM lParam)
719 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
720 LPTBBUTTON lpTbb = (LPTBBUTTON)lParam;
721 INT nOldButtons, nNewButtons, nAddButtons, nCount;
723 TRACE (toolbar, "adding %d buttons!\n", wParam);
725 nAddButtons = (UINT)wParam;
726 nOldButtons = infoPtr->nNumButtons;
727 nNewButtons = nOldButtons + nAddButtons;
729 if (infoPtr->nNumButtons == 0) {
731 COMCTL32_Alloc (sizeof(TBUTTON_INFO) * nNewButtons);
734 TBUTTON_INFO *oldButtons = infoPtr->buttons;
736 COMCTL32_Alloc (sizeof(TBUTTON_INFO) * nNewButtons);
737 memcpy (&infoPtr->buttons[0], &oldButtons[0],
738 nOldButtons * sizeof(TBUTTON_INFO));
739 COMCTL32_Free (oldButtons);
742 infoPtr->nNumButtons = nNewButtons;
744 /* insert new button data */
745 for (nCount = 0; nCount < nAddButtons; nCount++) {
746 TBUTTON_INFO *btnPtr = &infoPtr->buttons[nOldButtons+nCount];
747 btnPtr->iBitmap = lpTbb[nCount].iBitmap;
748 btnPtr->idCommand = lpTbb[nCount].idCommand;
749 btnPtr->fsState = lpTbb[nCount].fsState;
750 btnPtr->fsStyle = lpTbb[nCount].fsStyle;
751 btnPtr->dwData = lpTbb[nCount].dwData;
752 btnPtr->iString = lpTbb[nCount].iString;
753 btnPtr->bHot = FALSE;
755 if ((infoPtr->hwndToolTip) && !(btnPtr->fsStyle & TBSTYLE_SEP)) {
758 ZeroMemory (&ti, sizeof(TTTOOLINFOA));
759 ti.cbSize = sizeof (TTTOOLINFOA);
761 ti.uId = btnPtr->idCommand;
763 ti.lpszText = LPSTR_TEXTCALLBACKA;
765 SendMessageA (infoPtr->hwndToolTip, TTM_ADDTOOLA,
770 TOOLBAR_CalcToolbar (hwnd);
772 InvalidateRect(hwnd, NULL, FALSE);
778 /* << TOOLBAR_AddButtons32W >> */
782 TOOLBAR_AddStringA (HWND hwnd, WPARAM wParam, LPARAM lParam)
784 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
787 if ((wParam) && (HIWORD(lParam) == 0)) {
790 TRACE (toolbar, "adding string from resource!\n");
792 len = LoadStringA ((HINSTANCE)wParam, (UINT)lParam,
795 TRACE (toolbar, "len=%d \"%s\"\n", len, szString);
796 nIndex = infoPtr->nNumStrings;
797 if (infoPtr->nNumStrings == 0) {
799 COMCTL32_Alloc (sizeof(LPWSTR));
802 LPWSTR *oldStrings = infoPtr->strings;
804 COMCTL32_Alloc (sizeof(LPWSTR) * (infoPtr->nNumStrings + 1));
805 memcpy (&infoPtr->strings[0], &oldStrings[0],
806 sizeof(LPWSTR) * infoPtr->nNumStrings);
807 COMCTL32_Free (oldStrings);
810 infoPtr->strings[infoPtr->nNumStrings] =
811 COMCTL32_Alloc (sizeof(WCHAR)*(len+1));
812 lstrcpyAtoW (infoPtr->strings[infoPtr->nNumStrings], szString);
813 infoPtr->nNumStrings++;
816 LPSTR p = (LPSTR)lParam;
821 TRACE (toolbar, "adding string(s) from array!\n");
822 nIndex = infoPtr->nNumStrings;
825 TRACE (toolbar, "len=%d \"%s\"\n", len, p);
827 if (infoPtr->nNumStrings == 0) {
829 COMCTL32_Alloc (sizeof(LPWSTR));
832 LPWSTR *oldStrings = infoPtr->strings;
834 COMCTL32_Alloc (sizeof(LPWSTR) * (infoPtr->nNumStrings + 1));
835 memcpy (&infoPtr->strings[0], &oldStrings[0],
836 sizeof(LPWSTR) * infoPtr->nNumStrings);
837 COMCTL32_Free (oldStrings);
840 infoPtr->strings[infoPtr->nNumStrings] =
841 COMCTL32_Alloc (sizeof(WCHAR)*(len+1));
842 lstrcpyAtoW (infoPtr->strings[infoPtr->nNumStrings], p);
843 infoPtr->nNumStrings++;
854 TOOLBAR_AddStringW (HWND hwnd, WPARAM wParam, LPARAM lParam)
856 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
859 if ((wParam) && (HIWORD(lParam) == 0)) {
862 TRACE (toolbar, "adding string from resource!\n");
864 len = LoadStringW ((HINSTANCE)wParam, (UINT)lParam,
867 TRACE (toolbar, "len=%d \"%s\"\n", len, debugstr_w(szString));
868 nIndex = infoPtr->nNumStrings;
869 if (infoPtr->nNumStrings == 0) {
871 COMCTL32_Alloc (sizeof(LPWSTR));
874 LPWSTR *oldStrings = infoPtr->strings;
876 COMCTL32_Alloc (sizeof(LPWSTR) * (infoPtr->nNumStrings + 1));
877 memcpy (&infoPtr->strings[0], &oldStrings[0],
878 sizeof(LPWSTR) * infoPtr->nNumStrings);
879 COMCTL32_Free (oldStrings);
882 infoPtr->strings[infoPtr->nNumStrings] =
883 COMCTL32_Alloc (sizeof(WCHAR)*(len+1));
884 lstrcpyW (infoPtr->strings[infoPtr->nNumStrings], szString);
885 infoPtr->nNumStrings++;
888 LPWSTR p = (LPWSTR)lParam;
893 TRACE (toolbar, "adding string(s) from array!\n");
894 nIndex = infoPtr->nNumStrings;
897 TRACE (toolbar, "len=%d \"%s\"\n", len, debugstr_w(p));
899 if (infoPtr->nNumStrings == 0) {
901 COMCTL32_Alloc (sizeof(LPWSTR));
904 LPWSTR *oldStrings = infoPtr->strings;
906 COMCTL32_Alloc (sizeof(LPWSTR) * (infoPtr->nNumStrings + 1));
907 memcpy (&infoPtr->strings[0], &oldStrings[0],
908 sizeof(LPWSTR) * infoPtr->nNumStrings);
909 COMCTL32_Free (oldStrings);
912 infoPtr->strings[infoPtr->nNumStrings] =
913 COMCTL32_Alloc (sizeof(WCHAR)*(len+1));
914 lstrcpyW (infoPtr->strings[infoPtr->nNumStrings], p);
915 infoPtr->nNumStrings++;
926 TOOLBAR_AutoSize (HWND hwnd, WPARAM wParam, LPARAM lParam)
928 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
929 DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);
936 TRACE (toolbar, "resize forced!\n");
938 parent = GetParent (hwnd);
939 GetClientRect(parent, &parent_rect);
941 if (dwStyle & CCS_NORESIZE) {
942 uPosFlags |= (SWP_NOSIZE | SWP_NOMOVE);
947 infoPtr->nWidth = parent_rect.right - parent_rect.left;
948 TOOLBAR_CalcToolbar (hwnd);
949 cy = infoPtr->nHeight;
950 cx = infoPtr->nWidth;
953 if (dwStyle & CCS_NOPARENTALIGN)
954 uPosFlags |= SWP_NOMOVE;
956 if (!(dwStyle & CCS_NODIVIDER))
957 cy += sysMetrics[SM_CYEDGE];
959 infoPtr->bAutoSize = TRUE;
960 SetWindowPos (hwnd, HWND_TOP, parent_rect.left, parent_rect.top,
968 TOOLBAR_ButtonCount (HWND hwnd, WPARAM wParam, LPARAM lParam)
970 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
972 return infoPtr->nNumButtons;
977 TOOLBAR_ButtonStructSize (HWND hwnd, WPARAM wParam, LPARAM lParam)
979 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
981 if (infoPtr == NULL) {
982 ERR (toolbar, "(0x%x, 0x%x, 0x%lx)\n", hwnd, wParam, lParam);
983 ERR (toolbar, "infoPtr == NULL!\n");
987 infoPtr->dwStructSize = (DWORD)wParam;
994 TOOLBAR_ChangeBitmap (HWND hwnd, WPARAM wParam, LPARAM lParam)
996 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
997 TBUTTON_INFO *btnPtr;
1001 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam);
1005 btnPtr = &infoPtr->buttons[nIndex];
1006 btnPtr->iBitmap = LOWORD(lParam);
1009 TOOLBAR_DrawButton (hwnd, btnPtr, hdc);
1010 ReleaseDC (hwnd, hdc);
1017 TOOLBAR_CheckButton (HWND hwnd, WPARAM wParam, LPARAM lParam)
1019 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1020 TBUTTON_INFO *btnPtr;
1025 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam);
1029 btnPtr = &infoPtr->buttons[nIndex];
1031 if (!(btnPtr->fsStyle & TBSTYLE_CHECK))
1034 if (LOWORD(lParam) == FALSE)
1035 btnPtr->fsState &= ~TBSTATE_CHECKED;
1037 if (btnPtr->fsStyle & TBSTYLE_GROUP) {
1039 TOOLBAR_GetCheckedGroupButtonIndex (infoPtr, nIndex);
1040 if (nOldIndex == nIndex)
1042 if (nOldIndex != -1)
1043 infoPtr->buttons[nOldIndex].fsState &= ~TBSTATE_CHECKED;
1045 btnPtr->fsState |= TBSTATE_CHECKED;
1049 if (nOldIndex != -1)
1050 TOOLBAR_DrawButton (hwnd, &infoPtr->buttons[nOldIndex], hdc);
1051 TOOLBAR_DrawButton (hwnd, btnPtr, hdc);
1052 ReleaseDC (hwnd, hdc);
1054 /* FIXME: Send a WM_NOTIFY?? */
1061 TOOLBAR_CommandToIndex (HWND hwnd, WPARAM wParam, LPARAM lParam)
1063 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1065 return TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam);
1070 TOOLBAR_Customize (HWND hwnd)
1072 FIXME (toolbar, "customization not implemented!\n");
1079 TOOLBAR_DeleteButton (HWND hwnd, WPARAM wParam, LPARAM lParam)
1081 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1082 INT nIndex = (INT)wParam;
1084 if ((nIndex < 0) || (nIndex >= infoPtr->nNumButtons))
1087 if ((infoPtr->hwndToolTip) &&
1088 !(infoPtr->buttons[nIndex].fsStyle & TBSTYLE_SEP)) {
1091 ZeroMemory (&ti, sizeof(TTTOOLINFOA));
1092 ti.cbSize = sizeof (TTTOOLINFOA);
1094 ti.uId = infoPtr->buttons[nIndex].idCommand;
1096 SendMessageA (infoPtr->hwndToolTip, TTM_DELTOOLA, 0, (LPARAM)&ti);
1099 if (infoPtr->nNumButtons == 1) {
1100 TRACE (toolbar, " simple delete!\n");
1101 COMCTL32_Free (infoPtr->buttons);
1102 infoPtr->buttons = NULL;
1103 infoPtr->nNumButtons = 0;
1106 TBUTTON_INFO *oldButtons = infoPtr->buttons;
1107 TRACE(toolbar, "complex delete! [nIndex=%d]\n", nIndex);
1109 infoPtr->nNumButtons--;
1110 infoPtr->buttons = COMCTL32_Alloc (sizeof (TBUTTON_INFO) * infoPtr->nNumButtons);
1112 memcpy (&infoPtr->buttons[0], &oldButtons[0],
1113 nIndex * sizeof(TBUTTON_INFO));
1116 if (nIndex < infoPtr->nNumButtons) {
1117 memcpy (&infoPtr->buttons[nIndex], &oldButtons[nIndex+1],
1118 (infoPtr->nNumButtons - nIndex) * sizeof(TBUTTON_INFO));
1121 COMCTL32_Free (oldButtons);
1124 TOOLBAR_CalcToolbar (hwnd);
1126 InvalidateRect (hwnd, NULL, TRUE);
1133 TOOLBAR_EnableButton (HWND hwnd, WPARAM wParam, LPARAM lParam)
1135 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1136 TBUTTON_INFO *btnPtr;
1140 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam);
1144 btnPtr = &infoPtr->buttons[nIndex];
1145 if (LOWORD(lParam) == FALSE)
1146 btnPtr->fsState &= ~(TBSTATE_ENABLED | TBSTATE_PRESSED);
1148 btnPtr->fsState |= TBSTATE_ENABLED;
1151 TOOLBAR_DrawButton (hwnd, btnPtr, hdc);
1152 ReleaseDC (hwnd, hdc);
1158 /* << TOOLBAR_GetAnchorHighlight >> */
1162 TOOLBAR_GetBitmap (HWND hwnd, WPARAM wParam, LPARAM lParam)
1164 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1167 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam);
1171 return infoPtr->buttons[nIndex].iBitmap;
1175 static __inline__ LRESULT
1176 TOOLBAR_GetBitmapFlags (HWND hwnd, WPARAM wParam, LPARAM lParam)
1178 return (GetDeviceCaps (0, LOGPIXELSX) >= 120) ? TBBF_LARGE : 0;
1183 TOOLBAR_GetButton (HWND hwnd, WPARAM wParam, LPARAM lParam)
1185 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1186 LPTBBUTTON lpTbb = (LPTBBUTTON)lParam;
1187 INT nIndex = (INT)wParam;
1188 TBUTTON_INFO *btnPtr;
1190 if (infoPtr == NULL)
1196 if ((nIndex < 0) || (nIndex >= infoPtr->nNumButtons))
1199 btnPtr = &infoPtr->buttons[nIndex];
1200 lpTbb->iBitmap = btnPtr->iBitmap;
1201 lpTbb->idCommand = btnPtr->idCommand;
1202 lpTbb->fsState = btnPtr->fsState;
1203 lpTbb->fsStyle = btnPtr->fsStyle;
1204 lpTbb->dwData = btnPtr->dwData;
1205 lpTbb->iString = btnPtr->iString;
1212 TOOLBAR_GetButtonInfoA (HWND hwnd, WPARAM wParam, LPARAM lParam)
1214 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1215 LPTBBUTTONINFOA lpTbInfo = (LPTBBUTTONINFOA)lParam;
1216 TBUTTON_INFO *btnPtr;
1219 if (infoPtr == NULL)
1221 if (lpTbInfo == NULL)
1223 if (lpTbInfo->cbSize < sizeof(TBBUTTONINFOA))
1226 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam);
1230 btnPtr = &infoPtr->buttons[nIndex];
1232 if (lpTbInfo->dwMask & TBIF_COMMAND)
1233 lpTbInfo->idCommand = btnPtr->idCommand;
1234 if (lpTbInfo->dwMask & TBIF_IMAGE)
1235 lpTbInfo->iImage = btnPtr->iBitmap;
1236 if (lpTbInfo->dwMask & TBIF_LPARAM)
1237 lpTbInfo->lParam = btnPtr->dwData;
1238 if (lpTbInfo->dwMask & TBIF_SIZE)
1239 lpTbInfo->cx = (WORD)(btnPtr->rect.right - btnPtr->rect.left);
1240 if (lpTbInfo->dwMask & TBIF_STATE)
1241 lpTbInfo->fsState = btnPtr->fsState;
1242 if (lpTbInfo->dwMask & TBIF_STYLE)
1243 lpTbInfo->fsStyle = btnPtr->fsStyle;
1244 if (lpTbInfo->dwMask & TBIF_TEXT) {
1245 if ((btnPtr->iString >= 0) || (btnPtr->iString < infoPtr->nNumStrings))
1246 lstrcpynA (lpTbInfo->pszText,
1247 (LPSTR)infoPtr->strings[btnPtr->iString],
1255 /* << TOOLBAR_GetButtonInfo32W >> */
1259 TOOLBAR_GetButtonSize (HWND hwnd)
1261 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1263 return MAKELONG((WORD)infoPtr->nButtonWidth,
1264 (WORD)infoPtr->nButtonHeight);
1269 TOOLBAR_GetButtonTextA (HWND hwnd, WPARAM wParam, LPARAM lParam)
1271 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1272 INT nIndex, nStringIndex;
1274 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam);
1278 nStringIndex = infoPtr->buttons[nIndex].iString;
1280 TRACE (toolbar, "index=%d stringIndex=%d\n", nIndex, nStringIndex);
1282 if ((nStringIndex < 0) || (nStringIndex >= infoPtr->nNumStrings))
1285 if (lParam == 0) return -1;
1287 lstrcpyA ((LPSTR)lParam, (LPSTR)infoPtr->strings[nStringIndex]);
1289 return lstrlenA ((LPSTR)infoPtr->strings[nStringIndex]);
1293 /* << TOOLBAR_GetButtonText32W >> */
1294 /* << TOOLBAR_GetColorScheme >> */
1298 TOOLBAR_GetDisabledImageList (HWND hwnd, WPARAM wParam, LPARAM lParam)
1300 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1302 if (GetWindowLongA (hwnd, GWL_STYLE) & TBSTYLE_FLAT)
1303 return (LRESULT)infoPtr->himlDis;
1309 __inline__ static LRESULT
1310 TOOLBAR_GetExtendedStyle (HWND hwnd)
1312 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1314 return infoPtr->dwExStyle;
1319 TOOLBAR_GetHotImageList (HWND hwnd, WPARAM wParam, LPARAM lParam)
1321 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1323 if (GetWindowLongA (hwnd, GWL_STYLE) & TBSTYLE_FLAT)
1324 return (LRESULT)infoPtr->himlHot;
1330 /* << TOOLBAR_GetHotItem >> */
1334 TOOLBAR_GetImageList (HWND hwnd, WPARAM wParam, LPARAM lParam)
1336 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1338 if (GetWindowLongA (hwnd, GWL_STYLE) & TBSTYLE_FLAT)
1339 return (LRESULT)infoPtr->himlDef;
1345 /* << TOOLBAR_GetInsertMark >> */
1346 /* << TOOLBAR_GetInsertMarkColor >> */
1350 TOOLBAR_GetItemRect (HWND hwnd, WPARAM wParam, LPARAM lParam)
1352 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1353 TBUTTON_INFO *btnPtr;
1357 if (infoPtr == NULL)
1359 nIndex = (INT)wParam;
1360 btnPtr = &infoPtr->buttons[nIndex];
1361 if ((nIndex < 0) || (nIndex >= infoPtr->nNumButtons))
1363 lpRect = (LPRECT)lParam;
1366 if (btnPtr->fsState & TBSTATE_HIDDEN)
1369 lpRect->left = btnPtr->rect.left;
1370 lpRect->right = btnPtr->rect.right;
1371 lpRect->bottom = btnPtr->rect.bottom;
1372 lpRect->top = btnPtr->rect.top;
1379 TOOLBAR_GetMaxSize (HWND hwnd, WPARAM wParam, LPARAM lParam)
1381 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1382 LPSIZE lpSize = (LPSIZE)lParam;
1387 lpSize->cx = infoPtr->rcBound.right - infoPtr->rcBound.left;
1388 lpSize->cy = infoPtr->rcBound.bottom - infoPtr->rcBound.top;
1390 TRACE (toolbar, "maximum size %d x %d\n",
1391 infoPtr->rcBound.right - infoPtr->rcBound.left,
1392 infoPtr->rcBound.bottom - infoPtr->rcBound.top);
1398 /* << TOOLBAR_GetObject >> */
1399 /* << TOOLBAR_GetPadding >> */
1403 TOOLBAR_GetRect (HWND hwnd, WPARAM wParam, LPARAM lParam)
1405 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1406 TBUTTON_INFO *btnPtr;
1410 if (infoPtr == NULL)
1412 nIndex = (INT)wParam;
1413 btnPtr = &infoPtr->buttons[nIndex];
1414 if ((nIndex < 0) || (nIndex >= infoPtr->nNumButtons))
1416 lpRect = (LPRECT)lParam;
1420 lpRect->left = btnPtr->rect.left;
1421 lpRect->right = btnPtr->rect.right;
1422 lpRect->bottom = btnPtr->rect.bottom;
1423 lpRect->top = btnPtr->rect.top;
1430 TOOLBAR_GetRows (HWND hwnd, WPARAM wParam, LPARAM lParam)
1432 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1434 if (GetWindowLongA (hwnd, GWL_STYLE) & TBSTYLE_WRAPABLE)
1435 return infoPtr->nRows;
1442 TOOLBAR_GetState (HWND hwnd, WPARAM wParam, LPARAM lParam)
1444 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1447 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam);
1451 return infoPtr->buttons[nIndex].fsState;
1456 TOOLBAR_GetStyle (HWND hwnd, WPARAM wParam, LPARAM lParam)
1458 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1461 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam);
1465 return infoPtr->buttons[nIndex].fsStyle;
1470 TOOLBAR_GetTextRows (HWND hwnd, WPARAM wParam, LPARAM lParam)
1472 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1474 if (infoPtr == NULL)
1477 return infoPtr->nMaxTextRows;
1482 TOOLBAR_GetToolTips (HWND hwnd, WPARAM wParam, LPARAM lParam)
1484 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1486 if (infoPtr == NULL)
1488 return infoPtr->hwndToolTip;
1493 TOOLBAR_GetUnicodeFormat (HWND hwnd, WPARAM wParam, LPARAM lParam)
1495 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1497 TRACE (toolbar, "%s hwnd=0x%x stub!\n",
1498 infoPtr->bUnicode ? "TRUE" : "FALSE", hwnd);
1500 return infoPtr->bUnicode;
1505 TOOLBAR_HideButton (HWND hwnd, WPARAM wParam, LPARAM lParam)
1507 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1508 TBUTTON_INFO *btnPtr;
1511 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam);
1515 btnPtr = &infoPtr->buttons[nIndex];
1516 if (LOWORD(lParam) == FALSE)
1517 btnPtr->fsState &= ~TBSTATE_HIDDEN;
1519 btnPtr->fsState |= TBSTATE_HIDDEN;
1521 TOOLBAR_CalcToolbar (hwnd);
1523 InvalidateRect (hwnd, NULL, TRUE);
1529 __inline__ static LRESULT
1530 TOOLBAR_HitTest (HWND hwnd, WPARAM wParam, LPARAM lParam)
1532 return TOOLBAR_InternalHitTest (hwnd, (LPPOINT)lParam);
1537 TOOLBAR_Indeterminate (HWND hwnd, WPARAM wParam, LPARAM lParam)
1539 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1540 TBUTTON_INFO *btnPtr;
1544 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam);
1548 btnPtr = &infoPtr->buttons[nIndex];
1549 if (LOWORD(lParam) == FALSE)
1550 btnPtr->fsState &= ~TBSTATE_INDETERMINATE;
1552 btnPtr->fsState |= TBSTATE_INDETERMINATE;
1555 TOOLBAR_DrawButton (hwnd, btnPtr, hdc);
1556 ReleaseDC (hwnd, hdc);
1563 TOOLBAR_InsertButtonA (HWND hwnd, WPARAM wParam, LPARAM lParam)
1565 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1566 LPTBBUTTON lpTbb = (LPTBBUTTON)lParam;
1567 INT nIndex = (INT)wParam;
1568 TBUTTON_INFO *oldButtons;
1575 TRACE (toolbar, "inserting button index=%d\n", nIndex);
1576 if (nIndex > infoPtr->nNumButtons) {
1577 nIndex = infoPtr->nNumButtons;
1578 TRACE (toolbar, "adjust index=%d\n", nIndex);
1581 oldButtons = infoPtr->buttons;
1582 infoPtr->nNumButtons++;
1583 infoPtr->buttons = COMCTL32_Alloc (sizeof (TBUTTON_INFO) * infoPtr->nNumButtons);
1584 /* pre insert copy */
1586 memcpy (&infoPtr->buttons[0], &oldButtons[0],
1587 nIndex * sizeof(TBUTTON_INFO));
1590 /* insert new button */
1591 infoPtr->buttons[nIndex].iBitmap = lpTbb->iBitmap;
1592 infoPtr->buttons[nIndex].idCommand = lpTbb->idCommand;
1593 infoPtr->buttons[nIndex].fsState = lpTbb->fsState;
1594 infoPtr->buttons[nIndex].fsStyle = lpTbb->fsStyle;
1595 infoPtr->buttons[nIndex].dwData = lpTbb->dwData;
1596 infoPtr->buttons[nIndex].iString = lpTbb->iString;
1598 if ((infoPtr->hwndToolTip) && !(lpTbb->fsStyle & TBSTYLE_SEP)) {
1601 ZeroMemory (&ti, sizeof(TTTOOLINFOA));
1602 ti.cbSize = sizeof (TTTOOLINFOA);
1604 ti.uId = lpTbb->idCommand;
1606 ti.lpszText = LPSTR_TEXTCALLBACKA;
1608 SendMessageA (infoPtr->hwndToolTip, TTM_ADDTOOLA,
1612 /* post insert copy */
1613 if (nIndex < infoPtr->nNumButtons - 1) {
1614 memcpy (&infoPtr->buttons[nIndex+1], &oldButtons[nIndex],
1615 (infoPtr->nNumButtons - nIndex - 1) * sizeof(TBUTTON_INFO));
1618 COMCTL32_Free (oldButtons);
1620 TOOLBAR_CalcToolbar (hwnd);
1622 InvalidateRect (hwnd, NULL, FALSE);
1628 /* << TOOLBAR_InsertButton32W >> */
1629 /* << TOOLBAR_InsertMarkHitTest >> */
1633 TOOLBAR_IsButtonChecked (HWND hwnd, WPARAM wParam, LPARAM lParam)
1635 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1638 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam);
1642 return (infoPtr->buttons[nIndex].fsState & TBSTATE_CHECKED);
1647 TOOLBAR_IsButtonEnabled (HWND hwnd, WPARAM wParam, LPARAM lParam)
1649 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1652 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam);
1656 return (infoPtr->buttons[nIndex].fsState & TBSTATE_ENABLED);
1661 TOOLBAR_IsButtonHidden (HWND hwnd, WPARAM wParam, LPARAM lParam)
1663 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1666 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam);
1670 return (infoPtr->buttons[nIndex].fsState & TBSTATE_HIDDEN);
1675 TOOLBAR_IsButtonHighlighted (HWND hwnd, WPARAM wParam, LPARAM lParam)
1677 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1680 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam);
1684 return (infoPtr->buttons[nIndex].fsState & TBSTATE_MARKED);
1689 TOOLBAR_IsButtonIndeterminate (HWND hwnd, WPARAM wParam, LPARAM lParam)
1691 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1694 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam);
1698 return (infoPtr->buttons[nIndex].fsState & TBSTATE_INDETERMINATE);
1703 TOOLBAR_IsButtonPressed (HWND hwnd, WPARAM wParam, LPARAM lParam)
1705 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1708 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam);
1712 return (infoPtr->buttons[nIndex].fsState & TBSTATE_PRESSED);
1716 /* << TOOLBAR_LoadImages >> */
1717 /* << TOOLBAR_MapAccelerator >> */
1718 /* << TOOLBAR_MarkButton >> */
1719 /* << TOOLBAR_MoveButton >> */
1723 TOOLBAR_PressButton (HWND hwnd, WPARAM wParam, LPARAM lParam)
1725 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1726 TBUTTON_INFO *btnPtr;
1730 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam);
1734 btnPtr = &infoPtr->buttons[nIndex];
1735 if (LOWORD(lParam) == FALSE)
1736 btnPtr->fsState &= ~TBSTATE_PRESSED;
1738 btnPtr->fsState |= TBSTATE_PRESSED;
1741 TOOLBAR_DrawButton (hwnd, btnPtr, hdc);
1742 ReleaseDC (hwnd, hdc);
1748 /* << TOOLBAR_ReplaceBitmap >> */
1752 TOOLBAR_SaveRestoreA (HWND hwnd, WPARAM wParam, LPARAM lParam)
1755 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1756 LPTBSAVEPARAMSA lpSave = (LPTBSAVEPARAMSA)lParam;
1758 if (lpSave == NULL) return 0;
1761 /* save toolbar information */
1762 FIXME (toolbar, "save to \"%s\" \"%s\"\n",
1763 lpSave->pszSubKey, lpSave->pszValueName);
1768 /* restore toolbar information */
1770 FIXME (toolbar, "restore from \"%s\" \"%s\"\n",
1771 lpSave->pszSubKey, lpSave->pszValueName);
1781 /* << TOOLBAR_SaveRestore32W >> */
1782 /* << TOOLBAR_SetAnchorHighlight >> */
1786 TOOLBAR_SetBitmapSize (HWND hwnd, WPARAM wParam, LPARAM lParam)
1788 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1790 if ((LOWORD(lParam) <= 0) || (HIWORD(lParam)<=0))
1793 infoPtr->nBitmapWidth = (INT)LOWORD(lParam);
1794 infoPtr->nBitmapHeight = (INT)HIWORD(lParam);
1801 TOOLBAR_SetButtonInfoA (HWND hwnd, WPARAM wParam, LPARAM lParam)
1803 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1804 LPTBBUTTONINFOA lptbbi = (LPTBBUTTONINFOA)lParam;
1805 TBUTTON_INFO *btnPtr;
1810 if (lptbbi->cbSize < sizeof(TBBUTTONINFOA))
1813 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam);
1817 btnPtr = &infoPtr->buttons[nIndex];
1818 if (lptbbi->dwMask & TBIF_COMMAND)
1819 btnPtr->idCommand = lptbbi->idCommand;
1820 if (lptbbi->dwMask & TBIF_IMAGE)
1821 btnPtr->iBitmap = lptbbi->iImage;
1822 if (lptbbi->dwMask & TBIF_LPARAM)
1823 btnPtr->dwData = lptbbi->lParam;
1824 /* if (lptbbi->dwMask & TBIF_SIZE) */
1825 /* btnPtr->cx = lptbbi->cx; */
1826 if (lptbbi->dwMask & TBIF_STATE)
1827 btnPtr->fsState = lptbbi->fsState;
1828 if (lptbbi->dwMask & TBIF_STYLE)
1829 btnPtr->fsStyle = lptbbi->fsStyle;
1831 if (lptbbi->dwMask & TBIF_TEXT) {
1832 if ((btnPtr->iString >= 0) ||
1833 (btnPtr->iString < infoPtr->nNumStrings)) {
1835 CHAR **lpString = &infoPtr->strings[btnPtr->iString];
1836 INT len = lstrlenA (lptbbi->pszText);
1837 *lpString = COMCTL32_ReAlloc (lpString, sizeof(char)*(len+1));
1840 /* this is the ultimate sollution */
1841 /* Str_SetPtrA (&infoPtr->strings[btnPtr->iString], lptbbi->pszText); */
1849 /* << TOOLBAR_SetButtonInfo32W >> */
1853 TOOLBAR_SetButtonSize (HWND hwnd, WPARAM wParam, LPARAM lParam)
1855 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1857 if ((LOWORD(lParam) <= 0) || (HIWORD(lParam)<=0))
1860 infoPtr->nButtonWidth = (INT)LOWORD(lParam);
1861 infoPtr->nButtonHeight = (INT)HIWORD(lParam);
1868 TOOLBAR_SetButtonWidth (HWND hwnd, WPARAM wParam, LPARAM lParam)
1870 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1872 if (infoPtr == NULL)
1875 infoPtr->cxMin = (INT)LOWORD(lParam);
1876 infoPtr->cxMax = (INT)HIWORD(lParam);
1883 TOOLBAR_SetCmdId (HWND hwnd, WPARAM wParam, LPARAM lParam)
1885 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1886 INT nIndex = (INT)wParam;
1888 if ((nIndex < 0) || (nIndex >= infoPtr->nNumButtons))
1891 infoPtr->buttons[nIndex].idCommand = (INT)lParam;
1893 if (infoPtr->hwndToolTip) {
1895 FIXME (toolbar, "change tool tip!\n");
1903 /* << TOOLBAR_SetColorScheme >> */
1907 TOOLBAR_SetDisabledImageList (HWND hwnd, WPARAM wParam, LPARAM lParam)
1909 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1910 HIMAGELIST himlTemp;
1912 if (!(GetWindowLongA (hwnd, GWL_STYLE) & TBSTYLE_FLAT))
1915 himlTemp = infoPtr->himlDis;
1916 infoPtr->himlDis = (HIMAGELIST)lParam;
1918 /* FIXME: redraw ? */
1920 return (LRESULT)himlTemp;
1925 TOOLBAR_SetDrawTextFlags (HWND hwnd, WPARAM wParam, LPARAM lParam)
1927 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1930 dwTemp = infoPtr->dwDTFlags;
1931 infoPtr->dwDTFlags =
1932 (infoPtr->dwDTFlags & (DWORD)wParam) | (DWORD)lParam;
1934 return (LRESULT)dwTemp;
1939 TOOLBAR_SetExtendedStyle (HWND hwnd, WPARAM wParam, LPARAM lParam)
1941 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1944 dwTemp = infoPtr->dwExStyle;
1945 infoPtr->dwExStyle = (DWORD)lParam;
1947 return (LRESULT)dwTemp;
1952 TOOLBAR_SetHotImageList (HWND hwnd, WPARAM wParam, LPARAM lParam)
1954 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(hwnd);
1955 HIMAGELIST himlTemp;
1957 if (!(GetWindowLongA (hwnd, GWL_STYLE) & TBSTYLE_FLAT))
1960 himlTemp = infoPtr->himlHot;
1961 infoPtr->himlHot = (HIMAGELIST)lParam;
1963 /* FIXME: redraw ? */
1965 return (LRESULT)himlTemp;
1969 /* << TOOLBAR_SetHotItem >> */
1973 TOOLBAR_SetImageList (HWND hwnd, WPARAM wParam, LPARAM lParam)
1975 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1976 HIMAGELIST himlTemp;
1978 if (!(GetWindowLongA (hwnd, GWL_STYLE) & TBSTYLE_FLAT))
1981 himlTemp = infoPtr->himlDef;
1982 infoPtr->himlDef = (HIMAGELIST)lParam;
1984 /* FIXME: redraw ? */
1986 return (LRESULT)himlTemp;
1991 TOOLBAR_SetIndent (HWND hwnd, WPARAM wParam, LPARAM lParam)
1993 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
1995 infoPtr->nIndent = (INT)wParam;
1997 TOOLBAR_CalcToolbar (hwnd);
1999 InvalidateRect(hwnd, NULL, FALSE);
2005 /* << TOOLBAR_SetInsertMark >> */
2009 TOOLBAR_SetInsertMarkColor (HWND hwnd, WPARAM wParam, LPARAM lParam)
2011 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
2013 infoPtr->clrInsertMark = (COLORREF)lParam;
2015 /* FIXME : redraw ??*/
2022 TOOLBAR_SetMaxTextRows (HWND hwnd, WPARAM wParam, LPARAM lParam)
2024 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
2026 if (infoPtr == NULL)
2029 infoPtr->nMaxTextRows = (INT)wParam;
2035 /* << TOOLBAR_SetPadding >> */
2039 TOOLBAR_SetParent (HWND hwnd, WPARAM wParam, LPARAM lParam)
2041 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
2044 if (infoPtr == NULL)
2046 hwndOldNotify = infoPtr->hwndNotify;
2047 infoPtr->hwndNotify = (HWND)wParam;
2049 return hwndOldNotify;
2054 TOOLBAR_SetRows (HWND hwnd, WPARAM wParam, LPARAM lParam)
2056 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
2057 LPRECT lprc = (LPRECT)lParam;
2059 if (LOWORD(wParam) > 1) {
2061 FIXME (toolbar, "multiple rows not supported!\n");
2065 /* recalculate toolbar */
2066 TOOLBAR_CalcToolbar (hwnd);
2068 /* return bounding rectangle */
2070 lprc->left = infoPtr->rcBound.left;
2071 lprc->right = infoPtr->rcBound.right;
2072 lprc->top = infoPtr->rcBound.top;
2073 lprc->bottom = infoPtr->rcBound.bottom;
2076 /* repaint toolbar */
2077 InvalidateRect(hwnd, NULL, FALSE);
2084 TOOLBAR_SetState (HWND hwnd, WPARAM wParam, LPARAM lParam)
2086 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
2087 TBUTTON_INFO *btnPtr;
2091 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam);
2095 btnPtr = &infoPtr->buttons[nIndex];
2096 btnPtr->fsState = LOWORD(lParam);
2099 TOOLBAR_DrawButton (hwnd, btnPtr, hdc);
2100 ReleaseDC (hwnd, hdc);
2107 TOOLBAR_SetStyle (HWND hwnd, WPARAM wParam, LPARAM lParam)
2109 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
2110 TBUTTON_INFO *btnPtr;
2114 nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam);
2118 btnPtr = &infoPtr->buttons[nIndex];
2119 btnPtr->fsStyle = LOWORD(lParam);
2122 TOOLBAR_DrawButton (hwnd, btnPtr, hdc);
2123 ReleaseDC (hwnd, hdc);
2125 if (infoPtr->hwndToolTip) {
2127 FIXME (toolbar, "change tool tip!\n");
2135 __inline__ static LRESULT
2136 TOOLBAR_SetToolTips (HWND hwnd, WPARAM wParam, LPARAM lParam)
2138 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
2140 if (infoPtr == NULL)
2142 infoPtr->hwndToolTip = (HWND)wParam;
2148 TOOLBAR_SetUnicodeFormat (HWND hwnd, WPARAM wParam, LPARAM lParam)
2150 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
2153 TRACE (toolbar, "%s hwnd=0x%04x stub!\n",
2154 ((BOOL)wParam) ? "TRUE" : "FALSE", hwnd);
2156 bTemp = infoPtr->bUnicode;
2157 infoPtr->bUnicode = (BOOL)wParam;
2164 TOOLBAR_Create (HWND hwnd, WPARAM wParam, LPARAM lParam)
2166 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
2167 DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);
2170 /* initialize info structure */
2171 infoPtr->nButtonHeight = 22;
2172 infoPtr->nButtonWidth = 23;
2173 infoPtr->nBitmapHeight = 15;
2174 infoPtr->nBitmapWidth = 16;
2176 infoPtr->nHeight = infoPtr->nButtonHeight + TOP_BORDER + BOTTOM_BORDER;
2178 infoPtr->nMaxTextRows = 1;
2179 infoPtr->cxMin = -1;
2180 infoPtr->cxMax = -1;
2182 infoPtr->bCaptured = FALSE;
2183 infoPtr->bUnicode = IsWindowUnicode (hwnd);
2184 infoPtr->nButtonDown = -1;
2185 infoPtr->nOldHit = -1;
2186 infoPtr->nHotItem = -2; /* It has to be initially different from nOldHit */
2187 infoPtr->hwndNotify = GetParent (hwnd);
2188 infoPtr->bTransparent = (dwStyle & TBSTYLE_FLAT);
2189 infoPtr->dwDTFlags = DT_CENTER;
2191 SystemParametersInfoA (SPI_GETICONTITLELOGFONT, 0, &logFont, 0);
2192 infoPtr->hFont = CreateFontIndirectA (&logFont);
2194 if (dwStyle & TBSTYLE_TOOLTIPS) {
2195 /* Create tooltip control */
2196 infoPtr->hwndToolTip =
2197 CreateWindowExA (0, TOOLTIPS_CLASSA, NULL, 0,
2198 CW_USEDEFAULT, CW_USEDEFAULT,
2199 CW_USEDEFAULT, CW_USEDEFAULT,
2202 /* Send NM_TOOLTIPSCREATED notification */
2203 if (infoPtr->hwndToolTip) {
2204 NMTOOLTIPSCREATED nmttc;
2206 nmttc.hdr.hwndFrom = hwnd;
2207 nmttc.hdr.idFrom = GetWindowLongA (hwnd, GWL_ID);
2208 nmttc.hdr.code = NM_TOOLTIPSCREATED;
2209 nmttc.hwndToolTips = infoPtr->hwndToolTip;
2211 SendMessageA (infoPtr->hwndNotify, WM_NOTIFY,
2212 (WPARAM)nmttc.hdr.idFrom, (LPARAM)&nmttc);
2221 TOOLBAR_Destroy (HWND hwnd, WPARAM wParam, LPARAM lParam)
2223 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
2225 /* delete tooltip control */
2226 if (infoPtr->hwndToolTip)
2227 DestroyWindow (infoPtr->hwndToolTip);
2229 /* delete button data */
2230 if (infoPtr->buttons)
2231 COMCTL32_Free (infoPtr->buttons);
2233 /* delete strings */
2234 if (infoPtr->strings) {
2236 for (i = 0; i < infoPtr->nNumStrings; i++)
2237 if (infoPtr->strings[i])
2238 COMCTL32_Free (infoPtr->strings[i]);
2240 COMCTL32_Free (infoPtr->strings);
2243 /* destroy default image list */
2244 if (infoPtr->himlDef)
2245 ImageList_Destroy (infoPtr->himlDef);
2247 /* destroy disabled image list */
2248 if (infoPtr->himlDis)
2249 ImageList_Destroy (infoPtr->himlDis);
2251 /* destroy hot image list */
2252 if (infoPtr->himlHot)
2253 ImageList_Destroy (infoPtr->himlHot);
2255 /* delete default font */
2257 DeleteObject (infoPtr->hFont);
2259 /* free toolbar info data */
2260 COMCTL32_Free (infoPtr);
2267 TOOLBAR_EraseBackground (HWND hwnd, WPARAM wParam, LPARAM lParam)
2269 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
2271 if (infoPtr->bTransparent)
2272 return SendMessageA (GetParent (hwnd), WM_ERASEBKGND, wParam, lParam);
2274 return DefWindowProcA (hwnd, WM_ERASEBKGND, wParam, lParam);
2279 TOOLBAR_LButtonDblClk (HWND hwnd, WPARAM wParam, LPARAM lParam)
2281 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
2282 TBUTTON_INFO *btnPtr;
2287 pt.x = (INT)LOWORD(lParam);
2288 pt.y = (INT)HIWORD(lParam);
2289 nHit = TOOLBAR_InternalHitTest (hwnd, &pt);
2292 btnPtr = &infoPtr->buttons[nHit];
2293 if (!(btnPtr->fsState & TBSTATE_ENABLED))
2296 infoPtr->bCaptured = TRUE;
2297 infoPtr->nButtonDown = nHit;
2299 btnPtr->fsState |= TBSTATE_PRESSED;
2302 TOOLBAR_DrawButton (hwnd, btnPtr, hdc);
2303 ReleaseDC (hwnd, hdc);
2305 else if (GetWindowLongA (hwnd, GWL_STYLE) & CCS_ADJUSTABLE)
2306 TOOLBAR_Customize (hwnd);
2313 TOOLBAR_LButtonDown (HWND hwnd, WPARAM wParam, LPARAM lParam)
2315 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
2316 TBUTTON_INFO *btnPtr;
2321 if (infoPtr->hwndToolTip)
2322 TOOLBAR_RelayEvent (infoPtr->hwndToolTip, hwnd,
2323 WM_LBUTTONDOWN, wParam, lParam);
2325 pt.x = (INT)LOWORD(lParam);
2326 pt.y = (INT)HIWORD(lParam);
2327 nHit = TOOLBAR_InternalHitTest (hwnd, &pt);
2330 btnPtr = &infoPtr->buttons[nHit];
2331 if (!(btnPtr->fsState & TBSTATE_ENABLED))
2335 infoPtr->bCaptured = TRUE;
2336 infoPtr->nButtonDown = nHit;
2337 infoPtr->nOldHit = nHit;
2339 btnPtr->fsState |= TBSTATE_PRESSED;
2342 TOOLBAR_DrawButton (hwnd, btnPtr, hdc);
2343 ReleaseDC (hwnd, hdc);
2351 TOOLBAR_LButtonUp (HWND hwnd, WPARAM wParam, LPARAM lParam)
2353 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
2354 TBUTTON_INFO *btnPtr;
2359 BOOL bSendMessage = TRUE;
2361 if (infoPtr->hwndToolTip)
2362 TOOLBAR_RelayEvent (infoPtr->hwndToolTip, hwnd,
2363 WM_LBUTTONUP, wParam, lParam);
2365 pt.x = (INT)LOWORD(lParam);
2366 pt.y = (INT)HIWORD(lParam);
2367 nHit = TOOLBAR_InternalHitTest (hwnd, &pt);
2369 if ((infoPtr->bCaptured) && (infoPtr->nButtonDown >= 0)) {
2370 infoPtr->bCaptured = FALSE;
2372 btnPtr = &infoPtr->buttons[infoPtr->nButtonDown];
2373 btnPtr->fsState &= ~TBSTATE_PRESSED;
2375 if (nHit == infoPtr->nButtonDown) {
2376 if (btnPtr->fsStyle & TBSTYLE_CHECK) {
2377 if (btnPtr->fsStyle & TBSTYLE_GROUP) {
2378 nOldIndex = TOOLBAR_GetCheckedGroupButtonIndex (infoPtr,
2379 infoPtr->nButtonDown);
2380 if (nOldIndex == infoPtr->nButtonDown)
2381 bSendMessage = FALSE;
2382 if ((nOldIndex != infoPtr->nButtonDown) &&
2384 infoPtr->buttons[nOldIndex].fsState &= ~TBSTATE_CHECKED;
2385 btnPtr->fsState |= TBSTATE_CHECKED;
2388 if (btnPtr->fsState & TBSTATE_CHECKED)
2389 btnPtr->fsState &= ~TBSTATE_CHECKED;
2391 btnPtr->fsState |= TBSTATE_CHECKED;
2396 bSendMessage = FALSE;
2399 if (nOldIndex != -1)
2400 TOOLBAR_DrawButton (hwnd, &infoPtr->buttons[nOldIndex], hdc);
2401 TOOLBAR_DrawButton (hwnd, btnPtr, hdc);
2402 ReleaseDC (hwnd, hdc);
2405 SendMessageA (infoPtr->hwndNotify, WM_COMMAND,
2406 MAKEWPARAM(btnPtr->idCommand, 0), (LPARAM)hwnd);
2408 infoPtr->nButtonDown = -1;
2409 infoPtr->nOldHit = -1;
2417 TOOLBAR_MouseMove (HWND hwnd, WPARAM wParam, LPARAM lParam)
2419 TBUTTON_INFO *btnPtr, *oldBtnPtr;
2420 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
2425 if (infoPtr->hwndToolTip)
2426 TOOLBAR_RelayEvent (infoPtr->hwndToolTip, hwnd,
2427 WM_MOUSEMOVE, wParam, lParam);
2429 pt.x = (INT)LOWORD(lParam);
2430 pt.y = (INT)HIWORD(lParam);
2432 nHit = TOOLBAR_InternalHitTest (hwnd, &pt);
2434 if (infoPtr->nOldHit != nHit)
2436 /* Remove the effect of an old hot button */
2437 if(infoPtr->nOldHit == infoPtr->nHotItem)
2439 oldBtnPtr = &infoPtr->buttons[infoPtr->nOldHit];
2440 oldBtnPtr->bHot = FALSE;
2442 InvalidateRect (hwnd, &oldBtnPtr->rect, TRUE);
2445 /* It's not a separator or in nowhere. It's a hot button. */
2448 btnPtr = &infoPtr->buttons[nHit];
2449 btnPtr->bHot = TRUE;
2452 TOOLBAR_DrawButton (hwnd, btnPtr, hdc);
2453 ReleaseDC (hwnd, hdc);
2455 infoPtr->nHotItem = nHit;
2458 if (infoPtr->bCaptured) {
2459 btnPtr = &infoPtr->buttons[infoPtr->nButtonDown];
2460 if (infoPtr->nOldHit == infoPtr->nButtonDown) {
2461 btnPtr->fsState &= ~TBSTATE_PRESSED;
2463 TOOLBAR_DrawButton (hwnd, btnPtr, hdc);
2464 ReleaseDC (hwnd, hdc);
2466 else if (nHit == infoPtr->nButtonDown) {
2467 btnPtr->fsState |= TBSTATE_PRESSED;
2469 TOOLBAR_DrawButton (hwnd, btnPtr, hdc);
2470 ReleaseDC (hwnd, hdc);
2473 infoPtr->nOldHit = nHit;
2479 __inline__ static LRESULT
2480 TOOLBAR_NCActivate (HWND hwnd, WPARAM wParam, LPARAM lParam)
2482 /* if (wndPtr->dwStyle & CCS_NODIVIDER) */
2483 return DefWindowProcA (hwnd, WM_NCACTIVATE, wParam, lParam);
2485 /* return TOOLBAR_NCPaint (wndPtr, wParam, lParam); */
2489 __inline__ static LRESULT
2490 TOOLBAR_NCCalcSize (HWND hwnd, WPARAM wParam, LPARAM lParam)
2492 if (!(GetWindowLongA (hwnd, GWL_STYLE) & CCS_NODIVIDER))
2493 ((LPRECT)lParam)->top += sysMetrics[SM_CYEDGE];
2495 return DefWindowProcA (hwnd, WM_NCCALCSIZE, wParam, lParam);
2500 TOOLBAR_NCCreate (HWND hwnd, WPARAM wParam, LPARAM lParam)
2502 TOOLBAR_INFO *infoPtr;
2504 /* allocate memory for info structure */
2505 infoPtr = (TOOLBAR_INFO *)COMCTL32_Alloc (sizeof(TOOLBAR_INFO));
2506 SetWindowLongA (hwnd, 0, (DWORD)infoPtr);
2509 infoPtr->dwStructSize = sizeof(TBBUTTON);
2511 /* fix instance handle, if the toolbar was created by CreateToolbarEx() */
2512 if (!GetWindowLongA (hwnd, GWL_HINSTANCE)) {
2513 HINSTANCE hInst = (HINSTANCE)GetWindowLongA (GetParent (hwnd), GWL_HINSTANCE);
2514 SetWindowLongA (hwnd, GWL_HINSTANCE, (DWORD)hInst);
2517 return DefWindowProcA (hwnd, WM_NCCREATE, wParam, lParam);
2522 TOOLBAR_NCPaint (HWND hwnd, WPARAM wParam, LPARAM lParam)
2524 DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);
2528 if (dwStyle & WS_MINIMIZE)
2529 return 0; /* Nothing to do */
2531 DefWindowProcA (hwnd, WM_NCPAINT, wParam, lParam);
2533 if (!(hdc = GetDCEx (hwnd, 0, DCX_USESTYLE | DCX_WINDOW)))
2536 if (!(dwStyle & CCS_NODIVIDER))
2538 GetWindowRect (hwnd, &rcWindow);
2539 OffsetRect (&rcWindow, -rcWindow.left, -rcWindow.top);
2540 DrawEdge (hdc, &rcWindow, EDGE_ETCHED, BF_TOP);
2543 ReleaseDC( hwnd, hdc );
2549 __inline__ static LRESULT
2550 TOOLBAR_Notify (HWND hwnd, WPARAM wParam, LPARAM lParam)
2552 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
2553 LPNMHDR lpnmh = (LPNMHDR)lParam;
2555 TRACE (toolbar, "passing WM_NOTIFY!\n");
2557 if ((infoPtr->hwndToolTip) && (lpnmh->hwndFrom == infoPtr->hwndToolTip)) {
2558 SendMessageA (infoPtr->hwndNotify, WM_NOTIFY, wParam, lParam);
2561 if (lpnmh->code == TTN_GETDISPINFOA) {
2562 LPNMTTDISPINFOA lpdi = (LPNMTTDISPINFOA)lParam;
2564 FIXME (toolbar, "retrieving ASCII string\n");
2567 else if (lpnmh->code == TTN_GETDISPINFOW) {
2568 LPNMTTDISPINFOW lpdi = (LPNMTTDISPINFOW)lParam;
2570 FIXME (toolbar, "retrieving UNICODE string\n");
2581 TOOLBAR_Paint (HWND hwnd, WPARAM wParam)
2586 hdc = wParam==0 ? BeginPaint (hwnd, &ps) : (HDC)wParam;
2587 TOOLBAR_Refresh (hwnd, hdc);
2589 EndPaint (hwnd, &ps);
2595 TOOLBAR_Size (HWND hwnd, WPARAM wParam, LPARAM lParam)
2597 TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
2598 DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);
2606 /* Resize deadlock check */
2607 if (infoPtr->bAutoSize) {
2608 infoPtr->bAutoSize = FALSE;
2612 flags = (INT) wParam;
2614 /* FIXME for flags =
2615 * SIZE_MAXIMIZED, SIZE_MAXSHOW, SIZE_MINIMIZED
2618 TRACE (toolbar, "sizing toolbar!\n");
2620 if (flags == SIZE_RESTORED) {
2621 /* width and height don't apply */
2622 parent = GetParent (hwnd);
2623 GetClientRect(parent, &parent_rect);
2625 if (dwStyle & CCS_NORESIZE) {
2626 uPosFlags |= (SWP_NOSIZE | SWP_NOMOVE);
2629 /* infoPtr->nWidth = parent_rect.right - parent_rect.left; */
2630 cy = infoPtr->nHeight;
2631 cx = infoPtr->nWidth;
2632 TOOLBAR_CalcToolbar (hwnd);
2633 infoPtr->nWidth = cx;
2634 infoPtr->nHeight = cy;
2637 infoPtr->nWidth = parent_rect.right - parent_rect.left;
2638 TOOLBAR_CalcToolbar (hwnd);
2639 cy = infoPtr->nHeight;
2640 cx = infoPtr->nWidth;
2643 if (dwStyle & CCS_NOPARENTALIGN) {
2644 uPosFlags |= SWP_NOMOVE;
2645 cy = infoPtr->nHeight;
2646 cx = infoPtr->nWidth;
2649 if (!(dwStyle & CCS_NODIVIDER))
2650 cy += sysMetrics[SM_CYEDGE];
2652 SetWindowPos (hwnd, 0, parent_rect.left, parent_rect.top,
2653 cx, cy, uPosFlags | SWP_NOZORDER);
2660 TOOLBAR_StyleChanged (HWND hwnd, WPARAM wParam, LPARAM lParam)
2662 TOOLBAR_AutoSize (hwnd, wParam, lParam);
2664 InvalidateRect(hwnd, NULL, FALSE);
2672 ToolbarWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
2677 return TOOLBAR_AddBitmap (hwnd, wParam, lParam);
2679 case TB_ADDBUTTONSA:
2680 return TOOLBAR_AddButtonsA (hwnd, wParam, lParam);
2682 /* case TB_ADDBUTTONS32W: */
2685 return TOOLBAR_AddStringA (hwnd, wParam, lParam);
2688 return TOOLBAR_AddStringW (hwnd, wParam, lParam);
2691 return TOOLBAR_AutoSize (hwnd, wParam, lParam);
2693 case TB_BUTTONCOUNT:
2694 return TOOLBAR_ButtonCount (hwnd, wParam, lParam);
2696 case TB_BUTTONSTRUCTSIZE:
2697 return TOOLBAR_ButtonStructSize (hwnd, wParam, lParam);
2699 case TB_CHANGEBITMAP:
2700 return TOOLBAR_ChangeBitmap (hwnd, wParam, lParam);
2702 case TB_CHECKBUTTON:
2703 return TOOLBAR_CheckButton (hwnd, wParam, lParam);
2705 case TB_COMMANDTOINDEX:
2706 return TOOLBAR_CommandToIndex (hwnd, wParam, lParam);
2709 return TOOLBAR_Customize (hwnd);
2711 case TB_DELETEBUTTON:
2712 return TOOLBAR_DeleteButton (hwnd, wParam, lParam);
2714 case TB_ENABLEBUTTON:
2715 return TOOLBAR_EnableButton (hwnd, wParam, lParam);
2717 /* case TB_GETANCHORHIGHLIGHT: */ /* 4.71 */
2720 return TOOLBAR_GetBitmap (hwnd, wParam, lParam);
2722 case TB_GETBITMAPFLAGS:
2723 return TOOLBAR_GetBitmapFlags (hwnd, wParam, lParam);
2726 return TOOLBAR_GetButton (hwnd, wParam, lParam);
2728 case TB_GETBUTTONINFOA:
2729 return TOOLBAR_GetButtonInfoA (hwnd, wParam, lParam);
2731 /* case TB_GETBUTTONINFO32W: */ /* 4.71 */
2733 case TB_GETBUTTONSIZE:
2734 return TOOLBAR_GetButtonSize (hwnd);
2736 case TB_GETBUTTONTEXTA:
2737 return TOOLBAR_GetButtonTextA (hwnd, wParam, lParam);
2739 /* case TB_GETBUTTONTEXT32W: */
2740 /* case TB_GETCOLORSCHEME: */ /* 4.71 */
2742 case TB_GETDISABLEDIMAGELIST:
2743 return TOOLBAR_GetDisabledImageList (hwnd, wParam, lParam);
2745 case TB_GETEXTENDEDSTYLE:
2746 return TOOLBAR_GetExtendedStyle (hwnd);
2748 case TB_GETHOTIMAGELIST:
2749 return TOOLBAR_GetHotImageList (hwnd, wParam, lParam);
2751 /* case TB_GETHOTITEM: */ /* 4.71 */
2753 case TB_GETIMAGELIST:
2754 return TOOLBAR_GetImageList (hwnd, wParam, lParam);
2756 /* case TB_GETINSERTMARK: */ /* 4.71 */
2757 /* case TB_GETINSERTMARKCOLOR: */ /* 4.71 */
2759 case TB_GETITEMRECT:
2760 return TOOLBAR_GetItemRect (hwnd, wParam, lParam);
2763 return TOOLBAR_GetMaxSize (hwnd, wParam, lParam);
2765 /* case TB_GETOBJECT: */ /* 4.71 */
2766 /* case TB_GETPADDING: */ /* 4.71 */
2769 return TOOLBAR_GetRect (hwnd, wParam, lParam);
2772 return TOOLBAR_GetRows (hwnd, wParam, lParam);
2775 return TOOLBAR_GetState (hwnd, wParam, lParam);
2778 return TOOLBAR_GetStyle (hwnd, wParam, lParam);
2780 case TB_GETTEXTROWS:
2781 return TOOLBAR_GetTextRows (hwnd, wParam, lParam);
2783 case TB_GETTOOLTIPS:
2784 return TOOLBAR_GetToolTips (hwnd, wParam, lParam);
2786 case TB_GETUNICODEFORMAT:
2787 return TOOLBAR_GetUnicodeFormat (hwnd, wParam, lParam);
2790 return TOOLBAR_HideButton (hwnd, wParam, lParam);
2793 return TOOLBAR_HitTest (hwnd, wParam, lParam);
2795 case TB_INDETERMINATE:
2796 return TOOLBAR_Indeterminate (hwnd, wParam, lParam);
2798 case TB_INSERTBUTTONA:
2799 return TOOLBAR_InsertButtonA (hwnd, wParam, lParam);
2801 /* case TB_INSERTBUTTON32W: */
2802 /* case TB_INSERTMARKHITTEST: */ /* 4.71 */
2804 case TB_ISBUTTONCHECKED:
2805 return TOOLBAR_IsButtonChecked (hwnd, wParam, lParam);
2807 case TB_ISBUTTONENABLED:
2808 return TOOLBAR_IsButtonEnabled (hwnd, wParam, lParam);
2810 case TB_ISBUTTONHIDDEN:
2811 return TOOLBAR_IsButtonHidden (hwnd, wParam, lParam);
2813 case TB_ISBUTTONHIGHLIGHTED:
2814 return TOOLBAR_IsButtonHighlighted (hwnd, wParam, lParam);
2816 case TB_ISBUTTONINDETERMINATE:
2817 return TOOLBAR_IsButtonIndeterminate (hwnd, wParam, lParam);
2819 case TB_ISBUTTONPRESSED:
2820 return TOOLBAR_IsButtonPressed (hwnd, wParam, lParam);
2822 /* case TB_LOADIMAGES: */ /* 4.70 */
2823 /* case TB_MAPACCELERATOR32A: */ /* 4.71 */
2824 /* case TB_MAPACCELERATOR32W: */ /* 4.71 */
2825 /* case TB_MARKBUTTON: */ /* 4.71 */
2826 /* case TB_MOVEBUTTON: */ /* 4.71 */
2828 case TB_PRESSBUTTON:
2829 return TOOLBAR_PressButton (hwnd, wParam, lParam);
2831 /* case TB_REPLACEBITMAP: */
2833 case TB_SAVERESTOREA:
2834 return TOOLBAR_SaveRestoreA (hwnd, wParam, lParam);
2836 /* case TB_SAVERESTORE32W: */
2837 /* case TB_SETANCHORHIGHLIGHT: */ /* 4.71 */
2839 case TB_SETBITMAPSIZE:
2840 return TOOLBAR_SetBitmapSize (hwnd, wParam, lParam);
2842 case TB_SETBUTTONINFOA:
2843 return TOOLBAR_SetButtonInfoA (hwnd, wParam, lParam);
2845 /* case TB_SETBUTTONINFO32W: */ /* 4.71 */
2847 case TB_SETBUTTONSIZE:
2848 return TOOLBAR_SetButtonSize (hwnd, wParam, lParam);
2850 case TB_SETBUTTONWIDTH:
2851 return TOOLBAR_SetButtonWidth (hwnd, wParam, lParam);
2854 return TOOLBAR_SetCmdId (hwnd, wParam, lParam);
2856 /* case TB_SETCOLORSCHEME: */ /* 4.71 */
2858 case TB_SETDISABLEDIMAGELIST:
2859 return TOOLBAR_SetDisabledImageList (hwnd, wParam, lParam);
2861 case TB_SETDRAWTEXTFLAGS:
2862 return TOOLBAR_SetDrawTextFlags (hwnd, wParam, lParam);
2864 case TB_SETEXTENDEDSTYLE:
2865 return TOOLBAR_SetExtendedStyle (hwnd, wParam, lParam);
2867 case TB_SETHOTIMAGELIST:
2868 return TOOLBAR_SetHotImageList (hwnd, wParam, lParam);
2870 /* case TB_SETHOTITEM: */ /* 4.71 */
2872 case TB_SETIMAGELIST:
2873 return TOOLBAR_SetImageList (hwnd, wParam, lParam);
2876 return TOOLBAR_SetIndent (hwnd, wParam, lParam);
2878 /* case TB_SETINSERTMARK: */ /* 4.71 */
2880 case TB_SETINSERTMARKCOLOR:
2881 return TOOLBAR_SetInsertMarkColor (hwnd, wParam, lParam);
2883 case TB_SETMAXTEXTROWS:
2884 return TOOLBAR_SetMaxTextRows (hwnd, wParam, lParam);
2886 /* case TB_SETPADDING: */ /* 4.71 */
2889 return TOOLBAR_SetParent (hwnd, wParam, lParam);
2892 return TOOLBAR_SetRows (hwnd, wParam, lParam);
2895 return TOOLBAR_SetState (hwnd, wParam, lParam);
2898 return TOOLBAR_SetStyle (hwnd, wParam, lParam);
2900 case TB_SETTOOLTIPS:
2901 return TOOLBAR_SetToolTips (hwnd, wParam, lParam);
2903 case TB_SETUNICODEFORMAT:
2904 return TOOLBAR_SetUnicodeFormat (hwnd, wParam, lParam);
2910 return TOOLBAR_Create (hwnd, wParam, lParam);
2913 return TOOLBAR_Destroy (hwnd, wParam, lParam);
2916 return TOOLBAR_EraseBackground (hwnd, wParam, lParam);
2918 /* case WM_GETFONT: */
2919 /* case WM_KEYDOWN: */
2920 /* case WM_KILLFOCUS: */
2922 case WM_LBUTTONDBLCLK:
2923 return TOOLBAR_LButtonDblClk (hwnd, wParam, lParam);
2925 case WM_LBUTTONDOWN:
2926 return TOOLBAR_LButtonDown (hwnd, wParam, lParam);
2929 return TOOLBAR_LButtonUp (hwnd, wParam, lParam);
2932 return TOOLBAR_MouseMove (hwnd, wParam, lParam);
2935 return TOOLBAR_NCActivate (hwnd, wParam, lParam);
2938 return TOOLBAR_NCCalcSize (hwnd, wParam, lParam);
2941 return TOOLBAR_NCCreate (hwnd, wParam, lParam);
2944 return TOOLBAR_NCPaint (hwnd, wParam, lParam);
2947 return TOOLBAR_Notify (hwnd, wParam, lParam);
2949 /* case WM_NOTIFYFORMAT: */
2952 return TOOLBAR_Paint (hwnd, wParam);
2955 return TOOLBAR_Size (hwnd, wParam, lParam);
2957 case WM_STYLECHANGED:
2958 return TOOLBAR_StyleChanged (hwnd, wParam, lParam);
2960 /* case WM_SYSCOLORCHANGE: */
2962 /* case WM_WININICHANGE: */
2967 case WM_MEASUREITEM:
2969 return SendMessageA (GetParent (hwnd), uMsg, wParam, lParam);
2972 if (uMsg >= WM_USER)
2973 ERR (toolbar, "unknown msg %04x wp=%08x lp=%08lx\n",
2974 uMsg, wParam, lParam);
2975 return DefWindowProcA (hwnd, uMsg, wParam, lParam);
2982 TOOLBAR_Register (VOID)
2986 if (GlobalFindAtomA (TOOLBARCLASSNAMEA)) return;
2988 ZeroMemory (&wndClass, sizeof(WNDCLASSA));
2989 wndClass.style = CS_GLOBALCLASS | CS_DBLCLKS;
2990 wndClass.lpfnWndProc = (WNDPROC)ToolbarWindowProc;
2991 wndClass.cbClsExtra = 0;
2992 wndClass.cbWndExtra = sizeof(TOOLBAR_INFO *);
2993 wndClass.hCursor = LoadCursorA (0, IDC_ARROWA);
2994 wndClass.hbrBackground = (HBRUSH)(COLOR_3DFACE + 1);
2995 wndClass.lpszClassName = TOOLBARCLASSNAMEA;
2997 RegisterClassA (&wndClass);
3002 TOOLBAR_Unregister (VOID)
3004 if (GlobalFindAtomA (TOOLBARCLASSNAMEA))
3005 UnregisterClassA (TOOLBARCLASSNAMEA, (HINSTANCE)NULL);