fpc/packages/amunits/examples/gtmenu.pas
Michaël Van Canneyt 99106402cb * PChar -> PAnsiChar
2023-07-15 18:22:39 +02:00

168 lines
4.6 KiB
ObjectPascal

Program GadtoolsMenu;
{* gadtoolsmenu.p
** Example showing the basic usage of the menu system with a window.
** Menu layout is done with GadTools, as is recommended for applications.
**
*}
{
Changed to use TAGS and pas2c.
1 Nov 1998.
Updated for systemvartags.
28 Nov 2002.
nils.sjoholm@mailbox.swipnet.se
}
uses Exec, Intuition, Utility, GadTools;
const
mynewmenu : array[0..15] of tNewMenu = (
(nm_Type: NM_TITLE; nm_Label:'Project'; nm_CommKey: NIL; nm_Flags:0;
nm_MutualExclude:0; nm_UserData:NIL),
(nm_Type: NM_ITEM; nm_Label:'Open...'; nm_CommKey:'O'; nm_Flags:0;
nm_MutualExclude:0; nm_UserData:NIL),
(nm_Type: NM_ITEM; nm_Label:'Save'; nm_CommKey:'S'; nm_Flags:0;
nm_MutualExclude:0; nm_UserData:NIL),
(nm_Type: NM_ITEM; nm_Label:nil; nm_CommKey: NIL; nm_Flags:0;
nm_MutualExclude:0; nm_UserData:NIL),
(nm_Type: NM_ITEM; nm_Label:'Print'; nm_CommKey: NIL; nm_Flags:0;
nm_MutualExclude:0; nm_UserData:NIL),
(nm_Type: NM_SUB; nm_Label:'Draft'; nm_CommKey: NIL; nm_Flags:0;
nm_MutualExclude:0; nm_UserData:NIL),
(nm_Type: NM_SUB; nm_Label:'NLQ'; nm_CommKey: NIL; nm_Flags:0;
nm_MutualExclude:0; nm_UserData:NIL),
(nm_Type: NM_ITEM; nm_Label:nil; nm_CommKey: NIL; nm_Flags:0;
nm_MutualExclude:0; nm_UserData:NIL),
(nm_Type: NM_ITEM; nm_Label:'Quit...'; nm_CommKey:'Q'; nm_Flags:0;
nm_MutualExclude:0; nm_UserData:NIL),
(nm_Type: NM_TITLE; nm_Label:'Edit'; nm_CommKey: NIL; nm_Flags:0;
nm_MutualExclude:0; nm_UserData:NIL),
(nm_Type: NM_ITEM; nm_Label:'Cut'; nm_CommKey:'X'; nm_Flags:0;
nm_MutualExclude:0; nm_UserData:NIL),
(nm_Type: NM_ITEM; nm_Label:'Copy'; nm_CommKey:'C'; nm_Flags:0;
nm_MutualExclude:0; nm_UserData:NIL),
(nm_Type: NM_ITEM; nm_Label:'Paste'; nm_CommKey:'V'; nm_Flags:0;
nm_MutualExclude:0; nm_UserData:NIL),
(nm_Type: NM_ITEM; nm_Label:nil; nm_CommKey: NIL; nm_Flags:0;
nm_MutualExclude:0; nm_UserData:NIL),
(nm_Type: NM_ITEM; nm_Label:'Undo'; nm_CommKey:'Z'; nm_Flags:0;
nm_MutualExclude:0; nm_UserData:NIL),
(nm_Type: NM_END; nm_Label:NIL; nm_CommKey:NIL; nm_Flags:0;
nm_MutualExclude:0; nm_UserData:NIL));
var
win : pWindow;
myVisualInfo : Pointer;
menuStrip : pMenu;
msg : pMessage;
done : boolean;
Procedure Die;
begin
if assigned(MenuStrip) then begin
ClearMenuStrip(win);
FreeMenus(MenuStrip);
end;
if assigned(myVisualInfo) then FreeVisualInfo(myVisualInfo);
if assigned(win) then CloseWindow(win);
Halt(0);
end;
{*
** Watch the menus and wait for the user to select the close gadget
** or quit from the menus.
*}
PROCEDURE ProcessIDCMP;
VAR
IMessage : tIntuiMessage;
IPtr : pIntuiMessage;
Procedure ProcessMenu;
var
MenuNumber : Word;
ItemNumber : Word;
SubItemNumber : Word;
begin
if IMessage.Code = MENUNULL then
Exit;
MenuNumber := MenuNum(IMessage.Code);
ItemNumber := ItemNum(IMessage.Code);
SubItemNumber := SubNum(IMessage.Code);
if (MenuNumber = 0) and (ItemNumber = 5) then done := true;
end;
begin
IPtr := pIntuiMessage(Msg);
IMessage := IPtr^;
ReplyMsg(Msg);
case IMessage.IClass of
IDCMP_MENUPICK : ProcessMenu;
IDCMP_CLOSEWINDOW : done := True;
end;
end;
{*
** Open all of the required libraries and set-up the menus.
*}
begin
win := OpenWindowTags(NIL, [
WA_Width, 400,
WA_Activate, ltrue,
WA_Height, 100,
WA_CloseGadget, ltrue,
WA_Title, AsTag('Menu Test Window'),
WA_IDCMP, IDCMP_CLOSEWINDOW or IDCMP_MENUPICK,
TAG_END]);
if win = nil then die;
myVisualInfo := GetVisualInfoA(win^.WScreen,nil);
if myVisualInfo = nil then die;
{
make the barlabels
}
mynewmenu[3].nm_Label := PAnsiChar(NM_BARLABEL);
mynewmenu[7].nm_Label := PAnsiChar(NM_BARLABEL);
mynewmenu[13].nm_Label := PAnsiChar(NM_BARLABEL);
if pExecBase(_ExecBase)^.LibNode.Lib_Version >= 39 then begin
MenuStrip := CreateMenus(@mynewmenu, [
GTMN_FrontPen, 1,
TAG_END]);
end else MenuStrip := CreateMenusA(@mynewmenu,NIL);
if menuStrip = nil then die;
if not LayoutMenusA(menuStrip, myVisualInfo,nil) then die;
if not SetMenuStrip(win,menuStrip) then die;
repeat
Msg := WaitPort(win^.UserPort);
Msg := GetMsg(win^.UserPort);
ProcessIDCMP;
until done;
die;
end.