Last updated: 13. 2.1998, 22:48
<*/NOWARN:F*>
IMPLEMENTATION MODULE StatBar;
(*-------------------------------------------
STATBAR.C --- Status bar helper functions.
(c) Paul Yao, 1996
StatBar.mod --- Translation to Stony Brook Modula-2
(c) Peter Stadler, 1998
-------------------------------------------*)
IMPORT comcthlp;
IMPORT COMMCTRL;
IMPORT WIN32;
IMPORT WINUSER;
IMPORT h2d_gadgets;
IMPORT SYSTEM;
IMPORT WINX;
IMPORT ToolBar;
IMPORT ASCII;
TYPE
POPUPSTRING = RECORD
hMenu :WIN32.HMENU;
uiString :WIN32.UINT;
END;
CONST MAX_MENUS=5;
VAR
popstr : ARRAY[0..MAX_MENUS-1] OF POPUPSTRING;
VAR bSimple : BOOLEAN = TRUE;
(*******************************************************************- *)
PROCEDURE InitStatusBar (hwndParent : WIN32.HWND) : WIN32.HWND;
VAR
hwndSB : WIN32.HWND;
hMenu : WIN32.HMENU;
hMenuTB : WIN32.HMENU;
hMenuSB : WIN32.HMENU;
BEGIN
(* Initialize values for WM_MENUSELECT message handling *)
hMenu := WINUSER.GetMenu (hwndParent);
hMenuTB := WINUSER.GetSubMenu (hMenu, 2);
hMenuSB := WINUSER.GetSubMenu (hMenu, 3);
popstr[0].hMenu := NIL;
popstr[0].uiString := 0;
popstr[1].hMenu := hMenu;
popstr[1].uiString := h2d_gadgets.IDS_MAIN_MENU;
popstr[2].hMenu := hMenuTB;
popstr[2].uiString := h2d_gadgets.IDS_TOOLBAR_MENU;
popstr[3].hMenu := hMenuSB;
popstr[3].uiString := h2d_gadgets.IDS_STATUSBAR_MENU;
popstr[4].hMenu := NIL;
popstr[4].uiString := 0;
hwndSB := COMMCTRL.CreateStatusWindow (dwStatusBarStyles,
"Ready",
hwndParent,
2);
RETURN hwndSB;
END InitStatusBar;
(*******************************************************************- *)
PROCEDURE FlipStyleFlag (dwStyle : WIN32.LPDWORD; flag : WIN32.DWORD);
BEGIN
IF (dwStyle^ BAND flag#0) THEN (* Flag on -- turn off *)
dwStyle^ := dwStyle^ BAND BNOT flag;
ELSE (* Flag off -- turn on *)
dwStyle^ := dwStyle^ BOR flag;
END;
END FlipStyleFlag;
(*******************************************************************- *)
PROCEDURE RebuildStatusBar (hwndParent : WIN32.HWND; wFlag : WIN32.WORD) : WIN32.HWND;
VAR
hwndSB : WIN32.HWND;
r : WIN32.RECT;
BEGIN
CASE (wFlag) OF
| h2d_gadgets.IDM_STAT_SIZEGRIP :
FlipStyleFlag (SYSTEM.ADR(dwStatusBarStyles), COMMCTRL.SBARS_SIZEGRIP);
| h2d_gadgets.IDM_STAT_TOP :
dwStatusBarStyles := dwStatusBarStyles BAND 0FFFFFFFCh;
dwStatusBarStyles := dwStatusBarStyles BOR COMMCTRL.CCS_TOP;
| h2d_gadgets.IDM_STAT_BOTTOM :
dwStatusBarStyles := dwStatusBarStyles BAND 0FFFFFFFCh;
dwStatusBarStyles := dwStatusBarStyles BOR COMMCTRL.CCS_BOTTOM;
| h2d_gadgets.IDM_STAT_NOMOVEY :
dwStatusBarStyles := dwStatusBarStyles BAND 0FFFFFFFCh;
dwStatusBarStyles := dwStatusBarStyles BOR COMMCTRL.CCS_NOMOVEY;
| h2d_gadgets.IDM_STAT_NOPARENTALIGN :
FlipStyleFlag (SYSTEM.ADR(dwStatusBarStyles), COMMCTRL.CCS_NOPARENTALIGN);
| h2d_gadgets.IDM_STAT_NORESIZE :
FlipStyleFlag (SYSTEM.ADR(dwStatusBarStyles), COMMCTRL.CCS_NORESIZE);
ELSE
END;
hwndSB := InitStatusBar (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 hwndSB;
END RebuildStatusBar;
(*******************************************************************- *)
PROCEDURE StatusBarMessage (hwndSB : WIN32.HWND; wMsg : WIN32.WORD);
VAR
ach : ARRAY[0..179] OF CHAR;
och : ARRAY[0..179] OF CHAR;
aiBorders : ARRAY[0..2] OF INTEGER;
nParts : INTEGER;
BEGIN
CASE (wMsg) OF
| h2d_gadgets.IDM_ST_GETBORDERS :
comcthlp.Status_GetBorders (hwndSB, aiBorders);
och := "Horiz Width = %d/n"+ASCII.lf+
"Vert Width = %d/n"+ASCII.lf+
"Separator Width = %d";
WINUSER.wsprintf (ach,och,
aiBorders[0], aiBorders[1],
aiBorders[2]);
WINUSER.MessageBox (WINUSER.GetParent (hwndSB), ach,
"COMMCTRL.SB_GETBORDERS", WINUSER.MB_OK);
| h2d_gadgets.IDM_ST_GETPARTS :
nParts := comcthlp.Status_GetParts (hwndSB, 0, 0);
WINUSER.wsprintf (ach, "Part Count = %d", nParts);
WINUSER.MessageBox (WINUSER.GetParent (hwndSB), ach,
"COMMCTRL.SB_GETPARTS", WINUSER.MB_OK);
| h2d_gadgets.IDM_ST_SETTEXT :
comcthlp.Status_SetText (hwndSB, 0, 0,
"COMMCTRL.SB_SETTEXT Message Sent");
| h2d_gadgets.IDM_ST_SIMPLE :
comcthlp.Status_Simple (hwndSB, VAL(WIN32.WORD,bSimple));
bSimple := NOT bSimple;
ELSE
END;
END StatusBarMessage;
(*******************************************************************- *)
PROCEDURE StatusBar_MenuSelect (hwnd : WIN32.HWND; wParam : WIN32.WPARAM; lParam : WIN32.LPARAM) : WIN32.LRESULT;
VAR
fuFlags : WIN32.UINT;
hMainMenu : WIN32.HMENU = NIL;
iMenu : INTEGER = 0;
BEGIN
fuFlags := VAL(WIN32.UINT, WINUSER.HIWORD (wParam));
(* Handle non-system popup menu descriptions. *)
IF ((fuFlags BAND WINUSER.MF_POPUP=1) AND
((fuFlags BAND WINUSER.MF_SYSMENU)=0)) THEN
iMenu := 1;
LOOP
IF ((SYSTEM.CAST(WIN32.HMENU,lParam) = popstr[iMenu].hMenu)) THEN
hMainMenu := SYSTEM.CAST(WIN32.HMENU,lParam);
EXIT;
END;
INC(iMenu);
IF(iMenu>=MAX_MENUS) THEN
EXIT;
END;
END;
END;
(* Display helpful text in status bar *)
COMMCTRL.MenuHelp (WINUSER.WM_MENUSELECT, wParam, lParam, hMainMenu, ToolBar.hInst,
hwndStatusBar, SYSTEM.CAST(WIN32.UINT,popstr[iMenu]));
RETURN 0;
END StatusBar_MenuSelect;
END StatBar.