DIRECTORY BiScrollers, Buttons, Commander, Containers, FS, Geom2D, Imager, ImagerBackdoor, Interpress, IPMaster, IO, Menus, MessageWindow, Real, Rope, Rules, ShowIP, Sliders, ViewerClasses, ViewerOps, ViewerSpecs, ViewerTools; ShowIPTool: CEDAR MONITOR IMPORTS BiScrollers, Buttons, Commander, Containers, FS, Geom2D, Imager, ImagerBackdoor, Interpress, IPMaster, IO, Menus, MessageWindow, Real, Rope, Rules, Sliders, ViewerOps, ViewerSpecs, ViewerTools EXPORTS ShowIP = BEGIN Data: TYPE = ShowIP.Data; DataRec: TYPE = ShowIP.DataRec; ipPageSize: REAL = 11.0*72.0; -- points visibleGrey: Imager.Color _ ImagerBackdoor.MakeStipple[122645B]; invisibleGrey: Imager.Color _ ImagerBackdoor.MakeStipple[100040B]; LProc: Interpress.LogProc = { MessageWindow.Append[message: Rope.Concat["InterpressMaster Error: ", explanation], clearFirst: TRUE]; MessageWindow.Blink[]; }; CreateShowViewer: PUBLIC PROC[fileName: Rope.ROPE] RETURNS [ipViewer: ViewerClasses.Viewer] = { data: Data; curIndent, topLine: INTEGER _ 0; button: Buttons.Button; rule: Rules.Rule; master: Interpress.OpenMaster; master _ Interpress.Open[fileName: fileName, logProc: LProc, logData: NIL ! FS.Error => CONTINUE; IPMaster.Error => { --ErrorDesc: TYPE ~ RECORD[code: ATOM, explanation: ROPE, index: INT _ 0] MessageWindow.Append[message: Rope.Cat[error.explanation, " for ", fileName], clearFirst: TRUE]; MessageWindow.Blink[]; GOTO Quit; }; Imager.Error => { --ErrorDesc: TYPE ~ RECORD [code: ATOM, explanation: ROPE] MessageWindow.Append[message: Rope.Cat[error.explanation, " for ", fileName], clearFirst: TRUE]; MessageWindow.Blink[]; GOTO Quit; }; ]; IF master = NIL THEN { -- does this really stay NIL if FS.Error happens ?? You may want to handle this earlier in the caller fileName _ Rope.Concat[fileName, ".ip"]; master _ Interpress.Open[fileName: fileName, logProc: LProc ! FS.Error => { MessageWindow.Append[message: Rope.Cat["Can't open ShowIP viewer on ", fileName, " | "], clearFirst: TRUE]; MessageWindow.Append[message: error.explanation, clearFirst: FALSE]; MessageWindow.Blink[]; GOTO Quit; }; IPMaster.Error => { --ErrorDesc: TYPE ~ RECORD[code: ATOM, explanation: ROPE, index: INT _ 0] MessageWindow.Append[message: Rope.Cat[error.explanation, " for ", fileName], clearFirst: TRUE]; MessageWindow.Blink[]; GOTO Quit; }; Imager.Error => { --ErrorDesc: TYPE ~ RECORD [code: ATOM, explanation: ROPE] MessageWindow.Append[message: Rope.Cat[error.explanation, " for ", fileName], clearFirst: TRUE]; MessageWindow.Blink[]; GOTO Quit; }; ]; }; data _ NEW[ DataRec _ [ipMaster: master, pageNumber: 1, top: ipPageSize, height: 0.0, lastPageNumber: master.pages]]; -- pages IN [1..end] data.ipContainer _ Containers.Create[ info: [ name: fileName, iconic: TRUE, menu: Menus.CopyMenu[BiScrollers.bsMenu], data: data, scrollable: FALSE], paint: FALSE ]; button _ Buttons.Create[ info: [ name: "FirstPage", wx: curIndent, wy: topLine, border: FALSE, parent: data.ipContainer], proc: FirstPage, clientData: data, documentation: "Left-click for the first page of the IP file", paint: FALSE]; curIndent _ button.wx + button.ww; button _ Buttons.Create[ info: [ name: "TurnPage", wx: curIndent, wy: topLine, border: FALSE, parent: data.ipContainer], proc: TurnPage, clientData: data, documentation: "Left-click for next page; Right-click for previous page", paint: FALSE]; curIndent _ button.wx + button.ww; button _ Buttons.Create[ info: [ name: "LastPage", wx: curIndent, wy: topLine, border: FALSE, parent: data.ipContainer], proc: LastPage, clientData: data, documentation: "Left-click for last page in IP file", paint: FALSE]; curIndent _ button.wx + button.ww; button _ Buttons.Create[ info: [ name: "Page", wx: curIndent, wy: topLine, border: FALSE, parent: data.ipContainer], proc: PageNumber, clientData: data, documentation: "Left-click for selected page number", paint: FALSE]; curIndent _ button.wx + button.ww; data.pageNumberViewer _ ViewerTools.MakeNewTextViewer[ info: [ wx: curIndent, wy: topLine+ViewerSpecs.windowBorderSize, ww: 40, wh: ViewerSpecs.scrollBarW+2*ViewerSpecs.windowBorderSize, parent: data.ipContainer, border: FALSE, scrollable: FALSE], paint: FALSE]; curIndent _ data.pageNumberViewer.wx + data.pageNumberViewer.ww; data.pageNumberSlider _ Sliders.Create[ info: [ wx: curIndent, wy: topLine, ww: data.ipContainer.ww-curIndent, wh: ViewerSpecs.scrollBarW+2*ViewerSpecs.windowBorderSize, border: FALSE, parent: data.ipContainer, scrollable: FALSE], filterProc: NormalizePageNumber, sliderProc: PageNumberSlider, orientation: horizontal, foreground: visibleGrey, background: invisibleGrey, clientData: data, paint: FALSE]; Containers.ChildXBound[data.ipContainer, data.pageNumberSlider]; rule _ Rules.Create[ info: [ parent: data.ipContainer, wx: 0, wy: topLine+ViewerSpecs.captionHeight+4*ViewerSpecs.windowBorderSize, wh: ViewerSpecs.menuBarHeight]]; Containers.ChildXBound[data.ipContainer, rule]; data.ipViewer _ ipViewer _ bsStyle.CreateBiScroller[ class: ipBSClass, info: [ parent: data.ipContainer, wx: 0, wy: topLine+ViewerSpecs.captionHeight+5*ViewerSpecs.windowBorderSize, border: FALSE, scrollable: FALSE, data: data], paint: FALSE ].QuaViewer[]; Containers.ChildXBound[data.ipContainer, data.ipViewer]; Containers.ChildYBound[data.ipContainer, data.ipViewer]; ViewerOps.PaintViewer[viewer: data.ipContainer, hint: all, clearClient: TRUE]; DeltaPage[data, 1]; EXITS Quit => RETURN; }; NormalizePageNumber: Sliders.FilterProc = TRUSTED { data: Data _ NARROW[clientData]; RETURN [Real.FDiv[Real.RoundI[value*(data.lastPageNumber)], (data.lastPageNumber)]] }; FirstPage: Buttons.ButtonProc = TRUSTED { data: Data _ NARROW[clientData]; DeltaPage[data, 1]; }; TurnPage: Buttons.ButtonProc = TRUSTED { data: Data _ NARROW[clientData]; where: INT _ IF mouseButton = red THEN +1 ELSE -1; DeltaPage[data, MIN[MAX[data.pageNumber+where, 1], (data.lastPageNumber)]]; }; LastPage: Buttons.ButtonProc = TRUSTED { data: Data _ NARROW[clientData]; DeltaPage[data, (data.lastPageNumber)]; }; PageNumber: Buttons.ButtonProc = TRUSTED { data: Data _ NARROW[clientData]; stream: IO.STREAM _ IO.RIS[ViewerTools.GetContents[data.pageNumberViewer]]; where: INT _ stream.GetInt[]; DeltaPage[data, MIN[MAX[where, 1], (data.lastPageNumber)]]; }; PageNumberSlider: Sliders.SliderProc = TRUSTED { data: Data _ NARROW[clientData]; SELECT reason FROM abort => { ViewerTools.SetContents[data.pageNumberViewer, IO.PutFR["%-g", IO.real[data.pageNumber]]]; }; move => { ViewerTools.SetContents[data.pageNumberViewer, IO.PutFR["%-g", IO.real[Real.RoundI[(data.lastPageNumber)*value]]]]; }; set => { DeltaPage[data, MIN[MAX[Real.RoundI[(data.lastPageNumber)*value], 1], (data.lastPageNumber)]]; }; ENDCASE; }; IPPaint: ViewerClasses.PaintProc = TRUSTED { data: Data _ NARROW[BiScrollers.ClientDataOfViewer[self]]; context.SetColor[Imager.black]; context.ScaleT[72.0/.0254]; -- points per meter Interpress.DoPage[master: data.ipMaster, page: data.pageNumber, context: context]; }; IPDestroy: ENTRY ViewerClasses.DestroyProc = TRUSTED { data: Data _ NARROW[BiScrollers.ClientDataOfViewer[self]]; data.ipMaster _ NIL; -- Interpress.Close doesn't exist }; DeltaPage: PROCEDURE [data: Data, newvalue: INT] = { ViewerTools.SetContents[data.pageNumberViewer, IO.PutFR["%-g", IO.int[newvalue]]]; Sliders.SetContents[data.pageNumberSlider, Real.FDiv[newvalue, (data.lastPageNumber)]]; IF data.pageNumber=newvalue THEN RETURN; data.pageNumber _ newvalue; ViewerOps.PaintViewer[viewer: data.ipViewer, hint: all, clearClient: TRUE]; }; Break: PROC [char: CHAR] RETURNS [IO.CharClass] = { IF char = '_ OR char = '; THEN RETURN [break]; IF char = ' OR char = ' OR char = ', OR char = '\n THEN RETURN [sepr]; RETURN [other]; }; MakeShowIP: Commander.CommandProc = TRUSTED { fileName: Rope.ROPE _ NIL; cis: IO.STREAM _ IO.RIS[cmd.commandLine]; fileName _ IO.GetTokenRope[cis, Break ! IO.EndOfStream => CONTINUE].token; [] _ CreateShowViewer[fileName]; }; IPExtremaProc: PROC [clientData: REF ANY, direction: Geom2D.Vec] RETURNS [min, max: Geom2D.Vec] --BiScrollers.ExtremaProc-- = { area: Geom2D.Rect _ [x: 0.0, y: 0.0, w: 8.5*72.0, h: 11.0*72.0]; -- is this right ?? [min, max] _ Geom2D.ExtremaOfRect[r: area, n: direction]; }; bsStyle: BiScrollers.BiScrollerStyle _ BiScrollers.GetStyle[]; -- default gets BiScrollersButtonned ipBSClass: BiScrollers.BiScrollerClass _ bsStyle.NewBiScrollerClass[[ flavor: $ShowIP, extrema: IPExtremaProc, paint: IPPaint, destroy: IPDestroy, mayStretch: TRUE, --OK to scale X and Y differently? preserve: [X: 0, Y: 0] --this specifies point that stays fixed when viewer size changes ]]; Commander.Register[key: "ShowIP", proc: MakeShowIP, doc: "Show an Interpress Master in a viewer" ]; END. τShowIPTool.mesa Last Edited by: Ken Pier, August 28, 1985 3:08:24 pm PDT [master: OpenMaster, class: ErrorClass, code: ATOM, explanation: ROPE] [self: Viewer, context: Imager.Context, whatChanged: REF ANY, clear: BOOL]; [self: Viewer] ; [cmd: Handle] RETURNS [result: REF _ NIL, msg: Rope.ROPE _ NIL]; may want to use more sophisticated fileNaming using CurrentWorkingDir. See Sil or IPViewerImpl for example. This proc is required by BiScrollers to return the extremes of the displayed data Κ B– "Cedar" style˜Icodešœ™K™8K˜šΟk ˜ Kšœ,œ6œo˜Ψ—šΟa œœ˜Kšœ.œ,œœW˜ΘKšœ ˜K˜Kšœœ˜Kšœ œ˜K˜Kšœ œΟc ˜'Kšœ@˜@KšœB˜BK˜šœ˜Kšœ.œœ™FKšœ`œ˜fKšœ˜K˜K˜—š Οnœœœœœ$˜_Kšœ ˜ Kšœœ˜ K˜K˜Kšœ˜šœFœ˜KKšœ œ˜šœŸI˜]Kšœ[œ˜aKšœ˜Kšœ˜ Kšœ˜—šœŸ:˜LKšœ[œ˜aKšœ˜Kšœ˜ Kšœ˜—Kšœ˜—šœ œœŸe˜|Kšœ(˜(šœ=˜=šœ ˜ Kšœeœ˜kKšœ=œ˜DKšœ˜Kšœ˜ Kšœ˜—šœŸI˜]Kšœ[œ˜aKšœ˜Kšœ˜ Kšœ˜—šœŸ:˜LKšœ[œ˜aKšœ˜Kšœ˜ Kšœ˜—Kšœ˜—K˜—K˜KšœœlŸ˜ŠK˜šœ%˜%šœ˜Kšœ˜Kšœœ˜ Kšœ)˜)Kšœ ˜ Kšœ œ˜—Kšœœ˜—K˜šœ˜šœ˜Kšœ˜Kšœ˜Kšœ ˜ Kšœœ˜Kšœ˜—Kšœ˜Kšœ˜Kšœ>˜>Kšœœ˜—K˜"K˜šœ˜šœ˜Kšœ˜Kšœ˜Kšœ ˜ Kšœœ˜Kšœ˜—Kšœ˜Kšœ˜KšœI˜IKšœœ˜—Kšœ"˜"K˜šœ˜šœ˜Kšœ˜Kšœ˜Kšœ ˜ Kšœœ˜Kšœ˜—Kšœ˜Kšœ˜Kšœ5˜5Kšœœ˜—Kšœ"˜"K˜šœ˜šœ˜Kšœ ˜ Kšœ˜Kšœ ˜ Kšœœ˜Kšœ˜—Kšœ˜Kšœ˜Kšœ5˜5Kšœœ˜—Kšœ"˜"K˜šœ6˜6šœ˜Kšœ˜Kšœ)˜)Kšœ˜Kšœ:˜:Kšœ˜Kšœœ˜Kšœ œ˜—Kšœœ˜—Kšœ@˜@K˜šœ'˜'šœ˜Kšœ˜Kšœ ˜ Kšœ"˜"Kšœ:˜:Kšœœ˜Kšœ˜Kšœ œ˜—K˜ Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœœ˜—Kšœ@˜@K˜˜˜Kšœ˜K˜KšœE˜EKšœ ˜ ——Kšœ/˜/K˜šœ4˜4Kšœ˜šœ˜Kšœ˜Kšœ˜KšœE˜EKšœœ˜Kšœ œ˜Kšœ ˜ —Kšœœ˜—Kšœ8˜8Kšœ8˜8K•StartOfExpansionw[viewer: ViewerClasses.Viewer, hint: ViewerOps.PaintHint, clearClient: BOOL _ TRUE, whatChanged: REF ANY _ NIL]šœHœ˜NKšœ˜K˜š˜Kšœœ˜—Kšœ˜K˜—šžœœ˜3Kšœ œ ˜ KšœM˜SK˜K˜—šž œœ˜)Kšœ œ ˜ Kšœ˜K˜K˜—šžœœ˜(Kšœ œ ˜ Kš œœœœœ˜2Kšœœœ4˜KK˜K˜—šžœœ˜(Kšœ œ ˜ Kšœ'˜'K˜K˜—šž œœ˜*Kšœ œ ˜ Kš œœœœœ1˜KKšœœ˜Kšœœœ$˜;K˜K˜—šžœœ˜0Kšœ œ ˜ šœ˜šœ ˜ Kšœ/œœ˜ZKšœ˜—šœ ˜ Kšœ/œœ2˜sKšœ˜—šœ˜KšœœœG˜^Kšœ˜—Kšœ˜—K˜K™—šžœœ˜,šŸK™KK˜—Kšœ œ'˜:K˜KšœŸ˜/KšœR˜RKšœ˜K˜—šž œœœ˜6Kšœ™Kšœ œ'˜:KšœœŸ!˜6Kšœ˜K˜—š  œ œœ˜4Kšœ/œœ˜RK˜WKšœœœ˜(Kšœ˜KšœEœ˜KK˜K˜—– "cedar" styleš  œœœœœ˜3Kšœ œ œœ ˜.Kš œ œ œ œ œœ˜HKšœ ˜Kšœ˜K˜—šž œœ˜-Kš œœ œœ œœ™@Kšœœœ˜Kš œœœœœ˜)K™kKšœ œœœ˜JKšœ ˜ Kšœ˜—K˜š   œœœœœŸœ˜K™QKšœAŸ˜TKšœ9˜9K˜—K˜Kšœ?Ÿ$˜cšœE˜EKšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ œŸ"˜4Kšœ œœŸ@˜XK˜—Kšœc˜cK˜—Kšœ˜—…—".L