Compiler ControllerMenus/n
m. stone March 14, 1984 8:26:04 pm PST
Tiberi November 4, 1979 5:41 PM
implementing module for griffin file controller menus
Last Edited by: Stone, November 14, 1983 3:06 pm
Last Edited by: Pier, February 13, 1984 4:25:40 pm PST
DIRECTORY
MenuDefs: FROM "MenuDefs",
RefreshDefs: FROM "RefreshDefs",
StyleDefs: FROM "StyleDefs",
ControllerMenuDefs: FROM "ControllerMenuDefs",
PointDefs: FROM "PointDefs",
GriffinMenusInterface,
GriffinDefs USING [UserMessage],
GriffinColor USING [StringToColor, ColorToString, GetNames],
GriffinFontDefs USING [Regular, Bold, Italic, BoldItalic, FontDescriptor],
GriffinStyle USING [CurrentStyle, FontFromInternalFont, InternalFontFromFont, Font, InternalFont, StyleHandle],
Convert USING [CardFromRope, RopeFromCard],
ViewerTools USING [GetSelectionContents],
Rope;
------------------------------------------------------------------
------------------------------------------------------------------
ControllerMenus: CEDAR PROGRAM
IMPORTS MenuDefs,
RefreshDefs, PointDefs, Rope, GriffinColor, GriffinStyle, GriffinDefs, Convert, ViewerTools
EXPORTS ControllerMenuDefs, GriffinMenusInterface =
BEGIN
ROPE: TYPE = Rope.ROPE;
colorMenu: PUBLIC MenuDefs.MenuHandle←NIL;
lineColorMenu: PUBLIC MenuDefs.MenuHandle←NIL;
textMenu: PUBLIC MenuDefs.MenuHandle←NIL;
centerMenu: PUBLIC MenuDefs.MenuHandle←NIL;
typeMenu: PUBLIC MenuDefs.MenuHandle←NIL;
fontMenu: PUBLIC MenuDefs.MenuHandle←NIL;
fontItem: MenuDefs.MenuItemHandle←NIL;
thickMenu: PUBLIC MenuDefs.MenuHandle←NIL;
colorControlMenu: PUBLIC MenuDefs.MenuHandle←NIL;
InitCaptionMenu: PUBLIC PROCEDURE =
BEGIN
default: MenuDefs.MenuItemHandle;
textMenu ← MenuDefs.CreateMenu[vertical, [350,150], NIL];
default ← MenuDefs.AddMenuItem[textMenu,"0",TextDir];
[]←MenuDefs.AddMenuItem[textMenu,"90",TextDir];
[]←MenuDefs.AddMenuItem[textMenu,"180",TextDir];
[]←MenuDefs.AddMenuItem[textMenu,"270",TextDir];
MenuDefs.BugItem[default];
centerMenu ← MenuDefs.CreateMenu[vertical, [250,150], NIL];
default ← MenuDefs.AddMenuItem [centerMenu, "left", SetCenter];
[]←MenuDefs.AddMenuItem [centerMenu, "centered", SetCenter];
[]←MenuDefs.AddMenuItem [centerMenu, "right", SetCenter];
MenuDefs.BugItem[default];
typeMenu ← MenuDefs.CreateMenu[vertical, [350,250], NIL];
default ← MenuDefs.AddMenuItem [typeMenu, "normal", SetType];
[]←MenuDefs.AddMenuItem [typeMenu, "stack", SetType];
MenuDefs.BugItem[default];
fontMenu ← MenuDefs.CreateMenu[vertical, [350,300], NIL];
fontItem ← MenuDefs.AddMenuItem[fontMenu, "Helevetica10", ChangeFont];
SetFontFromName["Helvetica10"];
END;
InitColorMenu: PUBLIC PROCEDURE =
BEGIN
default, new: MenuDefs.MenuItemHandle;
names: LIST OF ROPE ← GriffinColor.GetNames[];
colorMenu ← MenuDefs.CreateMenu[vertical, [180,500], "Areas"];
FOR l: LIST OF ROPE ← names, l.rest UNTIL l=NIL DO
new←MenuDefs.AddMenuItem[colorMenu,l.first,ColorType];
IF Rope.Equal[l.first, "grey", FALSE] THEN default ← new;
ENDLOOP;
MenuDefs.BugItem[default];
lineColorMenu ← MenuDefs.CreateMenu[vertical, [100,500], "Lines"];
FOR l: LIST OF ROPE ← names, l.rest UNTIL l=NIL DO
new←MenuDefs.AddMenuItem[lineColorMenu,l.first,ColorType];
IF Rope.Equal[l.first, "black", FALSE] THEN default ← new;
ENDLOOP;
MenuDefs.BugItem[default];
END;
InitShapeMenu: PUBLIC PROCEDURE =
BEGIN
default: MenuDefs.MenuItemHandle;
colorControlMenu ← MenuDefs.CreateMenu[vertical, [100,200], NIL];
[]←MenuDefs.AddMenuItem[colorControlMenu, "Outlined", ColorControl];
[]←MenuDefs.AddMenuItem[colorControlMenu, "Filled", ColorControl];
default←MenuDefs.AddMenuItem[colorControlMenu, "Both", ColorControl];
MenuDefs.BugItem[default];
thickMenu ← MenuDefs.CreateMenu[vertical, [50,200], NIL];
[]←MenuDefs.AddMenuItem [thickMenu, "1 pt", SetThickness];
default ←MenuDefs.AddMenuItem [thickMenu, "2 pt", SetThickness];
[]←MenuDefs.AddMenuItem [thickMenu, "3 pt", SetThickness];
[]←MenuDefs.AddMenuItem [thickMenu, "4 pt", SetThickness];
MenuDefs.BugItem[default];
END;
DisplayCaptionMenu: PUBLIC PROCEDURE =
BEGIN
MenuDefs.ShowMenu[textMenu];
MenuDefs.ShowMenu[centerMenu];
MenuDefs.ShowMenu[typeMenu];
MenuDefs.ShowMenu[fontMenu];
RefreshDefs.RestoreScreen[];
END;
UnDisplayCaptionMenu: PUBLIC PROCEDURE =
BEGIN
MenuDefs.HideMenu[textMenu];
MenuDefs.HideMenu[centerMenu];
MenuDefs.HideMenu[typeMenu];
MenuDefs.HideMenu[fontMenu];
RefreshDefs.RestoreScreen[];
END;
DisplayColorMenu: PUBLIC PROCEDURE =
BEGIN
MenuDefs.ShowMenu[lineColorMenu];
MenuDefs.ShowMenu[colorMenu];
RefreshDefs.RestoreScreen[];
END;
UnDisplayColorMenu: PUBLIC PROCEDURE =
BEGIN
MenuDefs.HideMenu[colorMenu];
MenuDefs.HideMenu[lineColorMenu];
RefreshDefs.RestoreScreen[];
END;
DisplayShapeMenu: PUBLIC PROCEDURE =
BEGIN
MenuDefs.ShowMenu[colorControlMenu];
MenuDefs.ShowMenu[thickMenu];
RefreshDefs.RestoreScreen[];
END;
UnDisplayShapeMenu: PUBLIC PROCEDURE =
BEGIN OPEN MenuDefs;
MenuDefs.HideMenu[colorControlMenu];
MenuDefs.HideMenu[thickMenu];
RefreshDefs.RestoreScreen[];
END;
ColorControl: PUBLIC MenuDefs.MenuProc =
BEGIN OPEN StyleDefs,MenuDefs;
string: ROPE ← MenuDefs.MenuString[item];
style: StyleDefs.StyleHandle ← GriffinStyle.CurrentStyle[];
SelectOnly[item];
SELECT TRUE FROM
Rope.Equal[string, "Outlined"] =>
BEGIN
style.outlined ← TRUE;
style.filled ← FALSE;
END;
Rope.Equal[string, "Filled"] =>
BEGIN
style.filled ← TRUE;
style.outlined ← FALSE;
END;
Rope.Equal[string, "Both"] =>
BEGIN
style.outlined ← TRUE;
style.filled ← TRUE;
END;
ENDCASE => ERROR;
END;
ColorType: PUBLIC MenuDefs.MenuProc =
BEGIN OPEN StyleDefs;
string: ROPE ← MenuDefs.MenuString[item];
color: Color ← GriffinColor.StringToColor[string];
IF MenuDefs.WhichMenu[item]=colorMenu
THEN GriffinStyle.CurrentStyle[].fillcolor ← color
ELSE GriffinStyle.CurrentStyle[].color ← color;
MenuDefs.SelectOnly[item];
END;
TextDir: PUBLIC MenuDefs.MenuProc =
BEGIN OPEN StyleDefs;
string: ROPE ← MenuDefs.MenuString[item];
GriffinStyle.CurrentStyle[].stringRotation
SELECT TRUE FROM
Rope.Equal[string,"0"] => StringRotation [or0],
Rope.Equal[string,"90"] => StringRotation [or90],
Rope.Equal[string,"180"] => StringRotation [or180],
Rope.Equal[string,"270"] => StringRotation [or270],
ENDCASE => ERROR;
MenuDefs.SelectOnly[item];
END;
SetCenter: PUBLIC MenuDefs.MenuProc =
BEGIN
string: ROPE ← MenuDefs.MenuString[item];
GriffinStyle.CurrentStyle[].anchor
SELECT TRUE FROM
Rope.Equal[string,"left"] => left,
Rope.Equal[string,"centered"] => center,
Rope.Equal[string,"right"] => right,
ENDCASE => ERROR;
MenuDefs.SelectOnly[item];
END;
SetType: PUBLIC MenuDefs.MenuProc =
BEGIN
string: ROPE ← MenuDefs.MenuString[item];
GriffinStyle.CurrentStyle[].stringType
SELECT TRUE FROM
Rope.Equal[string,"normal"] => normal,
Rope.Equal[string,"stack"] => stack,
ENDCASE => ERROR;
MenuDefs.SelectOnly[item];
END;
ChangeFont: MenuDefs.MenuProc = {
name: ROPE ← ViewerTools.GetSelectionContents[];
IF name=NIL THEN SIGNAL GriffinDefs.UserMessage["Please select a name like Helvetica10B"];
SetFontFromName[name];
MenuDefs.ShowMenu[fontMenu];
RefreshDefs.RestoreScreen[];
};
SetFontFromName: PROC[name: ROPE] = {
iFont: GriffinStyle.InternalFont ← NEW[GriffinFontDefs.FontDescriptor];
font: GriffinStyle.Font;
nchars, startSize, startFace: INT ← 0;
style: GriffinStyle.StyleHandle ← GriffinStyle.CurrentStyle[];
findSize: BOOLEANTRUE;
findFace: BOOLEANFALSE;
nchars ← Rope.Length[name];
FOR i: INT IN [0..nchars) DO
IF findSize THEN IF Rope.Fetch[name, i] IN ['0..'9] THEN {
startSize ← i; findFace ← TRUE; findSize ← FALSE;};
IF findFace THEN IF Rope.Fetch[name, i] NOT IN ['0..'9] THEN {startFace ← i};
ENDLOOP;
IF startFace=0 THEN {
iFont.face ← GriffinFontDefs.Regular;
startFace ← nchars}
ELSE {
face: ROPE ← Rope.Substr[base: name, start: startFace, len: nchars-startFace];
iFont.face ← SELECT TRUE FROM
Rope.Equal[face, "B", FALSE] => GriffinFontDefs.Bold,
Rope.Equal[face, "I", FALSE] => GriffinFontDefs.Italic,
Rope.Equal[face, "BI", FALSE] => GriffinFontDefs.BoldItalic,
Rope.Equal[face, "IB", FALSE] => GriffinFontDefs.BoldItalic,
Rope.Equal[face, "R", FALSE] => GriffinFontDefs.Regular,
ENDCASE => 10; --an arbitrary error number
IF iFont.face=10 THEN SIGNAL GriffinDefs.UserMessage[Rope.Cat["Invalid face code: ", face]];
};
IF startSize=0 THEN SIGNAL GriffinDefs.UserMessage["Include the point size in the name, ie: Helvetica10"];
iFont.name ← Rope.Substr[base: name, start: 0, len: startSize];
iFont.points ← Convert.CardFromRope[Rope.Substr[base: name, start: startSize, len: startFace-startSize]];
font ← GriffinStyle.FontFromInternalFont[iFont]; --catch font not found here
GriffinStyle.CurrentStyle[].font ← font;
MenuDefs.SetMenuString[fontItem, NameFromFont[iFont]];
};
NameFromFont: PROC[iFont: GriffinStyle.InternalFont] RETURNS [ROPE] = {
points: ROPE ← Convert.RopeFromCard[iFont.points];
face: ROPESELECT iFont.face FROM
GriffinFontDefs.Bold => "B",
GriffinFontDefs.Italic => "I",
GriffinFontDefs.BoldItalic => "BI",
ENDCASE => "";
RETURN[Rope.Cat[iFont.name, points, face]];
};
SetThickness: PUBLIC MenuDefs.MenuProc =
BEGIN OPEN PointDefs;
string: ROPE ← MenuDefs.MenuString[item];
GriffinStyle.CurrentStyle[].width
SELECT TRUE FROM
Rope.Equal[string,"1 pt"] => ScrValToObjVal[1],
Rope.Equal[string,"2 pt"] => ScrValToObjVal[2],
Rope.Equal[string,"3 pt"] => ScrValToObjVal[3],
Rope.Equal[string,"4 pt"] => ScrValToObjVal[4],
ENDCASE => ERROR;
MenuDefs.SelectOnly[item];
END;
SetStyleMenus: PUBLIC PROCEDURE[style: StyleDefs.StyleHandle] =
BEGIN
iFont: GriffinStyle.InternalFont ← GriffinStyle.InternalFontFromFont[style.font];
MenuDefs.SetMenuString[fontItem, NameFromFont[iFont]];
BugItemByString[colorMenu, GriffinColor.ColorToString[style.fillcolor]];
BugItemByString[lineColorMenu, GriffinColor.ColorToString[style.color]];
BugItemByString[colorControlMenu,
SELECT TRUE FROM
style.filled AND style.outlined => "Both",
style.filled => "Filled",
style.outlined => "Outlined",
ENDCASE => ERROR];
BugItemByString[textMenu,
SELECT style.stringRotation FROM
or0 => "0 d",
or90 => "90 d",
or180 => "180 d",
or270 => "270 d",
ENDCASE => ERROR];
BugItemByString[centerMenu,
SELECT style.anchor FROM
left => "left",
center => "centered",
right => "right",
ENDCASE => ERROR];
BugItemByString[typeMenu,
SELECT style.stringType FROM
normal => "normal",
stack => "stack",
ENDCASE => ERROR];
BugItemByString[thickMenu,
SELECT PointDefs.ObjValToScrVal[style.width] FROM
1 => "1 pt",
2 => "2 pt",
3 => "3 pt",
4 => "4 pt",
ENDCASE => ERROR];
END;
BugItemByString: PROCEDURE[menu: MenuDefs.MenuHandle, string: ROPE]=
BEGIN OPEN MenuDefs;
menuItem: MenuItemHandle ← NARROW[menu.head];
IsThisItem: MenuProc = {
IF Rope.Equal[MenuString[item], string, FALSE] THEN menuItem ← item};
ForAllMenuItems[menu, IsThisItem];
BugItem[menuItem]
END;
END.