<> <> <> DIRECTORY Atom, CD, CDSequencer, TerminalIO, CDPanel, CDCallSpecific, CDOps, CDProperties, CDExtras, Rope; ExtraCommands: CEDAR PROGRAM IMPORTS Atom, CDOps, CDPanel, CDProperties, CDSequencer, TerminalIO, CDCallSpecific, CDExtras, Rope = BEGIN verbose: BOOL _ TRUE; ToggleVerbose: PROC = {verbose_~verbose}; --called from debugger-- WriteInLambda: PROC [n: CD.Number] = {TerminalIO.WriteRope[CDExtras.ToLambda[n]]}; CoordinatesCommand: PROC [comm: CDSequencer.Command] = BEGIN TerminalIO.WriteRope["Coordinates"]; TerminalIO.WriteRope[" down: ("]; WriteInLambda[comm.sPos.x]; TerminalIO.WriteRope[","]; WriteInLambda[comm.sPos.y]; TerminalIO.WriteRope[") up: ("]; WriteInLambda[comm.pos.x]; TerminalIO.WriteRope[","]; WriteInLambda[comm.pos.y]; TerminalIO.WriteRope[") dist: ("]; WriteInLambda[comm.pos.x-comm.sPos.x]; TerminalIO.WriteRope[","]; WriteInLambda[comm.pos.y-comm.sPos.y]; TerminalIO.WriteRope[")\n"]; END; WriteInfo: PROC[aptr: CD.ApplicationPtr] = <<-- copied from CDOps>> BEGIN x: REF ~ CDProperties.GetPropFromApplication[aptr, $SignalName]; TerminalIO.WriteRope[" ("]; TerminalIO.WriteRope[CDOps.Info[aptr.ob]]; IF x#NIL THEN WITH x SELECT FROM r: Rope.ROPE => TerminalIO.WriteRope[Rope.Concat[" ", r]]; a: ATOM => TerminalIO.WriteRope[Rope.Concat[" ", Atom.GetPName[a]]]; ENDCASE => NULL; TerminalIO.WriteRope[")"]; END; StatisticCommand: PROC [comm: CDSequencer.Command] = BEGIN cont: CD.ApplicationList _ comm.design^.actual.first.specific.contents; cnt: INT _ 0; cnts: INT _ 0; aptr: CD.ApplicationPtr; TerminalIO.WriteRope["Statistic"]; FOR l: CD.ApplicationList _ cont, l.rest WHILE l#NIL DO cnt _ cnt+1; IF l.first.selected THEN {cnts_cnts+1; aptr_l.first} ENDLOOP; TerminalIO.WriteInt[cnt]; TerminalIO.WriteRope[" objects;"]; TerminalIO.WriteInt[cnts]; TerminalIO.WriteRope[" selected"]; IF cnts=1 THEN { WriteInfo[aptr]; IF verbose THEN { TerminalIO.WriteRope[" at: ("]; TerminalIO.WriteInt[aptr.location.x]; TerminalIO.WriteRope[","]; TerminalIO.WriteInt[aptr.location.y]; TerminalIO.WriteRope[") size: ("]; TerminalIO.WriteInt[aptr.ob.size.x]; TerminalIO.WriteRope[","]; TerminalIO.WriteInt[aptr.ob.size.y]; TerminalIO.WriteRope[") orientation-code:"]; TerminalIO.WriteInt[aptr.orientation]; } }; TerminalIO.WriteLn[]; END; SelectIfLevel: CDCallSpecific.CallProc = BEGIN IF aptr.ob.level#NARROW[x, REF CD.Level]^ THEN {done_FALSE; RETURN}; IF aptr.selected THEN RETURN; aptr.selected _ TRUE; repaintMe _ TRUE END; AddSelectLevel: PROC [comm: CDSequencer.Command] = BEGIN n: INT; reflev: REF CD.Level _ NEW[CD.Level_CDPanel.FetchDefaultLevel[comm.design]]; TerminalIO.WriteRope["Select all of current layer: ("]; n _ CDCallSpecific.CallForAll[design: comm.design, whatElse: SelectIfLevel, x: reflev]; TerminalIO.WriteInt[n]; TerminalIO.WriteRope[") objects\n"]; END; DesignMenu: PROC [comm: CDSequencer.Command] = BEGIN ENABLE TerminalIO.UserAbort => GOTO userAbort; Forward: PROC [a: ATOM] = { CDSequencer.ExecuteCommand[comm: comm, as: a, queue: dontQueue]; }; SELECT TerminalIO.RequestSelection[ label: "Design options", choice: LIST["IO", "viewer", "directory", "rename", "select all", "transform", "statistic"] ] FROM 1 => Forward[$IOMenu]; 2 => Forward[$ViewerMenu]; 3 => Forward[$DirectoryMenu]; 4 => Forward[$RenameDesign]; 5 => Forward[$SelectAll]; 6 => Forward[$TransformS]; 7 => Forward[$Statistic]; ENDCASE => TerminalIO.WriteRope["skipped\n"]; EXITS userAbort => {TerminalIO.WriteRope["discarded\n"]} END; DirectoryMenu: PROC [comm: CDSequencer.Command] = BEGIN ENABLE TerminalIO.UserAbort => GOTO userAbort; Forward: PROC [a: ATOM] = { CDSequencer.ExecuteCommand[comm: comm, as: a, queue: dontQueue]; }; SELECT TerminalIO.RequestSelection[ label: "Directory options", choice: LIST["list direcory", "clean up directory", "remove cell", "list imports", "list importee", "IO"] ] FROM 1 => Forward[$DisplayCellNames]; 2 => Forward[$DeleteUnUsedObjects]; 3 => Forward[$RemoveCell]; 4 => Forward[$DisplayImports]; 5 => Forward[$DisplayImportedEntries]; 6 => Forward[$IOMenu] ENDCASE => TerminalIO.WriteRope["skipped\n"]; EXITS userAbort => {TerminalIO.WriteRope["discarded\n"]} END; IOMenu: PROC [comm: CDSequencer.Command] = BEGIN ENABLE TerminalIO.UserAbort => GOTO userAbort; Forward: PROC [a: ATOM] = { CDSequencer.ExecuteCommand[comm: comm, as: a, queue: dontQueue]; }; SELECT TerminalIO.RequestSelection[ label: "Input / Output", choice: LIST["output", "import", "include", "list imports", "directory", "chipmonk-output"] ] FROM 1 => Forward[$OutputDesign]; 2 => Forward[$ImportADesign]; 3 => Forward[$IncludeADesign]; 4 => Forward[$DisplayImports]; 5 => Forward[$DirectoryMenu]; 6 => Forward[$ChipmonkOutput]; ENDCASE => TerminalIO.WriteRope["skipped\n"]; EXITS userAbort => {TerminalIO.WriteRope["discarded\n"]} END; Impl: PROC [] = BEGIN CDSequencer.ImplementCommand[$AddSelectLevel, AddSelectLevel]; CDSequencer.ImplementCommand[$DesignMenu, DesignMenu]; CDSequencer.ImplementCommand[$IOMenu, IOMenu]; CDSequencer.ImplementCommand[$DirectoryMenu, DirectoryMenu]; CDSequencer.ImplementCommand[$Coordinates, CoordinatesCommand]; CDSequencer.ImplementCommand[$Statistic, StatisticCommand]; END; Impl[]; END.