<> <> <> <> <<>> DIRECTORY FS USING [ComponentPositions, Error, ExpandName], Menus USING [CreateEntry, AppendMenuEntry, MenuProc], Rope USING [Concat, Equal, Fetch, Length, ROPE, Run, Size, Substr], TiogaOps USING [GetSelection, GetRope], Terminal USING [BlinkBWDisplay, Current], ViewerClasses USING [Viewer], ViewerEvents USING [EventProc, RegisterEventProc], ViewerOps USING [EnumProc, EnumerateViewers, PaintViewer], ViewerTools USING [GetSelectedViewer, GetSelectionContents, SetSelection]; ExecHacks: CEDAR PROGRAM IMPORTS FS, Menus, Rope, TiogaOps, Terminal, ViewerEvents, ViewerOps, ViewerTools = BEGIN Blink: PROC = {Terminal.BlinkBWDisplay[Terminal.Current[]]}; Compile: Menus.MenuProc = BEGIN exec: ViewerClasses.Viewer ~ NARROW[parent]; sel: Rope.ROPE _ ViewerTools.GetSelectionContents[]; function: Rope.ROPE _ "Compile "; IF Rope.Size[sel] <= 1 THEN BEGIN selViewer: ViewerClasses.Viewer _ ViewerTools.GetSelectedViewer[]; sel _ selViewer.name; END; {fullFName: Rope.ROPE; cp: FS.ComponentPositions; dirOmitted: BOOLEAN; [fullFName, cp, dirOmitted] _ FS.ExpandName[sel ! FS.Error => CONTINUE]; IF fullFName = NIL THEN {Blink[]; RETURN}; sel _ Rope.Substr[fullFName, cp.base.start, cp.base.length]; IF cp.ext.length > 0 THEN { ext: Rope.ROPE _ Rope.Substr[fullFName, cp.ext.start, cp.ext.length]; IF Rope.Equal[ext, "mesa", FALSE] THEN function _ "Compile " ELSE IF Rope.Equal[ext, "config", FALSE] THEN function _ "Bind " ELSE IF Rope.Equal[ext, "cm", FALSE] THEN function _ "@" ELSE {Blink[]; RETURN}; }; }; sel _ Rope.Concat[function, sel]; sel _ Rope.Concat[sel, " "]; ViewerTools.SetSelection[exec, NIL]; exec.class.notify[exec, LIST[sel]]; END; Redo: Menus.MenuProc = BEGIN ScanAndStuff: PROC = BEGIN exec: ViewerClasses.Viewer ~ NARROW[parent]; rope: Rope.ROPE; start, end: INT; ViewerTools.SetSelection[exec, NIL]; rope _ TiogaOps.GetRope[TiogaOps.GetSelection[].end.node]; IF (start _ Rope.Size[rope]) < 6 THEN ERROR; start _ start - 4; --one to point to the last char, 2 to skip current %, 1 for prev CR WHILE Rope.Fetch[rope, start]#'% DO start _ start-1; ENDLOOP; end _ start _ start+2; WHILE Rope.Fetch[rope, end]#15C DO end _ end+1; ENDLOOP; rope _ Rope.Substr[rope, start, end-start+1]; exec.class.notify[exec, LIST[rope]]; END; ScanAndStuff[! ANY => {Blink[]; CONTINUE}]; END; <> <> <> <> <> <> <> <<>> quoteCommander: Rope.ROPE ~ "CommandTool:"; lengthQuoteCommander: INT ~ Rope.Length[quoteCommander]; DoMenu: ViewerEvents.EventProc = BEGIN IF Rope.Run[s1: viewer.name, s2: quoteCommander] = lengthQuoteCommander THEN BEGIN Menus.AppendMenuEntry[viewer.menu, Menus.CreateEntry[name:"Compile", proc:Compile, fork:FALSE]]; Menus.AppendMenuEntry[viewer.menu, Menus.CreateEntry[name:"Redo", proc:Redo, fork:FALSE]]; ViewerOps.PaintViewer[viewer, menu]; END; END; AttachMenuItemsToExecs: PROC = BEGIN PerViewer: ViewerOps.EnumProc = BEGIN [] _ DoMenu[v, create, FALSE]; END; ViewerOps.EnumerateViewers[PerViewer]; END; [] _ ViewerEvents.RegisterEventProc[DoMenu, create, $Typescript, FALSE]; AttachMenuItemsToExecs[]; END.