DIRECTORY Buttons, ColorTrixDispatch, Commander, CommandTool, Containers, FileNames, FS, IO, MessageWindow, Process, Rope, ViewerClasses, ViewerOps; ColorTrixGalleryImpl: CEDAR PROGRAM IMPORTS Buttons, ColorTrixDispatch, CommandTool, Containers, FileNames, FS, IO, MessageWindow, Process, Rope, ViewerOps ~ BEGIN ROPE: TYPE ~ Rope.ROPE; GalleryData: TYPE ~ RECORD [ cmd: Commander.Handle _ NIL, ctView: Commander.CommandProc _ NIL, viewer, printButton: ViewerClasses.Viewer _ NIL, filenames: LIST OF ROPE _ NIL, currentName: LIST OF ROPE _ NIL ]; CtGallery: PUBLIC Commander.CommandProc ~ { FirstChar: PUBLIC PROC [rope: ROPE, char: CHAR] RETURNS [BOOL] ~ { RETURN[rope.Length[] > 0 AND rope.Fetch[0] = char]; }; LastChar: PUBLIC PROC [rope: ROPE, char: CHAR] RETURNS [BOOL] ~ { ropeLength: INT _ rope.Length[]; RETURN[ropeLength > 0 AND rope.Fetch[ropeLength-1] = char]; }; RopeShorten: PUBLIC PROC [rope: ROPE, n: INT] RETURNS [ROPE] ~ { ropeLength: INT _ rope.Length[]; IF ropeLength >= n THEN rope _ rope.Substr[0, ropeLength-n]; RETURN [rope]; }; args: CommandTool.ArgumentVector _ CommandTool.Parse[cmd]; gd: REF GalleryData _ NEW[GalleryData _ [cmd: cmd]]; FOR i: INT IN [1..args.argc) DO IF NOT FirstChar[args[i], '-] THEN { EachName: FS.NameProc ~ { Process.CheckForAbort[]; gd.filenames _ CONS[FileNames.ConvertToSlashFormat[fullFName], gd.filenames]; RETURN[TRUE]; }; Pattern: PROC [arg: ROPE] RETURNS [ROPE] ~ { star: BOOL _ LastChar[arg, '*]; errorMsg _ NIL; WHILE LastChar[arg, '*] DO arg _ RopeShorten[arg, 1]; ENDLOOP; IF Rope.IsEmpty[arg] OR LastChar[arg, '/] OR LastChar[arg, '>] THEN RETURN[NIL]; arg _ FileNames.ResolveRelativePath[arg]; -- handle .> or ..> arg _ Rope.Concat[arg, "*"]; -- ensure FName arg _ FS.ExpandName[arg ! FS.Error => { errorMsg _ error.explanation; CONTINUE}].fullFName; IF errorMsg # NIL THEN RETURN[NIL]; IF NOT star THEN arg _ RopeShorten[arg, 1]; -- remove '* RETURN[Rope.Concat[arg, "!H"]]; }; errorMsg: ROPE _ NIL; pattern: ROPE ~ Pattern[args[i]]; IF pattern = NIL THEN IO.PutRope[cmd.err, errorMsg] ELSE FS.EnumerateForNames[pattern, EachName ! FS.Error => CONTINUE]; }; ENDLOOP; IF gd.filenames = NIL THEN {Blink["No such files"]; RETURN}; gd.viewer _ Containers.Create[ info: [name: "Ct Gallery", openHeight: 33, iconic: TRUE, column: right, scrollable: FALSE], paint: FALSE]; gd.currentName _ gd.filenames; [] _ Buttons.Create[info: [parent: gd.viewer, name: "Next Picture", wx: 7, wy: 2], proc: Next, clientData: gd, paint: TRUE]; ViewerOps.OpenIcon[gd.viewer]; gd.ctView _ ColorTrixDispatch.GetCtOp["View"].proc; Show[gd]; }; Blink: PROC [rope: ROPE] ~ { MessageWindow.Append[rope, TRUE]; MessageWindow.Blink[]; }; Show: PROC [gd: REF GalleryData] ~ { result: ROPE; IF gd.currentName = NIL THEN RETURN; gd.cmd.commandLine _ Rope.Concat[gd.currentName.first, "\n"]; MessageWindow.Append[gd.currentName.first, TRUE]; IF (result _ gd.ctView[gd.cmd].msg) # NIL THEN Blink[result]; IF gd.currentName = gd.filenames THEN MessageWindow.Append[" (. . . first)"]; IF (gd.currentName _ gd.currentName.rest) = NIL THEN { gd.currentName _ gd.filenames; MessageWindow.Append[" (. . . last)"]; }; }; Next: Buttons.ButtonProc ~ {Show[NARROW[clientData]]}; ColorTrixDispatch.RegisterCtOp[ "Gallery", CtGallery, "Ct Gallery {pattern and/or list of filenames}."]; END. –ColorTrixGalleryImpl.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Bloomenthal, January 29, 1987 2:32:53 pm PST Start Code Κ˜šœ™Jšœ Οmœ1™Lš žœžœžœžœžœžœ˜PLšœ.Οc˜ALšœ£˜4šœžœžœ ˜'Lšœžœ ˜3—Lš žœ žœžœžœžœ˜#Lšžœžœžœ£Πci ˜