<> DIRECTORY InputFocus USING [SetInputFocus], Menus USING [CreateEntry, AppendMenuEntry, MenuProc], Rope USING [Concat, Equal, Fetch, ROPE, Size, Substr], TiogaOps USING [GetSelection, GetRope], UserTerminal USING [BlinkDisplay], ViewerClasses USING [Viewer], ViewerEvents USING [EventProc, RegisterEventProc], ViewerOps USING [EnumProc, EnumerateViewers, PaintViewer], ViewerTools USING [GetSelectedViewer, GetSelectionContents, SetSelection]; ExecHacks: CEDAR PROGRAM IMPORTS InputFocus, Menus, Rope, TiogaOps, UserTerminal, ViewerEvents, ViewerOps, ViewerTools = BEGIN Compile: Menus.MenuProc = BEGIN exec: ViewerClasses.Viewer ~ NARROW[parent]; sel: Rope.ROPE _ ViewerTools.GetSelectionContents[]; IF sel = NIL THEN TRUSTED {UserTerminal.BlinkDisplay[]; RETURN}; IF Rope.Size[sel] <= 1 THEN BEGIN selViewer: ViewerClasses.Viewer _ ViewerTools.GetSelectedViewer[]; IF selViewer=exec THEN TRUSTED {UserTerminal.BlinkDisplay[]; RETURN}; sel _ selViewer.name; END; sel _ Rope.Concat["Compile ", 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 => TRUSTED {UserTerminal.BlinkDisplay[]; CONTINUE}]; END; Reset: Menus.MenuProc = BEGIN exec: ViewerClasses.Viewer ~ NARROW[parent]; InputFocus.SetInputFocus[NIL]; exec.class.set[exec, NIL, FALSE]; ViewerTools.SetSelection[exec, NIL]; exec.class.notify[exec, LIST["-- reset -- "]]; END; DoMenu: ViewerEvents.EventProc = BEGIN IF Rope.Equal[viewer.name, "Commander"] 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]]; Menus.AppendMenuEntry[viewer.menu, Menus.CreateEntry[name:"Reset", proc:Reset, fork:FALSE, guarded: TRUE]]; 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.