StyleToolConvertImpl.mesa, written by Linda Gass on August 12, 1982 9:42 am
Last Edit by Linda Gass on November 4, 1982 2:28 pm
Last Edited by: Plass, March 28, 1983 2:57 pm
Last Edited by: Beach, February 22, 1984 3:28:18 pm PST
Pavel, June 26, 1985 4:23:43 pm PDT
DIRECTORY
Atom USING [GetPName],
IO USING [RIS, GetInt, GetReal, Error, STREAM, PutFR, real],
MessageWindow USING [Append, Blink],
NodeStyle USING [FontFace, FontAlphabets, FontUnderlining, LineFormatting, PathType],
Rope USING [Cat, Equal, ROPE, Size],
StyleToolConvert,
StyleToolDefs USING [FontFamilyRec, fontFamilyList],
ViewerClasses USING [Viewer],
ViewerTools USING [GetContents];
StyleToolConvertImpl: CEDAR PROGRAM
IMPORTS Atom, IO, MessageWindow, Rope, StyleToolDefs, ViewerTools
EXPORTS StyleToolConvert =
BEGIN OPEN StyleToolDefs;
BadNumber: PUBLIC SIGNAL = CODE;
UnitsType: TYPE = {pt, pc, in, cm, mm, dd, em, en, sp};
pointsPerInch: REAL = 72.27; -- how many points to the inch for consistency
ConversionFactors: ARRAY UnitsType[pt..sp] OF ARRAY UnitsType[pt..sp] OF REAL
[[1.0,    0.083334, 1/pointsPerInch, 0.03515, 0.3515, 0.9346, 1.0, 1.0, 1.0],
[12.0,    1.0,  0.166667,   0.42334, 4.2334, 11.214953, 1.0, 1.0, 1.0],
[pointsPerInch, 6.0,  1.0,    2.54,  25.4,  67.542056, 1.0, 1.0, 1.0],
[28.453,   2.3623, 0.3937,   1.0,  10.0,  26.6,  1.0, 1.0, 1.0],
[2.8453,   0.23623, 0.03937,   0.1,  1.0,  2.66,  1.0, 1.0, 1.0],
[1.07,    0.08917, 0.0148,   0.03759, 0.3759, 1.0,  1.0, 1.0, 1.0],
[1.0,    1.0,  1.0,    1.0,  1.0,  1.0,  1.0, 1.0, 1.0],
[1.0,    1.0,  1.0,    1.0,  1.0,  1.0,  1.0, 1.0, 1.0],
[1.0,    1.0,  1.0,    1.0,  1.0,  1.0,  1.0, 1.0, 1.0]];
The above array contains all the multiplicative factors used in converting from one unit of measurement to another. The array is two dimensional and is indexed by the different units along both dimensions. So for example, an entry ConversionFactors[y][x] will give us the factor for converting a number in y units to a number in x units. We simply multiply the number we currently have by the number in ConversionFactors[y][x].
These conversion factors were obtained from the following standard conversions:
72.27 points = 1 inch   12 points = 1 pica
2.54 cm = 1 inch    2.66 didot points = 1 mm  0.3759 mm = 1 didot point
6 picas = 1 inch    1.07 points = 1 didot point = 0.0148 ins
ConvertUnits: PUBLIC PROC [num: REAL, prevUnits, newUnits: Rope.ROPE] RETURNS [REAL] =
{
old, new: UnitsType;
old ← ConvertRopeToUnitsType[prevUnits];
new ← ConvertRopeToUnitsType[newUnits];
num ← num * ConversionFactors[old][new];
RETURN[num];
};
ConvertRopeToUnitsType: PROCEDURE [units: Rope.ROPE] RETURNS [UnitsType] = BEGIN
SELECT TRUE FROM
Rope.Equal[units, "points", FALSE]  => RETURN[pt];
Rope.Equal[units, "picas", FALSE]   => RETURN[pc];
Rope.Equal[units, "inches", FALSE]  => RETURN[in];
Rope.Equal[units, "centimeters", FALSE] => RETURN[cm];
Rope.Equal[units, "millimeters", FALSE] => RETURN[mm];
Rope.Equal[units, "didot points", FALSE] => RETURN[dd];
Rope.Equal[units, "ems", FALSE]   => RETURN[em];
Rope.Equal[units, "ens", FALSE]   => RETURN[en];
Rope.Equal[units, "spaces", FALSE]  => RETURN[sp];
ENDCASE => ERROR;
END;
GetRealFromViewer: PUBLIC PROC [viewer: ViewerClasses.Viewer] RETURNS [REAL] = BEGIN
Alert: PROCEDURE = BEGIN
MessageWindow.Append[Rope.Cat["Invalid real number in ", viewer.name, " field."], TRUE];
MessageWindow.Blink[];
SIGNAL BadNumber;
END;
numberRope: Rope.ROPE ← ViewerTools.GetContents[viewer];
realNumber: REAL;
h: IO.STREAM;
IF Rope.Size[numberRope] = 0 THEN RETURN[0.0];  -- Ignore if no value
h ← IO.RIS[numberRope];
realNumber ← IO.GetReal[h ! IO.Error =>
SELECT ec FROM
SyntaxError => { Alert;
CONTINUE;
};
ENDCASE => ERROR; -- shouldn't get any other errors
];
RETURN [realNumber];
END;
GetIntegerFromViewer: PUBLIC PROC [viewer: ViewerClasses.Viewer] RETURNS [INTEGER] = BEGIN
Alert: PROCEDURE = BEGIN
MessageWindow.Append[Rope.Cat["Invalid integer in ", viewer.name, " field."], TRUE];
MessageWindow.Blink[];
SIGNAL BadNumber;
END;
numberRope: Rope.ROPE ← ViewerTools.GetContents[viewer];
int: INTEGER;
h: IO.STREAM;
IF Rope.Size[numberRope] = 0 THEN RETURN[0];  -- Ignore if no value
h ← IO.RIS[numberRope];
int ← IO.GetInt[h ! IO.Error =>
SELECT ec FROM
SyntaxError => { Alert;
CONTINUE;
};
ENDCASE => ERROR; -- shouldn't get any other errors
];
RETURN [int];
END;
GetFontFamily: PUBLIC PROC [name: ATOM]
RETURNS [fontInfo: FontFamilyRec] =
BEGIN
IF name = NIL THEN
fontInfo.name ← "None"
ELSE
{
fontInfo.name ← Atom.GetPName[name];
Check if this font family is in our list of font family names
IF ~MemberOfList[fontInfo.name, fontFamilyList] THEN
{
This display contains a non-standard font name. In this case we wish to return the font name as well as the button to be turned "on" - "Other".
fontInfo.text ← fontInfo.name;
fontInfo.name ← "Other";
}
ELSE
fontInfo.text ← NIL;
};
END;
MemberOfList: PROC [item: Rope.ROPE, list: LIST OF Rope.ROPE] RETURNS [BOOLEAN] =
{
FOR eachItem: LIST OF Rope.ROPE ← list, eachItem.rest UNTIL eachItem = NIL DO
IF Rope.Equal[eachItem.first, item, FALSE] THEN
RETURN [TRUE];
ENDLOOP;
If we get here, we haven't found the item in our list
RETURN[FALSE];
};
GetFontFaceJaM: PUBLIC PROC[face: NodeStyle.FontFace] RETURNS [Rope.ROPE] =
{
SELECT face FROM
Regular => RETURN["regular"];
Bold => RETURN["bold"];
Italic => RETURN["italic"];
BoldItalic => RETURN["bold+italic"];
ENDCASE => ERROR;
};
GetFontFaceChoice: PUBLIC PROC[face: NodeStyle.FontFace] RETURNS [Rope.ROPE] =
{
SELECT face FROM
Regular => RETURN["Regular"];
Bold => RETURN["Bold"];
Italic => RETURN["Italic"];
BoldItalic => RETURN["BoldItalic"];
ENDCASE => ERROR;
};
RopeFromReal: PUBLIC PROC[r: REAL] RETURNS [Rope.ROPE] = {
RETURN[IO.PutFR["%g", IO.real[r]]];
};
GetFontAlphabetsJaM: PUBLIC PROC[alphabets: NodeStyle.FontAlphabets] RETURNS [Rope.ROPE] = {
SELECT alphabets FROM
CapsAndLower  => RETURN["caps+lowercase"];
CapsAndSmallCaps => RETURN["caps+smallCaps"];
LowerOnly   => RETURN["lowerOnly"];
CapsOnly    => RETURN["capsOnly"];
ENDCASE    => ERROR;
};
GetFontAlphabetsChoice: PUBLIC PROC[alphabets: NodeStyle.FontAlphabets]RETURNS[Rope.ROPE] = {
SELECT alphabets FROM
CapsAndLower  => RETURN["CapsAndLower"];
CapsAndSmallCaps => RETURN["CapsAndSmallCaps"];
LowerOnly   => RETURN["LowerOnly"];
CapsOnly    => RETURN["CapsOnly"];
ENDCASE    => ERROR;
};
FontAlphChoiceToJaM: PUBLIC PROCEDURE [alphabets: Rope.ROPE] RETURNS [Rope.ROPE] = BEGIN
SELECT TRUE FROM
Rope.Equal[alphabets, "CapsAndLower", FALSE]  => RETURN["caps+lowercase"];
Rope.Equal[alphabets, "CapsAndSmallCaps", FALSE] => RETURN["caps+smallCaps"];
Rope.Equal[alphabets, "LowerOnly", FALSE]   => RETURN["lowerOnly"];
Rope.Equal[alphabets, "CapsOnly", FALSE]    => RETURN["capsOnly"];
ENDCASE             => ERROR;
END;
GetFontUnderliningJaM: PUBLIC PROC[underlining: NodeStyle.FontUnderlining] RETURNS [Rope.ROPE] = {
SELECT underlining FROM
None     => RETURN["none"];
LettersAndDigits => RETURN["lettersAndDigits"];
Visible    => RETURN["visible"];
All     => RETURN["all"];
ENDCASE    => ERROR;
};
GetFontUnderliningChoice: PUBLIC PROC[underlining: NodeStyle.FontUnderlining] RETURNS [Rope.ROPE] = {
SELECT underlining FROM
None     => RETURN["None"];
LettersAndDigits => RETURN["LettersAndDigits"];
Visible    => RETURN["Visible"];
All     => RETURN["All"];
ENDCASE    => ERROR;
};
FontUndChoiceToJaM: PUBLIC PROCEDURE [underlining: Rope.ROPE] RETURNS [Rope.ROPE] = {
SELECT TRUE FROM
Rope.Equal[underlining, "None", FALSE]     => RETURN["none"];
Rope.Equal[underlining, "LettersAndDigits", FALSE] => RETURN["lettersAndDigits"];
Rope.Equal[underlining, "Visible", FALSE]    => RETURN["visible"];
Rope.Equal[underlining, "All", FALSE]     => RETURN["all"];
ENDCASE              => ERROR;
};
GetLineFormattingJaM: PUBLIC PROC[lineFormat: NodeStyle.LineFormatting]RETURNS[Rope.ROPE] ={
SELECT lineFormat FROM
FlushLeft => RETURN["flushLeft"];
FlushRight => RETURN["flushRight"];
Justified  => RETURN["justified"];
Centered  => RETURN["centered"];
ENDCASE  => ERROR;
};
GetLineFormattingChoice: PUBLIC PROC[lineFormat: NodeStyle.LineFormatting] RETURNS [Rope.ROPE] = {
SELECT lineFormat FROM
FlushLeft => RETURN["FlushLeft"];
FlushRight => RETURN["FlushRight"];
Justified  => RETURN["Justified"];
Centered  => RETURN["Centered"];
ENDCASE  => ERROR;
};
LineChoiceToJaM: PUBLIC PROCEDURE [lineFormatting: Rope.ROPE] RETURNS [Rope.ROPE] = {
SELECT TRUE FROM
Rope.Equal[lineFormatting, "FlushLeft", FALSE]  => RETURN["flushLeft"];
Rope.Equal[lineFormatting, "FlushRight", FALSE] => RETURN["flushRight"];
Rope.Equal[lineFormatting, "Justified", FALSE]  => RETURN["justified"];
Rope.Equal[lineFormatting, "Centered", FALSE]  => RETURN["centered"];
ENDCASE             => ERROR;
};
GetPathTypeJaM: PUBLIC PROC[pathType: NodeStyle.PathType] RETURNS [Rope.ROPE] = {
SELECT pathType FROM
Filled      => RETURN["filled"];
Outlined     => RETURN["outlined"];
FilledAndOutlined  => RETURN["filled+outlined"];
ENDCASE     => ERROR;
};
GetPathTypeChoice: PUBLIC PROC[pathType: NodeStyle.PathType] RETURNS [Rope.ROPE] = {
SELECT pathType FROM
Filled      => RETURN["Filled"];
Outlined     => RETURN["Outlined"];
FilledAndOutlined  => RETURN["FilledAndOutlined"];
ENDCASE     => ERROR;
};
END.