DIRECTORY Args, Commander, Containers, DFUtilities, FileNames, FS, IO, MessageWindow, PFS, Rope, TiogaButtons, TiogaMenuOps, ViewerClasses, ViewerOps; ButtonOpenImpl: CEDAR PROGRAM IMPORTS Args, Commander, Containers, DFUtilities, FileNames, FS, IO, MessageWindow, PFS, Rope, TiogaButtons, TiogaMenuOps, ViewerOps EXPORTS = BEGIN ROPE: TYPE = Rope.ROPE; Viewer: TYPE = ViewerClasses.Viewer; MacroToolRef: TYPE = REF MacroToolObj; MacroToolObj: TYPE = RECORD [ container: Viewer, buttons: Viewer, workingDirectory: Rope.ROPE, headerButton: TiogaButtons.TiogaButton, prevButton: TiogaButtons.TiogaButton ]; CreateMacroTool: PROC [name: Rope.ROPE, workingDirectory: Rope.ROPE] RETURNS [macroTool: MacroToolRef] = { macroTool ¬ NEW[MacroToolObj]; macroTool.workingDirectory ¬ workingDirectory; macroTool.container ¬ Containers.Create[ info: [ name: name, iconic: TRUE, column: left, scrollable: FALSE]]; -- inhibit user from scrolling contents MakeTiogaButtons[macroTool]; }; MakeTiogaButtons: PROC [macroTool: MacroToolRef] = { lineHeight: INTEGER ¬ 15; macroTool.buttons ¬ TiogaButtons.CreateViewer[ info: [ wx: 0, wy: 0, ww: macroTool.container.ww, wh: macroTool.container.wh, parent: macroTool.container, border: FALSE] ]; macroTool.container.class.set[self: macroTool.container, data: macroTool.buttons, op: $XBound]; macroTool.container.class.set[self: macroTool.container, data: macroTool.buttons, op: $YBound]; macroTool.headerButton ¬ macroTool.prevButton ¬ NewHeaderButton[macroTool.buttons, NIL]; }; NewHeaderButton: PROC [v: Viewer, name: Rope.ROPE] RETURNS [button: TiogaButtons.TiogaButton] = { button ¬ TiogaButtons.CreateButton[ viewer: v, rope: name, format: "", looks: "", proc: NIL, clientData: NIL]; }; ButtonData: TYPE = REF ButtonDataObj; ButtonDataObj: TYPE = RECORD [ localName: Rope.ROPE, inDFName: Rope.ROPE, macroTool: MacroToolRef ]; FileExists: PROC [name: ROPE] RETURNS [BOOL] = { path: PFS.PATH ¬ PFS.PathFromRope[name]; fullName: PFS.PATH; fullName ¬ PFS.FileInfo[name: path ! PFS.Error=> CONTINUE].fullFName; RETURN[fullName#NIL]; }; OpenFile: TiogaButtons.TiogaButtonProc = { TryRemote: PROC [] = { IF buttonData.inDFName # NIL THEN { IF FileExists[buttonData.inDFName] THEN { MessageWindow.Append[Rope.Concat["Opening ", buttonData.inDFName], TRUE]; [] ¬ TiogaMenuOps.Open[fileName: buttonData.inDFName, column: left]; } ELSE { MessageWindow.Append[IO.PutFR1["ButtonOpen: Couldn't find %g ... giving up", [rope[buttonData.inDFName]]], TRUE]; MessageWindow.Blink[]; }; }; }; buttonData: ButtonData ¬ NARROW[clientData]; macroTool: MacroToolRef ¬ buttonData.macroTool; IF mouseButton = red OR mouseButton = yellow THEN { IF buttonData.localName # NIL THEN { IF FileExists[buttonData.localName] THEN { MessageWindow.Append[Rope.Concat["Opening ", buttonData.localName], TRUE]; [] ¬ TiogaMenuOps.Open[fileName: buttonData.localName, column: left]; } ELSE { MessageWindow.Append[IO.PutFR1["ButtonOpen: Couldn't find %g ... trying released version", [rope[buttonData.localName]]], TRUE]; MessageWindow.Blink[]; TryRemote[]; }; } ELSE TryRemote[]; } ELSE TryRemote[]; }; ButtonOpenDF: TiogaButtons.TiogaButtonProc = { TryRemote: PROC RETURNS [errorMsg: ROPE ¬ NIL] = { MessageWindow.Append[Rope.Concat["ButtonOpen DF: ", buttonData.inDFName], TRUE]; IF buttonData.inDFName # NIL THEN errorMsg ¬ ButtonOpen[dfName: buttonData.inDFName, wDir: macroTool.workingDirectory, column: right]; }; buttonData: ButtonData ¬ NARROW[clientData]; macroTool: MacroToolRef ¬ buttonData.macroTool; errorMsg: ROPE; IF mouseButton = red OR mouseButton = yellow THEN { MessageWindow.Append[Rope.Concat["ButtonOpen DF: ", buttonData.localName], TRUE]; IF buttonData.localName # NIL THEN errorMsg ¬ ButtonOpen[dfName: buttonData.localName, wDir: macroTool.workingDirectory, column: right]; IF errorMsg # NIL THEN errorMsg ¬ TryRemote[]; } ELSE errorMsg ¬ TryRemote[]; IF errorMsg # NIL THEN { MessageWindow.Append[errorMsg, TRUE]; MessageWindow.Blink[]; }; }; PressDirectory: TiogaButtons.TiogaButtonProc = { buttonData: ButtonData ¬ NARROW[clientData]; macroTool: MacroToolRef ¬ buttonData.macroTool; MessageWindow.Append[Rope.Concat["Creating viewer in directory: ", buttonData.inDFName], TRUE]; [] ¬ TiogaMenuOps.Open[fileName: buttonData.inDFName, column: left]; }; ExpandFileName: PROC [name: Rope.ROPE, wDir: ROPE] RETURNS [fullName: Rope.ROPE, success: BOOL ¬ TRUE] = { name ¬ FileNames.StripVersionNumber[name]; [fullName, ----, ----] ¬ FS.ExpandName[name, wDir ! FS.Error => { success ¬ FALSE; CONTINUE; } ]; IF NOT success THEN fullName ¬ NIL; }; AddFile: PROC [fileName, comment: ROPE, macroTool: MacroToolRef, inDFDirectory: ROPE] RETURNS [success: BOOL ¬ FALSE] = { buttonData: ButtonData ¬ NEW[ButtonDataObj]; [buttonData.localName, success] ¬ ExpandFileName[fileName, macroTool.workingDirectory]; [buttonData.inDFName, success] ¬ ExpandFileName[fileName, inDFDirectory]; buttonData.macroTool ¬ macroTool; macroTool.prevButton ¬ TiogaButtons.AppendToButton[ button: macroTool.prevButton, rope: Rope.Cat[" ", comment, FileNames.StripVersionNumber[fileName], "\n"], looks: "", proc: OpenFile, clientData: buttonData, fork: FALSE]; }; AddDF: PROC [localName, remoteName, comment: ROPE, macroTool: MacroToolRef] RETURNS [success: BOOL ¬ TRUE] = { buttonData: ButtonData ¬ NEW[ButtonDataObj]; buttonData.localName ¬ localName; buttonData.inDFName ¬ remoteName; buttonData.macroTool ¬ macroTool; macroTool.prevButton ¬ TiogaButtons.AppendToButton[ button: macroTool.prevButton, rope: " [ ] ", looks: "b", proc: ButtonOpenDF, clientData: buttonData, fork: FALSE]; macroTool.prevButton ¬ TiogaButtons.AppendToButton[ button: macroTool.prevButton, rope: Rope.Cat[" ", comment, FileNames.StripVersionNumber[remoteName], "\n"], looks: "", proc: OpenFile, clientData: buttonData, fork: FALSE]; }; AddDirectory: PROC [path1: Rope.ROPE, macroTool: MacroToolRef] = { buttonData: ButtonData ¬ NEW[ButtonDataObj]; buttonData.inDFName ¬ path1; buttonData.macroTool ¬ macroTool; macroTool.prevButton ¬ TiogaButtons.AppendToButton[ button: macroTool.prevButton, rope: Rope.Concat[buttonData.inDFName, "\n"], looks: "", proc: PressDirectory, clientData: buttonData, fork: FALSE]; }; ButtonOpenCommand: Commander.CommandProc = { dfName: ROPE; wDir: Rope.ROPE ¬ FileNames.CurrentWorkingDirectory[]; IF Args.NArgs[cmd] > 0 THEN { dfName ¬ Args.GetRope[cmd, 0]; msg ¬ ButtonOpen[dfName, wDir, right]; }; }; ButtonOpen: PROC [dfName, wDir: ROPE, column: ViewerOps.Column ¬ right] RETURNS [errorMsg: ROPE] = { fullDFName, badName: ROPE; successSoFar: BOOL ¬ TRUE; cp: FS.ComponentPositions; dfFilter: DFUtilities.Filter ¬ [ comments: FALSE, filterA: all, filterB: all, filterC: all, list: NIL ]; dfStream: IO.STREAM; macroTool: MacroToolRef; AddToMacroTool: DFUtilities.ProcessItemProc = { WITH item SELECT FROM fileItem: REF DFUtilities.FileItem => { success: BOOL; fullName: Rope.ROPE; [fullName, cp] ¬ FS.ExpandName[fileItem.name, macroTool.workingDirectory]; success ¬ AddFile[fileItem.name, NIL, macroTool, inDFDirectory]; IF NOT success AND successSoFar THEN { badName ¬ fileItem.name; successSoFar ¬ FALSE; }; }; directoryItem: REF DFUtilities.DirectoryItem => { inDFDirectory ¬ directoryItem.path1; AddDirectory[directoryItem.path1, macroTool]; }; includeItem: REF DFUtilities.IncludeItem => { success: BOOL; shortName, localName, remoteName: ROPE; [remoteName, cp,] ¬ FS.ExpandName[includeItem.path1]; shortName ¬ Rope.Concat[Rope.Substr[remoteName, cp.base.start, cp.base.length], ".df"]; [localName, cp,] ¬ FS.ExpandName[shortName, macroTool.workingDirectory]; success ¬ AddDF[localName, remoteName, "Include ", macroTool]; IF NOT success AND successSoFar THEN { badName ¬ includeItem.path1; successSoFar ¬ FALSE; }; }; importsItem: REF DFUtilities.ImportsItem => { success: BOOL; shortName, localName, remoteName: ROPE; [remoteName, cp,] ¬ FS.ExpandName[importsItem.path1]; shortName ¬ Rope.Concat[Rope.Substr[remoteName, cp.base.start, cp.base.length], ".df"]; [localName, cp,] ¬ FS.ExpandName[shortName, macroTool.workingDirectory]; success ¬ AddDF[localName, remoteName, "Imports ", macroTool]; IF NOT success AND successSoFar THEN { badName ¬ importsItem.path1; successSoFar ¬ FALSE; }; }; ENDCASE; }; inDFDirectory: ROPE ¬ NIL; [fullDFName, cp] ¬ FS.ExpandName[dfName, wDir]; IF NOT Rope.Equal[Rope.Substr[fullDFName, cp.ext.start, cp.ext.length], "df", FALSE] THEN { RETURN["ButtonOpen only works on DF files"]; }; dfStream ¬ FS.StreamOpen[dfName, $read ! FS.Error => {errorMsg ¬ Rope.Concat[error.explanation, "\n"]; CONTINUE}]; IF errorMsg # NIL THEN RETURN; IF dfStream # NIL THEN { macroTool ¬ CreateMacroTool[Rope.Cat[dfName, ", ", wDir], wDir]; DFUtilities.ParseFromStream[dfStream, AddToMacroTool, dfFilter]; IF NOT successSoFar THEN MessageWindow.Append[Rope.Concat["FS Error during name expansion of ", badName], TRUE] ELSE { ViewerOps.ChangeColumn[macroTool.container, column]; ViewerOps.OpenIcon[macroTool.container]; }; }; }; Commander.Register[key: "ButtonOpen", proc: ButtonOpenCommand, doc: "Takes a DF file name. Opens a TiogaButton files with one button for each file mentioned in the DF file", clientData: NIL, interpreted: TRUE] END. R ButtonOpenImpl.mesa Copyright Ó 1988, 1989, 1991, 1992 by Xerox Corporation. All rights reserved. Last edited by Bier on January 3, 1989 11:36:46 pm PST Bier, June 16, 1991 4:02 pm PDT Doug Wyatt, April 14, 1992 12:39 pm PDT Contents: Implements a tool which displays a list of items, such as file names, as TiogaButtons and allows a procedure to be registered with each item, that is performed when that button is pressed. CommandProc: TYPE = PROC [cmd: Handle] RETURNS [result: REF _ NIL, msg: ROPE _ NIL]; ProcessItemProc: TYPE = PROC [item: REF ANY] RETURNS [stop: BOOL _ FALSE]; Ê ü–(cedarcode) style•NewlineDelimiter ™codešœ™Kšœ ÏeœB™NKšœ6™6K™K™'K˜—™ÇK™—šÏk ˜ KšœŒ˜Œ—K˜šÏnœžœž˜Kšžœ|˜„Kšžœž˜—K˜K•StartOfExpansionx[key: ROPE, proc: Commander.CommandProc, doc: ROPE _ NIL, clientData: REF ANY _ NIL, interpreted: BOOL _ TRUE]šžœžœžœ˜K–x[key: ROPE, proc: Commander.CommandProc, doc: ROPE _ NIL, clientData: REF ANY _ NIL, interpreted: BOOL _ TRUE]šœžœ˜$K˜Kšœžœžœ˜&šœžœžœ˜Kšœ˜Kšœ˜Kšœžœ˜Kšœ'˜'Kšœ$˜$K˜K˜—š Ÿœžœ žœžœžœ˜jKšœ žœ˜K˜.K˜šœ˜Kšœ˜Kšœ ˜ Kšœžœ˜ Kšœ ˜ Kšœ žœžœÏc'˜=—Kšœ˜K˜K˜—šŸœžœ˜4Kšœ žœ˜˜.šœ˜KšœE˜EKšœ˜Kšœžœ˜—Kšœ˜—Kšœ_˜_Kšœ_˜_KšœSžœ˜XK˜K˜—šŸœžœžœžœ'˜aK˜#Kšœ ˜ Kšœ ˜ Kšœ ˜ Kšœ ˜ Kšœžœ˜ Kšœ žœ˜K˜K˜—Kšœ žœžœ˜%šœžœžœ˜Kšœž˜Kšœž˜K˜K˜K˜—š Ÿ œžœžœžœžœ˜0Kšœžœžœžœ˜(Kšœ žœž˜Kšœ žœžœ žœ ˜EKšžœ žœ˜K˜K˜—šŸœ"˜*šŸ œžœ˜šžœžœžœ˜#šžœ ˜"šžœ˜KšœCžœ˜IK˜DK˜—šžœ˜KšœžœTžœ˜qKšœ˜K˜——K˜—K˜—Kšœžœ ˜,K˜/šžœžœžœ˜3šžœž˜šžœ˜šžœ!˜#šžœ˜KšœDžœ˜JK˜EK˜—šžœ˜Kšœžœcžœ˜€Kšœ˜Kšœ ˜ K˜——K˜—Kšžœ ˜—K˜—Kšžœ ˜K˜K˜—šŸ œ"˜.š Ÿ œžœžœ žœžœ˜2KšœJžœ˜PKšžœžœžœe˜†K˜—Kšœžœ ˜,K˜/Kšœ žœ˜šžœžœžœ˜3KšœKžœ˜QKšžœžœžœf˜ˆKšžœ žœžœ˜.K˜—Kšžœ˜šžœ žœžœ˜Kšœžœ˜%Kšœ˜K˜—K˜K˜—šŸœ"˜0Kšœžœ ˜,K˜/KšœYžœ˜_K˜DK˜K˜K˜—šŸœžœ žœžœžœžœ žœžœ˜jK˜*šœžœžœ ˜AKšœ žœ˜Kšžœ˜ K˜Kšœ˜—Kšžœžœ žœ žœ˜#K˜K˜—šŸœžœžœ*žœžœ žœžœ˜yKšœžœ˜,K˜WK˜IK˜!˜3Kšœ˜KšœL˜LKšœ ˜ Kšœ˜Kšœ˜Kšœžœ˜ —K˜K˜—š Ÿœžœ"žœžœ žœžœ˜nKšœžœ˜,K˜!K˜!K˜!˜3Kšœ˜KšœÏbœ˜Kšœ ˜ Kšœ˜Kšœ˜Kšœžœ˜ —˜3Kšœ˜KšœM˜MKšœ ˜ Kšœ˜Kšœ˜Kšœžœ˜ —K˜K˜—šŸ œžœžœ˜BKšœžœ˜,K˜K˜!˜3Kšœ˜Kšœ-˜-Kšœ ˜ Kšœ˜Kšœ˜Kšœžœ˜ —K˜K˜—šŸœ˜,Kšœ žœžœžœ žœžœžœžœ™TKšœžœ˜ Kšœ žœ'˜6šžœžœ˜K˜K˜&K˜—K˜K˜—š Ÿ œžœžœ$žœ žœ˜dKšœžœ˜Kšœžœžœ˜Kšœžœ˜˜ Kšœ žœ˜Kšœ ˜ Kšœ ˜ Kšœ ˜ Kšœž˜ K˜—Kšœ žœžœ˜Kšœ˜šŸœ!˜/KšœJ™Jšžœžœž˜šœ žœ˜'Kšœ ž˜Kšœžœ˜K˜JKšœ!žœ˜@šžœžœ žœ ž˜&K˜Kšœžœ˜K˜—K˜—šœ1˜1K˜$Kšœ-˜-K˜—šœ-˜-Kšœ ž˜Kšœ"žœ˜'Kšœžœ˜5K˜WKšœžœ3˜HK˜>šžœžœ žœ ž˜&K˜Kšœžœ˜K˜—K˜—šœ-˜-Kšœ ž˜Kšœ"žœ˜'Kšœžœ˜5K˜WKšœžœ3˜HK˜>šžœžœ žœ ž˜&K˜Kšœžœ˜K˜—K˜—Kšžœ˜—K˜—Kšœžœžœ˜K˜/šžœžœHžœžœ˜[Kšžœ&˜,Kšœ˜—šœ žœ˜&Kšœžœ<žœ˜K—Kšžœ žœžœžœ˜šžœ žœžœ˜K˜@Kšœ@˜@šžœžœž˜KšœQžœ˜V—šžœ˜Kšœ4˜4Kšœ(˜(K˜—K˜—K˜K˜—Kšœ»žœžœ˜ÒKšžœ˜K˜—…—#â10