home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1986-11-21 | 9.7 KB | 275 lines |
- IMPLEMENTATION MODULE EasyMenus;
-
- (* EasyMenus.mod 1.0 Mike Scalora PLink : SCARY
-
- This MODULE is public domain. Freely distributable as long as this
- notice stays in.
-
- This program was originally uploaded to PeopleLink's Amiga Zone. The Amiga
- Zone has well over 2000 members, and a library of thousands of public domain
- files. If you're interested in joining us, call 800-524-0100 (voice)
- or 800-826-8855 (modem).
-
- Modified : 8/7/87 by Richie Bielak
- Adapted for OXXI Modula-2 Compiler.
-
- *)
-
- FROM Intuition IMPORT IntuiText, IntuiTextPtr, MenuItem,
- MenuItemPtr, Menu, MenuPtr, MenuFlagsSet, MenuFlags,
- MenuItemFlags, MenuItemFlagsSet, HighComp, HighBox, HighNone,
- SetMenuStrip, ClearMenuStrip, MenuItemMutualExcludeSet,
- WindowPtr;
- FROM Memory IMPORT AllocMem, FreeMem, MemReqSet, MemPublic;
- FROM SYSTEM IMPORT ADR, ADDRESS, BYTE, TSIZE;
- FROM Rasters IMPORT Jam2, Jam1, DrawModeSet;
-
- PROCEDURE EasyIntuiText(text : ARRAY OF CHAR; x,y,fc,bc : INTEGER): ADDRESS;
- VAR
- I,J : INTEGER;
- TP : POINTER TO ARRAY [0..1000] OF CHAR;
- IT : IntuiTextPtr;
- BEGIN
- I := 0; WHILE (I<=INTEGER(HIGH(text))) AND (text[I]#0C) DO INC(I); END;
- TP := AllocMem(LONGCARD(I+1),MemReqSet{MemPublic});
- IF TP=NIL THEN RETURN(NIL); END;
- TP^[I] := 0C;
- IF I>0 THEN FOR J := 0 TO I-1 DO TP^[J] := text[J]; END; END;
- IT := AllocMem(LONGCARD(TSIZE(IntuiText)),MemReqSet{MemPublic});
- IF IT=NIL THEN FreeMem(TP,LONGCARD(I+1)); RETURN(NIL); END;
- WITH IT^ DO
- FrontPen := BYTE(fc); BackPen := BYTE(bc); IText := TP; NextText := NIL;
- DrawMode := DrawModeSet(1); LeftEdge := x; TopEdge := y; ITextFont := NIL;
- IF fc=bc THEN BackPen := BYTE(bc+1); END;
- END;
- RETURN(IT);
- END EasyIntuiText;
-
- PROCEDURE EasyMenuItem( NextItems,SubItems : ADDRESS;
- x,y,w,h,mx,select,high,fc,bc : INTEGER;
- cmd : CHAR; text : ARRAY OF CHAR): ADDRESS;
- VAR
- MIP : MenuItemPtr; I : INTEGER;
- BEGIN
- MIP := AllocMem(LONGCARD(TSIZE(MenuItem)),MemReqSet{MemPublic});
- IF MIP=NIL THEN RETURN(NIL); END;
- WITH MIP^ DO
- NextItem := NextItems; SubItem := SubItems;
- LeftEdge := x; TopEdge := y; Width := w;
- Height := h;
- MutualExclude := MenuItemMutualExcludeSet(mx);
- Command := BYTE(cmd);
- ItemFill := EasyIntuiText(text,2,1,fc,bc); SelectFill := NIL;
- Flags := MenuItemFlagsSet{ItemText,ItemEnabled};
- IF cmd#0C THEN INCL(Flags,CommSeq); END;
- CASE select OF
- 0 : |
- 1 : Flags := Flags + MenuItemFlagsSet{CheckIt,MenuToggle}; |
- 2 : Flags := Flags + MenuItemFlagsSet{CheckIt,MenuToggle,Checked};
- ELSE; END;
- CASE high OF
- 0 : Flags := Flags + HighComp; |
- 1 : Flags := Flags + HighBox; |
- 3 : Flags := Flags + HighNone;
- ELSE Flags := Flags + HighComp;
- END;
- END;
- RETURN(ADDRESS(MIP));
- END EasyMenuItem;
-
- PROCEDURE EasyItemStrip(x,y,w,mx,select,selected,high : INTEGER;
- text : ARRAY OF CHAR): ADDRESS;
- TYPE
- TextPtr = POINTER TO ARRAY [1..1000] OF CHAR;
- VAR
- I,J,L,LL,MX,SEL,W,Y : INTEGER; CMD : ARRAY [1..32] OF CHAR;
- TP : ARRAY [1..32] OF TextPtr;
- PIP,PPIP : ADDRESS; MXBSP : POINTER TO BITSET;
- BEGIN
- IF x=0 THEN x := 1; END; IF y=0 THEN y := 1; END;
- J := 1; L := 0; LL := 0; I := 0; TP[1] := ADR(text);
- IF TP[1]^[1]='@' THEN
- CMD[1] := TP[1]^[2]; TP[1]:= ADDRESS(TP[1])+ADDRESS(2);
- ELSE CMD[1] := 0C; END;
- WHILE (I<=INTEGER(HIGH(text))) AND (text[I]#0C) DO
- IF text[I]='|' THEN
- IF LL<L THEN LL := L; END; (* save length if longest so far *)
- text[I] := 0C; L := 0; INC(J); TP[J] := ADR(text[I+1]);
- IF TP[J]^[1]='@' THEN CMD[J] := TP[J]^[2];
- TP[J]:= ADDRESS(TP[J])+ADDRESS(2); INC(I,2);
- ELSE CMD[J] := 0C; END;
- ELSE INC(L); END;
- INC(I);
- END;
- IF LL<L THEN LL := L; END; (* save length if longest so far *)
- MX := 0; TP[J+1] := NIL; PIP := NIL; L := LL*8+7; MXBSP := ADR(MX);
- IF L<w THEN L := w; END;
- FOR I := J TO 1 BY -1 DO
- IF selected=I THEN SEL := 2; ELSE SEL := select; END;
- IF mx=1 THEN MX := -1; EXCL(MXBSP^,CARDINAL(I-1)); END; PPIP := PIP;
- PIP:=EasyMenuItem(PIP,NIL,x,(I-1)*9+y,L,9,MX,SEL,high,0,1,CMD[I],TP[I]^);
- IF PIP=NIL THEN IF PPIP#NIL THEN
- DisposeEasyItemStrip(PPIP); END; RETURN(NIL); END;
- END;
- RETURN(PIP);
- END EasyItemStrip;
-
- PROCEDURE EasyMenu(NextMenus,Items : ADDRESS; x,w : INTEGER;
- text : ARRAY OF CHAR): ADDRESS;
- VAR
- MP : MenuPtr;
- TP : POINTER TO ARRAY [0..1000] OF CHAR; I,J : INTEGER;
- BEGIN
- I := 0; WHILE (I<=INTEGER(HIGH(text))) AND (text[I]#0C) DO INC(I); END;
- TP := AllocMem(LONGCARD(I+1),MemReqSet{MemPublic}); TP^[I] := 0C;
- IF TP=NIL THEN RETURN(NIL); END;
- IF I>0 THEN FOR J := 0 TO I-1 DO TP^[J] := text[J]; END; END;
- MP := AllocMem(LONGCARD(TSIZE(Menu)),MemReqSet{MemPublic});
- IF MP=NIL THEN FreeMem(TP,LONGCARD(I+1)); RETURN(NIL); END;
- WITH MP^ DO
- NextMenu := NextMenus; LeftEdge := x; TopEdge := 1;
- Width := w; Height := 10; MenuName := TP; FirstItem := Items;
- Flags := MenuFlagsSet{MenuEnabled};
- END;
- RETURN(ADDRESS(MP));
- END EasyMenu;
-
- PROCEDURE EasyMenuStrip(x : INTEGER; mx,select,high : BITSET;
- text1,text2,text3,text4,text5,text6,text7,
- text8,text9,text10,text11,text12 : ARRAY OF CHAR): ADDRESS;
- VAR
- MP : MenuPtr; TP : POINTER TO ARRAY [1..1000] OF CHAR;
- I,J,K,MX,SEL,HI,W : INTEGER; RAD : ADDRESS;
- text : POINTER TO ARRAY [0..1000] OF CHAR;
- BEGIN
- MP := NIL;
- FOR K := 12 TO 1 BY -1 DO
- CASE K OF
- 1 : text := ADR(text1); HI := HIGH(text1); |
- 2 : text := ADR(text2); HI := HIGH(text2); |
- 3 : text := ADR(text3); HI := HIGH(text3); |
- 4 : text := ADR(text4); HI := HIGH(text4); |
- 5 : text := ADR(text5); HI := HIGH(text5); |
- 6 : text := ADR(text6); HI := HIGH(text6); |
- 7 : text := ADR(text7); HI := HIGH(text7); |
- 8 : text := ADR(text8); HI := HIGH(text8); |
- 9 : text := ADR(text9); HI := HIGH(text9); |
- 10 : text := ADR(text10); HI := HIGH(text10); |
- 11 : text := ADR(text11); HI := HIGH(text11); |
- 12 : text := ADR(text12); HI := HIGH(text12); ELSE;
- END;
- IF text^[0]#0C THEN
- I := 0;
- WHILE (I<=HI) AND (text^[I]#0C) AND (text^[I]#'|') DO
- INC(I); END;
- IF (text^[I]='|') AND ((I+1)<=HI) AND (text^[I+1]#0C) THEN
- text^[I] := 0C; W := I*8+7; TP := ADR(text^[I+1]);
- MP := EasyMenu(MP,NIL,0,W,text^);
- IF MP=NIL THEN RETURN(NIL); END;
- text^[HI] := 0C;
- IF CARDINAL(K) IN select THEN SEL := 1; ELSE SEL := 0; END;
- IF CARDINAL(K) IN mx THEN MX := 1; ELSE MX := 0; END;
- IF CARDINAL(K) IN high THEN HI := 1; ELSE HI := 0; END;
- MP^.FirstItem := EasyItemStrip(1,1,W,MX,SEL,0,HI,TP^);
- IF MP^.FirstItem=NIL THEN
- DisposeEasyMenu(MP); RETURN(NIL); END;
- END;
- END;
- END;
- I := x; RAD := MP;
- WHILE MP#NIL DO
- MP^.LeftEdge := I; INC(I,MP^.Width); MP := MP^.NextMenu; END;
- RETURN(RAD);
- END EasyMenuStrip;
-
-
- PROCEDURE DisposeEasyIntuiText(ITextPtr : ADDRESS);
- VAR
- I : INTEGER; TP : POINTER TO ARRAY [1..1000] OF CHAR;
- ITP : IntuiTextPtr;
- BEGIN
- ITP := ITextPtr; TP := ITP^.IText; I := 1;
- WHILE TP^[I]#0C DO INC(I); END;
- FreeMem(TP,LONGCARD(I));
- FreeMem(ITP,LONGCARD(TSIZE(IntuiText)));
- END DisposeEasyIntuiText;
-
- PROCEDURE DisposeEasyItem(ItemPtr : ADDRESS);
- VAR
- IP : MenuItemPtr;
- BEGIN
- IP := ItemPtr;
- DisposeEasyIntuiText(IP^.ItemFill);
- FreeMem(IP,LONGCARD(TSIZE(MenuItem)));
- END DisposeEasyItem;
-
- PROCEDURE DisposeEasyItemStrip(ItemPtr : ADDRESS);
- VAR
- AItemPtr : MenuItemPtr;
- BEGIN
- AItemPtr := ItemPtr;
- IF AItemPtr^.NextItem#NIL THEN
- DisposeEasyItemStrip(AItemPtr^.NextItem); END;
- IF AItemPtr^.SubItem#NIL THEN
- DisposeEasyItemStrip(AItemPtr^.SubItem); END;
- DisposeEasyItem(ItemPtr);
- END DisposeEasyItemStrip;
-
- PROCEDURE DisposeEasyMenu(MenuPt : ADDRESS);
- VAR
- I : INTEGER; TP : POINTER TO ARRAY [1..1000] OF CHAR;
- IMP : MenuPtr;
- BEGIN
- IMP := MenuPt; TP := IMP^.MenuName; I := 1;
- WHILE TP^[I]#0C DO INC(I); END;
- FreeMem(TP,LONGCARD(I));
- FreeMem(IMP,LONGCARD(TSIZE(Menu)));
- END DisposeEasyMenu;
-
- PROCEDURE DisposeEasyMenuStrip(MenuPt : ADDRESS);
- VAR
- AMenuPtr : MenuPtr;
- BEGIN
- AMenuPtr := MenuPt;
- IF AMenuPtr^.NextMenu#NIL THEN
- DisposeEasyMenuStrip(AMenuPtr^.NextMenu); END;
- IF AMenuPtr^.FirstItem#NIL THEN
- DisposeEasyItemStrip(AMenuPtr^.FirstItem); END;
- DisposeEasyMenu(MenuPt);
- END DisposeEasyMenuStrip;
-
- PROCEDURE SubItemNum(MenuNumber : INTEGER): CARDINAL;
- BEGIN
- IF BITSET(MenuNumber)>=BITSET{11..15} THEN RETURN(0);
- ELSE RETURN(CARDINAL(MenuNumber) DIV 2048 + 1); END;
- END SubItemNum;
-
- PROCEDURE ItemNum(MenuNumber : INTEGER): CARDINAL;
- BEGIN
- IF BITSET(MenuNumber)>=BITSET{5..10} THEN RETURN(0);
- ELSE RETURN(CARDINAL(BITSET(MenuNumber)-BITSET{11..15}) DIV 32 + 1); END;
- END ItemNum;
-
- PROCEDURE MenuNum(MenuNumber : INTEGER): CARDINAL;
- BEGIN
- IF BITSET(MenuNumber)>=BITSET{0..4} THEN RETURN(0);
- ELSE RETURN(CARDINAL(BITSET(MenuNumber)-BITSET{5..15}) + 1); END;
- END MenuNum;
-
- PROCEDURE AttachMenuStrip(WindPtr, MenuPt : ADDRESS);
- VAR wp : WindowPtr; MP : MenuPtr;
- BEGIN
- MP := MenuPt;
- wp := WindPtr;
- SetMenuStrip(wp^,MP^);
- END AttachMenuStrip;
-
- PROCEDURE DetachMenuStrip(WindPtr : ADDRESS);
- VAR wp : WindowPtr;
- BEGIN
- wp := WindPtr;
- ClearMenuStrip(wp^);
- END DetachMenuStrip;
-
- END EasyMenus.
-