<> <> <> <> <> <> DIRECTORY Buttons, Commander USING [CommandProc, Register], Containers, Graphics USING [Box, ClipBox, Scale, Translate], GraphicsBasic, IO, MessageWindow USING [Append, Blink], Process USING [Detach], Real, Rope, Rules, ShowPress USING [Close, DrawPressPage, Handle, Open, ShowPressError], Sliders, ViewerClasses USING [DestroyProc, PaintProc, PaintRectangle, ScrollProc, Viewer, ViewerRec, ViewerClass, ViewerClassRec], ViewerOps USING [CreateViewer, PaintViewer, RegisterViewerClass, UserToScreenCoords], -- DestroyViewer ViewerSpecs, ViewerTools; ShowPressTool: MONITOR IMPORTS Buttons, Commander, Containers, Graphics, IO, MessageWindow, Process, Real, Rope, Rules, ShowPress, Sliders, ViewerOps, ViewerTools EXPORTS ShowPress = BEGIN pressViewerClass: ViewerClasses.ViewerClass _ NEW[ViewerClasses.ViewerClassRec]; ShowData: TYPE = REF ShowDataRec; ShowDataRec: TYPE = RECORD [ show: ShowPress.Handle, pressContainer: Containers.Container _ NIL, pressViewer: ViewerClasses.Viewer _ NIL, pageNumberViewer: ViewerClasses.Viewer _ NIL, pageNumberSlider: Sliders.Slider _ NIL, pageNumber: INT _ 1, top, height: REAL ]; pointsPerMica: REAL = 72.0/2540.0; micasPerPoint: REAL = 2540.0/72.0; pressPageSize: REAL = 11.0*72.0; -- points viewerOverheadSize: INT = (ViewerSpecs.captionHeight + ViewerSpecs.menuHeight + ViewerSpecs.menuBarHeight + ViewerSpecs.windowBorderSize*2); visibleGrey: GraphicsBasic.Color = [stipple, 0, 122645B/256, 122645B MOD 256]; invisibleGrey: GraphicsBasic.Color = [stipple, 0, 100040B/256, 100040B MOD 256]; CreateShowViewer: PUBLIC PROC[fileName: Rope.ROPE] RETURNS[pressViewer: ViewerClasses.Viewer] = { my: ShowData; curIndent: INTEGER _ 0; topLine: INTEGER _ 0; button: Buttons.Button; rule: Rules.Rule; file: ShowPress.Handle; file _ ShowPress.Open[fileName ! ShowPress.ShowPressError => { SELECT code FROM CantReadFile => CONTINUE; CantFindFonts => { MessageWindow.Append[message: Rope.Concat["Can't Find Fonts for ", fileName], clearFirst: TRUE]; MessageWindow.Blink[]; GOTO Quit; }; ENDCASE => REJECT; } ]; IF file = NIL THEN { fileName _ Rope.Concat[fileName, ".press"]; file _ ShowPress.Open[fileName ! ShowPress.ShowPressError => { MessageWindow.Append[message: Rope.Concat["Can't open Press viewer on ", fileName], clearFirst: TRUE]; MessageWindow.Blink[]; GOTO Quit; } ]; }; my _ NEW[ ShowDataRec _ [show: file, pageNumber: 1, top: pressPageSize, height: 0.0]]; my.pressContainer _ Containers.Create[ info: [ name: fileName, iconic: FALSE, data: my, scrollable: FALSE], paint: TRUE ]; button _ Buttons.Create[ info: [ name: "FirstPage", wx: curIndent, wy: topLine, border: FALSE, parent: my.pressContainer], proc: FirstPage, clientData: my, documentation: "Left-click for the first page of the Press file", paint: TRUE]; curIndent _ button.wx + button.ww; button _ Buttons.Create[ info: [ name: "TurnPage", wx: curIndent, wy: topLine, border: FALSE, parent: my.pressContainer], proc: TurnPage, clientData: my, documentation: "Left-click for next page; Right-click for previous page", paint: TRUE]; curIndent _ button.wx + button.ww; button _ Buttons.Create[ info: [ name: "LastPage", wx: curIndent, wy: topLine, border: FALSE, parent: my.pressContainer], proc: LastPage, clientData: my, documentation: "Left-click for last page in Press file", paint: TRUE]; curIndent _ button.wx + button.ww; button _ Buttons.Create[ info: [ name: "Page", wx: curIndent, wy: topLine, border: FALSE, parent: my.pressContainer], proc: PageNumber, clientData: my, documentation: "Left-click for selected page number", paint: TRUE]; curIndent _ button.wx + button.ww; my.pageNumberViewer _ ViewerTools.MakeNewTextViewer[ info: [ wx: curIndent, wy: topLine+ViewerSpecs.windowBorderSize, ww: 40, wh: ViewerSpecs.scrollBarW+2*ViewerSpecs.windowBorderSize, parent: my.pressContainer, border: FALSE, scrollable: FALSE], paint: TRUE]; curIndent _ my.pageNumberViewer.wx + my.pageNumberViewer.ww; my.pageNumberSlider _ Sliders.Create[ info: [ wx: curIndent, wy: topLine, ww: my.pressContainer.ww-curIndent, wh: ViewerSpecs.scrollBarW+2*ViewerSpecs.windowBorderSize, border: FALSE, parent: my.pressContainer, scrollable: FALSE], filterProc: NormalizePageNumber, sliderProc: PageNumberSlider, orientation: horizontal, foreground: visibleGrey, background: invisibleGrey, clientData: my, paint: TRUE]; Containers.ChildXBound[my.pressContainer, my.pageNumberSlider]; rule _ Rules.Create[ info: [ parent: my.pressContainer, wx: 0, wy: topLine+ViewerSpecs.captionHeight+4*ViewerSpecs.windowBorderSize, wh: ViewerSpecs.menuBarHeight]]; Containers.ChildXBound[my.pressContainer, rule]; my.pressViewer _ pressViewer _ ViewerOps.CreateViewer[ flavor: $Press, info: [ name: fileName, parent: my.pressContainer, wx: 0, wy: topLine+ViewerSpecs.captionHeight+5*ViewerSpecs.windowBorderSize, border: FALSE, scrollable: TRUE, iconic: FALSE, data: my], paint: TRUE ]; Containers.ChildXBound[my.pressContainer, my.pressViewer]; Containers.ChildYBound[my.pressContainer, my.pressViewer]; DeltaPage[my, 1]; ViewerOps.PaintViewer[my.pressContainer, all]; EXITS Quit => RETURN; }; NormalizePageNumber: Sliders.FilterProc = TRUSTED { my: ShowData _ NARROW[clientData]; RETURN [Real.FDiv[Real.RoundI[value*(my.show.lastPart-1)], (my.show.lastPart-1)]] }; FirstPage: Buttons.ButtonProc = TRUSTED { my: ShowData _ NARROW[clientData]; DeltaPage[my, 1]; Process.Detach[FORK ScrollIt[my.pressViewer, my, pressPageSize]]; }; TurnPage: Buttons.ButtonProc = TRUSTED { my: ShowData _ NARROW[clientData]; where: INT _ IF mouseButton = red THEN +1 ELSE -1; DeltaPage[my, MIN[MAX[my.pageNumber+where, 1], (my.show.lastPart-1)]]; Process.Detach[FORK ScrollIt[my.pressViewer, my, pressPageSize]]; }; LastPage: Buttons.ButtonProc = TRUSTED { my: ShowData _ NARROW[clientData]; DeltaPage[my, (my.show.lastPart-1)]; Process.Detach[FORK ScrollIt[my.pressViewer, my, pressPageSize]]; }; PageNumber: Buttons.ButtonProc = TRUSTED { my: ShowData _ NARROW[clientData]; stream: IO.STREAM _ IO.RIS[ViewerTools.GetContents[my.pageNumberViewer]]; where: INT _ stream.GetInt[]; DeltaPage[my, MIN[MAX[where, 1], (my.show.lastPart-1)]]; Process.Detach[FORK ScrollIt[my.pressViewer, my, pressPageSize]]; }; PageNumberSlider: Sliders.SliderProc = TRUSTED { my: ShowData _ NARROW[clientData]; SELECT reason FROM abort => { ViewerTools.SetContents[my.pageNumberViewer, IO.PutFR["%-g", IO.real[my.pageNumber]]]; }; move => { ViewerTools.SetContents[my.pageNumberViewer, IO.PutFR["%-g", IO.real[Real.RoundI[(my.show.lastPart-1)*value]]]]; }; set => { DeltaPage[my, MIN[MAX[Real.RoundI[(my.show.lastPart-1)*value], 1], (my.show.lastPart-1)]]; Process.Detach[FORK ScrollIt[my.pressViewer, my, pressPageSize]]; }; ENDCASE; }; PressPaint: ENTRY ViewerClasses.PaintProc = TRUSTED { my: ShowData _ NARROW[self.data]; rect: ViewerClasses.PaintRectangle; my.height _ self.ch; IF my.height > my.top THEN my.top _ my.height; IF ISTYPE[whatChanged, ViewerClasses.PaintRectangle] THEN rect _ NARROW[whatChanged]; IF rect # NIL THEN { dx, dy: REAL; box: Graphics.Box; IF rect.h > self.wh THEN RETURN; [dx, dy] _ ViewerOps.UserToScreenCoords[self, 0, 0]; -- need to map rect to user coords box.xmin _ rect.x - dx; box.ymin _ rect.y - dy; box.xmax _ rect.x + rect.w - dx; box.ymax _ rect.y + rect.h - dy; context.ClipBox[box: box, exclude: TRUE]; }; Graphics.Translate[context, 0.0, my.height-my.top]; Graphics.Scale[context, pointsPerMica, pointsPerMica]; -- establish Press coord system ShowPress.DrawPressPage[context: context, show: my.show, pageNumber: my.pageNumber ! ShowPress.ShowPressError => { my: ShowData _ NARROW[self.data]; SELECT code FROM NoSuchPage => {my.pageNumber _ my.pageNumber-1; RETRY;} ENDCASE => REJECT } ]; }; -- PressPaint PressScroll: ViewerClasses.ScrollProc = TRUSTED { my: ShowData _ NARROW[self.data]; SELECT op FROM query => RETURN [ top: Real.Fix[(1.0-my.top/pressPageSize)*100.0], bottom: Real.Fix[(1.0-(my.top-my.height)/pressPageSize)*100.0]]; up => IF my.top > my.height THEN { Process.Detach[FORK ScrollIt[self, my, MAX[my.top-amount, my.height]]]; }; down => IF my.top < pressPageSize THEN { Process.Detach[FORK ScrollIt[self, my, MIN[my.top+amount, pressPageSize]]]; }; thumb => { Process.Detach[FORK ScrollIt[self, my, MAX[MIN[(100-amount)*pressPageSize/100, pressPageSize], my.height]]]; }; ENDCASE => ERROR; }; -- PressScroll PressDestroy: ViewerClasses.DestroyProc = TRUSTED { my: ShowData _ NARROW[self.data]; my.show.Close[]; }; -- PressDestroy ScrollIt: PROCEDURE [self: ViewerClasses.Viewer, data: ShowData, newvalue: REAL] = { DeltaTop[data, newvalue]; ViewerOps.PaintViewer[viewer: self, hint: client]; }; DeltaPage: ENTRY PROCEDURE [data: ShowData, newvalue: INT] = { data.pageNumber _ newvalue; ViewerTools.SetContents[data.pageNumberViewer, IO.PutFR["%-g", IO.int[newvalue]]]; Sliders.SetContents[data.pageNumberSlider, Real.FDiv[newvalue, (data.show.lastPart-1)]]; }; DeltaTop: ENTRY PROCEDURE [data: ShowData, newvalue: REAL] = { data.top _ newvalue; }; MakeShowPress: Commander.CommandProc = TRUSTED { fileName: Rope.ROPE _ IO.GetToken[IO.RIS[cmd.commandLine], IO.WhiteSpace]; [] _ CreateShowViewer[fileName]; }; -- MakeShowPress <<>> pressViewerClass.paint _ PressPaint; pressViewerClass.destroy _ PressDestroy; pressViewerClass.scroll _ PressScroll; pressViewerClass.bltContents _ top; ViewerOps.RegisterViewerClass[$Press, pressViewerClass]; Commander.Register[ key: "ShowPress", proc: MakeShowPress, doc: "Show a Press file through CedarGraphics" ]; END. -- ShowPressTool <> <> <<>> <> <> <<>> <> <> <<>> <> <> <<>> <> <> <<>> <> < Commander.>> <<>> <> <> <<>>