<> <> <> DIRECTORY FS USING [Error, ExpandName, SetKeep], Menus USING [AppendMenuEntry, CreateEntry, Menu, MenuProc], MessageWindow USING [Append, Blink], Rope USING [Cat, Equal, Index, ROPE, Substr], SkiPatrolViewers, ViewerClasses USING [Viewer], ViewerOps USING [AddProp, FetchProp, PaintViewer, SaveViewer], ViewerTools USING [GetSelectionContents] ; SkiPatrolViewersImpl: CEDAR PROGRAM IMPORTS FS, Menus, MessageWindow, Rope, ViewerOps, ViewerTools EXPORTS SkiPatrolViewers = BEGIN YES: BOOLEAN = TRUE; NO: BOOLEAN = FALSE; <> StoreDocProc: REF Menus.MenuProc _ NEW[Menus.MenuProc _ PrintConfirmMessage]; storePathName: Rope.ROPE; keep: CARDINAL _ 5; -- default keep value for a SkiPatrol viewer AddProps: PUBLIC PROC [viewer: ViewerClasses.Viewer, baseTitle: Rope.ROPE, WDir: Rope.ROPE] ~ { <> ViewerOps.AddProp[viewer: viewer, prop: $BaseTitle, val: baseTitle]; ViewerOps.AddProp[viewer: viewer, prop: $WorkingDirectory, val: WDir]; }; AddSaveAndStore: PUBLIC PROC [myMenu: Menus.Menu] ~ { <> Menus.AppendMenuEntry[ menu: myMenu, entry: Menus.CreateEntry[name: "Save", proc: SaveButton] ]; Menus.AppendMenuEntry[ menu: myMenu, entry: Menus.CreateEntry[name: "Store", proc: StoreButton, documentation: StoreDocProc, guarded: YES] ]; }; PrintConfirmMessage: Menus.MenuProc ~ { <> thisViewer: ViewerClasses.Viewer _ NARROW[parent]; storePathName _ FS.ExpandName[ name: ViewerTools.GetSelectionContents[], wDir: NARROW [ViewerOps.FetchProp[viewer: thisViewer, prop: $WorkingDirectory]] ! FS.Error => IF error.code = $illegalName THEN { MessageWindow.Append[message: error.explanation, clearFirst: YES]; MessageWindow.Blink[]; storePathName _ NIL; GOTO Quit; } ].fullFName; MessageWindow.Append[message: "Please confirm store to file: ", clearFirst: YES]; MessageWindow.Append[message: storePathName]; EXITS Quit => NULL; }; RemoveVersion: PROC [name: Rope.ROPE] RETURNS [Rope.ROPE] ~ { <> RETURN [Rope.Substr[base: name, len: Rope.Index[s1: name, s2: "!"]]] }; SaveButton: Menus.MenuProc ~ { <> thisViewer: ViewerClasses.Viewer _ NARROW[parent]; FS.SetKeep[RemoveVersion[thisViewer.file], keep]; ViewerOps.SaveViewer[thisViewer]; thisViewer.name _ Rope.Cat[ NARROW[ViewerOps.FetchProp[viewer: thisViewer, prop: $BaseTitle]], " (", thisViewer.file, ")" ]; ViewerOps.PaintViewer[viewer: thisViewer, hint: caption] }; StoreButton: Menus.MenuProc ~ { <> thisViewer: ViewerClasses.Viewer _ NARROW[parent]; previousName: Rope.ROPE _ thisViewer.name; -- save in case user selection is bad. previousFile: Rope.ROPE _ thisViewer.file; -- (ditto) file: Rope.ROPE; -- will hold a file name. thisViewer.file _ storePathName; FS.SetKeep[RemoveVersion[thisViewer.file], keep]; ViewerOps.SaveViewer[thisViewer]; <> file _ Rope.Substr[base: thisViewer.file, len: Rope.Index[s1: thisViewer.file, s2: "!"]]; -- (get rid of the version part of the file name) IF NOT Rope.Equal[thisViewer.name, file] THEN { -- unsuccessful. thisViewer.name _ previousName; thisViewer.file _ previousFile; } ELSE thisViewer.name _ Rope.Cat[ NARROW[ViewerOps.FetchProp[viewer: thisViewer, prop: $BaseTitle]], " (", thisViewer.file, ")" ]; ViewerOps.PaintViewer[viewer: thisViewer, hint: caption] }; END. CHANGE LOG <> <> <> <<>>