Last updated: 4. 3.1998, 23: 2
<*/NOWARN:F*>
MODULE CtlMacro;
%IF WIN32 %THEN
<*/Resource:CTLMACRO.RES*>
%ELSE
%END
(*--------------------------------------------
CTLMACRO.C --- Control Macro Helper Utility
(c) Paul Yao, 1996
CtlMacro.mod --- Translation to Stony Brook Modula-2
(c) Peter Stadler, 1998
--------------------------------------------*)
IMPORT TreeView;
IMPORT resource;
IMPORT Notify;
IMPORT WINGDI;
IMPORT WIN32;
IMPORT COMMCTRL;
IMPORT WINUSER;
IMPORT SYSTEM;
IMPORT WINX;
VAR COL_WHITE : INTEGER;
VAR
hInst : WIN32.HINSTANCE;
VAR
bFirstSelection : BOOLEAN = TRUE; (* static *)
<*/PUSH*>
%IF WIN32 %THEN
<*/CALLS:WIN32SYSTEM*>
%ELSE
<*/CALLS:WINSYSTEM*>
%END
(*++++*****************************************************************)
PROCEDURE DlgProc (hwnd : WIN32.HWND;
(**********************************************************************)
mMsg : WIN32.UINT;
wParam : WIN32.WPARAM;
lParam : WIN32.LPARAM) : WIN32.BOOL [EXPORT];
(*******************************************************************- *)
VAR
hicon : WIN32.HICON;
himl : COMMCTRL.HIMAGELIST;
hItem : COMMCTRL.HTREEITEM;
hwndEdit : WIN32.HWND;
hwndCopy : WIN32.HWND;
hwndCtrl : WIN32.HWND;
hwndButton : WIN32.HWND;
wNotifyCode : WIN32.WORD;
cb : INTEGER;
idCtrl : INTEGER;
pnmtv : COMMCTRL.LPNM_TREEVIEW;
pnmh : WINUSER.LPNMHDR;
lpstr : WIN32.LPTSTR;
BEGIN
CASE (mMsg) OF
| WINUSER.WM_INITDIALOG :
(* Add listview root items *)
hwndCtrl := WINUSER.GetDlgItem (hwnd, resource.IDC_MESSAGES);
TreeView.tv_BuildRootFolder (hwndCtrl);
(* Select first item *)
hItem := COMMCTRL.TreeView_GetFirstVisible (hwndCtrl);
COMMCTRL.TreeView_SelectItem (hwndCtrl, hItem);
(* Create image list & connect to list view *)
lpstr := WINUSER.MAKEINTRESOURCE (resource.IDR_TVITEMS);
himl :=
COMMCTRL.ImageList_LoadBitmap (hInst,
lpstr^,
16,
0,
COL_WHITE);
COMMCTRL.TreeView_SetImageList (hwndCtrl, himl, COMMCTRL.TVSIL_NORMAL);
(* Disable [Copy] button when no macro is present *)
hwndCtrl := WINUSER.GetDlgItem (hwnd, resource.IDC_COPY);
WINUSER.EnableWindow (hwndCtrl, FALSE);
(* Install icon *)
lpstr := WINUSER.MAKEINTRESOURCE (resource.IDI_APP);
hicon := WINUSER.LoadIcon (hInst,lpstr^);
WINUSER.SendMessage (hwnd, WINUSER.WM_SETICON, VAL(WIN32.WPARAM,TRUE),
SYSTEM.CAST(WIN32.LPARAM, hicon));
RETURN TRUE;
| WINUSER.WM_COMMAND :
CASE (WINUSER.LOWORD (wParam)) OF
(* Copy macro data to clipboard *)
| resource.IDC_COPY :
hwndEdit := WINUSER.GetDlgItem (hwnd, resource.IDC_MACROS);
WINX.Edit_SetSel (hwndEdit, 0, -1);
WINUSER.SendMessage (hwndEdit, WINUSER.WM_COPY, 0, 0h);
(* Close dialog *)
| WINUSER.IDOK :
WINUSER.EndDialog (hwnd, 0);
(* Enable & disable [Copy] button when edit changes *)
| resource.IDC_MACROS :
wNotifyCode := WINUSER.HIWORD (wParam);
IF (wNotifyCode = WINUSER.EN_CHANGE) THEN
hwndEdit := SYSTEM.CAST(WIN32.HWND,lParam);
hwndCopy := WINUSER.GetDlgItem (hwnd, resource.IDC_COPY);
cb := WINX.Edit_GetTextLength (hwndEdit);
WINUSER.EnableWindow (hwndCopy, SYSTEM.CAST(BOOLEAN,cb));
END;
ELSE
RETURN TRUE;
END;
RETURN TRUE;
| WINUSER.WM_NOTIFY :
idCtrl := SYSTEM.CAST(INTEGER,wParam);
pnmh := SYSTEM.CAST(WINUSER.LPNMHDR, lParam);
(* Expand tree as required *)
IF (pnmh^.code = COMMCTRL.TVN_ITEMEXPANDING) THEN
pnmtv := SYSTEM.CAST(COMMCTRL.LPNM_TREEVIEW,lParam);
TreeView.tv_ExpandChild (pnmh^.hwndFrom, pnmtv^.itemNew.lParam);
END;
(* Respond to selection of items *)
IF (pnmh^.code = COMMCTRL.TVN_SELCHANGED) THEN
pnmtv := SYSTEM.CAST(COMMCTRL.LPNM_TREEVIEW, lParam);
hwndEdit := WINUSER.GetDlgItem (hwnd, resource.IDC_MACROS);
(* Ignore first selection request *)
IF (bFirstSelection) THEN
bFirstSelection := FALSE;
RETURN TRUE;
END;
(* Fetch macro for leaf nodes *)
IF (TreeView.tv_FetchMacro (pnmtv^.itemNew.lParam, hwndEdit)) THEN
WINX.Edit_SetSel (hwndEdit, 0, -1);
ELSE
(* Expand tree for folder nodes *)
COMMCTRL.TreeView_Expand (pnmh^.hwndFrom,
pnmtv^.itemNew.hItem,
COMMCTRL.TVE_EXPAND);
WINX.Edit_SetText (hwndEdit, "");
END;
RETURN TRUE;
END;
(* Double-click means copy macro to clipboard *)
IF (pnmh^.code = COMMCTRL.NM_DBLCLK) THEN
hwndEdit := WINUSER.GetDlgItem (hwnd, resource.IDC_MACROS);
hwndButton := WINUSER.GetDlgItem (hwnd, resource.IDC_COPY);
IF (WINX.Edit_GetTextLength (hwndEdit) > 0) THEN
COMMCTRL.FORWARD_WM_COMMAND (hwnd, resource.IDC_COPY,
hwndButton, WINUSER.BN_CLICKED,
WINUSER.SendMessage);
END;
END;
RETURN TRUE;
ELSE
RETURN FALSE;
END;
END DlgProc;
<*/POP*>
(*******************************************************************- *)
VAR
lpstr : WIN32.LPTSTR;
BEGIN
COL_WHITE := (WINGDI.RGB (255, 255, 255));
hInst := WINX.Instance;
(* Load common control library *)
COMMCTRL.InitCommonControls ();
lpstr := WINUSER.MAKEINTRESOURCE (resource.IDD_DIALOG);
WINUSER.DialogBox (hInst,lpstr^, NIL, DlgProc);
END CtlMacro.