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.  FigureOps.mesa Last Edited by: Stone, June 19, 1984 2:22:47 pm PDT Last Edited by: Pier, February 14, 1984 10:11:13 am PST IF readOnly THEN menuName is a complete GName Otherwise, the menuName is approximately the LName for the file Exceptions: if the file is on the default subdirectory then no subdirectory is included The LName never contains an extension isSimple _ cp.server.length=0 AND Rope.Equal[dirInfo, localDirInfo, FALSE] AND cp.ver.length=0 AND (cp.ext.length=0 OR Rope.Equal[extension, "griffin", FALSE] OR Rope.Equal[extension, "press", FALSE]); will be unconvincing if grid < 2; NameProc: TYPE = PROC [fullFName: ROPE] RETURNS [continue: BOOLEAN]; ʘJšœ™Jšœ3™3Jšœ7™7J˜šÏk ˜ Jšœ œ˜ Jšœ œ ˜Jšœ œ ˜Jšœ œ˜Jšœœ˜)Jšœœ˜(Jšœœ?˜GJšœ œ˜ Jšœ œ˜Jšœ œ˜"J˜Jšœœœ ˜-J˜—šœ ˜šœ/˜6Jšœœ0˜C—Jšœ&˜-—Jš˜Jšœœ œ˜'Jšœœœ˜Jšœœ œ˜Jšœœ œ˜Jšœœœ˜J˜J˜Jšœ œ˜#Jš˜˜&J˜J˜ J˜—J˜!Jšœ˜J˜Jšœœ˜!šœœ ˜Jšœœ˜ Jšœ œ˜Jšœ˜Jšœœœ˜#Jšœ œ/˜?J˜J˜!Jšœ˜—J˜Jšœœ˜ Jšœœ ˜Jšœœ˜ Jšœ œ˜Jšœ˜Jšœœœ˜#Jšœ œ/˜?Jšœ!˜!J˜Jšœ$œ˜*J˜#J˜Jšœ˜J˜Jšœ œ˜#Jšœœ ˜Jšœœ˜ Jšœ œ˜Jšœ˜Jšœœœ˜#Jšœ œ"˜3J˜šœ!œ˜.Jš˜J˜J˜Jšœœ˜!Jšœ˜—Jšœ˜J˜Jšœœ˜,Jš˜J˜J˜#Jšœ˜J˜Jš Ïnœ œœ œ œ˜<šœœ ˜Jšœœ˜˜Jš˜Jšœœ˜)Jšœ˜—J˜-JšœR˜RJšœœ Ïc˜TJšœ˜Jšœ˜—J˜š ž œœœœœ œ˜U˜BJ˜<—J˜J˜—š ž œœœœ œ œ˜KJšœ-™-Jšœ?™?šœ ™ JšœL™LJ™%—Jšœ˜Jšœœ˜ Jšœ1˜1J˜ J˜