File: SVViewerToolsImpl.mesa
Created December 18, 1982 1:40 am
Copyright © 1984 by Xerox Corporation. All rights reserved.
Last edited by Eric Bier on August 19, 1984 4:44:16 pm PDT
Contents: Basic functions for retrieving values from and writing values to text viewers.
DIRECTORY
GraphicsColor,
IO,
Rope,
SVViewerTools,
TFI3d,
SVError,
ViewerClasses,
ViewerTools;
SVViewerToolsImpl: PROGRAM
IMPORTS GraphicsColor, IO, Rope, SVError, TFI3d, ViewerTools
EXPORTS SVViewerTools =
BEGIN
Color: TYPE = GraphicsColor.Color;
Viewer: TYPE = ViewerClasses.Viewer;
GetReal: PUBLIC PROC [textViewer: Viewer, default: REAL] RETURNS [r: REAL] = {
rRope: Rope.ROPE ← ViewerTools.GetContents[textViewer];
IF Rope.Size[rRope] = 0 THEN r ← default ELSE {
IF Rope.Find[rRope, ".", 0, FALSE] = -1 THEN rRope ← Rope.Concat[rRope, ".0"];
r ← IO.GetReal[IO.RIS[rRope]];
};
};
GetBool: PUBLIC PROC [textViewer: Viewer] RETURNS [b: BOOL] = {
bRope: Rope.ROPE ← ViewerTools.GetContents[textViewer];
b ← IF Rope.Equal[bRope, "TRUE"] THEN TRUE ELSE FALSE;
};
GetColor: PUBLIC PROC [textViewer: Viewer] RETURNS [color: GraphicsColor.Color, success: BOOL] = {
r, g, b: REAL;
success ← TRUE;
[r, g, b] ← GetThreeReals[textViewer];
IF r > 1 OR r < 0 THEN {SVError.Append["r value must be between 0 and 1", TRUE, TRUE]; SVError.Blink[]; success ← FALSE};
IF g > 1 OR g < 0 THEN {SVError.Append["g value must be between 0 and 1", TRUE, TRUE]; SVError.Blink[]; success ← FALSE};
IF b > 1 OR b < 0 THEN {SVError.Append["b value must be between 0 and 1", TRUE, TRUE]; SVError.Blink[]; success ← FALSE};
IF success THEN color ← GraphicsColor.RGBToColor [r, g, b];
};
GetThreeReals: PUBLIC PROC [textViewer: Viewer] RETURNS [x, y, z: REAL] = {
wholeRope: Rope.ROPE ← ViewerTools.GetContents[textViewer];
wholeStream: IO.STREAMIO.RIS[wholeRope];
threeNumsThere: BOOLTRUE;
TFI3d.ReadBlank[wholeStream];
x ← TFI3d.ReadReal[wholeStream];
TFI3d.ReadBlankAndRope[wholeStream, ","
!TFI3d.RopeNotOnTop => {threeNumsThere ← FALSE; CONTINUE}];
IF NOT threeNumsThere THEN y ← x
ELSE {
TFI3d.ReadBlank[wholeStream]; y ← TFI3d.ReadReal[wholeStream]};
TFI3d.ReadBlankAndRope[wholeStream, ","
!TFI3d.RopeNotOnTop => {threeNumsThere ← FALSE; CONTINUE}];
IF NOT threeNumsThere THEN z ← y
ELSE {
TFI3d.ReadBlank[wholeStream]; z ← TFI3d.ReadReal[wholeStream]};
};
GetNat: PUBLIC PROC [textViewer: Viewer] RETURNS [n: NAT] = {
nRope: Rope.ROPE ← ViewerTools.GetContents[textViewer];
IF Rope.Size[nRope] = 0 THEN n ← 0 ELSE {
n ← IO.GetInt[IO.RIS[nRope]];
};
};
SetReal: PUBLIC PROC [viewer: Viewer, real: REAL] = {
s: IO.STREAM;
realRope: Rope.ROPE;
s ← IO.ROS[];
s.PutF["%g", [real[real]]];
realRope ← IO.RopeFromROS[s];
ViewerTools.SetContents[viewer, realRope];
};
SetBool: PUBLIC PROC [viewer: Viewer, bool: BOOL] = {
s: IO.STREAM;
boolRope: Rope.ROPE;
s ← IO.ROS[];
s.PutF["%g", [boolean[bool]]];
boolRope ← IO.RopeFromROS[s];
ViewerTools.SetContents[viewer, boolRope];
};
SetColor: PUBLIC PROC [viewer: Viewer, color: Color] = {
r,g,b: REAL;
[r,g,b] ← GraphicsColor.ColorToRGB[color];
SetThreeReals[viewer, r, g, b];
};
SetThreeReals: PUBLIC PROC [viewer: Viewer, a, b, c: REAL] = {
s: IO.STREAM;
realsRope: Rope.ROPE;
s ← IO.ROS[];
s.PutF["%g, %g, %g", [real[a]], [real[b]], [real[c]]];
realsRope ← IO.RopeFromROS[s];
ViewerTools.SetContents[viewer, realsRope];
};
END.