Toolbar customization dialog (take one).

diff --git a/dlls/comctl32/comctl32.h b/dlls/comctl32/comctl32.h
new file mode 100644
index 0000000..da5e702
--- /dev/null
+++ b/dlls/comctl32/comctl32.h
@@ -0,0 +1,30 @@
+/******************************************************************************
+ * 
+ * Common definitions (resource ids and global variables)
+ *
+ * Copyright 1999 Thuy Nguyen
+ * Copyright 1999 Eric Kohl
+ *
+ */
+
+extern HMODULE COMCTL32_hModule;
+
+/* Property sheet / Wizard */
+#define IDD_PROPSHEET 1006
+#define IDD_WIZARD    1020
+
+#define IDC_TABCONTROL   12320
+#define IDC_APPLY_BUTTON 12321
+
+
+/* Toolbar customization dialog */
+#define IDD_TBCUSTOMIZE     200
+
+#define IDC_AVAILBTN_LBOX   201
+#define IDC_RESET_BTN       202
+#define IDC_TOOLBARBTN_LBOX 203
+#define IDC_REMOVE_BTN      204
+#define IDC_HELP_BTN        205
+#define IDC_MOVEUP_BTN      206
+#define IDC_MOVEDN_BTN      207
+
diff --git a/dlls/comctl32/propsheet.c b/dlls/comctl32/propsheet.c
index f5c1c3f..ab31345 100644
--- a/dlls/comctl32/propsheet.c
+++ b/dlls/comctl32/propsheet.c
@@ -15,7 +15,7 @@
 #include "commctrl.h"
 #include "prsht.h"
 #include "winnls.h"
-#include "propsheet.h"
+#include "comctl32.h"
 #include "debug.h"
 
 
diff --git a/dlls/comctl32/propsheet.h b/dlls/comctl32/propsheet.h
deleted file mode 100644
index 1bb2037..0000000
--- a/dlls/comctl32/propsheet.h
+++ /dev/null
@@ -1,16 +0,0 @@
-/******************************************************************************
- * 
- * Property Sheets
- *
- * Copyright 1999 Thuy Nguyen
- *
- */
-
-extern HMODULE COMCTL32_hModule;
-
-#define IDD_PROPSHEET 1006
-#define IDD_WIZARD    1020
-
-#define IDC_TABCONTROL   12320
-#define IDC_APPLY_BUTTON 12321
-
diff --git a/dlls/comctl32/rsrc.rc b/dlls/comctl32/rsrc.rc
index d04a52f..6fc87af 100644
--- a/dlls/comctl32/rsrc.rc
+++ b/dlls/comctl32/rsrc.rc
@@ -1,5 +1,5 @@
 #include "winuser.h"
-#include "propsheet.h"
+#include "comctl32.h"
 
 
 IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 292, 159
@@ -14,3 +14,22 @@
   CONTROL       "Tab",    IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS,7,7,278,125
 END
 
+
+IDD_TBCUSTOMIZE DIALOG DISCARDABLE 10, 20, 357, 125
+STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Customize Toolbar"
+FONT 8, "MS Sans Serif"
+BEGIN
+  DEFPUSHBUTTON "&Close",     IDCANCEL,308,6,44,14
+  PUSHBUTTON    "R&eset",     IDC_RESET_BTN,308,23,44,14
+  PUSHBUTTON    "&Help",      IDC_HELP_BTN,308,40,44,14
+  PUSHBUTTON    "Move &Up",   IDC_MOVEUP_BTN,308,74,44,14
+  PUSHBUTTON    "Move &Down", IDC_MOVEDN_BTN,308,91,44,14
+  LTEXT         "A&vailable buttons:", -1,4,5,84,10
+  LISTBOX       IDC_AVAILBTN_LBOX,4,17,120,100, LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP
+  PUSHBUTTON    "&Add ->",    IDOK, 131, 42, 44, 14
+  PUSHBUTTON    "<- &Remove", IDC_REMOVE_BTN,131,62,44,14
+  LTEXT         "&Toolbar buttons:", -1,182,5,78,10
+  LISTBOX       IDC_TOOLBARBTN_LBOX, 182,17,120,100,LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP
+END
+
diff --git a/dlls/comctl32/toolbar.c b/dlls/comctl32/toolbar.c
index c397f3a..ac8f280 100644
--- a/dlls/comctl32/toolbar.c
+++ b/dlls/comctl32/toolbar.c
@@ -1,8 +1,7 @@
-
 /*
  * Toolbar control
  *
- * Copyright 1998 Eric Kohl
+ * Copyright 1998,1999 Eric Kohl
  *
  * TODO:
  *   - A little bug in TOOLBAR_DrawMasked()
@@ -14,7 +13,7 @@
  *   - Unicode suppport.
  *   - Internal COMMCTL32 bitmaps.
  *   - Fix TOOLBAR_SetButtonInfo32A.
- *   - Fix TOOLBAR_Customize. (Customize dialog.)
+ *   - Customize dialog (under construction).
  *
  * Testing:
  *   - Run tests using Waite Group Windows95 API Bible Volume 2.
@@ -32,6 +31,7 @@
 #include "commctrl.h"
 #include "sysmetrics.h"
 #include "cache.h"
+#include "comctl32.h"
 #include "toolbar.h"
 #include "debug.h"
 
@@ -41,9 +41,9 @@
 #define TOP_BORDER         2
 #define BOTTOM_BORDER      2
 
-
 #define TOOLBAR_GetInfoPtr(wndPtr) ((TOOLBAR_INFO *)GetWindowLongA(hwnd,0))
 
+
 static void
 TOOLBAR_DrawFlatSeparator (LPRECT lpRect, HDC hdc)
 {
@@ -716,6 +716,151 @@
     SendMessageA (hwndTip, TTM_RELAYEVENT, 0, (LPARAM)&msg);
 }
 
+
+/***********************************************************************
+ * TOOLBAR_CustomizeDialogProc
+ * This function implements the toolbar customization dialog.
+ */
+BOOL WINAPI
+TOOLBAR_CustomizeDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+    TOOLBAR_INFO *infoPtr = (TOOLBAR_INFO *)GetWindowLongA (hwnd, DWL_USER);
+    static HDSA hDsa = NULL;
+
+    switch (uMsg)
+    {
+	case WM_INITDIALOG:
+	    infoPtr = (TOOLBAR_INFO *)lParam;
+	    SetWindowLongA (hwnd, DWL_USER, (DWORD)infoPtr);
+
+	    hDsa = DSA_Create (sizeof(TBUTTON_INFO), 5);
+
+	    if (infoPtr)
+	    {
+		TBUTTON_INFO *btnPtr;
+		INT i;
+
+		/* insert 'virtual' separator button into 'available buttons' list */
+		SendDlgItemMessageA (hwnd, IDC_AVAILBTN_LBOX, LB_ADDSTRING, 0, (LPARAM)"");
+
+		/* copy all buttons and append them to the right listbox */		
+		btnPtr = infoPtr->buttons;
+		for (i = 0; i < infoPtr->nNumButtons; i++, btnPtr++)
+		{
+		    DSA_InsertItem (hDsa, i, btnPtr);
+
+		    if (btnPtr->fsState & TBSTATE_HIDDEN)
+		    {
+			SendDlgItemMessageA (hwnd, IDC_AVAILBTN_LBOX, LB_ADDSTRING, 0, (LPARAM)"");
+		    }
+		    else
+		    {
+			SendDlgItemMessageA (hwnd, IDC_TOOLBARBTN_LBOX, LB_ADDSTRING, 0, (LPARAM)"");
+		    }
+		}
+
+		/* append 'virtual' sepatator button to the 'toolbar buttons' list */
+		/* TODO */
+	    }
+	    return TRUE;
+
+	case WM_CLOSE:
+	    EndDialog(hwnd, FALSE);
+	    return TRUE;
+
+	case WM_COMMAND:
+	    switch (LOWORD(wParam))
+	    {
+		case IDCANCEL:
+		    EndDialog(hwnd, FALSE);
+		    break;
+	    }
+	    return TRUE;
+
+	case WM_DESTROY:
+	    if (hDsa)
+		DSA_Destroy (hDsa);
+	    return TRUE;
+
+	case WM_DRAWITEM:
+	    if (wParam == IDC_AVAILBTN_LBOX || wParam == IDC_TOOLBARBTN_LBOX)
+	    {
+		LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT)lParam;
+		RECT rcButton;
+		RECT rcText;
+		HPEN hOldPen;
+		HBRUSH hOldBrush;
+		COLORREF oldText = 0;
+		COLORREF oldBk = 0;
+
+		FIXME(toolbar, "action: %x itemState: %x\n",
+		      lpdis->itemAction, lpdis->itemState);		
+
+		if (lpdis->itemState & ODS_FOCUS)
+		{
+		    oldBk = SetBkColor (lpdis->hDC, GetSysColor(COLOR_HIGHLIGHT));
+		    oldText = SetTextColor (lpdis->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT));
+		}
+
+		hOldPen = SelectObject (lpdis->hDC, GetSysColorPen ((lpdis->itemState & ODS_SELECTED)?COLOR_HIGHLIGHT:COLOR_WINDOW));
+		hOldBrush = SelectObject (lpdis->hDC, GetSysColorBrush ((lpdis->itemState & ODS_FOCUS)?COLOR_HIGHLIGHT:COLOR_WINDOW));
+
+		/* fill background rectangle */
+		Rectangle (lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top,
+			   lpdis->rcItem.right, lpdis->rcItem.bottom);
+
+		/* calculate button and text rectangles */
+		CopyRect (&rcButton, &lpdis->rcItem);
+		InflateRect (&rcButton, -1, -1);
+		CopyRect (&rcText, &rcButton);
+		rcButton.right = rcButton.left + infoPtr->nBitmapWidth + 6;
+		rcText.left = rcButton.right + 2;
+
+		/* draw focus rectangle */
+		if (lpdis->itemState & ODS_FOCUS)
+		    DrawFocusRect (lpdis->hDC, &lpdis->rcItem);
+
+		/* draw button */
+		DrawEdge (lpdis->hDC, &rcButton, EDGE_RAISED, BF_RECT|BF_MIDDLE|BF_SOFT);
+
+		/* draw text */
+		if (wParam == IDC_AVAILBTN_LBOX && lpdis->itemID == 0)
+		    DrawTextA (lpdis->hDC, "Separator", -1, &rcText,
+			       DT_LEFT | DT_VCENTER | DT_SINGLELINE);
+
+		if (lpdis->itemState & ODS_FOCUS)
+		{
+		    SetBkColor (lpdis->hDC, oldBk);
+		    SetTextColor (lpdis->hDC, oldText);
+		}
+
+		SelectObject (lpdis->hDC, hOldBrush);
+		SelectObject (lpdis->hDC, hOldPen);
+
+		return TRUE;
+	    }
+	    return FALSE;
+
+	case WM_MEASUREITEM:
+	    if (wParam == IDC_AVAILBTN_LBOX || wParam == IDC_TOOLBARBTN_LBOX)
+	    {
+		MEASUREITEMSTRUCT *lpmis = (MEASUREITEMSTRUCT*)lParam;
+
+		if (infoPtr)
+		    lpmis->itemHeight = infoPtr->nBitmapHeight + 8;
+		else
+		    lpmis->itemHeight = 16 + 8; /* default height */
+
+		return TRUE;
+	    }
+	    return FALSE;
+
+	default:
+	    return FALSE;
+    }
+}
+
+
 /***********************************************************************
  * TOOLBAR_AddBitmap:  Add the bitmaps to the default image list.
  *
@@ -1156,9 +1301,41 @@
 static LRESULT
 TOOLBAR_Customize (HWND hwnd)
 {
-    FIXME (toolbar, "customization not implemented!\n");
+    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
+    LRESULT ret;
+    LPCVOID template;
+    HRSRC hRes;
+    NMHDR nmhdr;
 
-    return 0;
+    /* send TBN_BEGINADJUST notification */
+    nmhdr.hwndFrom = hwnd;
+    nmhdr.idFrom   = GetWindowLongA (hwnd, GWL_ID);
+    nmhdr.code     = TBN_BEGINADJUST;
+
+    SendMessageA (infoPtr->hwndNotify, WM_NOTIFY,
+		  (WPARAM)nmhdr.idFrom, (LPARAM)&nmhdr);
+
+    if (!(hRes = FindResourceA (COMCTL32_hModule,
+                                MAKEINTRESOURCEA(IDD_TBCUSTOMIZE),
+                                RT_DIALOGA)))
+	return FALSE;
+
+    if(!(template = (LPVOID)LoadResource (COMCTL32_hModule, hRes)))
+	return FALSE;
+
+    ret = DialogBoxIndirectParamA (GetWindowLongA (hwnd, GWL_HINSTANCE),
+                                   (LPDLGTEMPLATEA)template,
+                                   hwnd,
+                                   (DLGPROC)TOOLBAR_CustomizeDialogProc,
+                                   (LPARAM)infoPtr);
+
+    /* send TBN_ENDADJUST notification */
+    nmhdr.code = TBN_ENDADJUST;
+
+    SendMessageA (infoPtr->hwndNotify, WM_NOTIFY,
+		  (WPARAM)nmhdr.idFrom, (LPARAM)&nmhdr);
+
+    return ret;
 }
 
 
@@ -2769,7 +2946,7 @@
 	case TB_ADDBUTTONSA:
 	    return TOOLBAR_AddButtonsA (hwnd, wParam, lParam);
 
-/*	case TB_ADDBUTTONS32W: */
+/*	case TB_ADDBUTTONSW: */
 
 	case TB_ADDSTRINGA:
 	    return TOOLBAR_AddStringA (hwnd, wParam, lParam);
@@ -2818,7 +2995,7 @@
 	case TB_GETBUTTONINFOA:
 	    return TOOLBAR_GetButtonInfoA (hwnd, wParam, lParam);
 
-/*	case TB_GETBUTTONINFO32W:		*/ /* 4.71 */
+/*	case TB_GETBUTTONINFOW:		*/ /* 4.71 */
 
 	case TB_GETBUTTONSIZE:
 	    return TOOLBAR_GetButtonSize (hwnd);
@@ -2826,7 +3003,7 @@
 	case TB_GETBUTTONTEXTA:
 	    return TOOLBAR_GetButtonTextA (hwnd, wParam, lParam);
 
-/*	case TB_GETBUTTONTEXT32W: */
+/*	case TB_GETBUTTONTEXTW: */
 /*	case TB_GETCOLORSCHEME:			*/ /* 4.71 */
 
 	case TB_GETDISABLEDIMAGELIST:
@@ -2888,7 +3065,7 @@
 	case TB_INSERTBUTTONA:
 	    return TOOLBAR_InsertButtonA (hwnd, wParam, lParam);
 
-/*	case TB_INSERTBUTTON32W: */
+/*	case TB_INSERTBUTTONW: */
 /*	case TB_INSERTMARKHITTEST:		*/ /* 4.71 */
 
 	case TB_ISBUTTONCHECKED:
@@ -2910,8 +3087,8 @@
 	    return TOOLBAR_IsButtonPressed (hwnd, wParam, lParam);
 
 /*	case TB_LOADIMAGES:			*/ /* 4.70 */
-/*	case TB_MAPACCELERATOR32A:		*/ /* 4.71 */
-/*	case TB_MAPACCELERATOR32W:		*/ /* 4.71 */
+/*	case TB_MAPACCELERATORA:		*/ /* 4.71 */
+/*	case TB_MAPACCELERATORW:		*/ /* 4.71 */
 /*	case TB_MARKBUTTON:			*/ /* 4.71 */
 /*	case TB_MOVEBUTTON:			*/ /* 4.71 */
 
@@ -2923,7 +3100,7 @@
 	case TB_SAVERESTOREA:
 	    return TOOLBAR_SaveRestoreA (hwnd, wParam, lParam);
 
-/*	case TB_SAVERESTORE32W: */
+/*	case TB_SAVERESTOREW: */
 /*	case TB_SETANCHORHIGHLIGHT:		*/ /* 4.71 */
 
 	case TB_SETBITMAPSIZE:
@@ -2932,7 +3109,7 @@
 	case TB_SETBUTTONINFOA:
 	    return TOOLBAR_SetButtonInfoA (hwnd, wParam, lParam);
 
-/*	case TB_SETBUTTONINFO32W:		*/ /* 4.71 */
+/*	case TB_SETBUTTONINFOW:			*/ /* 4.71 */
 
 	case TB_SETBUTTONSIZE:
 	    return TOOLBAR_SetButtonSize (hwnd, wParam, lParam);
diff --git a/include/commctrl.h b/include/commctrl.h
index f4567da..28ac75b 100644
--- a/include/commctrl.h
+++ b/include/commctrl.h
@@ -893,6 +893,23 @@
 #define TBN_GETBUTTONINFOA    (TBN_FIRST-0)
 #define TBN_GETBUTTONINFOW    (TBN_FIRST-20)
 #define TBN_GETBUTTONINFO WINELIB_NAME_AW(TBN_GETBUTTONINFO)
+#define TBN_BEGINDRAG		(TBN_FIRST-1)
+#define TBN_ENDDRAG		(TBN_FIRST-2)
+#define TBN_BEGINADJUST		(TBN_FIRST-3)
+#define TBN_ENDADJUST		(TBN_FIRST-4)
+#define TBN_RESET		(TBN_FIRST-5)
+#define TBN_QUERYINSERT		(TBN_FIRST-6)
+#define TBN_QUERYDELETE		(TBN_FIRST-7)
+#define TBN_TOOLBARCHANGE	(TBN_FIRST-8)
+#define TBN_CUSTHELP		(TBN_FIRST-9)
+#define TBN_DROPDOWN		(TBN_FIRST-10)
+#define TBN_GETOBJECT		(TBN_FIRST-12)
+#define TBN_HOTITEMCHANGE	(TBN_FIRST-13)
+#define TBN_DRAGOUT		(TBN_FIRST-14)
+#define TBN_DELETINGBUTTON	(TBN_FIRST-15)
+#define TBN_GETDISPINFOA	(TBN_FIRST-16)
+#define TBN_GETDISPINFOW	(TBN_FIRST-17)
+#define TBN_GETDISPINFO		WINELIB_NAME_AW(TBN_GETDISPINFO)
 #define TBN_GETINFOTIPA       (TBN_FIRST-18)
 #define TBN_GETINFOTIPW       (TBN_FIRST-19)
 #define TBN_GETINFOTIP WINELIB_NAME_AW(TBN_GETINFOTIP)
diff --git a/include/toolbar.h b/include/toolbar.h
index 968dab5..bb6d8ff 100644
--- a/include/toolbar.h
+++ b/include/toolbar.h
@@ -65,6 +65,8 @@
 } TOOLBAR_INFO;
 
 
+extern BOOL WINAPI TBARCUST_DialogProc (HWND, UINT, WPARAM, LPARAM);
+
 extern VOID TOOLBAR_Register (VOID);
 extern VOID TOOLBAR_Unregister (VOID);