DIRECTORY TrcTool, Abutters USING [Abutter, Create, QuaAbutter, QuaViewer, Series, SetLayout, vanilla], Atom USING [MakeAtom], Buttons USING [Button, ButtonProc, Create], Commander USING [CommandProc, Register], CommandTool USING [ArgumentVector, CurrentWorkingDirectory, Parse], Convert USING [RopeFromAtom], FS USING [ComponentPositions, Error, ExpandName, FileInfo, StreamOpen], ImagerFont USING [Find], IO, Labels USING [Create, Label, Set], Menus USING [AppendMenuEntry, ClickProc, CreateEntry, CreateMenu, Menu], MessageWindow USING [Append, Blink], PopUpMenus USING [Call, Create, Entry, Menu], Process USING [Detach], Rope USING [Cat, Fetch, Find, Length, ROPE, Substr], Trc, TrcViewers USING [CreateTRCViewer, NewTrc], UserCredentials USING [Get], UserProfile USING [ListOfTokens, Token], ViewerClasses USING [Viewer, ViewerRec], ViewerOps USING [AddProp, DestroyViewer, FetchProp, PaintViewer, SetNewVersion], ViewerTools USING [GetSelectionContents]; TrcToolImpl: CEDAR PROGRAM IMPORTS Abutters, Atom, Buttons, Commander, CommandTool, Convert, FS, ImagerFont, IO, Labels, Menus, MessageWindow, PopUpMenus, Process, Rope, Trc, TrcViewers, UserCredentials, UserProfile, ViewerOps, ViewerTools EXPORTS TrcTool ~ BEGIN OPEN TrcTool; ROPE: TYPE ~ Rope.ROPE; width: NAT ~ 100; cWidth: NAT ~ 250; margin: NAT ~ 5; sq: NAT ~ 15; trcToolMenu: Menus.Menu ~ BuildTrcToolMenu[]; MakeTrcTool: PUBLIC PROC [info: ViewerClasses.ViewerRec, paint: BOOL] RETURNS [v: ViewerClasses.Viewer] ~ { initialFlavor: ATOM ~ IF info.data#NIL AND ISTYPE[info.data, ATOM] THEN NARROW[info.data] ELSE NIL; trc: Trc.TRC _ NewSelectableTrc[initialFlavor]; filename: ROPE _ NIL; filename _ NoVersion[FS.FileInfo[name: info.file, wDir: CommandTool.CurrentWorkingDirectory[] ! FS.Error => {filename_NIL; CONTINUE}].fullFName]; IF filename=NIL THEN filename _ WDOf[FS.ExpandName[name: Rope.Cat[info.file, "foo"], wDir: CommandTool.CurrentWorkingDirectory[]].fullFName]; info.file _ filename; info.iconic _ TRUE; info.menu _ trcToolMenu; v _ Trc.BuildControlViewer[trc: trc, info: info, paint: paint]; ViewerOps.AddProp[viewer: v, prop: $Trc, val: trc]; IF IsWD[filename] THEN InitializeTool[v, FALSE] ELSE LoadTool[viewer: v, filename: filename]; [] _ Trc.InstallListener[trc: trc, listener: [proc: MarkCaptionAsEdited, listenerData: v]]; ViewerOps.PaintViewer[viewer: v, hint: caption]; }; MarkCaptionAsEdited: Trc.ListenerProc = { ViewerOps.SetNewVersion[NARROW[listenerData]]; }; MenuClear: Menus.ClickProc = { viewer: ViewerClasses.Viewer ~ NARROW[parent]; InitializeTool[viewer]; }; MenuGet: Menus.ClickProc = { viewer: ViewerClasses.Viewer ~ NARROW[parent]; filename: ROPE _ ViewerTools.GetSelectionContents[]; IF IsWD[filename] THEN Complain["\"", filename, "\" is an invalid file name."] ELSE { filename _ NoVersion[FS.FileInfo[name: filename, wDir: WDOf[viewer.file] ! FS.Error => {Complain["Couldn't find ", viewer.file, "!"]; GOTO Fail}].fullFName]; LoadTool[viewer, filename]; }; ViewerOps.PaintViewer[viewer: viewer, hint: all]; EXITS Fail => NULL; }; MenuStore: Menus.ClickProc = { viewer: ViewerClasses.Viewer ~ NARROW[parent]; filename: ROPE _ ViewerTools.GetSelectionContents[]; IF IsWD[filename] THEN Complain["\"", filename, "\" is an invalid file name."] ELSE { filename _ NoVersion[FS.ExpandName[name: filename, wDir: WDOf[viewer.file]].fullFName]; viewer.file _ filename; StoreTool[viewer]; }; ViewerOps.PaintViewer[viewer: viewer, hint: all]; }; MenuSave: Menus.ClickProc = { viewer: ViewerClasses.Viewer ~ NARROW[parent]; IF viewer.newVersion THEN StoreTool[viewer]; ViewerOps.PaintViewer[viewer: viewer, hint: caption]; }; InitializeTool: PROC [viewer: ViewerClasses.Viewer, paint: BOOL _ TRUE] ~ { viewer.file _ WDOf[viewer.file]; viewer.newVersion _ FALSE; ComputeName[viewer]; IF paint THEN ViewerOps.PaintViewer[viewer: viewer, hint: all]; }; LoadTool: PROC [viewer: ViewerClasses.Viewer, filename: ROPE] ~ { ReadTrc: PROC RETURNS [trc: Trc.TRC] ~ { flavor: ATOM ~ IO.GetAtom[stream]; class: Trc.Class ~ Trc.ClassFromFlavor[flavor]; trc _ Trc.Depickle[class: class, stream: stream]; }; trc: Trc.TRC ~ NARROW[ViewerOps.FetchProp[viewer: viewer, prop: $Trc]]; stream: IO.STREAM ~ FS.StreamOpen[filename]; SelectNewTrc[trc: trc, under: ReadTrc[]]; viewer.file _ filename; viewer.newVersion _ FALSE; ComputeName[viewer]; }; StoreTool: PROC [viewer: ViewerClasses.Viewer] ~ { stream: IO.STREAM ~ FS.StreamOpen[fileName: viewer.file, accessOptions: create]; IO.PutF[ stream: stream, format: "-- %g\n-- Created (from TrcTool) by %g %g\n", v1: [rope[SimpleName[viewer.file]]], v2: [rope[UserProfile.Token[key: "EditorComforts.LastEdited", default: Rope.Cat[UserCredentials.Get[].name, ","]]]], v3: IO.time[] ]; Trc.Pickle[trc: NARROW[ViewerOps.FetchProp[viewer: viewer, prop: $Trc]], stream: stream, indentation: "\t"]; IO.PutRope[self: stream, r: "\nEND .\n"]; IO.Close[self: stream]; viewer.newVersion _ FALSE; ComputeName[viewer]; }; Complain: PROC [r1, r2, r3, r4, r5: ROPE _ NIL] ~ { MessageWindow.Append[message: Rope.Cat[r1, r2, r3, r4, r5], clearFirst: TRUE]; MessageWindow.Blink[]; }; ComputeName: PROC [viewer: ViewerClasses.Viewer] ~ { IF IsWD[viewer.file] THEN { viewer.name _ viewer.file; viewer.label _ NIL; } ELSE { pos: INT; viewer.name _ FS.FileInfo[name: viewer.file].fullFName; IF (pos _ Rope.Find[s1: viewer.name, s2: "!"])<0 THEN ERROR; viewer.name _ Rope.Cat["Trc: ", Rope.Substr[base: viewer.name, len: pos], " (", Rope.Substr[base: viewer.name, start: pos], ")"]; viewer.label _ viewer.file; FOR each: LIST OF ROPE _ UserProfile.ListOfTokens[key: "Viewers.SuppressIconPrefix", default: NIL], each.rest UNTIL each=NIL DO IF Rope.Find[s1: viewer.name, s2: each.first, case: FALSE]=0 THEN { viewer.label _ Rope.Substr[base: viewer.file, start: Rope.Length[each.first]]; }; ENDLOOP; }; }; WDOf: PROC [filePattern: ROPE] RETURNS [wd: ROPE] ~ { cp: FS.ComponentPositions; IF IsWD[filePattern] THEN RETURN [WDOf[Rope.Cat[filePattern, "foo"]]]; [fullFName: filePattern, cp: cp] _ FS.ExpandName[name: filePattern, wDir: "[]<>"]; wd _ Rope.Substr[base: filePattern, len: cp.base.start]; }; IsWD: PROC [filePattern: ROPE] RETURNS [wd: BOOL] ~ { IF Rope.Length[filePattern]=0 THEN RETURN [TRUE]; SELECT Rope.Fetch[base: filePattern, index: Rope.Length[filePattern]-1] FROM '/, '> => RETURN [TRUE]; ENDCASE => RETURN [FALSE]; }; SimpleName: PROC [filePattern: ROPE] RETURNS [simple: ROPE] ~ { cp: FS.ComponentPositions; [fullFName: filePattern, cp: cp] _ FS.ExpandName[name: filePattern]; simple _ Rope.Substr[base: filePattern, start: cp.base.start, len: cp.ext.start-cp.base.start+cp.ext.length]; }; NoVersion: PROC [filePattern: ROPE] RETURNS [withoutVersion: ROPE] ~ { cp: FS.ComponentPositions; [fullFName: filePattern, cp: cp] _ FS.ExpandName[name: filePattern]; withoutVersion _ Rope.Substr[base: filePattern, len: cp.ext.start+cp.ext.length]; }; BuildTrcToolMenu: PROC RETURNS [menu: Menus.Menu] ~ { menu _ Menus.CreateMenu[]; Menus.AppendMenuEntry[menu: menu, entry: Menus.CreateEntry[name: "Clear", proc: MenuClear]]; Menus.AppendMenuEntry[menu: menu, entry: Menus.CreateEntry[name: "Get", proc: MenuGet]]; Menus.AppendMenuEntry[menu: menu, entry: Menus.CreateEntry[name: "Store", proc: MenuStore, documentation: "Click again to Store", guarded: TRUE]]; Menus.AppendMenuEntry[menu: menu, entry: Menus.CreateEntry[name: "Save", proc: MenuSave]]; }; ClassFromFlavor: PROC [flavor: ATOM] RETURNS [class: Trc.Class] ~ { IF flavor=NIL THEN flavor _ Atom.MakeAtom[pName: UserProfile.Token[key: "Trc.DefaultTrc", default: "Midtone"]]; class _ Trc.ClassFromFlavor[flavor: flavor]; IF class=NIL THEN class _ Trc.ClassFromFlavor[flavor: $Identity]; }; NewSelectableTrc: PUBLIC PROC [underlyingFlavor: ATOM _ NIL] RETURNS [trc: Trc.TRC] ~ { underlyingTrc: Trc.TRC ~ NEW[Trc.TRCRep _ [ class: ClassFromFlavor[flavor: underlyingFlavor], instance: NIL ]]; data: SelectData ~ NEW[SelectDataRep _ [ under: underlyingTrc ]]; trc _ NEW[Trc.TRCRep _ [ class: selectableClass, instance: data ]]; data.listenerReg _ Trc.InstallListener[trc: data.under, listener: [proc: SelectListenerProc, listenerData: trc]]; }; SelectNewTrc: PUBLIC PROC [trc, under: Trc.TRC, paint, notify: BOOL _ TRUE] ~ { data: SelectData ~ NARROW[trc.instance]; IF data.listenerReg#NIL THEN Trc.DeinstallListener[registration: data.listenerReg]; --Break old dependency data.listenerReg _ NIL; data.under _ under; data.listenerReg _ Trc.InstallListener[trc: data.under, listener: [proc: SelectListenerProc, listenerData: trc]]; IF data.control#NIL THEN { parent: ViewerClasses.Viewer ~ data.control.parent; ViewerOps.DestroyViewer[viewer: data.control, paint: FALSE]; data.control _ Trc.BuildControlViewer[trc: data.under, info: [parent: parent, wx: margin, wy: data.trcV.wy+data.trcV.wh+margin], paint: FALSE]; Labels.Set[label: data.label, value: Convert.RopeFromAtom[from: data.under.class.flavor, quote: FALSE], paint: FALSE]; TrcViewers.NewTrc[viewer: data.trcV, trc: data.under, paint: FALSE]; SetSelectLayout[data, FALSE]; --January 25, 1987 5:02:11 am PST. Right? }; IF notify THEN Trc.NotifyListeners[trc: trc]; IF data.control#NIL AND paint THEN ViewerOps.PaintViewer[viewer: IF data.control.parent=NIL THEN data.control ELSE data.control.parent, hint: client]; }; CurrentSelection: PUBLIC PROC [trc: Trc.TRC] RETURNS [under: Trc.TRC] ~ { RETURN [NARROW[trc.instance, SelectData].under]; }; SelectData: TYPE ~ REF SelectDataRep; SelectDataRep: TYPE ~ RECORD [ under: Trc.TRC _ NIL, trcV, selectClass, label, control: ViewerClasses.Viewer _ NIL, listenerReg: REF _ NIL ]; SelectFcn: Trc.Fcn = { RETURN [Trc.ApplyFcn[trc: NARROW[trc.instance, SelectData].under, a: a]] }; SelectBlockFcn: Trc.BlockFcn = UNCHECKED { Trc.ApplyBlockFcn[trc: NARROW[trc.instance, SelectData].under, from: from, to: to, count: count]; }; SelectCopy: Trc.CopyProc = { new _ NEW[Trc.TRCRep _ [ class: trc.class, instance: NEW[SelectDataRep _ [under: Trc.Copy[NARROW[trc.instance, SelectData].under]]] ]]; }; SelectPickle: Trc.PickleProc = { data: SelectData ~ NARROW[trc.instance]; Trc.PickleArbitraryTrc[trc: data.under, stream: stream, indentation: indentation]; }; SelectDepickle: Trc.DepickleProc = { trc _ NewSelectableTrc[]; SelectNewTrc[trc: trc, under: Trc.DepickleArbitraryTrc[stream: stream], paint: FALSE, notify: FALSE]; }; SelectNotify: Trc.NotifyProc = { under: Trc.TRC ~ NARROW[trc.instance, SelectData].under; under.class.notify[viewer: viewer, trc: under, input: input]; }; SelectBackground: Trc.BackgroundProc = { Trc.PaintBackground[trc: NARROW[trc.instance, SelectData].under, context: context, rectangle: rectangle, whatChanged: whatChanged]; }; SelectControl: Trc.BuildControlViewerProc = { TrcRectangle: PROC RETURNS [rectangle: Trc.Rectangle _ [x: 0, y: 0, w: 1, h: 1]] ~ INLINE { WITH Trc.FetchProp[info.parent, $TrcView] SELECT FROM rect: REF Trc.Rectangle => RETURN [rect^]; ENDCASE; }; TrcSize: PROC RETURNS [size: CARDINAL _ 100] ~ INLINE { WITH Trc.FetchProp[info.parent, $TrcSize] SELECT FROM int: REF INT => RETURN [int^]; ENDCASE; }; Dx: PROC RETURNS [dx: REAL] ~ INLINE { segments: CARDINAL _ 40; WITH Trc.FetchProp[info.parent, $TrcSegments] SELECT FROM int: REF INT => segments _ int^; ENDCASE; dx _ rectangle.w/segments; }; trcSize: CARDINAL ~ TrcSize[]; rectangle: Trc.Rectangle ~ TrcRectangle[]; dx: REAL ~ Dx[]; data: SelectData ~ IF trc.instance=NIL THEN NEW[SelectDataRep] ELSE NARROW[trc.instance]; abutter: Abutters.Abutter; childInfo: ViewerClasses.ViewerRec _ info; info.data _ data; abutter _ Abutters.Create[viewerFlavor: Abutters.vanilla, info: info, paint: FALSE]; viewer _ Abutters.QuaViewer[abutter]; IF data.under=NIL THEN { data.under _ NEW[Trc.TRCRep _ [class: ClassFromFlavor[NIL], instance: NIL]]; }; data.trcV _ TrcViewers.CreateTRCViewer[trc: data.under, rectangle: rectangle, dx: dx, info: [parent: viewer, wx: margin, wy: margin, ww: trcSize, wh: trcSize], paint: FALSE]; data.selectClass _ Buttons.Create[info: [parent: viewer, name: "Trc Class:", wx: margin+data.trcV.ww+margin, wy: margin, border: FALSE], proc: SelectClass, clientData: trc, font: ImagerFont.Find[name: "Xerox/TiogaFonts/Tioga10B"], paint: FALSE]; data.label _ Labels.Create[info: [parent: viewer, wy: margin, ww: 150, border: FALSE, name: Convert.RopeFromAtom[from: data.under.class.flavor, quote: FALSE]], paint: FALSE]; data.control _ Trc.BuildControlViewer[trc: data.under, info: [parent: viewer, wx: margin, wy: data.trcV.wy+data.trcV.wh+margin], paint: FALSE]; SetSelectLayout[data: data, paint: paint]; }; SelectListenerProc: Trc.ListenerProc = { Trc.NotifyListeners[trc: NARROW[listenerData]]; }; SetSelectLayout: PROC [data: SelectData, paint: BOOL] ~ { Abutters.SetLayout[ a: Abutters.QuaAbutter[data.trcV.parent], rules: [ left: [ rigid: NIL, end: parallel [ p: LIST [ [ rigid: LIST [[data.trcV, margin], [data.selectClass, margin]], end: stretch [[data.label, margin]] ], [ rigid: NIL, end: stretch [[data.control, margin]] ] ]] ], right: [ rigid: NIL, end: parallel [ p: LIST [ [ rigid: NIL, end: stretch [[data.label, margin]] ], [ rigid: NIL, end: stretch [[data.control, margin]] ] ]] ], top: [ rigid: LIST [[data.trcV, margin]], end: stretch [[data.control, margin]] ], bottom: [rigid: NIL, end: stretch [[data.control, margin]]] ], paint: paint ] }; SelectClass: Buttons.ButtonProc = { EachClass: Trc.ClassEnumProc = { IF class.control#NIL THEN [] _ PopUpMenus.Entry[menu: pumenu, entry: Convert.RopeFromAtom[from: class.flavor, quote: FALSE], entryData: class]; }; pumenu: PopUpMenus.Menu ~ PopUpMenus.Create[header: "TRC Classes"]; newClass: Trc.Class; Trc.EnumerateRegisteredClasses[proc: EachClass]; newClass _ NARROW[PopUpMenus.Call[menu: pumenu, callData: clientData]]; IF newClass#NIL THEN { trc: Trc.TRC ~ NARROW[clientData]; data: SelectData ~ NARROW[trc.instance]; TRUSTED {Process.Detach[FORK SelectNewTrc[trc: trc, under: NEW[Trc.TRCRep _ [class: newClass, instance: NIL]]]]}; }; }; selectableClass: Trc.Class ~ NEW[Trc.ClassRep _ [ flavor: $Selectable, fcn: SelectFcn, blockFcn: SelectBlockFcn, copy: SelectCopy, pickle: SelectPickle, depickle: SelectDepickle, notify: SelectNotify, background: SelectBackground, control: SelectControl ]]; TrcToolCommand: Commander.CommandProc = { arg: CommandTool.ArgumentVector ~ CommandTool.Parse[cmd: cmd, starExpand: TRUE]; IF arg.argc=1 THEN [] _ MakeTrcTool[info: [file: CommandTool.CurrentWorkingDirectory[]], paint: TRUE] ELSE FOR k: NAT IN [1..arg.argc) DO [] _ MakeTrcTool[info: [file: arg[k]], paint: TRUE]; ENDLOOP; }; Trc.RegisterClass[class: selectableClass]; Commander.Register[key: "TrcTool", proc: TrcToolCommand, doc: "Open a trc tool for a given trc file"]; END. ”TrcToolImpl.mesa Copyright c 1986 by Xerox Corporation. All rights reserved. Eric Nickell, January 25, 1987 5:29:51 am PST [trc: TRC, listenerData: REF ANY] [parent: REF ANY, clientData: REF ANY _ NIL, mouseButton: Menus.MouseButton _ red, shift: BOOL _ FALSE, control: BOOL _ FALSE] [parent: REF ANY, clientData: REF ANY _ NIL, mouseButton: Menus.MouseButton _ red, shift: BOOL _ FALSE, control: BOOL _ FALSE] [parent: REF ANY, clientData: REF ANY _ NIL, mouseButton: Menus.MouseButton _ red, shift: BOOL _ FALSE, control: BOOL _ FALSE] [parent: REF ANY, clientData: REF ANY _ NIL, mouseButton: Menus.MouseButton _ red, shift: BOOL _ FALSE, control: BOOL _ FALSE] Selectable Trcs Build new control viewer ViewerOps.DestroyViewer[viewer: data.control]; [trc: TRC, a: REAL] RETURNS [b: REAL] [trc: TRC, from: Trc.UnsafeTable, to: Trc.UnsafeTable, count: NAT] [trc: TRC] RETURNS [new: TRC] [trc: TRC, stream: STREAM, indentation: ROPE _ NIL] [class: Trc.Class, stream: STREAM] RETURNS [trc: TRC] [viewer: ViewerClasses.Viewer, trc: TRC, input: LIST OF REF ANY] [trc: TRC, context: Imager.Context, rectangle: ImagerTransformation.Rectangle, whatChanged: REF ANY _ NIL] [trc: TRC, info: ViewerClasses.ViewerRec, propList: Properties.PropList _ NIL] RETURNS [viewer: ViewerClasses.Viewer] data.under _ TrcStandardClasses.NewIdentityTrc[]; [trc: TRC, listenerData: REF ANY] Abutters.SetLayout[ a: Abutters.QuaAbutter[data.trcV.parent], rules: [ left: [ rigid: NIL, end: parallel [ p: LIST [ [ rigid: LIST [[data.trcV, margin], [data.selectClass, margin], [data.label, margin]], end: none [spaceAfter: margin, setParentSize: TRUE] ], [ rigid: LIST [[data.control, margin]], end: none [spaceAfter: margin, setParentSize: TRUE] ] ]] ], right: [rigid: NIL, end: none []], top: [ rigid: LIST [[data.trcV, margin], [data.control, margin]], end: none [spaceAfter: margin, setParentSize: TRUE] ], bottom: [rigid: NIL, end: none []] ], paint: paint ] [parent: REF ANY, clientData: REF ANY _ NIL, mouseButton: Menus.MouseButton _ red, shift: BOOL _ FALSE, control: BOOL _ FALSE] [class: Trc.Class] RETURNS [quit: BOOL _ FALSE] [cmd: Commander.Handle] RETURNS [result: REF ANY _ NIL, msg: ROPE _ NIL] ส,.˜šœ™Icodešœ<™[viewer: ViewerClasses.Viewer, prop: ATOM, val: REF ANY]šœ3˜3K˜K˜K–L[viewer: ViewerClasses.Viewer, tool: TrcToolImpl.Tool, filename: ROPE]šœœœœ)˜]K–&[trc: TRC, listener: Trc.Listener]šœ[˜[K–w[viewer: ViewerClasses.Viewer, hint: ViewerOps.PaintHint, clearClient: BOOL _ TRUE, whatChanged: REF ANY _ NIL]˜0Kšœ˜—–% -- [trc: TRC, listenerData: REF ANY]˜)Lšะck!™!Lšœœ˜.L˜—˜Lš ~™~L–.[viewer: ViewerClasses.Viewer, prop: ATOM]šœœ ˜.L˜L˜—–‚ -- [parent: REF ANY, clientData: REF ANY _ NIL, mouseButton: Menus.MouseButton _ red, shift: BOOL _ FALSE, control: BOOL _ FALSE]šœ˜Lš ~™~L–.[viewer: ViewerClasses.Viewer, prop: ATOM]šœœ ˜.L–[]šœ œ#˜4šœœ9œ˜ULšœœoœ˜L˜Kšœ˜—L–w[viewer: ViewerClasses.Viewer, hint: ViewerOps.PaintHint, clearClient: BOOL _ TRUE, whatChanged: REF ANY _ NIL]˜1Lšœ œ˜L˜—–‚ -- [parent: REF ANY, clientData: REF ANY _ NIL, mouseButton: Menus.MouseButton _ red, shift: BOOL _ FALSE, control: BOOL _ FALSE]šœ˜Lš ~™~L–.[viewer: ViewerClasses.Viewer, prop: ATOM]šœœ ˜.L–[]šœ œ#˜4šœœ9œ˜UL–"[name: ROPE, wDir: ROPE _ NIL]šœœ@˜WL˜L˜Kšœ˜—L–w[viewer: ViewerClasses.Viewer, hint: ViewerOps.PaintHint, clearClient: BOOL _ TRUE, whatChanged: REF ANY _ NIL]˜1L˜—–‚ -- [parent: REF ANY, clientData: REF ANY _ NIL, mouseButton: Menus.MouseButton _ red, shift: BOOL _ FALSE, control: BOOL _ FALSE]šœ˜Lš ~™~L–.[viewer: ViewerClasses.Viewer, prop: ATOM]šœœ ˜.Kšœœ˜,L–w[viewer: ViewerClasses.Viewer, hint: ViewerOps.PaintHint, clearClient: BOOL _ TRUE, whatChanged: REF ANY _ NIL]˜5L˜—šŸœœ'œœ˜KL˜ Lšœœ˜L˜K–w[viewer: ViewerClasses.Viewer, hint: ViewerOps.PaintHint, clearClient: BOOL _ TRUE, whatChanged: REF ANY _ NIL]šœœ2˜?K˜—šŸœœ*œ˜AšŸœœœ œ˜(K–[stream: STREAM]šœœœ˜"K–[flavor: ATOM]˜/K˜1K˜—K–.[viewer: ViewerClasses.Viewer, prop: ATOM]šœ œœ2˜GKšœœœœ˜,K˜)K˜Kšœœ˜K˜K˜—šŸ œœ#˜2K–ผ[fileName: ROPE, accessOptions: FS.AccessOptions _ read, streamOptions: FS.StreamOptions _ (5)[TRUE, TRUE, TRUE, TRUE, TRUE], keep: CARDINAL _ 1B (1), createByteCount: FS.ByteCount _ 2560, streamBufferParms: FS.StreamBufferParms _ [vmPagesPerBuffer: 8, nBuffers: 2], extendFileProc: FS.ExtendFileProc, wantedCreatedTime: GMT _ --{UnknownError[sig: 3500B, msg: 177777B]}--, remoteCheck: BOOL _ TRUE, wDir: ROPE _ NIL]šœœœœ:˜Pšœ˜Kšœ˜Kšœ6˜6Kšœ$˜$Kšœt˜tKšœœ˜ Kšœ˜—K–.[viewer: ViewerClasses.Viewer, prop: ATOM]šœœV˜lK–elf: STREAM, r: ROPE]šœ'˜)Kšœ˜Kšœœ˜K˜K˜—šŸœœœœ˜3K–-[message: ROPE, clearFirst: BOOL _ FALSE]šœHœ˜NK–[]˜K˜—šŸ œœ#˜4šœœ˜K˜Kšœœ˜Kšœ˜—šœ˜K–[name: ROPE, wantedCreatedTime: GMT _ --{UnknownError[sig: 111124B, msg: 177777B]}--, remoteCheck: BOOL _ TRUE, wDir: ROPE _ NIL]šœœ˜ Kšœœ'˜7K–>[s1: ROPE, s2: ROPE, pos1: INT _ 0, case: BOOL _ TRUE]šœ/œœ˜[s1: ROPE, s2: ROPE, pos1: INT _ 0, case: BOOL _ TRUE]šœ2œœ˜CK–9[base: ROPE, start: INT _ 0, len: INT _ 2147483647]˜NKšœ˜—Kšœ˜—Kšœ˜—K˜—š Ÿœœœœœ˜5Kšœœ˜Kšœœœ&˜FK–"[name: ROPE, wDir: ROPE _ NIL]šœ#œ-˜RK–9[base: ROPE, start: INT _ 0, len: INT _ 2147483647]šœ8˜8K˜—š Ÿœœœœœ˜5Kšœœœœ˜1– [base: ROPE, index: INT _ 0]šœB˜LKšœ œœ˜Kšœœœ˜—K˜—š Ÿ œœœœ œ˜?Kšœœ˜K–"[name: ROPE, wDir: ROPE _ NIL]šœ#œ˜DK–9[base: ROPE, start: INT _ 0, len: INT _ 2147483647]˜mK˜—š Ÿ œœœœœ˜FKšœœ˜K–"[name: ROPE, wDir: ROPE _ NIL]šœ#œ˜DK–9[base: ROPE, start: INT _ 0, len: INT _ 2147483647]šœQ˜QK˜—šŸœœœ˜5K˜K–’[name: ROPE, proc: Menus.ClickProc, clientData: REF ANY _ NIL, documentation: REF ANY _ NIL, fork: BOOL _ TRUE, guarded: BOOL _ FALSE]˜\K–’[name: ROPE, proc: Menus.ClickProc, clientData: REF ANY _ NIL, documentation: REF ANY _ NIL, fork: BOOL _ TRUE, guarded: BOOL _ FALSE]˜XK–’[name: ROPE, proc: Menus.ClickProc, clientData: REF ANY _ NIL, documentation: REF ANY _ NIL, fork: BOOL _ TRUE, guarded: BOOL _ FALSE]šœ‹œ˜’K–’[name: ROPE, proc: Menus.ClickProc, clientData: REF ANY _ NIL, documentation: REF ANY _ NIL, fork: BOOL _ TRUE, guarded: BOOL _ FALSE]˜ZK˜——head–L -- [cmd: Commander.Handle] RETURNS [result: REF ANY _ NIL, msg: ROPE _ NIL]™šŸœœ œœ˜CK–$[key: ROPE, default: ROPE _ NIL]šœœœ]˜oK˜,Kšœœœ0˜AK˜—šŸœœœœœœ œ˜W–[flavor: ATOM]šœœœ˜+Kšœ1˜1Kšœ ˜ Kšœ˜—šœœ˜(Kšœ˜Kšœ˜—šœœ˜K˜Kšœ˜Kšœ˜—K–&[trc: TRC, listener: Trc.Listener]˜qK˜—K–) -- [trc: TRC, a: REAL] RETURNS [b: REAL]˜š Ÿ œœœœœœ˜OKšœœ˜(K–[registration: REF ANY]˜Kšœœœ8ฯc˜jKšœœ˜K™K™Kšœ˜K–&[trc: TRC, listener: Trc.Listener]˜qšœœœ˜K˜3K–6[viewer: ViewerClasses.Viewer, paint: BOOL _ TRUE]šœ5œ˜Kšœ œ˜Kšœ˜—˜Kš %™%Kšœœ(˜HK˜—–F -- [trc: TRC, from: Trc.UnsafeTable, to: Trc.UnsafeTable, count: NAT]šœ œ˜*Kš B™BKšœœD˜aK˜—–! -- [trc: TRC] RETURNS [new: TRC]˜Kš ™šœœ˜K˜Kšœ œžœ œ#˜XKšœ˜—K˜—–7 -- [trc: TRC, stream: STREAM, indentation: ROPE _ NIL]˜ Kš 3™3K–ฏ[stream: STREAM, format: ROPE _ NIL, v1: IO.Value _ [null[]], v2: IO.Value _ [null[]], v3: IO.Value _ [null[]], v4: IO.Value _ [null[]], v5: IO.Value _ [null[]]]šœœ˜(J˜RK˜—–9 -- [class: Trc.Class, stream: STREAM] RETURNS [trc: TRC]˜$Kš 5™5K˜KšœOœ œ˜eK˜—˜ Kš @™@Kšœ œœ!˜8K˜=K˜—–n -- [trc: TRC, context: Imager.Context, rectangle: ImagerTransformation.Rectangle, whatChanged: REF ANY _ NIL]˜(Kš j™jKšœœd˜ƒK˜—–y -- [trc: TRC, info: ViewerClasses.ViewerRec, propList: Properties.PropList _ NIL] RETURNS [viewer: ViewerClasses.Viewer]˜-Kš u™ušŸ œœœ9œ˜[šœ&œ˜5Kšœœœ ˜*Kšœ˜—K˜—š Ÿœœœœ œ˜7šœ&œ˜5Kšœœœœ˜Kšœ˜—K˜—š Ÿœœœœœ˜&Kšœ œ˜šœ*œ˜9Kšœœœ˜ Kšœ˜—K˜K˜—Kšœ œ ˜Kšœ*˜*Kšœœ˜Kš œœœœœœœ˜YK–ฺ[viewerFlavor: ATOM, info: ViewerClasses.ViewerRec _ [class: NIL, wx: 0, wy: 0, ww: 0, wh: 0, cx: 0, cy: 0, cw: 0, ch: 0, lock: [process: PROCESS#0B, count: 0B (0)], tipTable: NIL, name: NIL, file: NIL, label: NIL, menu: NIL, icon: 177777B?, column: left, caption: FALSE, scrollable: TRUE, hscrollable: FALSE, iconic: TRUE, border: TRUE, newVersion: FALSE, newFile: FALSE, visible: TRUE, offDeskTop: FALSE, destroyed: FALSE, init: FALSE, saveInProgress: FALSE, inhibitDestroy: FALSE, guardDestroy: FALSE, paintingWedged: FALSE, spare0: FALSE, spare1: FALSE, spare2: FALSE, spare3: FALSE, spare4: FALSE, spare5: FALSE, spare6: FALSE, position: 0, openHeight: 0, link: NIL, parent: NIL, sibling: NIL, child: NIL, props: NIL, data: NIL], paint: BOOL _ TRUE]˜Kšœ*˜*K˜K˜K–ฺ[viewerFlavor: ATOM, info: ViewerClasses.ViewerRec _ [class: NIL, wx: 0, wy: 0, ww: 0, wh: 0, cx: 0, cy: 0, cw: 0, ch: 0, lock: [process: PROCESS#0B, count: 0B (0)], tipTable: NIL, name: NIL, file: NIL, label: NIL, menu: NIL, icon: 177777B?, column: left, caption: FALSE, scrollable: TRUE, hscrollable: FALSE, iconic: TRUE, border: TRUE, newVersion: FALSE, newFile: FALSE, visible: TRUE, offDeskTop: FALSE, destroyed: FALSE, init: FALSE, saveInProgress: FALSE, inhibitDestroy: FALSE, guardDestroy: FALSE, paintingWedged: FALSE, spare0: FALSE, spare1: FALSE, spare2: FALSE, spare3: FALSE, spare4: FALSE, spare5: FALSE, spare6: FALSE, position: 0, openHeight: 0, link: NIL, parent: NIL, sibling: NIL, child: NIL, props: NIL, data: NIL], paint: BOOL _ TRUE]šœMœ˜TK–[Abutters.Abutter]šœ%˜%K˜–[]šœ œœ˜Kšœ œ&œ œ˜LKšœ1™1Kšœ˜—Kšœงœ˜ฎKšœœhœ˜๕K–$[from: ATOM, quote: BOOL _ TRUE]šœOœCœ œ˜ฎKšœˆœ˜K˜*K˜—–% -- [trc: TRC, listenerData: REF ANY]šฯbœ˜(Lš !™!L–"[trc: TRC, fork: BOOL _ FALSE]šœœ˜/L˜—šŸœœœ˜9™K–[ViewerClasses.Viewer]™)šœ™™Kšœœ™ šœœ™šœ™KšœœI™TKšœ.œ™3Kšœ™—šœ™Kšœœ™%Kšœ.œ™4Kšœ™—K™—K™—Kšœœ™"šœ™Kšœœ/™:Kšœ.œ™3Kšœ™—Kšœœ™"Kšœ™—Kšœ ™ Kšœ™—˜K–[ViewerClasses.Viewer]˜)šœ˜˜Kšœœ˜ šœœ˜šœ˜Kšœœ3˜>Kšœ#˜#Kšœ˜—šœ˜Kšœœ˜ Kšœ%˜%Kšœ˜—K˜—K˜—šœ˜Kšœœ˜ šœœ˜šœ˜Kšœœ˜ Kšœ#˜#Kšœ˜—šœ˜Kšœœ˜ Kšœ%˜%Kšœ˜—K˜—K˜—šœ˜Kšœœ˜"Kšœ%˜%Kšœ˜—Kšœœ(˜;Kšœ˜—Kšœ ˜ Kšœ˜—K˜—šค œ˜#Lš ~™~–3 -- [class: Trc.Class] RETURNS [quit: BOOL _ FALSE]šค œ˜ Lš /™/K–$[from: ATOM, quote: BOOL _ TRUE]šœœœ\œ˜L˜—L–F[header: ROPE _ NIL, doc: ROPE _ NIL, clientData: REF ANY _ NIL]šœC˜CL˜L–roc: Trc.ClassEnumProc]šœ0˜0L–i[menu: PopUpMenus.Menu, callData: REF ANY _ NIL, position: REF ANY _ NIL, default: REF ANY _ NIL]šœ œ6˜Gšœ œœ˜Lšœ œœ ˜"Kšœœ˜(K™Kšœœœ*œ˜qKšœ˜—L˜—šœœ˜1K˜K˜K˜K˜Kšœ˜Kšœ˜K˜K˜K˜Kšœ˜—šœ)˜)Kš H™HK–I[cmd: Commander.Handle, starExpand: BOOL _ FALSE, switchChar: CHAR]šœJœ˜PK–[]šœ œNœ˜eš œœœœ˜#Kšœ.œ˜4Kšœ˜—K˜—K˜K–[class: Trc.Class]šœ*˜*K˜f—K˜Kšœ˜—…—96m๘