<> <> <> DIRECTORY GriffinDefs: FROM "GriffinDefs", MenuDefs: FROM "MenuDefs", PointDefs: FROM "PointDefs", ObjectDefs: FROM "ObjectDefs", GriffinViewer USING [PaintProc, DoPaint], GriffinFileDefs: FROM "GriffinFileDefs", FS USING [EnumerateForNames, NameProc, ExpandName, ComponentPositions], RefreshDefs: FROM "RefreshDefs", ScreenDefs USING [ClearScreen], GriffinColor USING [LoadColorMap], GriffinMenusInterface, Rope USING [Cat, Substr, Length,ROPE, Equal]; FigureOps: PROGRAM IMPORTS GriffinDefs, MenuDefs, ScreenDefs, ObjectDefs, GriffinFileDefs, FS, RefreshDefs, Rope, GriffinViewer, GriffinColor EXPORTS GriffinDefs, GriffinMenusInterface = BEGIN gridX: INTEGER _ 8; gridY: INTEGER _ 8; gridOn: BOOLEAN _ FALSE; X: CARDINAL = PointDefs.X; Y: CARDINAL = PointDefs.Y; ROPE: TYPE = Rope.ROPE; Refresh: PUBLIC MenuDefs.MenuProc = BEGIN paintProc: GriffinViewer.PaintProc = { ScreenDefs.ClearScreen[dc]; ObjectDefs.ReplotAllObjects[dc]; }; GriffinViewer.DoPaint[paintProc]; END; Press: PUBLIC MenuDefs.MenuProc = BEGIN OPEN ObjectDefs; name: ROPE; readOnly: BOOLEAN; [name, readOnly]_ GetName[]; IF Rope.Length[name]=0 THEN RETURN; IF readOnly THEN GriffinDefs.UserMessage["File is read-only."]; ExpungeObjects[]; ObjectDefs.PressAllObjects[name]; END; Save: PUBLIC MenuDefs.MenuProc = BEGIN OPEN ObjectDefs; name: ROPE; readOnly: BOOLEAN; [name, readOnly]_ GetName[]; IF Rope.Length[name]=0 THEN RETURN; IF readOnly THEN GriffinDefs.UserMessage["File is read-only."]; name _ Rope.Cat[name,".griffin"]; ExpungeObjects[]; [] _ GriffinFileDefs.OpenFile[name, TRUE]; [] _ GriffinFileDefs.WriteFigure[]; GriffinFileDefs.CloseFile[]; END; Restore: PUBLIC MenuDefs.MenuProc = BEGIN OPEN ObjectDefs; name: ROPE; readOnly: BOOLEAN; [name, readOnly]_ GetName[]; IF Rope.Length[name]=0 THEN RETURN; IF ~readOnly THEN name _ Rope.Cat[name,".griffin"]; ExpungeObjects[]; IF GriffinFileDefs.OpenFile[name, FALSE] THEN BEGIN GriffinFileDefs.ReadFigure[]; GriffinFileDefs.CloseFile[]; ObjectDefs.ReplotAllObjects[NIL]; END; END; TypeIntoFileName: PUBLIC MenuDefs.MenuProc = BEGIN MenuDefs.SelectOnly[item]; GriffinDefs.TypeIntoMenuItem[item]; END; GetName: PROCEDURE RETURNS[string: ROPE, readOnly: BOOLEAN]= BEGIN OPEN MenuDefs; nameItem: MenuItemHandle _ NIL; FindLastSelected: MenuProc = BEGIN IF IsSelected[item] THEN nameItem _ item; END; ForAllMenuItems[filesMenu, FindLastSelected]; [menuName: string, readOnly: readOnly] _ ParseName[MenuDefs.MenuString[nameItem]]; IF nameItem = fileName THEN [] _ AddPortfolioName[string]; --name is in type-in menu RETURN[string, readOnly]; END; MakeDirInfo: PROC[fName: ROPE, cp: FS.ComponentPositions] RETURNS [dirInfo: ROPE] = { dirInfo _ Rope.Cat[Rope.Substr[fName,cp.dir.start, cp.dir.length], ">",Rope.Substr[fName,cp.subDirs.start, cp.subDirs.length]]; }; ParseName: PROC[name: ROPE] RETURNS [readOnly: BOOLEAN, menuName: ROPE] = { <> <> <> <> <> cp: FS.ComponentPositions; dirInfo, extension, fName: ROPE; [fullFName: fName, cp: cp] _ FS.ExpandName[name]; dirInfo _ MakeDirInfo[fName,cp]; extension _ Rope.Substr[fName, cp.ext.start, cp.ext.length]; <> readOnly _ cp.server.length#0 OR cp.ver.length#0 OR ~(Rope.Equal[extension, "griffin", FALSE] OR Rope.Equal[extension, "press", FALSE]); menuName _IF readOnly THEN fName ELSE IF Rope.Equal[dirInfo, localDirInfo, FALSE] THEN Rope.Substr[fName, cp.base.start, cp.base.length] ELSE Rope.Cat[dirInfo, Rope.Substr[fName, cp.base.start, cp.base.length]]; }; AddPortfolioName: PROCEDURE[string: ROPE] RETURNS [item: MenuDefs.MenuItemHandle] = BEGIN OPEN MenuDefs, GriffinDefs; IF Rope.Length[string] = 0 THEN UserMessage["First select or type a file name."]; item _ AddMenuItem[filesMenu, string, SelectOnly]; SetMenuString[fileName, ""]; SelectOnly[item]; RefreshDefs.RestoreScreen[]; END; GridMenuProc: PUBLIC MenuDefs.MenuProc = BEGIN gridOn _ ~gridOn; IF ~gridOn THEN BEGIN MenuDefs.Deselect[item]; ObjectDefs.GridOff[]; END ELSE BEGIN MenuDefs.Select[item]; ObjectDefs.GridOn[]; END; END; Grid: PUBLIC PROCEDURE[pt: PointDefs.ScrPt] RETURNS[PointDefs.ScrPt]= BEGIN dx,dy: INTEGER; IF NOT gridOn THEN RETURN[pt]; <> dx _ pt[X] MOD gridX; pt[X] _ pt[X]-dx; IF dx > gridX/2 THEN pt[X] _ pt[X] +gridX; dy _ pt[Y] MOD gridY; pt[Y] _ pt[Y]-dy; IF dy > gridY/2 THEN pt[Y] _ pt[Y] +gridY; RETURN[pt]; END; Merge: PUBLIC MenuDefs.MenuProc = BEGIN OPEN ObjectDefs; view: View _ viewMenu.view; Mark: ObjectProc = BEGIN IF obj.view=view THEN RETURN; obj.view _ view; RefreshDefs.MarkBox[obj.tl,obj.br,obj]; END; ForAllObjects[Mark]; RefreshDefs.RestoreScreen[]; END; Switch: PUBLIC MenuDefs.MenuProc = BEGIN OPEN ObjectDefs; newView: View _ IF viewMenu.view=main THEN alternate ELSE main; Mark: ObjectProc = BEGIN WITH foo: obj SELECT FROM menu => obj.view _ newView; token => IF foo.tokenType#selected AND foo.tokenType#open THEN obj.view _ newView; ENDCASE; END; paintProc: GriffinViewer.PaintProc = { ScreenDefs.ClearScreen[dc]; ObjectDefs.ReplotAllObjects[dc]; }; ForAllObjects[Mark]; SetCurrentView[newView]; GriffinViewer.DoPaint[paintProc]; END; ColorMap: PUBLIC MenuDefs.MenuProc = {GriffinColor.LoadColorMap[]}; promptMenu: MenuDefs.MenuHandle_NIL; displayMenu,filesMenu,viewMenu: PUBLIC MenuDefs.MenuHandle_NIL; fileName: MenuDefs.MenuItemHandle; localDirInfo: ROPE _ NIL; EachGriffinFile: FS.NameProc = TRUSTED BEGIN <> cp: FS.ComponentPositions _ FS.ExpandName[fullFName].cp; []_AddPortfolioName[Rope.Substr[fullFName,cp.base.start,cp.base.length]]; localDirInfo _ MakeDirInfo[fullFName, cp]; RETURN[TRUE]; END; StartFigureMenus: PUBLIC PROC = { IF filesMenu=NIL THEN { --first call promptMenu _ MenuDefs.CreateMenu[horizontal, [60,70], "Type File Name >"]; viewMenu _ MenuDefs.CreateMenu[horizontal, [100,50], NIL]; []_MenuDefs.AddMenuItem[viewMenu,"Refresh",Refresh]; []_MenuDefs.AddMenuItem[viewMenu,"Grid",GridMenuProc]; []_MenuDefs.AddMenuItem[viewMenu,"Merge",Merge]; []_MenuDefs.AddMenuItem[viewMenu,"Switch",Switch]; []_MenuDefs.AddMenuItem[viewMenu,"ColorMap",ColorMap]; } ELSE [] _ ObjectDefs.DeleteObject[filesMenu]; --we're being called with a new viewer and wd filesMenu _ MenuDefs.CreateMenu[vertical, [100,75], NIL]; []_MenuDefs.AddMenuItem[filesMenu,"Save", Save]; []_MenuDefs.AddMenuItem[filesMenu,"Restore", Restore]; []_MenuDefs.AddMenuItem[filesMenu,"Press", Press]; fileName _ MenuDefs.AddMenuItem[filesMenu, "", TypeIntoFileName]; FS.EnumerateForNames[pattern: "*.griffin!H", proc: EachGriffinFile, wDir: NIL]; MenuDefs.SelectOnly[fileName]; }; END.