<> <> <> <> DIRECTORY GriffinViewer, IO USING [PutRope], Commander USING [CommandProc, Register], Rope USING [ROPE, Cat], List USING [Assoc], 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, Rope, List, ProcessProps, Commander, IO EXPORTS GriffinViewer = BEGIN griffinViewer: ViewerClasses.Viewer _ NIL; currentWD: Rope.ROPE _ 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 [Rope.Cat[currentWD,"Destroyed.griffin"], TRUE]; [] _ GriffinFileDefs.WriteFigure[]; GriffinFileDefs.CloseFile[]; griffinViewer _ NIL; }; haveFocus: BOOLEAN _ FALSE; Modify: ViewerClasses.ModifyProc = TRUSTED { IF self=griffinViewer THEN SELECT change FROM kill => {haveFocus _ FALSE; handler[[abort,,,]]}; set => haveFocus _ TRUE; ENDCASE; }; Create: PROC RETURNS [ViewerClasses.Viewer] = { IF griffinViewer=NIL THEN { currentWD _ NARROW[List.Assoc[key: $WorkingDirectory, aList: ProcessProps.GetPropList[]]]; ViewerOps.RegisterViewerClass[$Griffin,griffinViewerClass]; griffinViewer _ ViewerOps.CreateViewer[flavor: $Griffin, info: [name: Rope.Cat[currentWD,"Griffin"], iconic: TRUE, scrollable: FALSE]]; }; RETURN[griffinViewer]; }; <> <> <> <> <> 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: BOOLEAN _ FALSE; 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 { focus: PROC = INLINE {IF ~haveFocus THEN InputFocus.SetInputFocus[self]}; FOR l: LIST OF REF ANY _ input, l.rest UNTIL l = NIL DO WITH l.first SELECT FROM z: ATOM => SELECT z FROM $ShiftedRedDown => {focus[]; handler[[red,,point,TRUE]]}; $ShiftedYellowDown => {focus[]; handler[[yellow,,point,TRUE]]}; $ShiftedBlueDown => {focus[]; handler[[blue,,point,TRUE]]}; $RedDown => {focus[]; handler[[red,,point,FALSE]]}; $YellowDown => {focus[]; handler[[yellow,,point,FALSE]]}; $BlueDown => {focus[]; handler[[blue,,point,FALSE]]}; $RedUp,$YellowUp,$BlueUp => {focus[]; handler[[up,,point,FALSE]]}; $ShiftedRedUp,$ShiftedYellowUp,$ShiftedBlueUp => {focus[]; 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: BOOLEAN _ FALSE; DoGriffinInit: PROC = { GriffinMemoryDefs.Initialize[]; griffinViewer _ Create[]; myRec _ GriffinMemoryDefs.CZone.NEW[GriffinViewer.ProcRec]; ControllerDefs.DefaultControllers[]; IF FALSE THEN SIGNAL crock; --for breakpoints in startup code PointDefs.InitPointFns[]; CaretDefs.Initialize[]; <> START ObjectDefs.ShowObjects; START ObjectDefs.ObjectFns; START RefreshDefs.Refresh; START ScreenDefs.ScreenFns; <> MenuDefs.InitMenuStyle[]; GriffinDefs.StartFigureMenus[]; GriffinDefs.StartObjectMenus[]; GriffinDefs.StartDrawMenus[]; ControllerMenuDefs.InitShapeMenu[]; ControllerMenuDefs.InitCaptionMenu[]; ControllerMenuDefs.InitColorMenu[]; GriffinDefs.StartMainMenus[]; handler _ GriffinInputDefs.StartInputHandler[]; started _ TRUE; }; Command: Commander.CommandProc = TRUSTED { IF started THEN IF griffinViewer#NIL THEN cmd.err.PutRope["Only one Griffin Viewer at a time.\n"] ELSE cmd.err.PutRope["To restart Griffin, Run -a Griffin Griffin \n"] ELSE DoGriffinInit[]; }; Commander.Register[key: "Griffin", proc: Command, doc: "Griffin Illustrator"]; END.