GriffinViewerImpl.mesa
Written by Maureen Stone, December 16, 1982 3:30 pm
Last change by Stone, June 19, 1984 2:37:39 pm PDT
Last Edited by: Pier, February 14, 1984 10:29:09 am PST
DIRECTORY
GriffinViewer,
Commander USING [Register,CommandProc],
List USING [Assoc],
IO USING [PutRope],
Rope USING [ROPE, Cat],
ProcessProps USING [GetPropList],
DebuggerSwap USING[CallDebugger],
GriffinInputDefs,
MenuDefs USING[ InitMenuStyle],
GriffinDefs USING[StartFigureMenus, StartObjectMenus, StartDrawMenus, StartMainMenus],
Terminal USING [BlinkBWDisplay],
Interminal USING [terminal], --the default terminal
TIPUser USING [InstantiateNewTIPTable, TIPScreenCoords],
GriffinMemoryDefs USING [Initialize, CZone],
Graphics USING [Context],
PointDefs USING [InitPointFns, ScrPt, X, Y],
ScreenDefs USING [ClearScreen, SetViewport, ScreenFns],
ObjectDefs USING [ReplotAllObjects, ShowObjects, ObjectFns],
ControllerMenuDefs USING [InitColorMenu, InitCaptionMenu, InitShapeMenu],
CaretDefs USING [Initialize],
CursorDefs USING [GetPointingCursor],
RefreshDefs USING [Refresh],
ControllerDefs USING [DefaultControllers],
GriffinFileDefs USING[OpenFile, WriteFigure, CloseFile],
ViewerClasses USING [Viewer, ViewerClass, ViewerClassRec, ModifyProc, DestroyProc],
ViewerOps USING [CreateViewer, RegisterViewerClass, Top2Bottom, PaintViewer],
InputFocus USING [SetInputFocus],
Icons USING [NewIconFromFile],
Menus USING [Menu, MenuProc--, InsertMenuEntry, CreateEntry, CreateMenu--];
GriffinViewerImpl: MONITOR
IMPORTS GriffinMemoryDefs, PointDefs, ScreenDefs, ControllerMenuDefs, ControllerDefs, GriffinFileDefs, ViewerOps, ObjectDefs, TIPUser, CaretDefs, MenuDefs, GriffinDefs, RefreshDefs, CursorDefs, GriffinInputDefs, DebuggerSwap, Terminal, Interminal, Icons, InputFocus, List, ProcessProps, IO, Commander, Rope
EXPORTS GriffinViewer =
BEGIN
griffinViewer: ViewerClasses.Viewer ← NIL;
GetViewer: PUBLIC PROC RETURNS [ViewerClasses.Viewer] = { RETURN[griffinViewer]};
griffinViewerClass: ViewerClasses.ViewerClass ← NEW[ViewerClasses.ViewerClassRec ← [
paint: Paint,
notify: InputNotify,
destroy: AboutToDestroy,
modify: Modify,
tipTable: TIPUser.InstantiateNewTIPTable["Griffin.TIP"],
cursor: CursorDefs.GetPointingCursor[],
icon: Icons.NewIconFromFile["Griffin.icons",4]
]];
AboutToDestroy: ViewerClasses.DestroyProc = TRUSTED {
[] ← GriffinFileDefs.OpenFile ["Destroyed", TRUE];
[] ← GriffinFileDefs.WriteFigure[];
GriffinFileDefs.CloseFile[];
griffinViewer ← NIL;
};
haveFocus: BOOLEANFALSE;
Modify: ViewerClasses.ModifyProc = TRUSTED {
IF self=griffinViewer THEN SELECT change FROM
kill => {haveFocus ← FALSE; handler[[abort,,,]]};
set => haveFocus ← TRUE;
ENDCASE;
};
Create: PROC[wd: Rope.ROPE] RETURNS [ViewerClasses.Viewer] = {
IF griffinViewer=NIL THEN {
ViewerOps.RegisterViewerClass[$Griffin,griffinViewerClass];
griffinViewer ← ViewerOps.CreateViewer[flavor: $Griffin,
info: [name:Rope.Cat[wd,"Griffin"], iconic: TRUE, scrollable: FALSE]];
};
RETURN[griffinViewer];
};
menu: Menus.Menu ← Menus.CreateMenu[];
Menus.InsertMenuEntry[menu, Menus.CreateEntry["Refresh", Refresh]];
ViewerOps.RegisterViewerClass[$Griffin,griffinViewerClass];
griffinViewer ← ViewerOps.CreateViewer[flavor: $Griffin,
info: [name:"Griffin", iconic: TRUE, scrollable: FALSE, menu: menu]];
Refresh: Menus.MenuProc = TRUSTED {
paintProc: GriffinViewer.PaintProc = {
ScreenDefs.ClearScreen[dc];
ObjectDefs.ReplotAllObjects[dc];
};
DoPaint[paintProc];
};
myRec: REF GriffinViewer.ProcRec;
DoPaint: PUBLIC PROC [proc: GriffinViewer.PaintProc] = {
myRec.proc ← proc;
ViewerOps.PaintViewer[griffinViewer,client,FALSE,myRec];
};
painting: BOOLEANFALSE; 
Paint: ENTRY SAFE PROCEDURE [self: ViewerClasses.Viewer, context: Graphics.Context,
whatChanged: REF ANY, clear: BOOLEAN] = TRUSTED {
ENABLE UNWIND => NULL;
IF whatChanged=NIL THEN {
ScreenDefs.SetViewport[width: self.cw,height: self.ch];
ObjectDefs.ReplotAllObjects[context];
}
ELSE {
rec: REF GriffinViewer.ProcRec ← NARROW[whatChanged];
IF painting THEN DebuggerSwap.CallDebugger["Painting"] ELSE painting ← TRUE;
rec.proc[context];
painting ←FALSE;
};
};
handler: GriffinInputDefs.InputEventProc;
point: PointDefs.ScrPt;
InputNotify: PUBLIC SAFE PROCEDURE [self: ViewerClasses.Viewer, input: LIST OF REF ANY] = TRUSTED {
FOR l: LIST OF REF ANY ← input, l.rest UNTIL l = NIL DO
IF ~haveFocus THEN InputFocus.SetInputFocus[self];
WITH l.first SELECT FROM
z: ATOM => SELECT z FROM
$ShiftedRedDown => handler[[red,,point,TRUE]];
$ShiftedYellowDown => handler[[yellow,,point,TRUE]];
$ShiftedBlueDown => handler[[blue,,point,TRUE]];
$RedDown => handler[[red,,point,FALSE]];
$YellowDown => handler[[yellow,,point,FALSE]];
$BlueDown => handler[[blue,,point,FALSE]];
$RedUp,$YellowUp,$BlueUp => handler[[up,,point,FALSE]];
$ShiftedRedUp,$ShiftedYellowUp,$ShiftedBlueUp => handler[[up,,point,TRUE]];
$Abort => handler[[abort,,,]];
ENDCASE;
z: TIPUser.TIPScreenCoords => {
point[PointDefs.X] ← z.mouseX;
point[PointDefs.Y] ← ViewerOps.Top2Bottom[griffinViewer,z.mouseY];
};
z: REF CHARACTER => handler[[keyStroke, z^, point, FALSE]];
ENDCASE => Terminal.BlinkBWDisplay[Interminal.terminal];
ENDLOOP;
};
crock: SIGNAL=CODE;
started: BOOLEANFALSE;
DoGriffinInit: PROC[wd: Rope.ROPE] = {
GriffinMemoryDefs.Initialize[];
griffinViewer ← Create[wd];
myRec ← GriffinMemoryDefs.CZone.NEW[GriffinViewer.ProcRec];
ControllerDefs.DefaultControllers[];
IF FALSE THEN SIGNAL crock; --for breakpoints in startup code
PointDefs.InitPointFns[];
CaretDefs.Initialize[];
START the modules that allocate variables
START ObjectDefs.ShowObjects;
START ObjectDefs.ObjectFns;
START RefreshDefs.Refresh;
START ScreenDefs.ScreenFns;
start up menus
MenuDefs.InitMenuStyle[];
GriffinDefs.StartFigureMenus[]; 
GriffinDefs.StartObjectMenus[];
GriffinDefs.StartDrawMenus[];
ControllerMenuDefs.InitShapeMenu[];
ControllerMenuDefs.InitCaptionMenu[];
ControllerMenuDefs.InitColorMenu[];
GriffinDefs.StartMainMenus[];
handler ← GriffinInputDefs.StartInputHandler[wd];
ViewerOps.PaintViewer[griffinViewer,client,FALSE,NIL]; --in case someone opened the viewer vefore the menu paint
started ← TRUE;
};
Command: Commander.CommandProc = TRUSTED {
wd: Rope.ROPENARROW[List.Assoc[key: $WorkingDirectory, aList: ProcessProps.GetPropList[]]];
SELECT TRUE FROM
started AND griffinViewer=NIL => {
griffinViewer ← Create[wd];
GriffinDefs.StartFigureMenus[]; --remakes filename list
handler ← GriffinInputDefs.StartInputHandler[wd];
};
started AND griffinViewer#NIL => cmd.err.PutRope["Only one Griffin Viewer at a time."];
ENDCASE => DoGriffinInit[wd]; 
};
Commander.Register[key: "Griffin", proc: Command, doc: "Griffin Illustrator"];
END.