<> <> <> DIRECTORY CD, CDCommandOps, CDConditions, CDOps, CDOrient, CDProperties, CDSequencer, Rope, TerminalIO; CDConditionsCommands: CEDAR PROGRAM IMPORTS CDCommandOps, CDConditions, CDProperties, CDSequencer, CDOps, TerminalIO = BEGIN ChangeCondition: PROC [comm: CDSequencer.Command] = BEGIN fileName, procedureText: Rope.ROPE; ob: CD.ObPtr; first: CD.ApplicationPtr; multiple: BOOL; TerminalIO.WriteRope["make object conditional\n"]; [first, multiple] _ CDOps.SelectedApplication[comm.design]; IF first=NIL THEN {TerminalIO.WriteRope[" no selected object\n"]; RETURN}; IF multiple THEN { TerminalIO.WriteRope[" multiple selection; not done for now\n"]; RETURN; <<--[done: multiple, cellOb: ob] _ CDCells.CreateCellSelected[comm.design, "-dummy"];>> <<--IF NOT multiple THEN {TerminalIO.WriteRope["not done\n"]; RETURN};>> }; IF ISTYPE[first.ob.specificRef, CDConditions.CondPtr] THEN { cp: CDConditions.CondPtr _ NARROW[first.ob.specificRef]; ob _ first.ob; TerminalIO.WriteRope[" object already conditional: ["]; TerminalIO.WriteRope[cp.procName]; TerminalIO.WriteRope["] on "]; TerminalIO.WriteRope[cp.fileName]; TerminalIO.WriteRope[" you may change procedure or abort\n"]; } ELSE { ob _ CDConditions.CreateCondition[design: comm.design, ob: first.ob, condition: NIL, data: NIL]; IF ob=NIL THEN { TerminalIO.WriteRope[" not done\n"]; RETURN }; first.ob _ ob; TerminalIO.WriteRope[" object made conditional; now input procedure\n"]; }; fileName _ TerminalIO.RequestRope[" filename > "]; procedureText _ TerminalIO.RequestRope[" (module.)procedure > "]; IF CDConditions.ChangeCondition[design: comm.design, ob: ob, procName: procedureText, fileName: fileName, data: NIL] THEN TerminalIO.WriteRope[" done\n"] ELSE TerminalIO.WriteRope[" procedure not found, but object is conditional\n"] END; CheckConditions: PROC [comm: CDSequencer.Command] = BEGIN all, done: BOOL _ FALSE; TerminalIO.WriteRope["check conditional objects\n"]; IF comm.a=$CheckAllConditions THEN all _ TRUE ELSE IF comm.a=$CheckUnloadedConditions THEN all _ FALSE ELSE all _ TerminalIO.RequestSelection[ label: "load conditional code", choice: LIST["all", "unloaded only"]]=1; IF all THEN TerminalIO.WriteRope[" reload all conditionals\n"] ELSE TerminalIO.WriteRope[" load unloaded conditionals\n"]; done _ CDConditions.UpdateConditions[comm.design, all]; IF done THEN { TerminalIO.WriteRope[" successfull; but:"] ; TerminalIO.WriteRope[" Warning: Imported designs are not checked; a reloading of conditionals can be forced by re-importing the designs\n"] ; } ELSE TerminalIO.WriteRope[" not successfull\n"]; END; UndoCondition: PROC [comm: CDSequencer.Command] = BEGIN app: CD.ApplicationPtr = CDCommandOps.TheApplication[comm, "remove condition"]; IF app#NIL THEN IF ~ISTYPE[app.ob.specificRef, CDConditions.CondPtr] THEN TerminalIO.WriteRope["selected ob not a condition"] ELSE { cp: CDConditions.CondPtr = NARROW[app.ob.specificRef]; app.ob _ cp.app.ob; TerminalIO.WriteRope[" done\n"] }; END; PropagationMenuSP: PROC [comm: CDSequencer.Command] = BEGIN aptr: CD.ApplicationPtr = CDCommandOps.TheApplication[comm, "propagation of conditional procedures input"]; IF aptr#NIL THEN { TerminalIO.WriteRope[" trough "]; CDCommandOps.WriteInfo[aptr]; IF ~aptr.ob.p.inDirectory THEN TerminalIO.WriteRope[" has no children; command not possible\n"] ELSE IF ~ISTYPE[aptr.ob.specificRef, CD.CellPtr] THEN { TerminalIO.WriteRope[" is not cell; propagates unconditional; command not possible\n"] } ELSE { IF CDProperties.GetPropFromObject[aptr.ob, $CDxPropagate]#$CDxPropagate THEN TerminalIO.WriteRope[" (now stops propagation)\n"] ELSE TerminalIO.WriteRope[" (now lets propagation trough)\n"]; SELECT TerminalIO.RequestSelection[ label: "propagation", choice: LIST["stop", "continue trough"] ] FROM 1 => { CDProperties.PutPropOnObject[onto: aptr.ob, prop: $CDxPropagate, val: NIL]; TerminalIO.WriteRope[" propagation will stop\n"]; CDOps.DelayedRedraw[comm.design]; }; 2 => { CDProperties.PutPropOnObject[onto: aptr.ob, prop: $CDxPropagate, val: $CDxPropagate]; TerminalIO.WriteRope[" propagation will continue trough\n"]; CDOps.DelayedRedraw[comm.design]; }; ENDCASE => TerminalIO.WriteRope["skipped\n"]; }; } END; CDSequencer.ImplementCommand[$CheckConditions, CheckConditions]; CDSequencer.ImplementCommand[$CheckUnloadedConditions, CheckConditions]; CDSequencer.ImplementCommand[$CheckAllConditions, CheckConditions]; CDSequencer.ImplementCommand[$DrawConditionS, ChangeCondition]; CDSequencer.ImplementCommand[$RemoveConditionS, UndoCondition]; CDSequencer.ImplementCommand[$CPropagationMenuS, PropagationMenuSP]; END.