DIRECTORY BasicTime, DFOperations, DFUtilities, FS, IO, List, ProcessProps, Rope, TEditOpsExtras, UserProfile, ViewerClasses; DFDWIM: CEDAR PROGRAM IMPORTS DFUtilities, FS, IO, Rope, TEditOpsExtras, UserProfile = BEGIN ROPE: TYPE = Rope.ROPE; Viewer: TYPE = ViewerClasses.Viewer; inPlace, tryBringover: BOOLEAN _ FALSE; OldFNP: PROC [ROPE, Viewer] RETURNS [fileName: ROPE, search: ROPE] _ NIL; log: IO.STREAM _ NIL; Debug: PROC = {log _ IO.ROS[]}; DontDebug: PROC = {log _ NIL}; GetLog: PROC RETURNS [r: ROPE] = {r _ log.RopeFromROS[]}; sourceFileExtensions: LIST OF ROPE _ NIL; DFDWIMit: PROC [orgName: ROPE, viewer: Viewer] RETURNS [fileName: ROPE, search: ROPE] = BEGIN IF viewer # NIL THEN BEGIN IF tryBringover AND IsADFFileName[viewer.file] THEN BEGIN found: BOOL; full: ROPE; [found, full] _ Find[viewer.file, orgName]; IF found THEN RETURN [full, NIL]; END; END; IF OldFNP # NIL THEN [fileName, search] _ OldFNP[orgName, viewer] ELSE {fileName _ search _ NIL}; END; Find: PROC [dfFileName, searchName: ROPE] RETURNS [found: BOOL, full: ROPE] = BEGIN PerItem: DFUtilities.ProcessItemProc --PROC [item: REF ANY] RETURNS [stop: BOOL _ FALSE]-- = BEGIN Try: PROC [dir, short: ROPE, ifFound: PROC] = { cp: FS.ComponentPositions; expanded, test: ROPE; [expanded, cp, ] _ FS.ExpandName[full _ dir.Concat[short], NIL]; IF versioned THEN test _ Rope.Concat["!", expanded.Substr[start: cp.ver.start, len: cp.ver.length]] ELSE test _ NIL; IF extended THEN test _ Rope.Cat[".", expanded.Substr[start: cp.ext.start, len: cp.ext.length], test]; test _ expanded.Substr[start: cp.base.start, len: cp.base.length].Concat[test]; IF test.Equal[s2: searchName, case: FALSE] THEN { IF (NOT extended) AND (cp.ext.length # 0) THEN { ext: ROPE _ expanded.Substr[start: cp.ext.start, len: cp.ext.length]; IF Member[ext, sourceFileExtensions] THEN ifFound[]; } ELSE ifFound[]; }; }; This: PROC = {found _ TRUE}; found _ FALSE; WITH item SELECT FROM di: REF DFUtilities.DirectoryItem => dir _ di.path1; fi: REF DFUtilities.FileItem => Try[dir, fi.name, This]; ii: REF DFUtilities.ImportsItem => { Try[NIL, ii.path1, This]; IF ii.list # NIL THEN FOR i: NAT IN [0 .. ii.list.nEntries) WHILE NOT found DO Sub: PROC = {[found, full] _ Find[ii.path1, ii.list[i].name]}; Try["[]<>", ii.list[i].name, Sub]; ENDLOOP; }; ii: REF DFUtilities.IncludeItem => NULL; c: REF DFUtilities.CommentItem => NULL; w: REF DFUtilities.WhiteSpaceItem => NULL; ENDCASE => ERROR; stop _ found; END; cp: FS.ComponentPositions; ok, extended, versioned: BOOL _ TRUE; from: IO.STREAM _ NIL; dir: ROPE _ NIL; [, cp, ] _ FS.ExpandName[searchName !FS.Error => {ok _ FALSE; CONTINUE}]; IF NOT ok THEN RETURN [FALSE, NIL]; extended _ cp.ext.length # 0; versioned _ cp.ver.length # 0; from _ FS.StreamOpen[dfFileName !FS.Error => CONTINUE]; IF from = NIL THEN RETURN [FALSE, NIL]; DFUtilities.ParseFromStream[in: from, proc: PerItem]; from.Close[]; END; Member: PROC [r: ROPE, in: LIST OF ROPE] RETURNS [m: BOOL] = { FOR in _ in, in.rest WHILE in # NIL DO IF in.first.Equal[r, FALSE] THEN RETURN [TRUE]; ENDLOOP; m _ FALSE}; IsADFFileName: PROC [name: ROPE] RETURNS [isa: BOOLEAN] = {isa _ name.Find[s2: ".DF!", case: FALSE] >= 0}; NoticeProfileChanges: UserProfile.ProfileChangedProc = BEGIN tryBringover _ UserProfile.Boolean["DFDWIM.TryBringover", TRUE]; sourceFileExtensions _ UserProfile.ListOfTokens["SourceFileExtensions", NIL]; IF tryBringover AND NOT inPlace THEN BEGIN inPlace _ TRUE; OldFNP _ TEditOpsExtras.ReplaceFileNameProc[DFDWIMit]; END; END; UserProfile.CallWhenProfileChanges[NoticeProfileChanges]; END. DDFDWIM.Mesa, from [Indigo]Top>DFDWIM.DF Last Edited by: Spreitzer, June 24, 1984 11:09:02 am PDT DFDWIMit: PROC [orgName: ROPE, viewer: Viewer] RETURNS [fileName: ROPE, search: ROPE] = BEGIN Try: PROC [name: ROPE] RETURNS [found: BOOLEAN _ FALSE] = {IF Exists[name] THEN {found _ TRUE; fileName _ name; search _ NIL} ELSE IF Exists[name _ name.Concat[".Mesa"]] THEN {found _ TRUE; fileName _ name; search _ NIL}}; TryBringover: PROC = BEGIN [] _ DFOperations.BringOver[dfFile: viewer.file, filter: [list: LIST [orgName]], interact: DumbyInteract, log: log]; END; directory, wdir: ROPE _ NIL; IF viewer # NIL THEN BEGIN directory _ TEditOpsExtras.WorkingDirectoryFromViewer[viewer]; IF tryBringover AND IsADFFileName[viewer.file] THEN BEGIN cp: FS.ComponentPositions _ [[0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1]]; cp _ FS.ExpandName[directory.Cat["Foo.Mesa"] !FS.Error => CONTINUE].cp; wdir _ IF (directory.Length[] # 0) AND (cp.server.length = 0 --local--) AND (cp.dir.length = 0 --current volume--) THEN directory ELSE "[]<>"; ProcessProps.AddPropList[ propList: List.PutAssoc[key: $WorkingDirectory, val: wdir, aList: NIL], inner: TryBringover]; IF Try[wdir.Concat[orgName]] THEN RETURN; END; END; IF OldFNP # NIL THEN [fileName, search] _ OldFNP[orgName, viewer] ELSE {fileName _ orgName; search _ NIL}; END; DumbyInteract: DFOperations.InteractionProc--PROC [interaction: REF ANY, clientData: REF ANY] RETURNS [abort: BOOL _ FALSE, abortMessageForLog: ROPE _ NIL, response: REF ANY _ NIL]-- = BEGIN --It says I should be able to default the interact, but that doesn't work, but Russ says this does-- END; Exists: PROC [fileName: ROPE] RETURNS [exists: BOOLEAN] = BEGIN exists _ TRUE; [] _ FS.FileInfo[name: fileName ! FS.Error => {exists _ FALSE; CONTINUE}]; exists _ exists; --wouldn't it be nice if we could really break on exit? END; ΚΚ– "cedar" style˜Jšœ.™.J™8J˜IcodešΟk œ'œœG˜}K˜šΡbkxœœ˜Kšœœœ%˜@—K˜Kš˜K˜Kšœœœ˜Kšœœ˜$K˜Kšœœœ˜'K˜KšΟnœœœ œ œ œœ˜IK˜Kšœœœœ˜K˜KšŸœœ œœ˜K˜KšŸ œœ œ˜K˜KšŸœœœœ˜9K˜Kš œœœœœ˜)K˜š Ÿœœ œœ œ œ˜WKš˜šœ œ˜Kš˜šœœ˜3Kš˜Kšœœ˜ Kšœœ˜ K˜+Kšœœœœ˜!Kšœ˜—Kšœ˜—Kšœ œœ-˜AKšœœ˜Kšœ˜—K˜š Ÿœœœœ œœ˜MKš˜šŸœΟc5œ˜\Kš˜šŸœœœ œ˜/Kšœœ˜Kšœœ˜Kšœœ&œ˜@šœ ˜ KšœR˜VKšœœ˜—Kšœ œV˜fKšœO˜Ošœ"œœ˜1šœœ œœ˜0Kšœœ<˜EKšœ#œ ˜4K˜—Kšœ ˜K˜—K˜—KšŸœœ œ˜Kšœœ˜šœœ˜Kšœœ-˜4Kšœœ1˜8šœœ˜$Kšœœ˜šœ ˜š œœœœœœ˜=KšŸœœ5˜>Kšœ"˜"Kšœ˜——K˜—Kšœœœ˜(Kšœœœ˜'Kšœœœ˜*Kšœœ˜—K˜ Kšœ˜—Kšœœ˜Kšœœœ˜%Kšœœœœ˜Kšœœœ˜Kš œ œœœœ˜IKš œœœœœœ˜#Kšœ˜Kšœ˜Kšœœœ œ˜7Kš œœœœœœ˜'K˜5K˜ Kšœ˜—K˜šŸœœœœœœœœ˜>šœœœ˜&Kš œœœœœ˜/Kšœ˜—Kšœœ˜ —K˜š Ÿœœ œœ œ œ™WKš™š Ÿœœœœ œœ™9šœœ ™Kšœ œœ™2—šœœ$™+Kšœ œœ™4——šŸ œœ™Kš™Kšœ@œ0™tKšœ™—Kšœœœ™šœ œ™Kš™Kšœ>™>šœœ™3Kš™KšœœG™MKšœœ'œ œ™GKšœœœ  œœ œœ œ™Žšœ™KšœBœ™GK™—Kšœœœ™)Kšœ™—Kšœ™—Kšœ œœ-™AKšœœ™(Kšœ™—K˜šŸ œ ‹œ™ΈKšœ dœœ™o—K˜š Ÿ œœœœœ˜9Kšœ#œ˜0—K˜š Ÿœœ œœ œ™9Kš™Kšœ œ™Kš œœœœœ™JKšœ 7™HKšœ™—K˜šŸœ"˜6Kš˜Kšœ:œ˜@KšœHœ˜Mšœœœ ˜$Kš˜Kšœ œ˜Kšœ6˜6Kšœ˜—Kšœ˜—K˜Kšœ9˜9K˜Kšœ˜—…—