DIRECTORY GriffinDefs: FROM "GriffinDefs", MenuDefs: FROM "MenuDefs", PointDefs: FROM "PointDefs", ObjectDefs: FROM "ObjectDefs", GriffinViewer USING [PaintProc, DoPaint], GriffinFileDefs: FROM "GriffinFileDefs", FS USING [EnumerateForNames, ExpandName, NameProc], RefreshDefs: FROM "RefreshDefs", ScreenDefs USING [ClearScreen], GriffinColor USING [LoadColorMap], GriffinMenusInterface, Rope USING [Cat, --Fetch, --Substr, Find,Length,ROPE, Match]; 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 _ GetName[]; IF Rope.Length[name]=0 THEN RETURN; ExpungeObjects[]; ObjectDefs.PressAllObjects[name]; END; Save: PUBLIC MenuDefs.MenuProc = BEGIN OPEN ObjectDefs; name: ROPE _ GetName[]; IF Rope.Length[name]=0 THEN RETURN; IF ~Rope.Match[pattern: "*.griffin", object: name, case: FALSE] THEN name _ Rope.Cat[name,".griffin"]; ExpungeObjects[]; [] _ GriffinFileDefs.OpenFile[name, TRUE]; [] _ GriffinFileDefs.WriteFigure[]; GriffinFileDefs.CloseFile[]; END; Restore: PUBLIC MenuDefs.MenuProc = BEGIN OPEN ObjectDefs; name: ROPE _ GetName[]; IF Rope.Length[name]=0 THEN RETURN; IF ~Rope.Match[pattern: "*.griffin", object: name, case: FALSE] 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]= BEGIN OPEN MenuDefs; nameItem: MenuItemHandle _ NIL; FindLastSelected: MenuProc = BEGIN IF IsSelected[item] THEN nameItem _ item; END; ForAllMenuItems[filesMenu, FindLastSelected]; IF nameItem = fileName THEN nameItem _ AddPortfolioName[MenuString[fileName]]; RETURN[MenuString[nameItem]]; END; 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[]}; EachGriffinFile: FS.NameProc = TRUSTED BEGIN nameInWDir: BOOLEAN _ 0 = Rope.Find[s1~fullFName, s2~griffinWDir, case~FALSE]; IF nameInWDir THEN { name: ROPE ~ Rope.Substr[fullFName, griffinWDirLength, Rope.Find[s1~fullFName, s2~".griffin", case~FALSE]-griffinWDirLength]; []_AddPortfolioName[name]; } ELSE { name: ROPE ~ Rope.Substr[fullFName, 0, Rope.Find[s1~fullFName, s2~".griffin", case~FALSE]]; []_AddPortfolioName[name]; }; RETURN[TRUE]; END; promptMenu: MenuDefs.MenuHandle_NIL; displayMenu,filesMenu,viewMenu: PUBLIC MenuDefs.MenuHandle_NIL; fileName: MenuDefs.MenuItemHandle; griffinWDir: ROPE; griffinWDirLength: INT; StartFigureMenus: PUBLIC PROC = { 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]; 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]; griffinWDir _ FS.ExpandName[".Griffin"].fullFName; griffinWDir _ Rope.Substr[griffinWDir, 0, Rope.Find[griffinWDir, ".Griffin"]]; griffinWDirLength _ Rope.Length[griffinWDir]; FS.EnumerateForNames[pattern: "*.griffin!H", proc: EachGriffinFile, wDir: NIL]; -- enumerate all griffin files in this directory MenuDefs.SelectOnly[fileName]; }; END. FigureOps.mesa Last Edited by: Stone, April 16, 1984 4:29:01 pm PST Last Edited by: Pier, February 14, 1984 10:11:13 am PST Last Edited by: Beach, December 3, 1984 5:08:16 pm PST will be unconvincing if grid < 2; NameProc: TYPE = PROC [fullFName: ROPE] RETURNS [continue: BOOLEAN]; mark: INT _ Rope.Find[fullFName, "."]; name: ROPE _ Rope.Substr[fullFName, 0, mark]; UNTIL mark<=0 DO mark _ mark-1; IF Rope.Fetch[name,mark]='> THEN EXIT; ENDLOOP; []_AddPortfolioName[Rope.Substr[name,mark+1,Rope.Length[name]]]; ÊA˜Jšœ™Jšœ4™4Jšœ7™7J™6J˜šÏk ˜ Jšœ œ˜ Jšœ œ ˜Jšœ œ ˜Jšœ œ˜Jšœœ˜)Jšœœ˜(Jšœœ+˜3Jšœ œ˜ 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šœœœ˜#šœ7œ˜?Jšœ"˜&—J˜Jšœ$œ˜*J˜#J˜Jšœ˜J˜Jšœ œ˜#Jšœœ ˜Jšœœ ˜Jšœœœ˜#šœ7œ˜?Jšœ"˜&—J˜šœ!œ˜.Jš˜J˜J˜Jšœœ˜!Jšœ˜—Jšœ˜J˜Jšœœ˜,Jš˜J˜J˜#Jšœ˜J˜JšÏnœ œœ œ˜)Jšœœ ˜Jšœœ˜˜Jš˜Jšœœ˜)Jšœ˜—J˜-Jšœœ4˜OJšœ˜Jšœ˜J˜šžœ œ œ˜)Jšœ"˜)—Jšœœ˜!šœ˜Jšœ2˜6—J˜2J˜J˜J˜Jšœ˜J˜Jšœœ˜(Jš˜J˜šœ œ˜J˜J˜Jš˜—šœ˜ J˜J˜Jšœ˜—Jšœ˜J˜Jšžœœ œœ˜EJš˜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šœ œœœ˜RJšœ˜Jšœ˜—˜&J˜J˜ J˜—J˜J˜J˜!Jšœ˜J˜Jšœ œ3˜CJ˜šžœœ ˜,Jš žœœœ œœ œ™DJšœœ™&Jšœœ#™-šœ ™J™Jšœœœ™&Jšœ™—J™@Jšœ œ4œ˜Nšœ œ˜JšœœYœ˜}J˜J˜—šœ˜JšœœIœ˜[Jšœ˜J˜—Jšœœ˜ Jšœ˜—J˜Jšœ œ˜$Jšœ œœ˜?J˜J˜"Jšœ œ˜Jšœœ˜J˜šžœœœ˜!J˜JJ˜Jšœ5œ˜:J˜4J˜6J˜0J˜2J˜6J˜Jšœ4œ˜9J˜0J˜6J˜2J˜AJ˜J˜2J˜NJ˜-J˜JšœHœÏc2˜J˜J˜J˜—Jšœ˜J˜J˜—…—N•