<> <> <> <> <> <> 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: BOOLEAN _ TRUE; findFace: BOOLEAN _ FALSE; 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: ROPE _ SELECT 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.