DIRECTORY Atom, CD, CDInstances, CDDirectory, PopUpMenus, CDOps, CDPrivate, CDProperties, CDRopeViewer, CDSequencer, IO, Properties, Rope, RuntimeError USING [UNCAUGHT], TerminalIO, TokenIO, ViewerTools USING [TiogaContents, TiogaContentsRec]; CDPropertyCommands: CEDAR PROGRAM IMPORTS Atom, CD, CDDirectory, CDOps, CDProperties, CDRopeViewer, CDSequencer, IO, PopUpMenus, Rope, RuntimeError, TerminalIO = BEGIN specialRights: BOOL _ FALSE; -- gives the right to access exclusive properties Atomize: PROC [r: Rope.ROPE] RETURNS [ATOM_NIL] = { IF Rope.Length[r]>1 AND Rope.Fetch[r]='$ THEN r _ Rope.Substr[r, 1, Rope.Length[r]-1]; IF ~Rope.IsEmpty[r] THEN RETURN [Atom.MakeAtom[r]] }; EnterSignalNameSP: PROC [comm: CDSequencer.Command] = { inst: CD.Instance _ CDOps.TheInstance[comm.design, "read signal-name"]; IF inst#NIL THEN { name: Rope.ROPE; TerminalIO.PutRopes[" onto ", CDOps.InstRope[inst]]; name _ TerminalIO.RequestRope[" type name: "]; IF Rope.IsEmpty[name] THEN name_NIL; CDProperties.PutInstanceProp[onto: inst, prop: $SignalName, val: name]; IF name#NIL THEN TerminalIO.PutRope[" done\n"] ELSE TerminalIO.PutRope[" removed\n"]; } }; EnterInstanceNameSP: PROC [comm: CDSequencer.Command] = { inst: CD.Instance _ CDOps.TheInstance[comm.design, "read instance-name"]; IF inst#NIL THEN { name: Rope.ROPE; TerminalIO.PutRopes[" onto ", CDOps.InstRope[inst]]; name _ TerminalIO.RequestRope[" type name: "]; IF Rope.IsEmpty[name] THEN name_NIL; CDProperties.PutInstanceProp[onto: inst, prop: $InstanceName, val: name]; IF name#NIL THEN TerminalIO.PutRope[" done\n"] ELSE TerminalIO.PutRope[" removed\n"]; } }; WriteValue: PROC [x: REF] = { ENABLE RuntimeError.UNCAUGHT => GOTO err; IF x=NIL THEN TerminalIO.PutRope["NIL"] ELSE WITH x SELECT FROM ip: REF INT => TerminalIO.PutF["^%g", IO.int[ip^]]; r: Rope.ROPE => TerminalIO.PutRope[r]; a: ATOM => TerminalIO.PutRopes["$", Atom.GetPName[a]]; ra: REF ATOM => TerminalIO.PutRopes["^$", Atom.GetPName[ra^]]; d: CD.Design => TerminalIO.PutRopes["design ", (IF d.name=NIL THEN "no name" ELSE d.name)]; ob: CD.Object => TerminalIO.PutRope[CD.Describe[ob, NIL]]; i: CD.Instance => TerminalIO.PutRope[CDOps.InstRope[i]]; l: CDPrivate.LayerRef => TerminalIO.PutRope[CDOps.LayerRope[l.number]]; ENDCASE => TerminalIO.PutF1["(%b)", IO.int[LOOPHOLE[x]]] EXITS err => TerminalIO.PutRope["??"]; }; RequestValue: PROC [default: REF] RETURNS [REF] = { n: CARDINAL_0; WHILE n=0 DO n _ TerminalIO.RequestSelection["property value", LIST["leave it", "remove", "INT", "ROPE", "ATOM", "REF ANY"]]; SELECT n FROM 2 => {default _ NIL}; 3 => {default _ NEW[INT_TerminalIO.RequestInt["int > "]]}; 4 => {default _ TerminalIO.RequestRope["rope > "]}; 5 => {default _ Atomize[TerminalIO.RequestRope["atom > "]]}; 6 => { TerminalIO.PutRope["(on crash: abort is ok)"]; default _ IO.GetRefAny[IO.RIS[TerminalIO.RequestRope["ref any > "]]] }; ENDCASE --0, 1-- => {NULL}; ENDLOOP; RETURN [default] }; PropertyDesign: PROC [comm: CDSequencer.Command] = { TerminalIO.PutRope["enter property for the design\n"]; PropertyForSome[comm.design]; }; PropertyApp: PROC [comm: CDSequencer.Command] = { inst: CD.Instance _ CDOps.TheInstance[comm.design, "enter property of instance\n"]; IF inst#NIL THEN PropertyForSome[inst]; }; PropertyOb: PROC [comm: CDSequencer.Command] = { inst: CD.Instance _ CDOps.TheInstance[comm.design, "enter property for an object\n"]; IF inst#NIL THEN IF (inst.ob.class.composed AND ~inst.ob.immutable) OR specialRights THEN { PropertyForSome[inst.ob]; IF inst.ob.class.composed AND ~inst.ob.immutable THEN CDDirectory.PropagateChange[inst.ob, comm.design]; } ELSE TerminalIO.PutRope["this object class has no user accessable properties\n"]; }; PropertyForSome: PROC [what: REF] = { value: REF; atom: ATOM _ Atomize[TerminalIO.RequestRope["type property name: "]]; IF atom=NIL THEN { TerminalIO.PutRope[" empty name; not done\n"]; RETURN }; value _ CDProperties.GetProp[what, atom]; TerminalIO.PutRope[" old value: "]; WriteValue[value]; TerminalIO.PutRope["\n"]; IF IsExclusive[atom] THEN { TerminalIO.PutRope[" this property is used exclusively by the program; "]; IF ~specialRights THEN { TerminalIO.PutRope["interactive access is not possible\n"]; RETURN } }; value _ RequestValue[value]; CDProperties.PutProp[onto: what, prop: atom, val: value]; TerminalIO.PutRope[" done\n"]; }; ShowProperties: PROC [from: REF] = { WITH from SELECT FROM a: CD.Instance => ShowPropertyList[a.properties]; o: CD.Object => ShowPropertyList[o.properties]; d: CD.Design => ShowPropertyList[d.properties^]; t: CD.Technology => ShowPropertyList[t.properties^]; ENDCASE => TerminalIO.PutRope[" no showable CD properties"]; }; ShowPropertyList: PROC [pl: CD.PropList] = { FOR list: CD.PropList _ pl, list.rest WHILE list#NIL DO WITH list.first.key SELECT FROM ra: REF ATOM => IF ra^=$MayBeRemoved THEN LOOP ENDCASE => NULL; ShowProperty[list.first]; ENDLOOP }; ShowProperty: PROC [pp: Properties.KeyVal] = { TerminalIO.PutRope[" name: "]; WriteValue[pp.key]; TerminalIO.PutRope[" value: "]; WriteValue[pp.val]; TerminalIO.PutRope["\n"]; }; ShowPropertiesSP: PROC [comm: CDSequencer.Command] = { inst: CD.Instance _ CDOps.TheInstance[comm.design, "show property lists\n"]; IF inst#NIL THEN { IF inst.properties#NIL THEN { TerminalIO.PutRope[" --properties on instance\n"]; ShowPropertyList[inst.properties]; }; IF inst.ob.properties#NIL THEN { TerminalIO.PutRope[" --properties on object itself\n"]; ShowPropertyList[inst.ob.properties]; }; TerminalIO.PutRope[" --\n"]; } }; ShowPropertiesDesign: PROC [comm: CDSequencer.Command] = { TerminalIO.PutRope["show properties of design\n"]; ShowPropertyList[comm.design.properties^]; TerminalIO.PutRope[" --\n"]; }; SaveComment: CDRopeViewer.SaveProc = { IF discard THEN RETURN; CDProperties.PutProp[ onto: clientData, prop: $Tioga, val: NEW[ViewerTools.TiogaContentsRec_[contents: contents, formatting: formatting]] ] }; CommentDesignComm: PROC [comm: CDSequencer.Command] = { TerminalIO.PutRope["edit comment for design\n"]; CommentSome[what: comm.design, caption: Rope.Cat["[comment for ", CD.DesignName[comm.design], "]"]]; }; CommentObComm: PROC [comm: CDSequencer.Command] = { inst: CD.Instance _ CDOps.TheInstance[comm.design, "comment object\n"]; IF inst#NIL THEN { IF inst.ob.class.composed THEN CommentSome[what: inst.ob, caption: Rope.Cat["Comment on ", CD.Describe[inst.ob, inst.properties]]] ELSE TerminalIO.PutRope["this object class has no comments\n"]; } }; CommentInstComm: PROC [comm: CDSequencer.Command] = { inst: CD.Instance _ CDOps.TheInstance[comm.design, "comment instance"]; IF inst#NIL THEN { CommentSome[what: inst, caption: "comment some instance (ChipNDale)"]; } }; CommentSome: PROC [what: REF, caption: Rope.ROPE] = { comment, formatting: Rope.ROPE _ NIL; WITH CDProperties.GetProp[from: what, prop: $Tioga] SELECT FROM t: ViewerTools.TiogaContents => { comment _ t.contents; formatting _ t.formatting; }; r: Rope.ROPE => comment _ r; ENDCASE => NULL; CDRopeViewer.Edit[contents: comment, formatting: formatting, caption: caption, save: SaveComment, clientData: what]; }; NameMenuComm: PROC [comm: CDSequencer.Command] = { m: PopUpMenus.Menu; x: REF; inst: CD.Instance _ CDOps.TheInstance[comm.design, "property and name menu\n"]; IF inst=NIL THEN m _ mD ELSE IF inst.ob.class.composed THEN m _ mFull ELSE m _ mInst; x _ PopUpMenus.Call[m, comm]; WITH x SELECT FROM a: ATOM => CDSequencer.ExecuteCommand[comm: comm, key: a] ENDCASE => NULL }; IsExclusive: PROC [a: ATOM] RETURNS [BOOL_FALSE] = { pType: CDProperties.PropertyProcs = CDProperties.FetchProcs[a]; IF pType#NIL THEN RETURN [pType.exclusive] }; Register: PROC [n: NAT, key: ATOM, entry, doc: Rope.ROPE _ NIL] = { [] _ PopUpMenus.Entry[mFull, entry, NIL, key, doc]; IF n<=1 THEN RETURN; [] _ PopUpMenus.Entry[mInst, entry, NIL, key, doc]; IF n<=2 THEN RETURN; [] _ PopUpMenus.Entry[mD, entry, NIL, key, doc]; }; mFull: PopUpMenus.Menu _ PopUpMenus.Create["Names & Properties", NIL]; mInst: PopUpMenus.Menu _ PopUpMenus.Create["Names & Properties", NIL]; mD: PopUpMenus.Menu _ PopUpMenus.Create["Names & Properties", NIL]; CDSequencer.ImplementCommand[$CommentDesign, CommentDesignComm]; CDSequencer.ImplementCommand[$CommentApp, CommentInstComm]; CDSequencer.ImplementCommand[$CommentOb, CommentObComm]; CDSequencer.ImplementCommand[$SignalNameS, EnterSignalNameSP]; CDSequencer.ImplementCommand[$InstanceNameS, EnterInstanceNameSP]; CDSequencer.ImplementCommand[$PropertyDesign, PropertyDesign]; CDSequencer.ImplementCommand[$PropertyApp, PropertyApp]; CDSequencer.ImplementCommand[$PropertyOb, PropertyOb]; CDSequencer.ImplementCommand[$ShowPropertiesS, ShowPropertiesSP,, doQueue]; CDSequencer.ImplementCommand[$ShowPropertiesDesign, ShowPropertiesDesign,, doQueue]; Register[3, $RenameDesign, "rename design"]; Register[2, $RenameS, "rename object"]; Register[3, $PropertyDesign, "property (design)", "add/change a property"]; Register[2, $PropertyApp, "property (instance)", "add/change a property"]; Register[1, $PropertyOb, "property (object)", "add/change a property"]; Register[3, $CommentDesign, "comment (design)", "edit the comment view"]; Register[2, $CommentApp, "comment (instance)", "edit the comment view"]; Register[1, $CommentOb, "comment (object)", "edit the comment view"]; Register[2, $InstanceNameS, "instance-name", "accept an instancename"]; Register[2, $SignalNameS, "signal-name (instance)", "accept a signalname"]; Register[3, $ShowPropertiesDesign, "list prop (design)", "list properties hanging on design"]; Register[2, $ShowPropertiesS, "list prop (i&o)", " | list properties of selected object"]; Register[3, $DisplayNames, "display signal-names", " | signal names of all visible objects"]; CDSequencer.ImplementCommand[$NameMenu, NameMenuComm, , dontQueue]; END. δCDPropertyCommands.mesa (part of ChipNDale) Copyright c 1983, 1987 by Xerox Corporation. All rights reserved. Created by Christian Jacobi, November 7, 1983 5:39 pm Last edited by: Christian Jacobi, October 12, 1987 3:53:46 pm PDT --if name = nil, property will be removed --if name = nil, property will be removed --XXX make public on next release; probably in ? --move this procedure to CDProperties --l: CD.LayerRef => ...; --at: ATOM => ...; -- module initialization Κ '˜codešœ-™-Kšœ Οmœ7™BKšœ6™6K™AK˜—šΟk ˜ Kšœž˜Kšžœ˜K˜ Kšœ ˜ Kšœ ˜ Kšœ˜Kšœ ˜ Kšœ ˜ Kšœ ˜ Kšœ ˜ Kšœ˜Kšœ ˜ Kšœ˜Kšœ žœžœ˜Kšœ ˜ Kšœ˜Kšœ žœ#˜4—K˜šΟnœžœžœ˜"KšžœHžœ/˜€—Kšž˜K˜K˜KšœžœžœΟc1˜OK˜š Ÿœžœ žœžœžœžœ˜3Kšžœžœžœ)˜VKšžœžœžœ˜2K˜—K˜šŸœžœ ˜7Kšœžœ?˜Gšžœžœžœ˜Kšœ žœ˜Kšœ5˜5Kšœ.˜.Kšœ)™)Kšžœžœžœ˜$KšœG˜GKšžœžœžœ ˜0Kšžœ#˜'K˜—Kšœ˜—K˜šŸœžœ ˜9KšœžœA˜Išžœžœžœ˜Kšœ žœ˜Kšœ5˜5Kšœ.˜.Kšœ)™)Kšžœžœžœ˜$KšœI˜IKšžœžœžœ ˜0Kšžœ#˜'K˜—Kšœ˜—K˜Kšœ0™0šŸ œžœžœ˜Kšžœžœžœ˜)Kšžœžœžœ˜(šž˜šžœžœž˜Kšœžœžœžœ ˜3Kšœžœ˜&Kšœžœ/˜6Kšœžœžœ2˜>Kš œžœ,žœžœžœ žœ ˜\Kšœžœžœžœ˜:Kšœžœ3˜8KšœG˜GKšžœžœžœ˜8——Kšžœ!˜&Kšœ˜K˜—š Ÿ œžœ žœžœžœ˜3Kšœžœ˜šžœž˜ Kšœ2žœ:˜pšžœž˜ Kšœžœ˜Kšœžœžœ#˜:Kšœ3˜3Kšœ<˜<šœ˜Kšœ.˜.Kšœ žœ žœžœ'˜DKšœ˜—Kšžœ œžœ˜—Kšžœ˜—Kšžœ ˜Kšœ˜—K˜šŸœžœ ˜4Kšœ6˜6Kšœ˜Kšœ˜—K˜šŸ œžœ ˜1KšœžœK˜SKšžœžœžœ˜'Kšœ˜—K˜šŸ œžœ ˜0KšœžœM˜Ušžœžœžœ˜šžœžœžœžœ˜JKšœ˜šžœžœžœ˜6Kšœ2˜2—Kšœ˜—KšžœM˜Q—Kšœ˜—K˜šŸœžœžœ˜%Kšœžœ˜ Kšœžœ;˜Ešžœžœžœ˜Kšœ.˜.Kšž˜K˜—Kšœ)˜)Kšœ$˜$Kšœ˜Kšœ˜šžœžœ˜KšœL˜Lšžœžœ˜Kšœ;˜;Kšž˜K˜—K˜—Kšœ˜Kšœ9˜9Kšœ˜Kšœ˜—K˜Kšœ%™%šŸœžœžœ˜$šžœžœž˜Kšœžœ,˜1Kšœžœ*˜/Kšœžœ+˜0Kšœžœ/˜4Kšœ™Kšœžœ™Kšžœ5˜<—Kšœ˜—K˜šŸœžœžœ˜,š žœžœžœžœž˜7šžœžœž˜Kš œžœžœžœžœž˜.Kšžœžœ˜—Kšœ˜Kšž˜—Kšœ˜K˜—šŸ œžœ˜.Kšœ˜Kšœ˜Kšœ ˜ Kšœ˜Kšœ˜Kšœ˜—K˜šŸœžœ ˜6KšœžœD˜Lšžœžœžœ˜šžœžœžœ˜Kšœ3˜3Kšœ"˜"K˜—šžœžœžœ˜ Kšœ8˜8Kšœ%˜%K˜—Kšœ˜K˜—Kšœ˜—K˜šŸœžœ ˜:Kšœ2˜2Kšœ*˜*Kšœ˜Kšœ˜—K˜šΟb œ˜&Kšžœ žœžœ˜šœ˜Kšœ˜Kšœ˜KšœžœK˜SKšœ˜—Kšœ˜—K˜šŸœžœ ˜7Kšœ0˜0KšœBžœ ˜dKšœ˜—K˜šŸ œžœ ˜3Kšœžœ?˜Gšžœžœžœ˜šžœžœ˜Kšœc˜c—Kšžœ;˜?Kšœ˜—Kšœ˜—K˜šŸœžœ ˜5Kšœžœ?˜Gšžœžœžœ˜KšœF˜FKšœ˜—Kšœ˜—K˜šŸ œžœžœžœ˜5Kšœžœžœ˜%šžœ0žœž˜?šœ!˜!Kšœ˜Kšœ˜K˜—Kšœžœ˜Kšžœžœ˜—Kšœt˜tKšœ˜—K˜šŸ œžœ ˜2Kšœžœ˜KšœžœG˜OKšžœžœžœ˜Kšžœžœžœ ˜-Kšžœ ˜Kšœ˜šžœžœž˜Kšœžœ2˜9Kšžœž˜—Kšœ˜—K™š Ÿ œžœžœžœžœžœ˜4Kšœ?˜?Kšžœžœžœžœ˜*Kšœ˜—J˜š Ÿœžœžœžœžœžœ˜CKšœ$žœ ˜3Kšžœžœžœ˜Kšœ$žœ ˜3Kšžœžœžœ˜Kšœ!žœ ˜0K˜—K™KšœF˜FKšœF˜FKšœC˜CK™Kšœ™K˜Kšœ@˜@Kšœ;˜;Kšœ8˜8Kšœ>˜>KšœB˜BKšœ>˜>Kšœ8˜8Kšœ6˜6KšœK˜KKšœT˜TK˜Kšœ,˜,Kšœ'˜'KšœK˜KKšœJ˜JKšœG˜GKšœI˜IKšœH˜HKšœE˜EKšœG˜GKšœK˜KKšœ^˜^Kšœb˜bKšœf˜fK˜KšœC˜CKšžœ˜—…—&f3q