<> <> <> <> <> <<>> DIRECTORY CD, CDDirectory, CDGenerate, CDMenus, CDProperties, CDRemote, CDSequencer, FileNames, PW, Rope, TerminalIO; CDBringoverCmds: CEDAR PROGRAM IMPORTS CDDirectory, CDGenerate, CDMenus, CDProperties, CDRemote, FileNames, PW, Rope, TerminalIO SHARES CDRemote = BEGIN ROPE: TYPE = Rope.ROPE; libraryProp: ATOM _ PW.RegisterProp[$CDBringoverLibraryName, TRUE]; <> deleteProp: ATOM _ $CDBringoverDelete; <> <> Bringover: PROC [comm: CDSequencer.Command] = { libFullFileName: ROPE _ TerminalIO.RequestRope["Library Name: "]; libFileName: ROPE _ GetNamePart[libFullFileName]; libDesign: CD.Design _ PW.OpenDesign[libFullFileName]; ForEachLibOb: CDDirectory.EachEntryAction = { targetFound: BOOL; targetOb: CD.Object; libObProp: ROPE _ NARROW[CDProperties.GetObjectProp[ob, libraryProp]]; [targetFound, targetOb] _ CDDirectory.Fetch[comm.design, name]; IF targetFound THEN { outRope: ROPE; targetObProp: ROPE _ NARROW[CDProperties.GetObjectProp[targetOb, libraryProp]]; IF targetObProp=NIL THEN outRope _ Rope.Cat["Object ", name, " from this design: "] ELSE outRope _ Rope.Cat["Object ", name, " from library ", targetObProp, ": "]; IF Rope.Equal[libObProp, targetObProp, FALSE] OR Rope.Equal[libFileName, targetObProp, FALSE] OR TerminalIO.Confirm["Replace it?", outRope] THEN { copyOfLibOb: CD.Object _ CDRemote.Get[comm.design, libDesign.name, name]; IF libObProp=NIL THEN PutLibraryName[copyOfLibOb, libFileName]; CDDirectory.ReplaceObject[comm.design, targetOb, copyOfLibOb]; MarkToBeDeleted[targetOb]; TerminalIO.WriteRopes["Replacing ", name, "\n"]; }; } ELSE { copyOfLibOb: CD.Object _ CDRemote.Get[comm.design, libDesign.name, name]; PutLibraryName[copyOfLibOb, libFileName]; TerminalIO.WriteRopes["Adding ", name, "\n"]; } }; SaveChildrenOfUnMarked: CDDirectory.EachEntryAction = { SaveChild: CDDirectory.EnumerateObjectsProc = { CDProperties.PutObjectProp[me, deleteProp, NIL] }; IF CDProperties.GetObjectProp[ob, deleteProp]=NIL THEN CDDirectory.EnumerateChildObjects[ob, SaveChild]; }; DeleteIfMarked: CDDirectory.EachEntryAction = { IF CDProperties.GetObjectProp[ob, deleteProp]#NIL THEN [] _ CDDirectory.Remove[comm.design, name, ob] }; FixNameIfLibraryObject: CDDirectory.EachEntryAction = { newName: ROPE; IF CDProperties.GetObjectProp[ob, libraryProp]=NIL THEN RETURN; newName _ Rope.Substr[name, 0, Rope.Index[name, 0, "@"]]; IF ~Rope.Equal[newName, name] THEN [] _ CDDirectory.Rename[comm.design, ob, newName, FALSE] }; IF libDesign=NIL THEN {TerminalIO.WriteRope["** Error: File not found\n"]; RETURN}; CDGenerate.FlushAll[CDRemote.GetTable[libDesign.name], comm.design]; CDRemote.CacheDesign[comm.design, libDesign]; [] _ CDDirectory.Enumerate[libDesign, ForEachLibOb]; [] _ CDDirectory.Enumerate[comm.design, SaveChildrenOfUnMarked]; [] _ CDDirectory.Enumerate[comm.design, DeleteIfMarked]; [] _ CDDirectory.Enumerate[comm.design, FixNameIfLibraryObject]; TerminalIO.WriteRope["Bringover done\n"]; }; PutLibraryName: PROC [ob: CD.Object, name: ROPE] = { ForEachChild: CDDirectory.EnumerateObjectsProc = { CDProperties.PutObjectProp[me, libraryProp, name]; }; CDDirectory.EnumerateChildObjects[ob, ForEachChild]; CDProperties.PutObjectProp[ob, libraryProp, name]; }; MarkToBeDeleted: PROC [ob: CD.Object] = { ForEachChild: CDDirectory.EnumerateObjectsProc = { CDProperties.PutObjectProp[me, deleteProp, $foo]; }; CDDirectory.EnumerateChildObjects[ob, ForEachChild]; CDProperties.PutObjectProp[ob, deleteProp, $foo]; }; GetNamePart: PROC [fileName: ROPE] RETURNS [name: ROPE] = { name _ FileNames.GetShortName[fileName]; name _ Rope.Substr[name, 0, Rope.Index[name, 0, "."]]; }; <> CDMenus.ImplementEntryCommand[menu: $IOMenu, entry: "Bringover Library", p: Bringover, key: $Bringover, queue: doQueueAndMark]; END.