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. 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 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 ÊŠ˜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š Ïn œœœœœ˜QJ˜J˜šœ0œ!˜TJ˜ J˜J˜J˜J˜8J˜'J˜.˜J˜——šœ,œ˜5Jšœ,œ˜2J˜#J˜Jšœœ˜J˜J˜—Jšœ œœ˜šœ#œ˜,šœœœ˜-Jšœœ˜1Jšœœ˜Jšœ˜—J˜J˜—šŸœœ œœ˜>šœœœ˜J˜;˜8Jšœ,œœ˜F—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šŸ œœœ œ%œœœœœ˜cšœœœœœœœ˜7Jšœ œ ˜2šœ œ˜šœœœ˜Jšœ'œ˜.Jšœ-œ˜4Jšœ)œ˜0Jšœ œ˜(Jšœ&œ˜.Jšœ"œ˜*Jšœ/œ˜7JšœEœ˜LJ˜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˜1Jšœ+œœž9˜pJšœ œ˜J˜J˜—šœ!œ˜*Jšœ œœH˜^šœœ˜šœœœ˜"Jšœ˜Jšœ ž˜7J˜1J˜—Jšœœœ:˜WJšœ˜—J˜—J˜NJšœ˜J˜J˜J˜J˜—…—à ˆ