-- Compiler ControllerMenus/n
-- m. stone December 2, 1981  11:17 PM
-- Tiberi November 4, 1979  5:41 PM
-- implementing module for griffin file controller menus

DIRECTORY ControllerDefs: FROM "ControllerDefs"
		USING [CurrentStyleRecord, CurrentFontDescriptor],
	MenuDefs: FROM "MenuDefs",
	RefreshDefs: FROM "RefreshDefs",
	GriffinFontDefs: FROM "GriffinFontDefs",
	StyleDefs: FROM "StyleDefs",
	ObjectDefs: FROM "ObjectDefs",
	ControllerMenuDefs: FROM "ControllerMenuDefs",
	GriffinMemoryDefs: FROM "GriffinMemoryDefs",
	PointDefs: FROM "PointDefs",
	StringDefs: FROM "StringDefs";



--------------------------------------------------------------------
--------------------------------------------------------------------
ControllerMenus:  PROGRAM
	IMPORTS StringDefs, MenuDefs, ControllerDefs,
	GriffinMemoryDefs, RefreshDefs, GriffinFontDefs, PointDefs
	EXPORTS ControllerMenuDefs =
BEGIN   
colorMenu: PUBLIC MenuDefs.MenuHandle←NIL;
lineColorMenu: PUBLIC MenuDefs.MenuHandle←NIL;
textMenu: PUBLIC MenuDefs.MenuHandle←NIL;
charMenu: PUBLIC MenuDefs.MenuHandle←NIL;
fontMenu: PUBLIC MenuDefs.MenuHandle←NIL;
centerMenu: PUBLIC MenuDefs.MenuHandle←NIL;
thickMenu: PUBLIC MenuDefs.MenuHandle←NIL;
colorControlMenu: PUBLIC MenuDefs.MenuHandle←NIL;

maxFontNameLength: CARDINAL = 128;

InitCaptionMenu: PUBLIC PROCEDURE =
	BEGIN
	default: MenuDefs.MenuItemHandle;
	
	textMenu ← MenuDefs.CreateMenu[vertical, [350,150], NIL];
	default ← MenuDefs.AddMenuItem[textMenu,"0 d",TextDir];
	[]←MenuDefs.AddMenuItem[textMenu,"90 d",TextDir];
	[]←MenuDefs.AddMenuItem[textMenu,"180 d",TextDir];
	[]←MenuDefs.AddMenuItem[textMenu,"270 d",TextDir];
	MenuDefs.BugItem[default];

	charMenu ← MenuDefs.CreateMenu[vertical, [350,250], NIL];
	default ← MenuDefs.AddMenuItem[charMenu,"0 char d",CharDir];
	[]←MenuDefs.AddMenuItem[charMenu,"90 char d",CharDir];
	[]←MenuDefs.AddMenuItem[charMenu,"180 char d",CharDir];
	[]←MenuDefs.AddMenuItem[charMenu,"270 char d",CharDir];
	MenuDefs.BugItem[default];

	fontMenu ← MenuDefs.CreateMenu[vertical, [240,250], NIL];
	GriffinFontDefs.ForAllFonts[do: AddFontName];

	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];
	END;

InitColorMenu: PUBLIC PROCEDURE =
	BEGIN
	default: MenuDefs.MenuItemHandle;

	colorMenu ← MenuDefs.CreateMenu[vertical, [180,200], "Areas"];
	[]←MenuDefs.AddMenuItem[colorMenu,"black",ColorType];
	[]←MenuDefs.AddMenuItem[colorMenu,"dk brown",ColorType];
	[]←MenuDefs.AddMenuItem[colorMenu,"brown",ColorType];
	[]←MenuDefs.AddMenuItem[colorMenu,"tan",ColorType];
	[]←MenuDefs.AddMenuItem[colorMenu,"maroon",ColorType];
	[]←MenuDefs.AddMenuItem[colorMenu,"dk red",ColorType];
	[]←MenuDefs.AddMenuItem[colorMenu,"red",ColorType];
	[]←MenuDefs.AddMenuItem[colorMenu,"orange",ColorType];
	[]←MenuDefs.AddMenuItem[colorMenu,"dk yellow",ColorType];
	[]←MenuDefs.AddMenuItem[colorMenu,"yellow",ColorType];
	[]←MenuDefs.AddMenuItem[colorMenu,"lt yellow",ColorType];
	[]←MenuDefs.AddMenuItem[colorMenu,"dk green",ColorType];
	[]←MenuDefs.AddMenuItem[colorMenu,"green",ColorType];
	[]←MenuDefs.AddMenuItem[colorMenu,"lt green",ColorType];
	[]←MenuDefs.AddMenuItem[colorMenu,"dk blue",ColorType];
	[] ← MenuDefs.AddMenuItem[colorMenu,"blue",ColorType];
	[]←MenuDefs.AddMenuItem[colorMenu,"lt blue",ColorType];
	[]←MenuDefs.AddMenuItem[colorMenu,"dk aqua",ColorType];
	[]←MenuDefs.AddMenuItem[colorMenu,"aqua",ColorType];
	[]←MenuDefs.AddMenuItem[colorMenu,"cyan",ColorType];
	[]←MenuDefs.AddMenuItem[colorMenu,"dk purple",ColorType];
	[]←MenuDefs.AddMenuItem[colorMenu,"purple",ColorType];
	[]←MenuDefs.AddMenuItem[colorMenu,"violet",ColorType];
	[]←MenuDefs.AddMenuItem[colorMenu,"magenta",ColorType];
	[]←MenuDefs.AddMenuItem[colorMenu,"pink",ColorType];
	[]←MenuDefs.AddMenuItem[colorMenu,"dk grey",ColorType];
	default←MenuDefs.AddMenuItem[colorMenu,"grey",ColorType];
	[]←MenuDefs.AddMenuItem[colorMenu,"lt grey",ColorType];
	[]←MenuDefs.AddMenuItem[colorMenu,"pale grey",ColorType];
	[]←MenuDefs.AddMenuItem[colorMenu,"white",ColorType];
	MenuDefs.BugItem[default];

	lineColorMenu ← MenuDefs.CreateMenu[vertical, [100,200], "Lines"];
	default←MenuDefs.AddMenuItem[lineColorMenu,"black",ColorType];
	[]←MenuDefs.AddMenuItem[lineColorMenu,"dk brown",ColorType];
	[]←MenuDefs.AddMenuItem[lineColorMenu,"brown",ColorType];
	[]←MenuDefs.AddMenuItem[lineColorMenu,"tan",ColorType];
	[]←MenuDefs.AddMenuItem[lineColorMenu,"maroon",ColorType];
	[]←MenuDefs.AddMenuItem[lineColorMenu,"dk red",ColorType];
	[]←MenuDefs.AddMenuItem[lineColorMenu,"red",ColorType];
	[]←MenuDefs.AddMenuItem[lineColorMenu,"orange",ColorType];
	[]←MenuDefs.AddMenuItem[lineColorMenu,"dk yellow",ColorType];
	[]←MenuDefs.AddMenuItem[lineColorMenu,"yellow",ColorType];
	[]←MenuDefs.AddMenuItem[lineColorMenu,"lt yellow",ColorType];
	[]←MenuDefs.AddMenuItem[lineColorMenu,"dk green",ColorType];
	[]←MenuDefs.AddMenuItem[lineColorMenu,"green",ColorType];
	[]←MenuDefs.AddMenuItem[lineColorMenu,"lt green",ColorType];
	[]←MenuDefs.AddMenuItem[lineColorMenu,"dk blue",ColorType];
	[] ← MenuDefs.AddMenuItem[lineColorMenu,"blue",ColorType];
	[]←MenuDefs.AddMenuItem[lineColorMenu,"lt blue",ColorType];
	[]←MenuDefs.AddMenuItem[lineColorMenu,"dk aqua",ColorType];
	[]←MenuDefs.AddMenuItem[lineColorMenu,"aqua",ColorType];
	[]←MenuDefs.AddMenuItem[lineColorMenu,"cyan",ColorType];
	[]←MenuDefs.AddMenuItem[lineColorMenu,"dk purple",ColorType];
	[]←MenuDefs.AddMenuItem[lineColorMenu,"purple",ColorType];
	[]←MenuDefs.AddMenuItem[lineColorMenu,"violet",ColorType];
	[]←MenuDefs.AddMenuItem[lineColorMenu,"magenta",ColorType];
	[]←MenuDefs.AddMenuItem[lineColorMenu,"pink",ColorType];
	[]←MenuDefs.AddMenuItem[lineColorMenu,"dk grey",ColorType];
	[]←MenuDefs.AddMenuItem[lineColorMenu,"grey",ColorType];
	[]←MenuDefs.AddMenuItem[lineColorMenu,"lt grey",ColorType];
	[]←MenuDefs.AddMenuItem[lineColorMenu,"pale grey",ColorType];
	[]←MenuDefs.AddMenuItem[lineColorMenu,"white",ColorType];
	MenuDefs.BugItem[default];
	END;

InitShapeMenu: PUBLIC PROCEDURE =
	BEGIN
	default: MenuDefs.MenuItemHandle;

	colorControlMenu ← MenuDefs.CreateMenu[vertical, [100,160], 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[charMenu];
MenuDefs.ShowMenu[fontMenu];
MenuDefs.ShowMenu[centerMenu];
RefreshDefs.RestoreScreen[];
END;

UnDisplayCaptionMenu: PUBLIC PROCEDURE =
BEGIN
MenuDefs.HideMenu[textMenu];
MenuDefs.HideMenu[charMenu];
MenuDefs.HideMenu[fontMenu];
MenuDefs.HideMenu[centerMenu];
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: MenuDefs.MenuProc =
BEGIN OPEN StyleDefs,StringDefs,StringDefs,MenuDefs;
string: STRING ← MenuDefs.MenuString[item];
style: StyleDefs.StyleHandle ← ControllerDefs.CurrentStyleRecord [];

SelectOnly[item];

SELECT TRUE FROM
EqualStrings[string, "Outlined"] =>
	BEGIN
	style.outlined ← TRUE;
	style.filled ← FALSE;
	END;
EqualStrings[string, "Filled"] =>
	BEGIN
	style.filled ← TRUE;
	style.outlined ← FALSE;
	END;
EqualStrings[string, "Both"] =>
	BEGIN
	style.outlined ← TRUE;
	style.filled ← TRUE;
	END;
ENDCASE => ERROR;
END;

ColorType: MenuDefs.MenuProc =
BEGIN OPEN StyleDefs,StringDefs,StringDefs;
string: STRING ← MenuDefs.MenuString[item];
color: Color;

color ← SELECT TRUE FROM
	EqualStrings[string, "black"] => [0,0,0],
	EqualStrings[string, "dk brown"] => [7,255,59],
	EqualStrings[string, "brown"] => [7,255,118],
	EqualStrings[string, "tan"] => [0,131,217],
	EqualStrings[string, "maroon"] => [234,255,79],
	EqualStrings[string, "dk red"] => [0,255,160],
	EqualStrings[string, "red"] => [0,255,255],
	EqualStrings[string, "orange"] => [10,255,255],
	EqualStrings[string, "dk yellow"] => [25,255,255],
	EqualStrings[string, "yellow"] => [40,255,255],
	EqualStrings[string, "lt yellow"] => [40,190,255],
	EqualStrings[string, "dk green"] => [71,255,59],
	EqualStrings[string, "green"] => [76,255,255],
	EqualStrings[string, "lt green"] => [71,193,255],
	EqualStrings[string, "dk blue"] => [150,255,170],
	EqualStrings[string, "blue"] => [148,255,255],
	EqualStrings[string, "lt blue"] => [141,150,255],
	EqualStrings[string, "dk aqua"] => [107,255,98],
	EqualStrings[string, "aqua"] => [107,224,255],
	EqualStrings[string, "cyan"] => [120,255,255],
	EqualStrings[string, "dk purple"] => [178,255,178],
	EqualStrings[string, "purple"] => [170,224,255],
	EqualStrings[string, "violet"] => [170,131,255],
	EqualStrings[string, "magenta"] => [200,255,255],
	EqualStrings[string, "pink"] => [206,170,255],
	EqualStrings[string, "dk grey"] => [0,0,40],
	EqualStrings[string, "grey"] => [0,0,120],
	EqualStrings[string, "lt grey"] => [0,0,200],
	EqualStrings[string, "pale grey"] => [0,0,230],
	EqualStrings[string, "white"] => [0,0,255],
	ENDCASE => ERROR;
IF MenuDefs.WhichMenu[item]=colorMenu
	THEN ControllerDefs.CurrentStyleRecord [].fillcolor ← color
	ELSE ControllerDefs.CurrentStyleRecord [].color ← color;
MenuDefs.SelectOnly[item];
END;

TextDir: MenuDefs.MenuProc =
BEGIN OPEN StyleDefs, StringDefs;
string: STRING ← MenuDefs.MenuString[item];

ControllerDefs.CurrentStyleRecord [].orientation
   ← SELECT TRUE FROM
	EqualStrings[string,"0 d"] => Orientation [or0],
	EqualStrings[string,"90 d"] => Orientation [or90],
	EqualStrings[string,"180 d"] => Orientation [or180],
	EqualStrings[string,"270 d"] => Orientation [or270],
	ENDCASE => ERROR; 
MenuDefs.SelectOnly[item];
END;

CharDir: MenuDefs.MenuProc =
BEGIN OPEN StyleDefs, GriffinFontDefs, StringDefs;
string: STRING ← MenuDefs.MenuString[item];

ControllerDefs.CurrentFontDescriptor [].rotation
   ← SELECT TRUE FROM
	EqualStrings[string,"0 char d"] => Rot0Degrees,
	EqualStrings[string,"90 char d"] => Rot90Degrees,
	EqualStrings[string,"180 char d"] => Rot180Degrees,
	EqualStrings[string,"270 char d"] => Rot270Degrees,
	ENDCASE => ERROR; 
MenuDefs.SelectOnly[item];
END;

AddFontName: PROCEDURE[font: GriffinFontDefs.FontDescriptorHandle] =
BEGIN OPEN StringDefs;
alreadyThere: BOOLEAN ← FALSE;
string: STRING ← [maxFontNameLength];
IsEqual: MenuDefs.MenuProc=
	BEGIN
	IF EquivalentStrings[string, MenuDefs.MenuString[item]]
		THEN alreadyThere ← TRUE;
	END;
AppendString[to: string, from: font.name];
AppendDecimal[string, font.points];
SELECT font.face FROM
	3 => AppendString[to: string, from: "BI"];
	2 => AppendString[to: string, from: "B"]; 
	1 => AppendString[to: string, from: "I"];
	ENDCASE;
MenuDefs.ForAllMenuItems[fontMenu, IsEqual];
IF alreadyThere THEN RETURN;
MenuDefs.BugItem[MenuDefs.AddMenuItem[fontMenu, string, SetFont]];
END;

SetFont: MenuDefs.MenuProc =
BEGIN OPEN MenuDefs, StringDefs, ControllerDefs, GriffinFontDefs;
cfd: FontDescriptorHandle ← CurrentFontDescriptor[];
string: STRING ← [maxFontNameLength];
temp: STRING ← [maxFontNameLength];
i,j: CARDINAL;

AppendString[string, MenuString[item]];
temp.length ← 0;
FOR i ← 0, i+1 UNTIL i=string.length OR string[i] IN ['0..'9] DO 	temp[i] ← string[i];
	temp.length ← temp.length+1;
	ENDLOOP;

GriffinMemoryDefs.FreeString [cfd.name];
cfd.name ← GriffinMemoryDefs.AllocateString [string.length];
AppendString [cfd.name, temp];

--i is at start of points and face
temp.length ← 0;
j ← 0;
UNTIL i=string.length
  OR string[i]='I OR string[i]='i
  OR string[i]='B OR string[i]='b DO
	temp[j] ← string[i];
	i ← i+1; j← j+1;
	temp.length ← temp.length+1;
	ENDLOOP;
cfd.points ← StringToDecimal[temp];
SELECT string.length-i FROM
	1 => {IF string[i]='b OR string[i]='B THEN cfd.face ← 2;
		 IF string[i]='i OR string[i]='I THEN  cfd.face ← 1};
	2 => cfd.face ← 3;	--a bit ad hoc
	ENDCASE => cfd.face ← 0;

MenuDefs.SelectOnly[item];
END;

SetCenter: MenuDefs.MenuProc =
BEGIN OPEN StringDefs;
string: STRING ← MenuDefs.MenuString[item];

ControllerDefs.CurrentStyleRecord [].anchor
   ← SELECT TRUE FROM
	EqualStrings[string,"left"] => left,
	EqualStrings[string,"centered"] => center,
	EqualStrings[string,"right"] => right,
	ENDCASE => ERROR; 
MenuDefs.SelectOnly[item];
END;


SetThickness: MenuDefs.MenuProc =
BEGIN OPEN StringDefs, PointDefs;
string: STRING ← MenuDefs.MenuString[item];

ControllerDefs.CurrentStyleRecord [].width
	← SELECT TRUE FROM
	EqualStrings[string,"1 pt"] => ScrValToObjVal[1],
	EqualStrings[string,"2 pt"] => ScrValToObjVal[2],
	EqualStrings[string,"3 pt"] => ScrValToObjVal[3],
	EqualStrings[string,"4 pt"] => ScrValToObjVal[4],
	ENDCASE => ERROR; 
MenuDefs.SelectOnly[item];
END;



END.