Gadgets.mod: Translation to Stony Brook Modula-2

Last updated: 11. 1.1998, 16:56

<*/NOWARN:F*>
MODULE Gadgets;
%IF WIN32 %THEN
    <*/Resource:GADGETS.RES*>
%ELSE
%END
(*---------------------------------------
   GADGETS.C       --- Gadgets for a frame window.
                   (c) Paul Yao,      1996
   Gadgets.mod     --- Translation to Stony Brook Modula-2
                   (c) Peter Stadler, 1998
  ---------------------------------------*)

IMPORT WINUSER;
IMPORT WINGDI;
IMPORT WIN32;
IMPORT WINX;
IMPORT SYSTEM;
IMPORT COMMCTRL;
IMPORT comcthlp;
IMPORT h2d_gadgets;
IMPORT StatBar;
IMPORT ToolBar;
IMPORT ToolTip;
IMPORT NotifDef;


CONST
  szAppName  =  "Gadgets: Translation to Stony Brook M2";
VAR
   hwnd            :  WIN32.HWND;
   bIgnoreSize     :  BOOLEAN = FALSE;
   hwndClient      :  WIN32.HWND = NIL;
   hwndToolBar     :  WIN32.HWND = NIL;
   idCtrl          :  INTEGER;
   hwndNotify      :  WIN32.HWND = NIL;
   msg  :     WINUSER.MSG;
VAR  crBack  :  WIN32.COLORREF;
     hbr     :  WIN32.HBRUSH;


(*++++*****************************************************************)
PROCEDURE InitApplication () : BOOLEAN;
(**********************************************************************)
VAR
  lpstr  :  WIN32.LPSTR;
  wc     :  WINUSER.WNDCLASSEX;
  rc     :  INTEGER;
BEGIN
  ToolBar.hInst    := WINX.Instance;
  wc.cbSize        := SIZE(wc);
  wc.lpszClassName := SYSTEM.ADR(szAppName);
  wc.hInstance     := WINX.Instance;
  wc.lpfnWndProc   := WndProc;
  wc.hCursor       := WINUSER.LoadCursor (NIL, WINUSER.IDC_ARROW^);
  lpstr            := WINUSER.MAKEINTRESOURCE (SYSTEM.CAST(INTEGER,WINUSER.IDI_APPLICATION));
  wc.hIcon         := WINUSER.LoadIcon (wc.hInstance, lpstr^);
  wc.lpszMenuName  := SYSTEM.ADR("MAIN");
  wc.hbrBackground := SYSTEM.CAST(WIN32.HBRUSH, WINUSER.COLOR_WINDOW+1);
  wc.style         := 0;
  wc.cbClsExtra    := 0;
  wc.cbWndExtra    := 0;
  wc.hIconSm       := WINUSER.LoadIcon (wc.hInstance, lpstr^);
  rc := WINUSER.RegisterClassEx(wc);

  wc.lpszClassName := SYSTEM.ADR("ClientWndProc");
  wc.hInstance     := WINX.Instance;
  wc.lpfnWndProc   := ClientWndProc;
  wc.hCursor       := WINUSER.LoadCursor (NIL, WINUSER.IDC_ARROW^);
  wc.hIcon         := WINUSER.LoadIcon (NIL, WINUSER.IDI_APPLICATION^);
  wc.lpszMenuName  := NIL;
  wc.hbrBackground := SYSTEM.CAST(WIN32.HBRUSH, WINUSER.COLOR_WINDOW+1);
  wc.style         := 0;
  wc.cbClsExtra    := 0;
  wc.cbWndExtra    := 0;
  wc.hIconSm       := WINUSER.LoadIcon (NIL, WINUSER.IDI_APPLICATION^);
  RETURN WINUSER.RegisterClassEx(wc)#0;

END InitApplication;
(*++++*****************************************************************)
PROCEDURE InitMainWindow () : BOOLEAN;
(**********************************************************************)
BEGIN
  hwnd := WINUSER.CreateWindowEx(0h,szAppName,
                        szAppName,
                        WINUSER.WS_OVERLAPPEDWINDOW,
                        WINUSER.CW_USEDEFAULT,
                        WINUSER.CW_USEDEFAULT,
                        WINUSER.CW_USEDEFAULT,
                        WINUSER.CW_USEDEFAULT,
                        NIL,
                        NIL,
                        WINX.Instance,
                        NIL);

  WINUSER.ShowWindow (hwnd, WINUSER.SW_SHOWDEFAULT);
  WINUSER.UpdateWindow (hwnd);
  COMMCTRL.InitCommonControls ();
  RETURN TRUE;
END InitMainWindow;

(*-------------------------------------------------------------------*)
PROCEDURE MenuCheckMark (hmenu : WIN32.HMENU;
                         id    : INTEGER;
                         bCheck: BOOLEAN);
VAR
  iState : INTEGER;
BEGIN
     IF(bCheck) THEN
        iState := WINUSER.MF_CHECKED;
     ELSE
        iState := WINUSER.MF_UNCHECKED;
     END;
     WINUSER.CheckMenuItem (hmenu, id, iState);
END MenuCheckMark;

<*/PUSH*>
%IF WIN32 %THEN
    <*/CALLS:WIN32SYSTEM*>
%ELSE
    <*/CALLS:WINSYSTEM*>
%END
(*++++*****************************************************************)
PROCEDURE WndProc (hwnd        : WIN32.HWND;
(**********************************************************************)
          mMsg        : WIN32.UINT;
          wParam      : WIN32.WPARAM;
          lParam      : WIN32.LPARAM) : WIN32.LRESULT [EXPORT];
VAR
  pnmh : WINUSER.LPNMHDR;
  r    : WIN32.RECT;
  ach  : ARRAY[0..80] OF CHAR;
  bCheck : BOOLEAN;
  hmenu  : WIN32.HMENU;
  lpttt : COMMCTRL.LPTOOLTIPTEXT;
  cx:       INTEGER;
  cy:       INTEGER;
  cyStatus: INTEGER;
  cyTB:     INTEGER;
  x, y:     INTEGER;
  dwStyle:  WIN32.DWORD;
  rWindow:  WIN32.RECT;
BEGIN
     CASE (mMsg) OF
          | WINUSER.WM_CREATE :
               (* Create toolbar (source resides in toolbar.c)*)
               hwndToolBar := ToolBar.InitToolBar (hwnd);

               (* Create status bar (source resides in statbar.c).*)
               StatBar.hwndStatusBar := StatBar.InitStatusBar(hwnd);

               (* Create client window (contains notify list).*)
               hwndClient := WINUSER.CreateWindowEx (WINUSER.WS_EX_CLIENTEDGE,
                                 "ClientWndProc", "",
                                 WINUSER.WS_CHILD BOR WINUSER.WS_VISIBLE, 0, 0, 0, 0,
                                 hwnd, SYSTEM.CAST(WIN32.HMENU, 4), ToolBar.hInst, NIL);

               RETURN 0;

          | WINUSER.WM_COMMAND :
               (* Toolbar button commands.*)
               IF (WINUSER.LOWORD(wParam) < 300) THEN
                    WINUSER.wsprintf (ach, "Got Command (%d)", wParam);
                    WINUSER.MessageBox (hwnd, ach, szAppName, WINUSER.MB_OK);
               ELSE

                 (* Menu item commands*)
                 CASE (WINUSER.LOWORD(wParam)) OF
                      (* Toolbar settings*)
                      | h2d_gadgets.IDM_STRINGS :
                           WINUSER.DestroyWindow (hwndToolBar);
                           hwndToolBar := ToolBar.RebuildToolBar (hwnd,
                                                         WINUSER.LOWORD(wParam));
                      | h2d_gadgets.IDM_LARGEICONS :
                           WINUSER.DestroyWindow (hwndToolBar);
                           hwndToolBar := ToolBar.RebuildToolBar (hwnd,
                                                         WINUSER.LOWORD(wParam));
                      | h2d_gadgets.IDM_SMALLICONS :
                           WINUSER.DestroyWindow (hwndToolBar);
                           hwndToolBar := ToolBar.RebuildToolBar (hwnd,
                                                         WINUSER.LOWORD(wParam));
                      | h2d_gadgets.IDM_NODIVIDER :
                           WINUSER.DestroyWindow (hwndToolBar);
                           hwndToolBar := ToolBar.RebuildToolBar (hwnd,
                                                         WINUSER.LOWORD(wParam));
                      | h2d_gadgets.IDM_WRAPABLE :
                           WINUSER.DestroyWindow (hwndToolBar);
                           hwndToolBar := ToolBar.RebuildToolBar (hwnd,
                                                         WINUSER.LOWORD(wParam));
                      | h2d_gadgets.IDM_TOP :
                           WINUSER.DestroyWindow (hwndToolBar);
                           hwndToolBar := ToolBar.RebuildToolBar (hwnd,
                                                         WINUSER.LOWORD(wParam));
                      | h2d_gadgets.IDM_BOTTOM :
                           WINUSER.DestroyWindow (hwndToolBar);
                           hwndToolBar := ToolBar.RebuildToolBar (hwnd,
                                                         WINUSER.LOWORD(wParam));
                      | h2d_gadgets.IDM_NOMOVEY :
                           WINUSER.DestroyWindow (hwndToolBar);
                           hwndToolBar := ToolBar.RebuildToolBar (hwnd,
                                                         WINUSER.LOWORD(wParam));
                      | h2d_gadgets.IDM_NOPARENTALIGN :
                           WINUSER.DestroyWindow (hwndToolBar);
                           hwndToolBar := ToolBar.RebuildToolBar (hwnd,
                                                         WINUSER.LOWORD(wParam));
                      | h2d_gadgets.IDM_NORESIZE :
                           WINUSER.DestroyWindow (hwndToolBar);
                           hwndToolBar := ToolBar.RebuildToolBar (hwnd,
                                                         WINUSER.LOWORD(wParam));
                      | h2d_gadgets.IDM_ADJUSTABLE :
                           WINUSER.DestroyWindow (hwndToolBar);
                           hwndToolBar := ToolBar.RebuildToolBar (hwnd,
                                                         WINUSER.LOWORD(wParam));
                      | h2d_gadgets.IDM_ALTDRAG :
                           WINUSER.DestroyWindow (hwndToolBar);
                           hwndToolBar := ToolBar.RebuildToolBar (hwnd,
                                                         WINUSER.LOWORD(wParam));
                      | h2d_gadgets.IDM_TOOLTIPS :
                           WINUSER.DestroyWindow (hwndToolBar);
                           hwndToolBar := ToolBar.RebuildToolBar (hwnd,
                                                         WINUSER.LOWORD(wParam));
                      | h2d_gadgets.IDM_COMBOBOX :
                           WINUSER.DestroyWindow (hwndToolBar);
                           hwndToolBar := ToolBar.RebuildToolBar (hwnd,
                                                         WINUSER.LOWORD(wParam));

                      (* Toolbar messages*)
                      | h2d_gadgets.IDM_TB_CHECK :
                           ToolBar.ToolBarMessage (hwndToolBar, WINUSER.LOWORD(wParam));
                      | h2d_gadgets.IDM_TB_ENABLE :
                           ToolBar.ToolBarMessage (hwndToolBar, WINUSER.LOWORD(wParam));
                      | h2d_gadgets.IDM_TB_HIDE :
                           ToolBar.ToolBarMessage (hwndToolBar, WINUSER.LOWORD(wParam));
                      | h2d_gadgets.IDM_TB_INDETERMINATE :
                           ToolBar.ToolBarMessage (hwndToolBar, WINUSER.LOWORD(wParam));
                      | h2d_gadgets.IDM_TB_PRESS :
                           ToolBar.ToolBarMessage (hwndToolBar, WINUSER.LOWORD(wParam));
                      | h2d_gadgets.IDM_TB_BUTTONCOUNT :
                           ToolBar.ToolBarMessage (hwndToolBar, WINUSER.LOWORD(wParam));
                      | h2d_gadgets.IDM_TB_GETROWS :
                           ToolBar.ToolBarMessage (hwndToolBar, WINUSER.LOWORD(wParam));
                      | h2d_gadgets.IDM_TB_CUSTOMIZE :
                           ToolBar.ToolBarMessage (hwndToolBar, WINUSER.LOWORD(wParam));

                      (* Status bar settings*)
                      | h2d_gadgets.IDM_STAT_SIZEGRIP :
                           WINUSER.DestroyWindow (StatBar.hwndStatusBar);
                           StatBar.hwndStatusBar := StatBar.RebuildStatusBar (hwnd,WINUSER.LOWORD(wParam));
                      | h2d_gadgets.IDM_STAT_TOP :
                           WINUSER.DestroyWindow (StatBar.hwndStatusBar);
                           StatBar.hwndStatusBar := StatBar.RebuildStatusBar (hwnd,WINUSER.LOWORD(wParam));
                      | h2d_gadgets.IDM_STAT_BOTTOM :
                           WINUSER.DestroyWindow (StatBar.hwndStatusBar);
                           StatBar.hwndStatusBar := StatBar.RebuildStatusBar (hwnd,WINUSER.LOWORD(wParam));
                      | h2d_gadgets.IDM_STAT_NOMOVEY :
                           WINUSER.DestroyWindow (StatBar.hwndStatusBar);
                           StatBar.hwndStatusBar := StatBar.RebuildStatusBar (hwnd,WINUSER.LOWORD(wParam));
                      | h2d_gadgets.IDM_STAT_NOPARENTALIGN :
                           WINUSER.DestroyWindow (StatBar.hwndStatusBar);
                           StatBar.hwndStatusBar := StatBar.RebuildStatusBar (hwnd,WINUSER.LOWORD(wParam));
                      | h2d_gadgets.IDM_STAT_NORESIZE :
                           WINUSER.DestroyWindow (StatBar.hwndStatusBar);
                           StatBar.hwndStatusBar := StatBar.RebuildStatusBar (hwnd,WINUSER.LOWORD(wParam));

                      (* Status bar messages*)
                      | h2d_gadgets.IDM_ST_GETBORDERS :
                           StatBar.StatusBarMessage (StatBar.hwndStatusBar, WINUSER.LOWORD(wParam));
                      | h2d_gadgets.IDM_ST_GETPARTS :
                           StatBar.StatusBarMessage (StatBar.hwndStatusBar, WINUSER.LOWORD(wParam));
                      | h2d_gadgets.IDM_ST_SETTEXT :
                           StatBar.StatusBarMessage (StatBar.hwndStatusBar, WINUSER.LOWORD(wParam));
                      | h2d_gadgets.IDM_ST_SIMPLE :
                           StatBar.StatusBarMessage (StatBar.hwndStatusBar, WINUSER.LOWORD(wParam));

                      (* Toggle display of toolbar*)
                      | h2d_gadgets.IDM_VIEW_TOOLBAR :
                           IF (hwndToolBar=SYSTEM.CAST(WIN32.HWND,1)) AND (WINUSER.IsWindowVisible (hwndToolBar)=TRUE) THEN
                                WINUSER.ShowWindow (hwndToolBar, WINUSER.SW_HIDE);
                           ELSE
                                WINUSER.ShowWindow (hwndToolBar, WINUSER.SW_SHOW);
                           END;

                           (* Resize other windows.*)
                           WINUSER.GetClientRect (hwnd, r);
                           WINUSER.PostMessage (hwnd, WINUSER.WM_SIZE, 0,
                                        WINUSER.MAKELPARAM (r.right, r.bottom));


                      (* Toggle display of status bar*)
                      | h2d_gadgets.IDM_VIEW_STATUS :
                           IF (StatBar.hwndStatusBar=SYSTEM.CAST(WIN32.HWND,1)) AND WINUSER.IsWindowVisible (StatBar.hwndStatusBar) THEN
                                WINUSER.ShowWindow (StatBar.hwndStatusBar, WINUSER.SW_HIDE);
                           ELSE
                                WINUSER.ShowWindow (StatBar.hwndStatusBar, WINUSER.SW_SHOW);
                           END;

                           (* Resize other windows.*)
                           WINUSER.GetClientRect (hwnd, r);
                           WINUSER.PostMessage (hwnd, WINUSER.WM_SIZE, 0,
                                        WINUSER.MAKELPARAM (r.right, r.bottom));


                      (* Toggle display of notifications window.*)
                      | h2d_gadgets.IDM_VIEW_NOTIFICATIONS :
                           hwndNotify := NotifDef.ViewNotificationsToggle (hwndClient);

                      (* Toggle ignore WINUSER.WM_SIZE to show auto-size\auto-move*)
                      | h2d_gadgets.IDM_IGNORESIZE :
                           bIgnoreSize := NOT bIgnoreSize;
                           IF (bIgnoreSize) THEN
                                WINUSER.ShowWindow (hwndClient, WINUSER.SW_HIDE);
                           ELSE
                                WINUSER.ShowWindow (hwndClient, WINUSER.SW_SHOW);
                                WINUSER.GetClientRect (hwnd, r);
                                WINUSER.PostMessage (hwnd, WINUSER.WM_SIZE, 0,
                                             WINUSER.MAKELPARAM (r.right, r.bottom));
                           END;
                      | h2d_gadgets.IDM_STAT_IGNORESIZE :
                           bIgnoreSize := NOT bIgnoreSize;
                           IF (bIgnoreSize) THEN
                                WINUSER.ShowWindow (hwndClient, WINUSER.SW_HIDE);
                           ELSE
                                WINUSER.ShowWindow (hwndClient, WINUSER.SW_SHOW);
                                WINUSER.GetClientRect (hwnd, r);
                                WINUSER.PostMessage (hwnd, WINUSER.WM_SIZE, 0,
                                             WINUSER.MAKELPARAM (r.right, r.bottom));
                           END;

                      (* Clear contents of notification window*)
                      | h2d_gadgets.IDM_NOTIFICATIONS_CLEAR :
                           NotifDef.ClearNotificationList ();

                   RETURN 0;
                 ELSE
		   RETURN 0;
                 END;
               END;
          | WINUSER.WM_INITMENU :
               hmenu := SYSTEM.CAST(WIN32.HMENU,wParam);

               MenuCheckMark (hmenu, h2d_gadgets.IDM_IGNORESIZE, bIgnoreSize);
               MenuCheckMark (hmenu, h2d_gadgets.IDM_STAT_IGNORESIZE, bIgnoreSize);

               (* Toolbar menu items.*)
               MenuCheckMark (hmenu, h2d_gadgets.IDM_STRINGS, ToolBar.bStrings);
               MenuCheckMark (hmenu, h2d_gadgets.IDM_LARGEICONS, ToolBar.bLargeIcons);
               MenuCheckMark (hmenu, h2d_gadgets.IDM_SMALLICONS, NOT ToolBar.bLargeIcons);
               MenuCheckMark (hmenu, h2d_gadgets.IDM_COMBOBOX, ToolBar.bComboBox);

               bCheck := (ToolBar.dwToolBarStyles BAND COMMCTRL.CCS_NODIVIDER=1);
               MenuCheckMark (hmenu, h2d_gadgets.IDM_NODIVIDER, bCheck);

               bCheck := (ToolBar.dwToolBarStyles BAND COMMCTRL.TBSTYLE_WRAPABLE=1);
               MenuCheckMark(hmenu, h2d_gadgets.IDM_WRAPABLE, bCheck);

               bCheck := ((ToolBar.dwToolBarStyles BAND 3) = COMMCTRL.CCS_TOP);
               MenuCheckMark(hmenu, h2d_gadgets.IDM_TOP, bCheck);

               bCheck := ((ToolBar.dwToolBarStyles BAND 3) = COMMCTRL.CCS_BOTTOM);
               MenuCheckMark (hmenu, h2d_gadgets.IDM_BOTTOM, bCheck);

               bCheck := ((ToolBar.dwToolBarStyles BAND 3) = COMMCTRL.CCS_NOMOVEY);
               MenuCheckMark (hmenu, h2d_gadgets.IDM_NOMOVEY, bCheck);

               bCheck := (ToolBar.dwToolBarStyles BAND COMMCTRL.CCS_NOPARENTALIGN=1);
               MenuCheckMark (hmenu, h2d_gadgets.IDM_NOPARENTALIGN, bCheck);

               bCheck := (ToolBar.dwToolBarStyles BAND COMMCTRL.CCS_NORESIZE=1);
               MenuCheckMark (hmenu, h2d_gadgets.IDM_NORESIZE, bCheck);

               bCheck := (ToolBar.dwToolBarStyles BAND COMMCTRL.CCS_ADJUSTABLE=1);
               MenuCheckMark (hmenu, h2d_gadgets.IDM_ADJUSTABLE, bCheck);

               bCheck := (ToolBar.dwToolBarStyles BAND COMMCTRL.TBSTYLE_ALTDRAG=1);
               MenuCheckMark (hmenu, h2d_gadgets.IDM_ALTDRAG, bCheck);

               bCheck := (ToolBar.dwToolBarStyles BAND COMMCTRL.TBSTYLE_TOOLTIPS=1);
               MenuCheckMark (hmenu, h2d_gadgets.IDM_TOOLTIPS, bCheck);

               (* Status bar menu items.*)
               bCheck := (StatBar.dwStatusBarStyles BAND COMMCTRL.SBARS_SIZEGRIP=1);
               MenuCheckMark (hmenu, h2d_gadgets.IDM_STAT_SIZEGRIP, bCheck);

               bCheck := ((StatBar.dwStatusBarStyles BAND 3) = COMMCTRL.CCS_TOP);
               MenuCheckMark (hmenu, h2d_gadgets.IDM_STAT_TOP, bCheck);

               bCheck := ((StatBar.dwStatusBarStyles BAND 3) = COMMCTRL.CCS_BOTTOM);
               MenuCheckMark (hmenu, h2d_gadgets.IDM_STAT_BOTTOM, bCheck);

               bCheck := ((StatBar.dwStatusBarStyles BAND 3) = COMMCTRL.CCS_NOMOVEY);
               MenuCheckMark (hmenu, h2d_gadgets.IDM_STAT_NOMOVEY, bCheck);

               bCheck := (StatBar.dwStatusBarStyles BAND COMMCTRL.CCS_NOPARENTALIGN=1);
               MenuCheckMark (hmenu, h2d_gadgets.IDM_STAT_NOPARENTALIGN, bCheck);

               bCheck := (StatBar.dwStatusBarStyles BAND COMMCTRL.CCS_NORESIZE=1);
               MenuCheckMark (hmenu, h2d_gadgets.IDM_STAT_NORESIZE, bCheck);

               (* View menu items.*)
               bCheck := WINUSER.IsWindowVisible (hwndToolBar);
               MenuCheckMark (hmenu, h2d_gadgets.IDM_VIEW_TOOLBAR, bCheck);

               bCheck := WINUSER.IsWindowVisible (StatBar.hwndStatusBar);
               MenuCheckMark (hmenu, h2d_gadgets.IDM_VIEW_STATUS, bCheck);

               bCheck := (hwndNotify # NIL);
               MenuCheckMark (hmenu, h2d_gadgets.IDM_VIEW_NOTIFICATIONS, bCheck);
               RETURN 0;

          | WINUSER.WM_MENUSELECT :
               RETURN StatBar.StatusBar_MenuSelect (hwnd, wParam, lParam);

          | WINUSER.WM_DESTROY :
               WINUSER.PostQuitMessage (0);
               RETURN 0;

          | WINUSER.WM_NOTIFY :
               pnmh := SYSTEM.CAST(WINUSER.LPNMHDR,lParam);
               idCtrl := SYSTEM.CAST(INTEGER,wParam);

               (* Display notification details in notify window *)
               NotifDef.DisplayNotificationDetails (wParam, lParam);

               (* Toolbar notifications *)
               IF (SYSTEM.CAST(INTEGER,pnmh^.code) >= COMMCTRL.TBN_LAST) AND
                  (SYSTEM.CAST(INTEGER,pnmh^.code) <= COMMCTRL.TBN_FIRST) THEN
                    RETURN ToolBar.ToolBarNotify (hwnd, wParam, lParam);
               END;
               (* Fetch tooltip text *)
               IF (pnmh^.code = COMMCTRL.TTN_NEEDTEXT) THEN
                    lpttt := SYSTEM.CAST(COMMCTRL.LPTOOLTIPTEXT,lParam);
                    ToolTip.CopyToolTipText (lpttt);
               END;

               RETURN 0;

          | WINUSER.WM_SIZE :
               cx := WINUSER.LOWORD(lParam);
               cy := WINUSER.HIWORD(lParam);

               (* Ignore size message to allow auto-move and auto-size *)
               (* features to be more clearly seen.*)
               IF (bIgnoreSize) THEN
                    RETURN 0;
               END;
               (* Adjust toolbar size.*)
               IF (WINUSER.IsWindowVisible (hwndToolBar)) THEN
                    dwStyle := WINUSER.GetWindowLong (hwndToolBar, WINUSER.GWL_STYLE);
                    IF (dwStyle BAND COMMCTRL.CCS_NORESIZE=1) THEN
                         WINUSER.MoveWindow (hwndToolBar,
                                     0, 0, cx, ToolBar.cyToolBar, FALSE);
                    ELSE
                         comcthlp.ToolBar_AutoSize (hwndToolBar);
                    END;
                    WINUSER.InvalidateRect (hwndToolBar, WINX.NIL_RECT, TRUE);
                    WINUSER.GetWindowRect (hwndToolBar, rWindow);
                    WINUSER.ScreenToClient (hwnd, SYSTEM.CAST(WIN32.POINT, rWindow.left));
                    WINUSER.ScreenToClient (hwnd, SYSTEM.CAST(WIN32.POINT, rWindow.right));
                    cyTB := rWindow.bottom - rWindow.top;
               ELSE
                    cyTB := 0;
               END;

               (* Adjust status bar size.*)
               IF (WINUSER.IsWindowVisible (StatBar.hwndStatusBar)) THEN
                    WINUSER.GetWindowRect (StatBar.hwndStatusBar, rWindow);
                    cyStatus := rWindow.bottom - rWindow.top;
                    WINUSER.MoveWindow (StatBar.hwndStatusBar, 0, cy - cyStatus,
                                              cx, cyStatus, TRUE);
               ELSE
                    cyStatus := 0;
               END;

               (* Adjust client window size.*)
               x := 0;
               y := cyTB;
               cy := cy - (cyStatus + cyTB);
               WINUSER.MoveWindow (hwndClient, x, y, cx, cy, TRUE);
               RETURN 0;

      ELSE
               RETURN (WINUSER.DefWindowProc (hwnd, mMsg, wParam, lParam));
      END;
END WndProc;
<*/POP*>

<*/PUSH*>
%IF WIN32 %THEN
    <*/CALLS:WIN32SYSTEM*>
%ELSE
    <*/CALLS:WINSYSTEM*>
%END
(*++++*****************************************************************)
PROCEDURE ClientWndProc (hwnd        : WIN32.HWND;
(**********************************************************************)
          mMsg        : WIN32.UINT;
          wParam      : WIN32.WPARAM;
          lParam      : WIN32.LPARAM) : WIN32.LRESULT [EXPORT];
VAR
    cx,cy      : INTEGER;
BEGIN
     CASE (mMsg) OF
          | WINUSER.WM_CREATE :
               hwndNotify := NotifDef.ViewNotificationsToggle (hwnd);
               crBack := WINUSER.GetSysColor (WINUSER.COLOR_APPWORKSPACE);
               hbr := WINGDI.CreateSolidBrush (crBack);
               RETURN 0;

          | WINUSER.WM_DESTROY :
               WINGDI.DeleteObject (SYSTEM.CAST(WIN32.HGDIOBJ,hbr));
               RETURN 0;

          | WINUSER.WM_CTLCOLORLISTBOX :
               WINUSER.DefWindowProc (hwnd, mMsg, wParam, lParam);
               WINGDI.SetBkColor (SYSTEM.CAST(WIN32.HDC,wParam), crBack);
               WINGDI.SetBkMode (SYSTEM.CAST(WIN32.HDC,wParam), WINGDI.TRANSPARENT);
               RETURN SYSTEM.CAST(WIN32.LRESULT, SYSTEM.CAST(WIN32.HBRUSH,hbr));

          | WINUSER.WM_SIZE :
               hwndNotify := WINUSER.GetWindow (hwnd, WINUSER.GW_CHILD);
               cx := WINUSER.LOWORD(lParam);
               cy := WINUSER.HIWORD(lParam);

               (* Ignore if notification window is absent.*)
               IF (hwndNotify # NIL) THEN
                    WINUSER.MoveWindow (hwndNotify, 0, 0, cx, cy, TRUE);
               END;

               RETURN 0;

          ELSE
               RETURN (WINUSER.DefWindowProc (hwnd, mMsg, wParam, lParam));
          END;
END ClientWndProc;
<*/POP*>
BEGIN
  StatBar.hwndStatusBar := NIL;
  IF InitApplication()  AND  InitMainWindow() THEN
    WHILE (WINUSER.GetMessage(msg,NIL,0,0)) DO
      WINUSER.TranslateMessage(msg);
      WINUSER.DispatchMessage(msg);
    END;
  END;
END Gadgets.