Last updated: 18. 1.1998, 15:48
<*/NOWARN:F*> MODULE PopPad2; (*----------------------------------------------------- POPPAD2.C --- Popup Editor Version 2 (includes menu) (c) Charles Petzold, 1996 PopPad2.mod --- Translation to Stony Brook Modula-2 (c) Peter Stadler, 1997 -----------------------------------------------------*) %IF WIN32 %THEN <*/Resource:PopPad2.RES*> %ELSE %END IMPORT WINUSER; IMPORT WIN32; IMPORT WINX; IMPORT WINGDI; IMPORT h2d_poppad2; IMPORT SYSTEM; CONST szAppName = "PopPad2"; szAppTitle = "PopPad2: Translation to Stony Brook Modula-2"; VAR hAccel : WIN32.HACCEL; hwnd : WIN32.HWND; msg : WINUSER.MSG; wc : WINUSER.WNDCLASSEX; hwndEdit : WIN32.HWND; iSelect : INTEGER; iEnable : INTEGER; PROCEDURE AskConfirmation (hwnd : WIN32.HWND) : INTEGER; BEGIN RETURN WINUSER.MessageBox (hwnd, "Really want to close PopPad2?", szAppName, WINUSER.MB_YESNO BOR WINUSER.MB_ICONQUESTION); END AskConfirmation; <*/PUSH*> %IF WIN32 %THEN <*/CALLS:WIN32SYSTEM*> %ELSE <*/CALLS:WINSYSTEM*> %END (*++++*****************************************************************) PROCEDURE WndProc (hwnd : WIN32.HWND; (**********************************************************************) iMsg : WIN32.UINT; wParam : WIN32.WPARAM; lParam : WIN32.LPARAM) : WIN32.LRESULT [EXPORT]; VAR bo : WIN32.BOOL; lr : WIN32.LRESULT; mf : INTEGER; lpcr : WINUSER.LPCREATESTRUCT; BEGIN CASE (iMsg) OF | WINUSER.WM_CREATE : lpcr := SYSTEM.CAST(WINUSER.LPCREATESTRUCT,lParam); hwndEdit := WINUSER.CreateWindow ("edit", "", WINUSER.WS_CHILD BOR WINUSER.WS_VISIBLE BOR WINUSER.WS_HSCROLL BOR WINUSER.WS_VSCROLL BOR WINUSER.WS_BORDER BOR WINUSER.ES_LEFT BOR WINUSER.ES_MULTILINE BOR WINUSER.ES_AUTOHSCROLL BOR WINUSER.ES_AUTOVSCROLL, 0, 0, 0, 0, hwnd, SYSTEM.CAST(WIN32.HMENU,1), (* statt (SYSTEM.CAST(WINUSER.LPCREATESTRUCT, lParam) ^. hInstance, NIL); *) lpcr^.hInstance, NIL); RETURN 0; | WINUSER.WM_SETFOCUS : WINUSER.SetFocus (hwndEdit); RETURN 0; | WINUSER.WM_SIZE : WINUSER.MoveWindow (hwndEdit, 0, 0, WINUSER.LOWORD (lParam), WINUSER.HIWORD (lParam), TRUE); RETURN 0; | WINUSER.WM_INITMENUPOPUP : IF (lParam = 1) THEN lr := WINUSER.SendMessage (hwndEdit, WINUSER.EM_CANUNDO, 0, 0); IF(lr=1) THEN mf := WINUSER.MF_ENABLED; ELSIF(lr=0) THEN mf := WINUSER.MF_GRAYED; END; WINUSER.EnableMenuItem (SYSTEM.CAST(WIN32.HMENU,wParam), h2d_poppad2.IDM_UNDO,mf); bo := WINUSER.IsClipboardFormatAvailable (WINUSER.CF_TEXT); IF(bo=TRUE) THEN mf := WINUSER.MF_ENABLED; ELSIF(bo=FALSE) THEN mf := WINUSER.MF_GRAYED; END; WINUSER.EnableMenuItem (SYSTEM.CAST(WIN32.HMENU,wParam), h2d_poppad2.IDM_PASTE,mf); iSelect := WINUSER.SendMessage (hwndEdit, WINUSER.EM_GETSEL, 0, 0); IF (WINUSER.HIWORD (iSelect) = WINUSER.LOWORD (iSelect)) THEN iEnable := SYSTEM.CAST(INTEGER,WINUSER.MF_GRAYED); ELSE iEnable := SYSTEM.CAST(INTEGER,WINUSER.MF_ENABLED); END; WINUSER.EnableMenuItem (SYSTEM.CAST(WIN32.HMENU,wParam), h2d_poppad2.IDM_CUT, iEnable); WINUSER.EnableMenuItem (SYSTEM.CAST(WIN32.HMENU,wParam), h2d_poppad2.IDM_COPY, iEnable); WINUSER.EnableMenuItem (SYSTEM.CAST(WIN32.HMENU,wParam), h2d_poppad2.IDM_DEL, iEnable); RETURN 0; END; | WINUSER.WM_COMMAND : IF (lParam=1) THEN IF (WINUSER.LOWORD (lParam) = 1) AND ((WINUSER.HIWORD (wParam) = WINUSER.EN_ERRSPACE) OR (WINUSER.HIWORD (wParam) = WINUSER.EN_MAXTEXT)) THEN WINUSER.MessageBox (hwnd, "Edit control out of space.", szAppName, WINUSER.MB_OK BOR WINUSER.MB_ICONSTOP); RETURN 0; END; ELSE CASE (WINUSER.LOWORD (wParam)) OF | h2d_poppad2.IDM_NEW : | h2d_poppad2.IDM_OPEN : | h2d_poppad2.IDM_SAVE : | h2d_poppad2.IDM_SAVEAS : | h2d_poppad2.IDM_PRINT : WINUSER.MessageBeep (0); RETURN 0; | h2d_poppad2.IDM_EXIT : WINUSER.SendMessage (hwnd, WINUSER.WM_CLOSE, 0, 0); RETURN 0; | h2d_poppad2.IDM_UNDO : WINUSER.SendMessage (hwndEdit, WINUSER.WM_UNDO, 0, 0); RETURN 0; | h2d_poppad2.IDM_CUT : WINUSER.SendMessage (hwndEdit, WINUSER.WM_CUT, 0, 0); RETURN 0; | h2d_poppad2.IDM_COPY : WINUSER.SendMessage (hwndEdit, WINUSER.WM_COPY, 0, 0); RETURN 0; | h2d_poppad2.IDM_PASTE : WINUSER.SendMessage (hwndEdit, WINUSER.WM_PASTE, 0, 0); RETURN 0; | h2d_poppad2.IDM_DEL : WINUSER.SendMessage (hwndEdit, WINUSER.WM_CLEAR, 0, 0); RETURN 0; | h2d_poppad2.IDM_SELALL : WINUSER.SendMessage (hwndEdit, WINUSER.EM_SETSEL, 0,-1); RETURN 0; | h2d_poppad2.IDM_HELP : WINUSER.MessageBox (hwnd, "Help not yet implemented!", szAppName, WINUSER.MB_OK BOR WINUSER.MB_ICONEXCLAMATION); RETURN 0; | h2d_poppad2.IDM_ABOUT : WINUSER.MessageBox (hwnd, "POPPAD2 (c) Charles Petzold, 1996, Translation to Stony Brook Modula-2 (c) Peter Stadler, 1997", szAppName, WINUSER.MB_OK BOR WINUSER.MB_ICONINFORMATION); RETURN 0; ELSE RETURN 0; END; END; | WINUSER.WM_CLOSE : IF (WINUSER.IDYES = AskConfirmation (hwnd)) THEN WINUSER.DestroyWindow (hwnd); END; RETURN 0; | WINUSER.WM_QUERYENDSESSION : IF (WINUSER.IDYES = AskConfirmation (hwnd)) THEN RETURN 1; ELSE RETURN 0; END; | WINUSER.WM_DESTROY : WINUSER.PostQuitMessage (0); RETURN 0; ELSE RETURN WINUSER.DefWindowProc (hwnd, iMsg, wParam, lParam); END; RETURN WINUSER.DefWindowProc (hwnd, iMsg, wParam, lParam); END WndProc; <*/POP*> (*++++*****************************************************************) PROCEDURE InitApplication () : BOOLEAN; (**********************************************************************) BEGIN wc.cbSize := SIZE(wc); wc.style := WINUSER.CS_HREDRAW BOR WINUSER.CS_VREDRAW; wc.lpfnWndProc := WndProc; wc.cbClsExtra := 0; wc.cbWndExtra := 0; wc.hInstance := WINX.Instance; wc.hIcon := WINUSER.LoadIcon (WINX.Instance, szAppName); wc.hCursor := WINUSER.LoadCursor (NIL, WINUSER.IDC_ARROW^); wc.hbrBackground := SYSTEM.CAST(WIN32.HBRUSH, WINGDI.GetStockObject (WINGDI.WHITE_BRUSH)); wc.lpszMenuName := SYSTEM.ADR(szAppName); wc.lpszClassName := SYSTEM.ADR(szAppName); wc.hIconSm := WINUSER.LoadIcon (NIL,WINUSER.IDI_APPLICATION^); RETURN WINUSER.RegisterClassEx(wc)#0; END InitApplication; (*++++*****************************************************************) PROCEDURE InitMainWindow () : BOOLEAN; (**********************************************************************) BEGIN hwnd := WINUSER.CreateWindow ( szAppName, (* window class name *) szAppTitle, (* window caption *) WINUSER.WS_OVERLAPPEDWINDOW, (* window style *) WINUSER.GetSystemMetrics (WINUSER.SM_CXSCREEN) / 4, WINUSER.GetSystemMetrics (WINUSER.SM_CYSCREEN) / 4, WINUSER.GetSystemMetrics (WINUSER.SM_CXSCREEN) / 2, WINUSER.GetSystemMetrics (WINUSER.SM_CYSCREEN) / 2, NIL, (* parent window handle *) NIL, (* window menu handle *) wc.hInstance, (* program instance handle *) NIL); (* creation parameters *) IF hwnd = NIL THEN RETURN FALSE; END; WINUSER.ShowWindow (hwnd, WINUSER.SW_SHOWDEFAULT); WINUSER.UpdateWindow (hwnd); hAccel := WINUSER.LoadAccelerators (wc.hInstance, szAppName); RETURN TRUE; END InitMainWindow; BEGIN IF InitApplication() AND InitMainWindow() THEN WHILE (WINUSER.GetMessage(msg,NIL,0,0)) DO IF (WINUSER.TranslateAccelerator (hwnd, hAccel, msg)=0) THEN WINUSER.TranslateMessage(msg); WINUSER.DispatchMessage(msg); END; END; END; END PopPad2.