home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
230.lha
/
SPY
/
Sources
/
IntuiCommon.Mod
< prev
next >
Wrap
Text File
|
1989-04-08
|
11KB
|
358 lines
IMPLEMENTATION MODULE IntuiCommon;
(* * * * * * * * * * * * * * * * * * * * * * *)
(* Common Intuition-related routines. *)
(* Originally written for the TDI package, *)
(* but was quickly modified for the Oxxi *)
(* compiler. *)
(* *)
(* (c) Copyright 1987 by Steve Faiwiszewski. *)
(* This program may be freely distributed, *)
(* but it is not to be sold. *)
(* Please leave this notice intact. *)
(* * * * * * * * * * * * * * * * * * * * * * *)
FROM Termination IMPORT AddTerminator;
FROM Conversions IMPORT ConvStringToNumber;
FROM Strings IMPORT StringLength;
FROM Rasters IMPORT DrawModeSet;
FROM Views IMPORT ViewModesSet, Hires, Lace, LoadRGB4;
FROM Intuition IMPORT Border, BorderPtr, Gadget, GadgetPtr,
GadgetFlagsSet, CustomScreen,
GadgetActivationSet, WBenchScreen,
GadgetMutualExcludeSet,
GadgetTypeSet, IDCMPFlagsSet,
WindowPtr, ScreenPtr, NewWindow,
NewScreen, ShowTitle,
WindowFlagsSet, OpenWindow, OpenScreen,
Requester, IntuiText, MenuEnabled,
MenuItemMutualExcludeSet, HighComp,
IntuiTextPtr, Menu, MenuPtr, MenuItem,
MenuItemPtr, MenuFlagsSet, CommSeq,
MenuItemFlagsSet, ItemText, ItemEnabled,
RememberPtr, AllocRemember,
FreeRemember, InitRequester;
FROM Memory IMPORT MemReqSet, MemChip, MemPublic;
FROM SYSTEM IMPORT BYTE, ADDRESS, ADR, TSIZE;
PROCEDURE ReleaseAllocations;
BEGIN
FreeRemember(RKey, TRUE);
END ReleaseAllocations;
PROCEDURE InitMenuRec (VAR Amenu : Menu;
left, top, width, height : INTEGER;
text : ADDRESS) : MenuPtr;
(* Initialize a menu record. *)
BEGIN
WITH Amenu DO
NextMenu := NIL;
LeftEdge := left; TopEdge := top;
Width := width; Height := height;
Flags := MenuFlagsSet{MenuEnabled};
MenuName := text;
FirstItem := NIL
END;
RETURN (ADR(Amenu))
END InitMenuRec;
PROCEDURE InitItemRec (VAR mi : MenuItem;
left, top,
width, height : INTEGER;
Cmd : CHAR;
ItemFillPtr : ADDRESS) : MenuItemPtr;
(* Initialize an item record. *)
BEGIN
WITH mi DO
NextItem := NIL;
LeftEdge := left;
TopEdge := top;
Width := width;
Height := height;
Flags :=
MenuItemFlagsSet{ItemText, ItemEnabled} + HighComp;
MutualExclude := MenuItemMutualExcludeSet{};
ItemFill := ItemFillPtr;
SelectFill := NIL;
Command := BYTE(Cmd);
IF Cmd <> 0C THEN
Flags := Flags + MenuItemFlagsSet{CommSeq}
END;
SubItem := NIL;
NextSelect := 0;
END;
RETURN(ADR(mi))
END InitItemRec;
PROCEDURE InitTextRec (VAR it : IntuiText;
left, top : INTEGER;
front, back : BYTE;
Mode : DrawModeSet;
text : ADDRESS) : IntuiTextPtr;
(* Initialize menu text record. *)
BEGIN
WITH it DO
FrontPen := front;
BackPen := back;
LeftEdge := left;
TopEdge := top;
DrawMode := Mode;
ITextFont := NIL;
IText := text;
NextText := NIL
END;
RETURN(ADR(it));
END InitTextRec;
PROCEDURE InitBorder(VAR border : Border;
Left, Top : INTEGER;
Front, Back,
count : BYTE;
Mode : DrawModeSet;
Coords : ADDRESS;
Next : BorderPtr);
BEGIN
WITH border DO
LeftEdge := Left;
TopEdge := Top;
FrontPen := Front;
BackPen := Back;
DrawMode := Mode;
Count := count;
XY := Coords;
NextBorder := Next;
END;
END InitBorder;
PROCEDURE InitGadget(VAR gadget : Gadget;
Left, Top : INTEGER;
width, height : INTEGER;
flags : GadgetFlagsSet;
Activate : GadgetActivationSet;
Type : GadgetTypeSet;
Render : ADDRESS;
Select : ADDRESS;
Special: ADDRESS;
ID : CARDINAL;
User : ADDRESS;
Text : IntuiTextPtr) : GadgetPtr;
BEGIN
WITH gadget DO
NextGadget := NIL;
LeftEdge := Left;
TopEdge := Top;
Width := width; Height := height;
Flags := flags;
Activation := Activate;
GadgetType := Type;
GadgetRender := Render;
SelectRender := Select;
GadgetText := Text;
MutualExclude := GadgetMutualExcludeSet{};
SpecialInfo := Special;
GadgetID := ID; UserData := User
END;
RETURN(ADR(gadget));
END InitGadget;
PROCEDURE InitReq(VAR requester : Requester;
Left, Top : INTEGER;
width, height : INTEGER;
gadget : GadgetPtr;
border : BorderPtr;
Text : IntuiTextPtr;
Fill : BYTE);
BEGIN
InitRequester(requester);
WITH requester DO
LeftEdge := Left;
TopEdge := Top;
Width := width;
Height := height;
ReqGadget := gadget;
ReqText := Text;
ReqBorder := border;
BackFill := Fill;
END;
END InitReq;
PROCEDURE InitCoordEntry(VAR coords : ARRAY OF CoordinateType;
offset : CARDINAL;
left, top : INTEGER);
BEGIN
WITH coords[offset] DO Left := left; Top := top END;
END InitCoordEntry;
PROCEDURE SetUpSimpleBorder(VAR Coords: ARRAY OF CoordinateType;
GadWidth, GadHeight : CARDINAL;
VAR border : Border;
Left, Top : INTEGER;
Front, Back,
count : BYTE;
Mode : DrawModeSet;
NextBorder : BorderPtr);
BEGIN
InitCoordEntry(Coords,0,0,0);
InitCoordEntry(Coords,1,GadWidth+1,0);
InitCoordEntry(Coords,2,GadWidth+1,GadHeight+1);
InitCoordEntry(Coords,3,0,GadHeight+1);
InitCoordEntry(Coords,4,0,0);
InitBorder(border,Left,Top,Front,Back,count,Mode,
ADR(Coords),NIL);
END SetUpSimpleBorder;
PROCEDURE AllocateStandardBorder(Width, Height : CARDINAL;
Front, Back : BYTE;
Mode : DrawModeSet): BorderPtr;
VAR
BorderP : BorderPtr;
CoordPtr: POINTER TO StandardCoordType;
BEGIN
CoordPtr := AllocRemember(RKey, TSIZE(StandardCoordType),
MemReqSet{});
BorderP := AllocRemember(RKey, TSIZE(Border), MemReqSet{});
SetUpSimpleBorder(CoordPtr^,Width,Height,
BorderP^,-1,-1,Front,Back,BYTE(5),Mode,NIL);
RETURN(BorderP);
END AllocateStandardBorder;
PROCEDURE AllocateReqBorder(Width, Height : CARDINAL;
Front, Back : BYTE;
Mode : DrawModeSet): BorderPtr;
VAR
BorderP : BorderPtr;
CoordPtr: POINTER TO StandardCoordType;
BEGIN
CoordPtr := AllocRemember(RKey, TSIZE(StandardCoordType),
MemReqSet{});
BorderP := AllocRemember(RKey, TSIZE(Border), MemReqSet{});
SetUpSimpleBorder(CoordPtr^,Width-2,Height-2,
BorderP^,0,0,Front,Back,BYTE(5),Mode,NIL);
RETURN(BorderP);
END AllocateReqBorder;
PROCEDURE AddGadgetToList(VAR GadList : GadgetPtr;
Left, Top : INTEGER;
width, height : INTEGER;
flags : GadgetFlagsSet;
Activate : GadgetActivationSet;
Type : GadgetTypeSet;
Render : ADDRESS;
Select : ADDRESS;
Special: ADDRESS;
ID : CARDINAL;
User : ADDRESS;
Text : IntuiTextPtr) : GadgetPtr;
VAR
GadP, tmp : GadgetPtr;
BEGIN
GadP := AllocRemember(RKey, TSIZE(Gadget), MemReqSet{});
tmp := InitGadget(GadP^, Left, Top, width, height, flags,
Activate, Type, Render, Select, Special, ID,
User, Text);
GadP^.NextGadget := GadList;
GadList := GadP;
RETURN(GadP);
END AddGadgetToList;
PROCEDURE OpenSimpleScreen(width,height,depth : CARDINAL;
modeset : ViewModesSet;
Title : ADDRESS) : ScreenPtr;
VAR
newScr : NewScreen;
MyScreen : ScreenPtr;
BEGIN
WITH newScr DO
LeftEdge := 0;
TopEdge := 0;
Width := width;
Height := height;
Depth := depth;
DetailPen := BYTE(0);
BlockPen := BYTE(1);
ViewModes := modeset;
IF width > 320 THEN
INCL(ViewModes,Hires)
END;
IF height > 200 THEN
INCL(ViewModes,Lace)
END;
Font := NIL;
DefaultTitle := Title;
Gadgets := NIL;
CustomBitMap := NIL;
Type := CustomScreen;
END;
MyScreen := (OpenScreen(newScr));
IF Title = NIL THEN
ShowTitle(MyScreen^,FALSE);
END;
RETURN MyScreen
END OpenSimpleScreen;
PROCEDURE OpenSimpleWindow(width,height,left,top : CARDINAL;
title : ADDRESS;
flags : WindowFlagsSet;
idcmpflags : IDCMPFlagsSet;
gadget : GadgetPtr;
screen : ScreenPtr) : WindowPtr;
VAR
MyNewWindow : NewWindow;
BEGIN
WITH MyNewWindow DO
LeftEdge := left;
TopEdge := top;
Height := height;
Width := width;
DetailPen := BYTE (0);
BlockPen := BYTE (1);
Title := title;
Flags := flags;
IDCMPFlags := idcmpflags;
CheckMark := NIL;
FirstGadget := gadget;
IF screen <> NIL THEN
Type := CustomScreen;
Screen := screen;
ELSE
Type := WBenchScreen;
END;
BitMap := NIL;
MinWidth := 0; MinHeight := 0;
MaxWidth := 0; MaxHeight := 0;
END;
(* Now open the window *)
RETURN OpenWindow(MyNewWindow);
END OpenSimpleWindow;
PROCEDURE SetScreenColors(screen : ScreenPtr;
data : ARRAY OF CHAR);
VAR
size,
i,j : CARDINAL;
table : ARRAY[0..31] OF CARDINAL;
str : ARRAY[0..3] OF CHAR;
succ : BOOLEAN;
temp : LONGCARD;
BEGIN
i := StringLength(data);
size := i DIV 4;
IF (i MOD 4) <> 0 THEN INC(size) END;
FOR i := 0 TO size - 1 DO
FOR j := 0 TO 2 DO
str[j] := data[(i*4)+j];
END;
str[3] := 0C;
succ := ConvStringToNumber(str,temp,FALSE,16);
table[i] := temp;
END;
LoadRGB4(screen^.ViewPort,ADR(table),size);
END SetScreenColors;
BEGIN
RKey := NIL;
AddTerminator(ReleaseAllocations);
END IntuiCommon.