GGViewerOpsImpl.mesa
Copyright © 1985 by Xerox Corporation. All rights reserved.
Last edited by Bier on September 12, 1987 2:24:55 pm PDT
Contents: Utility routines to get and set values from buttons, labels, and text viewers.
Pier, June 27, 1991 2:49 pm PDT
DIRECTORY
GGParseIn, GGViewerOps, Icons, IO, Rope, Vector2, ViewerClasses, ViewerTools;
GGViewerOpsImpl:
CEDAR
PROGRAM
IMPORTS GGParseIn, IO, 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.ReadWReal[wholeStream];
GGParseIn.ReadWRope[wholeStream, ","];
y ← GGParseIn.ReadWReal[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.PutFR[format, [real[real]]];
changed from %6.3. KAP. August 18, 1986
changed to format, Bier, September 8, 1987
ViewerTools.SetContents[viewer, realRope];
};
GetPoint:
PUBLIC
PROC [textViewer: Viewer]
RETURNS [point: Point, success:
BOOL] = {
Assumes a rope of the form "[<real1>,<real2>]".
pointRope: Rope.ROPE ← ViewerTools.GetContents[textViewer];
f: IO.STREAM ← IO.RIS[pointRope];
ReadRope[f, "["];
point.x ← ReadBlankAndReal[f];
ReadRope[f, ","];
point.y ← ReadBlankAndReal[f];
ReadRope[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];
};
ReadRope:
PUBLIC
PROC [f:
IO.
STREAM, rope: Rope.
ROPE] = {
Removes the given rope from the top of the stream. Used to remove formatting words and phrases from 3d files. We are not interested in these strings but only in the data in between them.
Signals RopeNotOnTop if some other rope is on top.
c: CHAR;
endofstream: BOOL ← FALSE;
FOR i:
INT
IN[1..Rope.Length[rope]]
DO
c ←
IO.GetChar[f
! IO.EndOfStream => {endofstream ← TRUE; CONTINUE}];
IF endofstream
THEN
SIGNAL RopeNotOnTop [IO.GetIndex[f], NIL, rope];
IF
NOT c = Rope.Fetch[rope,i-1]
THEN
SIGNAL RopeNotOnTop [IO.GetIndex[f], Rope.FromChar[c], rope];
ENDLOOP;
};
ReadBlankAndReal:
PROC [f:
IO.
STREAM]
RETURNS [r:
REAL] = {
A convenience function. Equivalent to ReadBlank[f]; r ← ReadReal[f];
ReadBlank[f];
r ← ReadReal[f];
};
ReadBlank:
PROC [f:
IO.
STREAM] = {
Reads, <SPACE>'s, <CR>'s, and <TAB>'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] = {
Reads digits up to the next ], <CR>, <SPACE> or <COMMA>. 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
'], ', => RETURN [break];
IO.CR =>RETURN [break];
IO.LF =>RETURN [break];
IO.SP => RETURN [break];
ENDCASE => RETURN [other];
};
GetIconSize:
PUBLIC
PROC []
RETURNS [width, height:
INT] = {
RETURN[Icons.iconW, Icons.iconH];
};
END.