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. GriffinViewerImpl.mesa Written by Maureen Stone, December 16, 1982 3:30 pm Last change by Stone, June 20, 1984 4:45:24 pm PDT Last Edited by: Pier, February 14, 1984 10:29:09 am PST 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]]; START the modules that allocate variables start up menus Êc˜J˜J˜Jšœ™Jšœ4™4Jšœ3™3Jšœ7™7J˜šÏk ˜ J˜Jšœœ ˜Jšœ œ˜(Jšœœœ˜Jšœœ ˜Jšœ œ˜!Jšœ œ˜!J˜Jšœ œ˜Jšœ œE˜VJšœ œ˜ Jšœ œ Ïc˜3Jšœœ+˜8Jšœœ˜,šœ œ ˜Jšœ œœœ˜,—Jšœ œ'˜7Jšœ œ,˜˜MJšœ œ˜!Jšœœ˜Jšœœž.œ˜KJ˜—šœ˜Jšœ«˜²Jšœ˜Jš˜J˜—Jšœ&œ˜*Jšœœœ˜Jš Ïn œœœœœ˜QJ˜˜šœ0œ!˜TJ˜ J˜J˜J˜J˜8J˜'J˜.J˜J˜——šœ,œ˜5JšœHœ˜NJ˜#J˜Jšœœ˜J˜J˜—Jšœ œœ˜šœ#œ˜,šœœœ˜-Jšœœ˜1Jšœœ˜Jšœ˜—J˜J˜—šŸœœœ˜/šœœœ˜Jšœ œH˜ZJ˜;˜8Jšœ4œœ˜N—J˜—Jšœ˜J˜J˜—Jšœ&™&JšœC™CJšœ;™;Jšœ8™8JšœE™Ešœœ˜#˜&J˜J˜ J˜—J˜J˜J˜—Jšœœ˜!šŸœœœ%˜9J˜Jšœ+œ˜8J˜J˜—Jšœ œœ˜šŸœœœ œ8˜SJš œ œœ œœ˜1šœœœ˜šœ œœ˜˜7J˜%—J˜—šœ˜Jšœœœ˜5Jšœ œ'œ œ˜LJ˜Jšœ œ˜J˜——J˜J˜—J˜)J˜J˜JšŸ œœœ œ%œœœœœ˜cJš œœœœ œ!˜Kšœœœœœœœ˜7šœ œ˜šœœœ˜Jšœ1œ˜9Jšœ7œ˜?Jšœ3œ˜;Jšœ*œ˜3Jšœ0œ˜9Jšœ,œ˜5Jšœ9œ˜BJšœOœ˜WJ˜Jšœ˜—˜Jšœœ ˜Jšœœ1˜BJ˜—Jšœœ œ#œ˜;Jšœ1˜8Jšœ˜—J˜J˜—Jšœœœ˜Jšœ œœ˜šŸ œœ˜J˜J˜Jšœ œ˜;J˜$Jš œœœœž!˜=J˜J˜—šœ)™)Jšœ˜Jšœ˜Jšœ˜Jšœ˜—šœ™J˜J˜ J˜J˜J˜#J˜%J˜#J˜J˜/Jšœ œ˜J˜J˜—šœ!œ˜*šœ ˜Jšœœœ8˜QJšœI˜M—Jšœ˜J˜—J˜NJšœ˜J˜J˜J˜J˜—…—Ž