<<>> <> <> <> <> <> <> <<>> DIRECTORY GGParseIn, GGViewerOps, Icons, InputFocus, IO, Process, Rope, Vector2, ViewerClasses, ViewerTools; GGViewerOpsImpl: CEDAR PROGRAM IMPORTS GGParseIn, InputFocus, IO, Process, Rope, ViewerTools EXPORTS GGViewerOps = BEGIN Point: TYPE = Vector2.VEC; Viewer: TYPE = ViewerClasses.Viewer; RopeNotOnTop: PUBLIC SIGNAL [position: NAT, wasThere: Rope.ROPE, notThere: Rope.ROPE] = CODE; GetReal: PUBLIC PROC [textViewer: Viewer, default: REAL] RETURNS [r: REAL] = { rRope: Rope.ROPE ¬ ViewerTools.GetContents[textViewer]; r ¬ IF Rope.Size[rRope] = 0 THEN default ELSE IO.GetReal[IO.RIS[rRope] ! IO.EndOfStream, IO.Error => {r ¬ default; CONTINUE}]; }; GetTwoReals: PUBLIC PROC [textViewer: Viewer] RETURNS [x, y: REAL] = { wholeRope: Rope.ROPE ¬ ViewerTools.GetContents[textViewer]; wholeStream: IO.STREAM ¬ IO.RIS[wholeRope]; x ¬ GGParseIn.ReadReal[wholeStream]; GGParseIn.ReadChar[wholeStream, ',]; y ¬ GGParseIn.ReadReal[wholeStream]; }; GetPositiveReal: PUBLIC PROC [textViewer: Viewer, default: REAL] RETURNS [r: REAL] = { rRope: Rope.ROPE ¬ ViewerTools.GetContents[textViewer]; IF Rope.Size[rRope] = 0 THEN r ¬ default ELSE { r ¬ IO.GetReal[IO.RIS[rRope] ! IO.EndOfStream, IO.Error => {r ¬ default; CONTINUE}]; RETURN[IF r >0 THEN r ELSE default]; }; }; SetReal: PUBLIC PROC [viewer: Viewer, real: REAL, format: Rope.ROPE ¬ NIL] = { realRope: Rope.ROPE; format ¬ IF format = NIL THEN "%g" ELSE format; realRope ¬ IO.PutFR1[format, [real[real]]]; <> <> ViewerTools.SetContents[viewer, realRope]; }; GetPoint: PUBLIC PROC [textViewer: Viewer] RETURNS [point: Point, success: BOOL] = { <,]".>> pointRope: Rope.ROPE ¬ ViewerTools.GetContents[textViewer]; f: IO.STREAM ¬ IO.RIS[pointRope]; GGParseIn.ReadChar[f, '[]; point.x ¬ ReadBlankAndReal[f]; GGParseIn.ReadChar[f, ',]; point.y ¬ ReadBlankAndReal[f]; GGParseIn.ReadChar[f, ']]; success ¬ TRUE; }; SetPoint: PUBLIC PROC [viewer: Viewer, point: Point] = { pointRope: Rope.ROPE; pointRope ¬ IO.PutFR["[%g,%g]", [real[point.x]], [real[point.y]]]; ViewerTools.SetContents[viewer, pointRope]; }; <> <> <> <> <> <> <> < {endofstream ¬ TRUE; CONTINUE}];>> <> <> <> <> <> <<};>> <<>> ReadBlankAndReal: PROC [f: IO.STREAM] RETURNS [r: REAL] = { <> ReadBlank[f]; r ¬ ReadReal[f]; }; ReadBlank: PROC [f: IO.STREAM] = { <'s, 's, and 's until something else is encountered. Doesn't mind if no white space characters are found. Treats comments as white space.>> [] ¬ IO.SkipWhitespace[f, TRUE]; }; ReadReal: PROC [f: IO.STREAM] RETURNS [r: REAL] = { <, or . Leaves these terminators on the stream.>> realRope: Rope.ROPE; end: BOOL ¬ FALSE; [realRope, ----] ¬ IO.GetTokenRope[f, RealBreakProc !IO.EndOfStream => {end ¬ TRUE; CONTINUE}]; IF end THEN {r ¬ 0.0; RETURN}; IF Rope.Find[realRope, ".", 0, FALSE] = -1 THEN realRope ¬ Rope.Concat[realRope, ".0"]; r ¬ IO.GetReal[IO.RIS[realRope]]; }; RealBreakProc: PROC [char: CHAR] RETURNS [IO.CharClass] = { SELECT char FROM '], ',, IO.CR, IO.LF, IO.SP =>RETURN [break]; ENDCASE => RETURN [other]; }; <<>> GetIconSize: PUBLIC PROC [] RETURNS [width, height: INT] = { RETURN[Icons.iconW, Icons.iconH]; }; <<>> pauses: INT ¬ 5; pauseMSec: Process.Milliseconds ¬ 100; -- one-tenth of a second GetSelectionContents: PUBLIC PROC [] RETURNS [Rope.ROPE] = { -- may return NIL <> THROUGH [0..pauses) DO f: InputFocus.Focus _ InputFocus.GetInputFocus[]; IF f=NIL THEN RETURN [NIL]; -- there really is no input focus IF f.owner=NIL THEN Process.PauseMsec[pauseMSec] -- wait a while until PopUpSelection2 pops InputFocus, then try again ELSE RETURN[ViewerTools.GetSelectionContents[] ]; ENDLOOP; RETURN[NIL]; -- some other process wacked the input focus }; <<>> END.