Last updated: 26. 2.1998, 21:37
<*/NOWARN:F*> IMPLEMENTATION MODULE ToolBar; (*--------------------------------------- TOOLBAR.C --- Gadgets for a frame window. (c) Paul Yao, 1996 ToolBar.mod --- Translation to Stony Brook Modula-2 (c) Peter Stadler, 1998 ---------------------------------------*) IMPORT WINUSER; IMPORT WINGDI; IMPORT WIN32; IMPORT WINX; IMPORT SYSTEM; IMPORT comcthlp; IMPORT h2d_gadgets; IMPORT ToolTip; IMPORT COMMCTRL; IMPORT Lib; IMPORT Str; (*++++******************************************************************) PROCEDURE Maximum(a,b : CARDINAL) : CARDINAL; (***********************************************************************) VAR max : CARDINAL; BEGIN IF (a <= b) THEN max := b ELSE max := a END; RETURN max; END Maximum; (*++++*****************************************************************) PROCEDURE GetString (iString : INTEGER) : WIN32.LPSTR; (**********************************************************************) VAR i,cb : INTEGER; pString : WIN32.LPTSTR; BEGIN (* Cycle through to requested string *) pString^ := szTbStrings; FOR i := 0 TO iString-1 DO cb := LENGTH(pString^); pString := SYSTEM.ADDADR(pString,cb + 1); END; RETURN pString; END GetString; (*++++*****************************************************************) PROCEDURE ToolBarNotify (hwnd : WIN32.HWND; wParam : WIN32.WPARAM; lParam : WIN32.LPARAM) : WIN32.LRESULT; (**********************************************************************) VAR pnhm : WINUSER.LPNMHDR; idCtrl : INTEGER; ptbn : COMMCTRL.LPTBNOTIFY; iButton: INTEGER; lpstr : WIN32.LPSTR; BEGIN pnhm := SYSTEM.CAST(WINUSER.LPNMHDR,lParam); idCtrl := SYSTEM.CAST(INTEGER,wParam); (* Allow toolbar to be customized *) IF ((pnhm^.code = COMMCTRL.TBN_QUERYDELETE) OR (pnhm^.code = COMMCTRL.TBN_QUERYINSERT)) THEN RETURN 1; (* We always say "yes" *) END; (* Provide details of allowable toolbar buttons *) IF (pnhm^.code = COMMCTRL.TBN_GETBUTTONINFO) THEN ptbn := SYSTEM.CAST(COMMCTRL.LPTBNOTIFY,lParam); iButton := nCust[ptbn^.iItem]; IF (iButton # -1) THEN lpstr := GetString (ptbn^.iItem); Str.Copy(ptbn^.pszText^,lpstr^); Lib.Move(SYSTEM.ADR(ptbn^.tbButton), SYSTEM.ADR(tbb[iButton]), SIZE(COMMCTRL.TBBUTTON)); RETURN 1; END; END; RETURN 0; END ToolBarNotify; (*++++*****************************************************************) PROCEDURE InitToolBar (hwndParent : WIN32.HWND) : WIN32.HWND; (**********************************************************************) VAR iNumButtons : INTEGER; ptbb : COMMCTRL.LPTBBUTTON; uiBitmap : CARDINAL; r : WIN32.RECT; x, y, cx, cy: INTEGER; BEGIN IF (bComboBox) THEN ptbb := SYSTEM.ADR(tbb[0]); iNumButtons := 31; ELSE ptbb := SYSTEM.ADR(tbb[21]); iNumButtons := 10; END; IF(bLargeIcons) THEN uiBitmap := COMMCTRL.IDB_STD_LARGE_COLOR; ELSE uiBitmap := COMMCTRL.IDB_STD_SMALL_COLOR; END; hwndTB := COMMCTRL.CreateToolbarEx (hwndParent, dwToolBarStyles, 1, 15, COMMCTRL.HINST_COMMCTRL, uiBitmap, ptbb^, iNumButtons, 0, 0, 0, 0, SIZE(COMMCTRL.TBBUTTON)); (* If requested, add to string list *) IF (bStrings) THEN comcthlp.ToolBar_AddString (hwndTB, NIL, szTbStrings); END; (* Store handle to tooltip control*) hwndToolTip := comcthlp.ToolBar_GetToolTips (hwndTB); (* Insert combo box into toolbar *) IF (bComboBox) THEN (* Calculate coordinates for combo box *) comcthlp.ToolBar_GetItemRect (hwndTB, 0, SYSTEM.ADR(r)); x := r.left; y := r.top; cy := 100; comcthlp.ToolBar_GetItemRect (hwndTB, 18, SYSTEM.ADR(r)); cx := r.right - x + 1; hwndCombo := WINUSER.CreateWindow ("combobox", "", WINUSER.WS_CHILD BOR WINUSER.WS_VISIBLE BOR WINUSER.CBS_DROPDOWN, x, y, cx, cy, hwndParent, SYSTEM.CAST(WIN32.HMENU,h2d_gadgets.IDC_TB_COMBOBOX), hInst, NIL); (* Set toolbar as combo box window parent *) WINUSER.SetParent (hwndCombo, hwndTB); WINUSER.SendMessage (hwndCombo, WINUSER.CB_ADDSTRING, 0, SYSTEM.CAST(WIN32.LPARAM,(SYSTEM.ADR("ONE")))); WINUSER.SendMessage (hwndCombo, WINUSER.CB_ADDSTRING, 0, SYSTEM.CAST(WIN32.LPARAM,(SYSTEM.ADR("TWO")))); WINUSER.SendMessage (hwndCombo, WINUSER.CB_ADDSTRING, 0, SYSTEM.CAST(WIN32.LPARAM,(SYSTEM.ADR("THREE")))); (* Calculate toolbar height *) WINUSER.GetWindowRect (hwndCombo, r); cyToolBar := r.bottom - r.top + 1; cyToolBar := cyToolBar + y; cyToolBar := cyToolBar + (2 * WINUSER.GetSystemMetrics (WINUSER.SM_CYBORDER)); comcthlp.ToolBar_GetItemRect (hwndTB, 0, SYSTEM.ADR(r)); cyToolBar := Maximum(cyToolBar, r.bottom+5); (* If toolbar has tooltips, initialize. *) IF (dwToolBarStyles BAND COMMCTRL.TBSTYLE_TOOLTIPS=1) THEN ToolTip.InitToolTip (hwndTB, hwndCombo); END; END; RETURN hwndTB; END InitToolBar; (*++++*****************************************************************) PROCEDURE FlipStyleFlag (dwStyle : WIN32.LPDWORD; flag : WIN32.DWORD); (**********************************************************************) BEGIN IF (dwStyle^ BAND flag=1) THEN (* Flag on -- turn off *) dwStyle^ := dwStyle^ BAND BNOT flag; ELSE (* Flag off -- turn on *) dwStyle^ := dwStyle^ BOR flag; END; END FlipStyleFlag; (*++++*****************************************************************) PROCEDURE RebuildToolBar (hwndParent : WIN32.HWND; wFlag : WIN32.WORD) : WIN32.HWND; (**********************************************************************) VAR hwndTB : WIN32.HWND; r : WIN32.RECT; BEGIN CASE (wFlag) OF | h2d_gadgets.IDM_STRINGS : bStrings := NOT bStrings; | h2d_gadgets.IDM_LARGEICONS : bLargeIcons := TRUE; | h2d_gadgets.IDM_SMALLICONS : bLargeIcons := FALSE; | h2d_gadgets.IDM_NODIVIDER : FlipStyleFlag (SYSTEM.ADR(dwToolBarStyles), COMMCTRL.CCS_NODIVIDER); | h2d_gadgets.IDM_WRAPABLE : FlipStyleFlag (SYSTEM.ADR(dwToolBarStyles), COMMCTRL.TBSTYLE_WRAPABLE); | h2d_gadgets.IDM_TOP : dwToolBarStyles := dwToolBarStyles BOR 0FFFFFFFCh; dwToolBarStyles := dwToolBarStyles BOR COMMCTRL.CCS_TOP; | h2d_gadgets.IDM_BOTTOM : dwToolBarStyles := dwToolBarStyles BAND 0FFFFFFFCh; dwToolBarStyles := dwToolBarStyles BOR COMMCTRL.CCS_BOTTOM; | h2d_gadgets.IDM_NOMOVEY : dwToolBarStyles := dwToolBarStyles BAND 0FFFFFFFCh; dwToolBarStyles := dwToolBarStyles BOR COMMCTRL.CCS_NOMOVEY; | h2d_gadgets.IDM_NOPARENTALIGN : FlipStyleFlag (SYSTEM.ADR(dwToolBarStyles), COMMCTRL.CCS_NOPARENTALIGN); | h2d_gadgets.IDM_NORESIZE : FlipStyleFlag (SYSTEM.ADR(dwToolBarStyles), COMMCTRL.CCS_NORESIZE); | h2d_gadgets.IDM_ADJUSTABLE : FlipStyleFlag (SYSTEM.ADR(dwToolBarStyles), COMMCTRL.CCS_ADJUSTABLE); | h2d_gadgets.IDM_ALTDRAG : FlipStyleFlag (SYSTEM.ADR(dwToolBarStyles), COMMCTRL.TBSTYLE_ALTDRAG); | h2d_gadgets.IDM_TOOLTIPS : FlipStyleFlag (SYSTEM.ADR(dwToolBarStyles), COMMCTRL.TBSTYLE_TOOLTIPS); | h2d_gadgets.IDM_COMBOBOX : bComboBox := NOT bComboBox; ELSE END; hwndTB := InitToolBar (hwndParent); (* Post parent a WM_SIZE message to resize children *) WINUSER.GetClientRect (hwndParent, r); WINUSER.PostMessage (hwndParent, WINUSER.WM_SIZE, 0, WINUSER.MAKELPARAM (r.right, r.bottom)); RETURN hwndTB; END RebuildToolBar; (*++++*****************************************************************) PROCEDURE ToolBarMessage ( hwndTB : WIN32.HWND; wMsg : WIN32.WORD); (**********************************************************************) VAR nState : INTEGER; nButtons : INTEGER; nRows : INTEGER; bCheck : BOOLEAN; bInd : BOOLEAN; bShow : BOOLEAN; bPress : BOOLEAN; bEnabled : BOOLEAN; ach : ARRAY[0..79] OF CHAR; BEGIN CASE (wMsg) OF | h2d_gadgets.IDM_TB_CHECK : nState := comcthlp.ToolBar_GetState (hwndTB, 1); bCheck := SYSTEM.CAST(BOOLEAN,BNOT (nState BAND COMMCTRL.TBSTATE_CHECKED)); comcthlp.ToolBar_CheckButton (hwndTB, 1, VAL(WIN32.WORD,bCheck)); | h2d_gadgets.IDM_TB_ENABLE : nState := comcthlp.ToolBar_GetState (hwndTB, 2); bEnabled := SYSTEM.CAST(BOOLEAN,BNOT (nState BAND COMMCTRL.TBSTATE_ENABLED)); comcthlp.ToolBar_EnableButton (hwndTB, 2, VAL(WIN32.WORD,bEnabled)); | h2d_gadgets.IDM_TB_HIDE : nState := comcthlp.ToolBar_GetState (hwndTB, 3); bShow := SYSTEM.CAST(BOOLEAN,BNOT (nState BAND COMMCTRL.TBSTATE_HIDDEN)); comcthlp.ToolBar_HideButton (hwndTB, 3, VAL(WIN32.WORD,bShow)); | h2d_gadgets.IDM_TB_INDETERMINATE : nState := comcthlp.ToolBar_GetState (hwndTB, 4); bInd := SYSTEM.CAST(BOOLEAN,BNOT (nState BAND COMMCTRL.TBSTATE_INDETERMINATE)); comcthlp.ToolBar_Indeterminate (hwndTB, 4, VAL(WIN32.WORD,bInd)); | h2d_gadgets.IDM_TB_PRESS : nState := comcthlp.ToolBar_GetState (hwndTB, 5); bPress := SYSTEM.CAST(BOOLEAN,BNOT (nState BAND COMMCTRL.TBSTATE_PRESSED)); comcthlp.ToolBar_PressButton (hwndTB, 5, VAL(WIN32.WORD,bPress)); | h2d_gadgets.IDM_TB_BUTTONCOUNT : nButtons := comcthlp.ToolBar_ButtonCount (hwndTB); WINUSER.wsprintf (ach, "Button Count := %d", nButtons); WINUSER.MessageBox (WINUSER.GetParent (hwndTB), ach, "TB_BUTTONCOUNT", WINUSER.MB_OK); | h2d_gadgets.IDM_TB_GETROWS : nRows := comcthlp.ToolBar_GetRows (hwndTB); WINUSER.wsprintf (ach, "Row Count := %d", nRows); WINUSER.MessageBox (WINUSER.GetParent (hwndTB), ach, "TB_GETROWS", WINUSER.MB_OK); | h2d_gadgets.IDM_TB_CUSTOMIZE : (* ToolBar_Customize (hwndTB); *) WINUSER.SendMessage (hwndTB,COMMCTRL.TB_CUSTOMIZE, SYSTEM.CAST(WIN32.LPARAM,tbb[25]), 5); ELSE END; END ToolBarMessage; BEGIN END ToolBar.