CDMakeMenusImpl.mesa
Copyright © 1986 by Xerox Corporation. All rights reserved.
Created by Christian Jacobi, August 6, 1986 11:13:11 am PDT
Last edited by: Christian Jacobi, August 22, 1986 2:29:49 pm PDT
DIRECTORY
Ascii,
Atom,
CD,
CDEnvironment,
CDMenus,
CDMenusExtras,
Commander,
FS,
IO,
Rope,
TEditProfile USING [DoList];
CDMakeMenusImpl:
CEDAR
MONITOR
IMPORTS Atom, CDEnvironment, CDMenus, CDMenusExtras, Commander, FS, IO, Rope, TEditProfile =
BEGIN
InitMenus:
PROC [] = {
MakeMenu:
PROC [text: Rope.
ROPE, nameAndCommand:
ATOM, doc: Rope.
ROPE←
NIL] = {
[] ← CDMenusExtras.CreateMenuExtra[text, nameAndCommand, doc];
CDMenus.ImplementCommandToCallMenu[nameAndCommand, nameAndCommand];
};
MakeMenu["Global menu", $GlobalMenu, "all entries are menus again"];
MakeMenu["Global on rects", $RectGlobalMenu, "all entries are menus again"];
MakeMenu["Additional Programs", $ProgramMenu];
MakeMenu["Programs on Rects", $RectProgramMenu];
MakeMenu["Other Programs", $OtherProgramMenu];
MakeMenu["Cell (s)", $CellMenu];
MakeMenu["Input / Output", $IOMenu];
MakeMenu["Directory options", $DirectoryMenu];
MakeMenu["Viewer options", $ViewerMenu];
MakeMenu["Special commands", $SpecialMenu];
MakeMenu["Special on rects", $RectSpecialMenu];
MakeMenu["Hard copy", $HardCopyMenu];
MakeMenu["Display options", $DisplayMenu];
MakeMenu["Import and remote", $ImportMenu];
MakeMenu["Generator options", $GeneratorMenu];
MakeMenu["Text & Properties", $TextPropertyMenu];
MakeMenu["Polygons & Splines", $PolygonMenu];
MakeMenu["Operators", $OperatorMenu, "Operations on the current selection"];
MakeMenu["Operators on rects", $RectOperatorMenu];
MakeMenu["DRC and friends", $DRCMenu, "Design rule checks and extractions"];
MakeMenu["DRC ... on rects", $RectDRCMenu];
MakeMenu["Selections", $SelectionMenu];
MakeMenu["Selections on rects", $RectSelectionMenu];
MakeMenu["Draw", $RectDrawMenu, "draw certain types of objects"];
};
SkipLeading:
PROC [line: Rope.
ROPE, start:
INT𡤀]
RETURNS [Rope.
ROPE] = {
removes leading spaces spaces and tabs
ignores one leading /
leng: INT ← Rope.Length[line];
WHILE start<leng
DO
SELECT Rope.Fetch[line, start]
FROM
Ascii.SP, Ascii.TAB => start ← start+1;
'/ => {start ← start+1; EXIT};
ENDCASE => EXIT;
ENDLOOP;
RETURN [ Rope.Substr[line, start] ];
};
SkipTrailing:
PROC [line: Rope.
ROPE, last:
INT←-1]
RETURNS [Rope.
ROPE] = {
removes trailing spaces spaces and tabs
ignores one trailing /
IF last<0 THEN last ← Rope.Length[line]-1;
WHILE last>0
DO
SELECT Rope.Fetch[line, last]
FROM
Ascii.SP, Ascii.TAB => last ← last-1;
'/ => {last ← last-1; EXIT};
ENDCASE => EXIT;
ENDLOOP;
RETURN [ Rope.Substr[line, 0, last+1] ];
};
SplitText:
PROC [line: Rope.
ROPE]
RETURNS [first, rest: Rope.
ROPE←
NIL] = {
Split line according to the following syntax
first | rest
represent | as ||
removes spaces and tabs adjacent to the |
ignores one / adjacent the |
nextPos: INT ← 0;
leng: INT ← Rope.Length[line];
WHILE nextPos<leng
DO
IF Rope.Fetch[line, nextPos]='|
THEN {
IF nextPos+1>leng
OR Rope.Fetch[line, nextPos+1]='|
THEN {
line ← Rope.Replace[line, nextPos, 1, NIL]; leng ← leng-1;
}
ELSE {
first ← SkipTrailing[line, nextPos-1];
rest ← SkipLeading[line, nextPos+1];
RETURN;
};
};
nextPos ← nextPos+1;
ENDLOOP;
first ← line
};
MakeMenuLine:
PROC [line: Rope.
ROPE] = {
Syntax of menu lines
menuKey | entryKey | entryText
lines starting with "-" are comment lines and ignored
"/" adjacent to a | are ignored
entryKey = "NIL": removes the entry
menuR, keyR, textR, restR, docR: Rope.ROPE ← NIL; key: ATOM←NIL;
line ← SkipLeading[line];
IF Rope.IsEmpty[line] THEN RETURN;
[menuR, restR] ← SplitText[line];
IF Rope.IsEmpty[menuR] OR Rope.Fetch[menuR, 0]='- THEN RETURN;
[keyR, textR] ← SplitText[restR];
IF Rope.IsEmpty[keyR] THEN RETURN;
IF ~Rope.IsEmpty[textR] THEN [textR, docR] ← SplitText[textR];
IF ~Rope.Equal[keyR, "NIL"] THEN key ← Atom.MakeAtom[keyR];
CDMenusExtras.CreateEntryExtra[Atom.MakeAtom[menuR], textR, key, docR];
};
InstallOneMenuFile:
PROC [fileName: Rope.
ROPE] = {
file: IO.STREAM; line: Rope.ROPE;
file ← FS.StreamOpen[fileName ! FS.Error => GOTO finish];
DO
line ← IO.GetLineRope[file ! IO.EndOfStream => GOTO finish];
IF ~Rope.IsEmpty[line] THEN MakeMenuLine[line];
ENDLOOP;
EXITS finish => NULL;
};
ReInstallMenus:
PROC = {
--Menu entries are installed in opposite order as found in user profile
--to allow client installations overwrite standard installation.
--Menu entries are not removed if not explicitely requested to allow permanent
--installation of menu entries by programs.
list: LIST OF Rope.ROPE ← NIL;
Each:
PROC [r: Rope.
ROPE] = {
IF Rope.Equal[r, "Default"] THEN r ← CDEnvironment.MakeName["ChipNDale", "MenuTable", CDEnvironment.GetWorkingDirectory[NIL]];
list ← CONS[r, list];
};
TEditProfile.DoList["ChipNDale.MenuTable", Each, "Default"];
WHILE list#
NIL
DO
InstallOneMenuFile[list.first];
list ← list.rest
ENDLOOP
};
ReInstallMenusCommand: Commander.CommandProc = {
ReInstallMenus[];
};
InitMenus[];
Commander.Register["///Commands/CDReInstallMenus", ReInstallMenusCommand, "re-read the ChipNDale menus"];
ReInstallMenus[];
END.