home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1987-05-17 | 10.7 KB | 399 lines |
- IMPLEMENTATION MODULE MyWindow;
-
-
- (*$S-*)(*$T-*)(*$A+*)
- (*
- PART OF Windowed Development program for Modula 2
-
- This creates, opens and maintains the DirUtil window.
- It contains a couple of other importable routines for
- user alterations.
-
- Written: 3/21/87 by Greg Browne
-
- Compiles on TDI's Modula-2 Compiler version 2.20a
-
-
- *)
-
- FROM SYSTEM IMPORT ADR, BYTE, ADDRESS, NULL,TSIZE,CODE;
- FROM Intuition IMPORT PropInfo,IntuitionName,IntuitionBase,
- WindowFlags,WindowPtr,NewWindow,Border,
- IDCMPFlags,IDCMPFlagSet,WindowFlagSet,
- WBenchScreen,SmartRefresh,ScreenFlagSet,
- Image,SimpleRefresh;
- FROM GraphicsLibrary IMPORT GraphicsName, GraphicsBase,Jam1;
- FROM Libraries IMPORT OpenLibrary,CloseLibrary;
- FROM Windows IMPORT OpenWindow,CloseWindow;
- FROM Gadgets IMPORT HighNone,HighComplement,
- ModifyProp,BoolGadget,PropGadget,StrGadget;
-
- (*--------------------------------------------------------------------*)
-
- (* ALL CONSTANTS AND MOST VARIABLES/TYPES DEFINED IN MyGlobals.def FILE
- FOR IMPORTATION
- *)
-
- FROM MyGlobals IMPORT StringBufSize,RegFlags,StringFlags,SliderFlags,
- WBColors,GadgetNames,IOStringInfo,MyWindowPtr,
- IOString,GadTxt,MyGads,NullReqPtr;
-
- (* REALLY Defined in MyGlobals.def
-
- GadgetNames = (df0,df1,df2,dh0,dh1,ram,vd0,
- up1,down1,
- filewindow,
- arc,bytes,copy,copydel,deldir,delete,
- dofr,dorf,edit,hprint,htype,info,link,makedir,
- modula,move,parent,print,rename,
- retag,root,show,stod,swap,tagall,type,untag,
- slider,
- brun,bsource,bdest, (* relative order of these six *)
- run,source,dest, (* IS IMPORTANT *)
- msg);
-
- *)
-
- TYPE
- BorderTypes = (filewind,rsd,device,command,message);
-
- VAR
- SlideImage : Image;
- Borders : ARRAY BorderTypes OF Border;
- SlideInfo : PropInfo;
-
- (* ---------------------------*)
- (* INTERNAL ONLY PROCEDURES *)
- (* ---------------------------*)
-
- PROCEDURE InitWindow(VAR text:ARRAY OF CHAR;FirstGad:ADDRESS):WindowPtr;
- VAR w : NewWindow;
- BEGIN
- WITH w DO
- LeftEdge := 0; TopEdge := 0;
- Width := 558; Height := 132;
- DetailPen := BYTE (ORD(Blue)); BlockPen := BYTE (ORD(White));
- Title := ADR(text);
- Flags := WindowFlagSet{WindowSizing,WindowDepth,WindowDrag,RMBTrap,
- Activate,WindowClose} + SmartRefresh;
- IDCMPFlags := IDCMPFlagSet{CloseWindowFlag,MouseButtons,GadgetUp,
- ResfreshWindow};
- Type := ScreenFlagSet{WBenchScreen};
- CheckMark := NULL;
- FirstGadget := FirstGad;
- Screen := NULL; BitMap := NULL;
- MinWidth := 80; MinHeight := 40;
- MaxWidth := 558; MaxHeight := 132;
- END;
- RETURN OpenWindow(w)
- END InitWindow;
-
- (* ---------------------------*)
- (* Entry/exit code off to create "static" border structures with CODE *)
- (* This method saves size since I am keeping it under 32767 for $A+ *)
- (* ---------------------------*)
-
- (*$P-*)
-
- PROCEDURE CBorder;
- BEGIN
- CODE(0FFFFH,0FFFFH,61,0FFFFH,61,9,0FFFFH,9,0FFFFH,0FFFFH);
- END CBorder;
-
- (*$P-*)
-
- PROCEDURE DBorder;
- BEGIN
- CODE(0FFFFH,0FFFFH,39,0FFFFH,39,9,0FFFFH,9,0FFFFH,0FFFFH);
- END DBorder;
-
- (*$P-*)
-
- PROCEDURE MBorder;
- BEGIN
- CODE(0FFFEH,0FFFEH,277,0FFFEH,277,0FFF4H,277,0FFFEH);
- CODE(512,0FFFEH,512,8,0FFFEH,8,0FFFEH,0FFFEH);
- END MBorder;
-
- (*$P-*)
-
- PROCEDURE RBorder;
- BEGIN
- CODE(0FFFEH,0FFFEH,232,0FFFEH,232,8,0FFFEH,8,0FFFEH,0FFFEH);
- END RBorder;
-
- (*$P-*)
-
- PROCEDURE FBorder;
- BEGIN
- CODE(0FFFFH,0FFFFH,307,0FFFFH,283,0FFFFH,283,97,0FFFFH,97,0FFFFH,0FFFFH);
- END FBorder;
-
- (*$P+*)
-
- (* ---------------------------*)
-
- PROCEDURE SetIText(it :GadgetNames;
- VAR text :ARRAY OF CHAR;
- Left :INTEGER);
- BEGIN
- WITH GadTxt[it] DO
- FrontPen := BYTE(ORD(White));
- BackPen := BYTE(ORD(Blue));
- DrawMode := BYTE(Jam1);
- LeftEdge := Left; TopEdge := 1;
- ITextFont := NULL; IText := ADR(text);
- NextText := NULL;
- END;
- END SetIText;
-
- (* ---------------------------*)
-
- PROCEDURE OneGadget(gadg:GadgetNames; L,T,W,H:INTEGER;
- textptr:ADDRESS; Bdr:ADDRESS;
- spinfoptr:ADDRESS; GadType:CARDINAL);
- BEGIN
- WITH MyGads[gadg] DO
- NextGadget := NULL;
- LeftEdge := L; TopEdge := T;
- Width := W; Height := H;
- Flags := HighComplement; Activation := RegFlags;
- GadgetType := GadType; GadgetRender := Bdr;
- SelectRender := NULL; GadgetText := textptr;
- MutualExclude := 0; SpecialInfo := spinfoptr;
- GadgetID := CARDINAL(ORD(gadg));
- UserData := NULL;
- END
- END OneGadget;
-
- (* ---------------------------*)
-
- PROCEDURE InitGadgets():ADDRESS;
- (*
- Procedure to initialize all the gadgets and related structures
- internal to the module only
- *)
- VAR i,m:GadgetNames; j,k: CARDINAL;
- BEGIN
- WITH Borders[command] DO (* Point to the borders *)
- LeftEdge := 0; TopEdge := 0; (* And define color/type *)
- FrontPen := BYTE(ORD(White)); BackPen := BYTE(ORD(Blue));
- DrawMode := BYTE(Jam1); Count := BYTE(5);
- XY := ADDRESS(CBorder); NextBorder := NULL
- END;
- Borders[device] := Borders[command]; (* all same except sizes *)
- Borders[device].XY := ADDRESS(DBorder);
- Borders[message] := Borders[command];
- Borders[message].XY := ADDRESS(MBorder);
- Borders[message].Count := BYTE(8);
- Borders[rsd] := Borders[command];
- Borders[rsd].XY := ADDRESS(RBorder);
- Borders[filewind] := Borders[command];
- Borders[filewind].XY := ADDRESS(FBorder);
- Borders[filewind].Count := BYTE(6);
-
- (* This section sets up the gadget text and colors/rendering *)
-
- SetIText(df0, "df0:",4);
- SetIText(df1, "df1:",4);
- SetIText(df2, "df2:",4);
- SetIText(dh0, "dh0:",4);
- SetIText(dh1, "dh1:",4);
- SetIText(ram, "ram:",4);
- SetIText(vd0, "vd0:",4);
-
- SetIText(up1, "+",5);
- SetIText(down1,"-",5);
-
- SetIText(run, "R", -14);
- SetIText(source, "S", -14);
- SetIText(dest, "D", -14);
- SetIText(msg, "M", -14);
-
- SetIText(filewindow,"", 0);
-
- SetIText(arc, "ARC", 18);
- SetIText(bytes, "BYTES", 10);
- SetIText(copy, "COPY", 14);
- SetIText(copydel,"CPYDEL", 6);
- SetIText(deldir, "DELDIR", 6);
- SetIText(delete, "DELETE", 6);
- SetIText(dofr, "DO f+R", 6);
-
- SetIText(dorf, "DO R+f", 6);
- SetIText(edit, "EDIT", 14);
- SetIText(hprint, "HPRINT", 6);
- SetIText(htype, "HTYPE", 10);
- SetIText(info, "INFO", 14);
- SetIText(link, "LINK", 14);
- SetIText(makedir,"MAKDIR", 6);
-
- SetIText(modula, "MODULA", 6);
- SetIText(move, "MOVE", 14);
- SetIText(parent, "PARENT", 6);
- SetIText(print, "PRINT", 10);
- SetIText(rename, "RENAME", 6);
- SetIText(retag, "RETAG", 10);
- SetIText(root, "ROOT", 14);
-
- SetIText(show, "SHOW", 14);
- SetIText(stod, "S->D", 14);
- SetIText(swap, "SWAP", 14);
- SetIText(tagall, "TAGALL", 6);
- SetIText(type, "TYPE", 14);
- SetIText(untag, "UNTAG", 10);
-
- WITH SlideInfo DO (* Define the slider information *)
- Flags := SliderFlags;
- VertPot := 8000H;
- VertBody := 0FFFFH;
- END;
-
- FOR i := run TO msg DO (* Setup and null all IOStringInfos *)
- GadTxt[i].FrontPen := BYTE(ORD(Green));
- GadTxt[i].TopEdge := 0;
- IOString[i] := "";
- WITH IOStringInfo[i] DO
- Buffer := ADR(IOString[i]); UndoBuffer := NULL;
- BufferPos := 0; MaxChars := StringBufSize;
- DispPos := 0; NumChars := 0;
- END;
- END;
-
- (* THIS SECTION NOW DEFINES THE GADGETS AND LINKS UP THE STRUCTURES *)
-
- (*Device gadgets*)
- j := 6;
- FOR i := df0 TO vd0 DO
- GadTxt[i].FrontPen := BYTE(ORD(Black));
- OneGadget(i, j, 14, 38, 9,ADR(GadTxt[i]),ADR(Borders[device]),
- NULL, BoolGadget);
- INC(j,40)
- END;
-
-
- (* String gadgets *)
- j := 93;
- FOR i := run TO dest DO
- OneGadget(i,324,j, 232, 10,ADR(GadTxt[i]), ADR(Borders[rsd]),
- ADR(IOStringInfo[i]), StrGadget);
- INC(j,10);
- END;
-
- (* Blanking gadgets *)
-
- j := 92;
- FOR i := brun TO bdest DO
- OneGadget(i,307,j, 15, 9,ADR(GadTxt[i]), NULL,
- NULL, BoolGadget);
- INC(j,10);
- END;
-
- (* Message gadget *)
-
- OneGadget(msg,28,123,512,10,ADR(GadTxt[msg]),ADR(Borders[message]),
- ADR(IOStringInfo[msg]), StrGadget);
-
- (* Filewindow gadget *)
-
- OneGadget(filewindow,5,24,281,97,NULL,ADR(Borders[filewind]),
- NULL,BoolGadget);
-
- MyGads[filewindow].Flags := HighNone;
-
- (* Command gadgets *)
- j := 14; k := 306;
- FOR i := arc TO untag DO
- OneGadget(i, k, j, 60, 9,ADR(GadTxt[i]),ADR(Borders[command]),
- NULL, BoolGadget);
- INC(j,10);
- IF j>74 THEN
- j := 14;
- INC(k,63);
- END;
- END;
-
-
- (* Slider gadget *)
-
- OneGadget(slider, 288, 33, 18, 79,NULL,ADR(SlideImage),
- ADR(SlideInfo), PropGadget);
-
- (* Up/Down gadgets *)
-
- OneGadget(up1, 288, 24, 17, 9,ADR(GadTxt[up1]),NULL,
- NULL,BoolGadget);
-
- OneGadget(down1, 288, 112, 17, 9,ADR(GadTxt[down1]),NULL,
- NULL, BoolGadget);
-
- FOR i := df0 TO dest DO
- m := i; INC(m);
- MyGads[i].NextGadget := ADR(MyGads[m])
- END;
- RETURN ADR(MyGads[df0])
- END InitGadgets;
-
-
- (* ---------------------------*)
- (* EXTERNAL PROCEDURES *)
- (* ---------------------------*)
-
-
- PROCEDURE SlidePot():CARDINAL;
- (*
- Function returns the current value of the slider VertPot)
- *)
- BEGIN
- RETURN CARDINAL(SlideInfo.VertPot);
- END SlidePot;
-
-
- PROCEDURE ResetSlider(bod:CARDINAL);
- (*
- Resets slide gadget size to the size passed in
- *)
- BEGIN
- ModifyProp(MyGads[slider],MyWindowPtr,NullReqPtr^,SliderFlags,0,0,0,bod);
- END ResetSlider;
-
- (* ---------------------------*)
-
- PROCEDURE CloseMyWindow;
- (*
- Closes the window and intuition and graphics bases if they are open
- *)
-
- BEGIN
- IF (MyWindowPtr # NULL) THEN CloseWindow (MyWindowPtr^) END;
- IF IntuitionBase <> 0 THEN CloseLibrary(IntuitionBase) END;
- IF GraphicsBase <> 0 THEN CloseLibrary(GraphicsBase) END;
- END CloseMyWindow;
-
- (* ---------------------------*)
-
- PROCEDURE OpenMyWindow(VAR name:ARRAY OF CHAR):BOOLEAN;
-
- (*
- The external primary procedure - sets up and opens the window
- *)
-
- BEGIN
- IF (GraphicsBase <> 0) AND (IntuitionBase <> 0) THEN
- MyWindowPtr := InitWindow(name,InitGadgets());
- RETURN (MyWindowPtr # NULL)
- ELSE
- RETURN FALSE
- END
- END OpenMyWindow;
-
-
- (********)
- (* MAIN *)
- (********)
-
- BEGIN
- IntuitionBase := OpenLibrary (IntuitionName,0);
- GraphicsBase := OpenLibrary (GraphicsName,0);
- END MyWindow.
-