<> <> <> <> 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: BOOLEAN _ FALSE; 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]; }; <> <> <> <> <> 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 { 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: BOOLEAN _ FALSE; 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 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[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.ROPE _ NARROW[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.