DIRECTORY Menus USING [MouseButton, Menu, MenuEntry, MenuLine, MenuProc, AppendMenuEntry, ChangeNumberOfLines, CreateMenu, CreateEntry, GetNumberOfLines, GetLine, SetLine], Rope, TiogaMenuOps USING [AllLevels, FewerLevels, FirstLevelOnly, MoreLevels, Normalize, Position, PrevPlace], TiogaOps USING [SearchDir, FindDef, FindText, FindWord], ViewerBLT USING [ChangeNumberOfLines], ViewerClasses USING [Viewer], ViewerOps USING [BlinkIcon, FetchProp], WalnutDisplayerInternal USING [MsgGvId], WalnutMsgSetDisplayerPrivate USING [MsgSetInfo, MsgSetFieldHandle, MsgInfo, AddProc, CategoriesProc, DeleteProc, DisplayProc, MoveToProc, NewMailProc, PrintSelectedProc], WalnutPrintOps USING [MsgSetPrintProc], WalnutViewer USING [CreateMenuEntry], WalnutWindowInternal USING [MsgSetButton, walnutQueue]; WalnutDisplayerMenusImpl: CEDAR PROGRAM IMPORTS Rope, WalnutDisplayerInternal, WalnutMsgSetDisplayerPrivate, WalnutPrintOps, WalnutViewer, WalnutWindowInternal, Menus, TiogaMenuOps, TiogaOps, ViewerBLT, ViewerOps EXPORTS WalnutMsgSetDisplayerPrivate SHARES Menus = BEGIN OPEN WalnutMsgSetDisplayerPrivate; Viewer: TYPE = ViewerClasses.Viewer; ROPE: TYPE = Rope.ROPE; displayerMenu: PUBLIC Menus.Menu _ Menus.CreateMenu[]; activeMenu: PUBLIC Menus.Menu _ Menus.CreateMenu[]; deletedMenu: PUBLIC Menus.Menu _ Menus.CreateMenu[]; buildingMenu: PUBLIC Menus.Menu _ Menus.CreateMenu[]; readOnlyMenu: PUBLIC Menus.Menu _ Menus.CreateMenu[]; placesMenuEntry: Menus.MenuEntry; levelsMenuEntry: Menus.MenuEntry; opsMenuEntry: Menus.MenuEntry; FindProc: Menus.MenuProc = { msViewer: Viewer = NARROW[parent]; msI: MsgSetInfo = NARROW[ViewerOps.FetchProp[msViewer, $MsgSetInfo]]; IF ~TiogaOps.FindText[ viewer: msI.tiogaViewer, whichDir: GetDirection[mouseButton], which: feedback, case: ~shift] THEN ViewerOps.BlinkIcon[msViewer]; }; WordProc: Menus.MenuProc = { msViewer: Viewer = NARROW[parent]; msI: MsgSetInfo = NARROW[ViewerOps.FetchProp[msViewer, $MsgSetInfo]]; IF ~TiogaOps.FindWord[ viewer: msI.tiogaViewer, whichDir: GetDirection[mouseButton], which: feedback, case: ~shift] THEN ViewerOps.BlinkIcon[msViewer]; }; DefProc: Menus.MenuProc = { msViewer: Viewer = NARROW[parent]; msI: MsgSetInfo = NARROW[ViewerOps.FetchProp[msViewer, $MsgSetInfo]]; IF ~TiogaOps.FindDef[ viewer: msI.tiogaViewer, whichDir: GetDirection[mouseButton], which: feedback, case: ~shift] THEN ViewerOps.BlinkIcon[msViewer]; }; PositionProc: Menus.MenuProc = { msViewer: Viewer = NARROW[parent]; msI: MsgSetInfo = NARROW[ViewerOps.FetchProp[msViewer, $MsgSetInfo]]; TiogaMenuOps.Position[msI.tiogaViewer]; }; NormalizeProc: Menus.MenuProc = { msViewer: Viewer = NARROW[parent]; msI: MsgSetInfo = NARROW[ViewerOps.FetchProp[msViewer, $MsgSetInfo]]; TiogaMenuOps.Normalize[msI.tiogaViewer]; }; PrevPlaceProc: Menus.MenuProc = { msViewer: Viewer = NARROW[parent]; msI: MsgSetInfo = NARROW[ViewerOps.FetchProp[msViewer, $MsgSetInfo]]; TiogaMenuOps.PrevPlace[msI.tiogaViewer]; }; FirstOnlyProc: Menus.MenuProc = { msViewer: Viewer = NARROW[parent]; msI: MsgSetInfo = NARROW[ViewerOps.FetchProp[msViewer, $MsgSetInfo]]; TiogaMenuOps.FirstLevelOnly[msI.tiogaViewer]; }; MoreLevelsProc: Menus.MenuProc = { msViewer: Viewer = NARROW[parent]; msI: MsgSetInfo = NARROW[ViewerOps.FetchProp[msViewer, $MsgSetInfo]]; TiogaMenuOps.MoreLevels[msI.tiogaViewer]; }; FewerLevelsProc: Menus.MenuProc = { msViewer: Viewer = NARROW[parent]; msI: MsgSetInfo = NARROW[ViewerOps.FetchProp[msViewer, $MsgSetInfo]]; TiogaMenuOps.FewerLevels[msI.tiogaViewer]; }; AllLevelsProc: Menus.MenuProc = { msViewer: Viewer = NARROW[parent]; msI: MsgSetInfo = NARROW[ViewerOps.FetchProp[msViewer, $MsgSetInfo]]; TiogaMenuOps.AllLevels[msI.tiogaViewer]; }; GVIDProc: Menus.MenuProc = { msViewer: Viewer = NARROW[parent]; msI: MsgSetInfo = NARROW[ViewerOps.FetchProp[msViewer, $MsgSetInfo]]; selected: MsgSetFieldHandle = msI.selected; IF selected = NIL THEN RETURN; WalnutDisplayerInternal.MsgGvId[selected.msgInfo.msg, mouseButton#red]; }; LevelsProc: Menus.MenuProc = { ChangeMenu[NARROW[parent], levelsMenuEntry] }; OpsProc: Menus.MenuProc = { ChangeMenu[NARROW[parent], opsMenuEntry] }; PlacesProc: Menus.MenuProc = { ChangeMenu[NARROW[parent], placesMenuEntry] }; GetDirection: PROC[mb: Menus.MouseButton] RETURNS[sd: TiogaOps.SearchDir] = { SELECT mb FROM red => RETURN[forwards]; yellow => RETURN[anywhere]; blue => RETURN[backwards]; ENDCASE; }; ChangeMenu: PROC [viewer: ViewerClasses.Viewer, subMenu: Menus.MenuEntry] = { menu: Menus.Menu = viewer.menu; found: BOOL _ FALSE; numLines: Menus.MenuLine = Menus.GetNumberOfLines[menu]; newLines: Menus.MenuLine _ numLines; FOR i: Menus.MenuLine IN [1..numLines) DO -- see if already showing the submenu IF Rope.Equal[Menus.GetLine[menu,i].name, subMenu.name] THEN { -- yes, so remove it FOR j: Menus.MenuLine IN (i..numLines) DO Menus.SetLine[menu, j-1, Menus.GetLine[menu, j]]; ENDLOOP; newLines _ newLines-1; found _ TRUE; EXIT }; ENDLOOP; IF ~found THEN { -- add it. do insertion sort to get it in the right place GoesBefore: PROC [m1, m2: Menus.MenuEntry] RETURNS [BOOL] = { Priority: PROC [m: Menus.MenuEntry] RETURNS [INTEGER] = { RETURN [SELECT TRUE FROM Rope.Equal[m.name, "Find"] => 2, Rope.Equal[m.name, "FirstLevelOnly"] => 1, Rope.Equal[m.name, "Categories"] => 0, ENDCASE => -1 -- unknown menu goes at bottom -- ] }; RETURN [Priority[m1] > Priority[m2]] }; newLast: Menus.MenuLine = MIN[numLines, LAST[Menus.MenuLine]]; newLines _ newLines+1; FOR i: Menus.MenuLine IN [1..numLines) DO IF GoesBefore[subMenu, Menus.GetLine[menu, i]] THEN { -- put it here FOR j: Menus.MenuLine DECREASING IN (i..newLast] DO Menus.SetLine[menu, j, Menus.GetLine[menu, j-1]]; ENDLOOP; Menus.SetLine[menu, i, subMenu]; found _ TRUE; EXIT }; ENDLOOP; IF ~found THEN Menus.SetLine[menu, newLast, subMenu]; }; ViewerBLT.ChangeNumberOfLines[viewer, newLines]; }; BuildDisplayerMenus: PROC = BEGIN OPEN WalnutWindowInternal; Menus.AppendMenuEntry[displayerMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "MoveTo", MoveToProc]]; Menus.AppendMenuEntry[displayerMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "Display", DisplayProc]]; Menus.AppendMenuEntry[displayerMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "Delete", DeleteProc]]; Menus.AppendMenuEntry[displayerMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "AddTo", AddProc]]; Menus.AppendMenuEntry[displayerMenu, Menus.CreateEntry["Places", PlacesProc]]; Menus.AppendMenuEntry[displayerMenu, Menus.CreateEntry["Levels", LevelsProc]]; Menus.AppendMenuEntry[displayerMenu, Menus.CreateEntry["MsgOps", OpsProc]]; Menus.AppendMenuEntry[displayerMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "Find", FindProc], 1]; Menus.AppendMenuEntry[displayerMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "Word", WordProc], 1]; Menus.AppendMenuEntry[displayerMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "Def", DefProc], 1]; Menus.AppendMenuEntry[displayerMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "Position", PositionProc], 1]; Menus.AppendMenuEntry[displayerMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "Normalize", NormalizeProc], 1]; Menus.AppendMenuEntry[displayerMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "PrevPlace", PrevPlaceProc], 1]; placesMenuEntry _ Menus.GetLine[displayerMenu, 1]; Menus.AppendMenuEntry[displayerMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "FirstLevelOnly", FirstOnlyProc], 2]; Menus.AppendMenuEntry[displayerMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "MoreLevels", MoreLevelsProc], 2]; Menus.AppendMenuEntry[displayerMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "FewerLevels", FewerLevelsProc], 2]; Menus.AppendMenuEntry[displayerMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "AllLevels", AllLevelsProc], 2]; levelsMenuEntry _ Menus.GetLine[displayerMenu, 2]; Menus.AppendMenuEntry[displayerMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "Categories", CategoriesProc], 3]; Menus.AppendMenuEntry[displayerMenu, WalnutViewer.CreateMenuEntry[q: walnutQueue, name: "Print", proc: WalnutPrintOps.MsgSetPrintProc, guarded: TRUE], 3]; Menus.AppendMenuEntry[displayerMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "PrintSel", PrintSelectedProc], 3]; Menus.AppendMenuEntry[displayerMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "gvID", GVIDProc], 3]; opsMenuEntry _ Menus.GetLine[displayerMenu, 3]; Menus.ChangeNumberOfLines[displayerMenu, 1]; Menus.AppendMenuEntry[activeMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "MoveTo", MoveToProc]]; Menus.AppendMenuEntry[activeMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "Display", DisplayProc]]; Menus.AppendMenuEntry[activeMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "Delete", DeleteProc]]; Menus.AppendMenuEntry[activeMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "AddTo", AddProc]]; Menus.AppendMenuEntry[activeMenu, Menus.CreateEntry["NewMail", NewMailProc]]; -- "immediate" Menus.AppendMenuEntry[activeMenu, Menus.CreateEntry["Places", PlacesProc]]; Menus.AppendMenuEntry[activeMenu, Menus.CreateEntry["Levels", LevelsProc]]; Menus.AppendMenuEntry[activeMenu, Menus.CreateEntry["MsgOps", OpsProc]]; Menus.SetLine[activeMenu, 1, placesMenuEntry]; Menus.SetLine[activeMenu, 2, levelsMenuEntry]; Menus.SetLine[activeMenu, 3, opsMenuEntry]; Menus.ChangeNumberOfLines[activeMenu, 1]; Menus.AppendMenuEntry[deletedMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "MoveTo", MoveToProc]]; Menus.AppendMenuEntry[deletedMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "Display", DisplayProc]]; Menus.AppendMenuEntry[deletedMenu, Menus.CreateEntry["Places", PlacesProc]]; Menus.AppendMenuEntry[deletedMenu, Menus.CreateEntry["Levels", LevelsProc]]; Menus.AppendMenuEntry[deletedMenu, Menus.CreateEntry["MsgOps", OpsProc]]; Menus.SetLine[deletedMenu, 1, placesMenuEntry]; Menus.SetLine[deletedMenu, 2, levelsMenuEntry]; Menus.SetLine[deletedMenu, 2, levelsMenuEntry]; Menus.ChangeNumberOfLines[deletedMenu, 1]; Menus.AppendMenuEntry[readOnlyMenu, WalnutViewer.CreateMenuEntry[walnutQueue, "Display", DisplayProc]]; Menus.AppendMenuEntry[readOnlyMenu, Menus.CreateEntry["Places", PlacesProc]]; Menus.AppendMenuEntry[readOnlyMenu, Menus.CreateEntry["Levels", LevelsProc]]; Menus.AppendMenuEntry[readOnlyMenu, Menus.CreateEntry["MsgOps", OpsProc]]; Menus.SetLine[readOnlyMenu, 1, placesMenuEntry]; Menus.SetLine[readOnlyMenu, 2, levelsMenuEntry]; Menus.SetLine[readOnlyMenu, 2, levelsMenuEntry]; Menus.ChangeNumberOfLines[readOnlyMenu, 1]; END; BuildDisplayerMenus[]; END. JWalnutDisplayerMenusImpl.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Willie-Sue, May 28, 1985 4:57:32 pm PDT Contents: Implementation of the menus for WalnutMsgSet displayers. (Changed message set version number to be part of viewer information, rather than part of message set buttons) (Changed to use TiogaButtons - May 6, 1985) Types Menus used in message set displays Error message Getting the menu changed Menus.ChangeNumberOfLines[menu, newLast-1]; higher priority means goes above in series of submenus looks at rope for first item to identify the subMenu. Menus.ChangeNumberOfLines[menu, newLast+1]; ViewerOps.EstablishViewerPosition[viewer, viewer.wx, viewer.wy, viewer.ww, viewer.wh]; ViewerOps.PaintViewer[viewer, all]; * * * * * * * * * * * * * * * * * * * * * * Menu for generic Displayer second line third line fourth line Menu for Active second line third line fourth line Menu for Deleted second line third line fourth line Menu for ReadOnly database second line third line fourth line * * * * * * * * * * * * * * * * * * * * * * * * * start code Κ ˜šΟn™Icodešœ Οmœ1™Jšœc˜c—J˜šœ Ÿœ@˜RJšœ˜—Jšœ Ÿœ*˜8Jšœ Ÿœ˜&JšœŸœ ˜Jšœ Ÿœ˜'J˜JšœŸœ ˜(šœŸœ)˜KJšœJ˜JJšœ˜—JšœŸœ˜'Jšœ Ÿœ˜%JšœŸœ˜7J˜JšœŸœŸ˜'šŸ˜J˜J˜6J˜3Jšœ˜Jšœ˜—šŸ˜J˜—šŸ˜J˜——J˜JšŸœŸœ˜(head™JšœŸœ˜$JšŸœŸœŸœ˜—™"JšœŸœ!˜6Jšœ Ÿœ!˜3Jšœ Ÿœ!˜4JšœŸœ!˜5JšœŸœ!˜5J˜Jšœ!˜!Jšœ!˜!Jšœ˜—™ šœ˜JšœŸœ ˜"JšœŸœ-˜EšŸœ˜Jšœ˜Jšœ$˜$Jšœ˜Jšœ ˜ JšŸœ˜#—J˜—J˜šœ˜JšœŸœ ˜"JšœŸœ-˜EšŸœ˜Jšœ˜Jšœ$˜$Jšœ˜Jšœ ˜ JšŸœ˜#—J˜—J˜šœ˜JšœŸœ ˜"JšœŸœ-˜EšŸœ˜Jšœ˜Jšœ$˜$Jšœ˜Jšœ ˜ JšŸœ˜#—J˜—J˜š œ˜ JšœŸœ ˜"JšœŸœ-˜EJšœ'˜'J˜—J˜š œ˜!JšœŸœ ˜"JšœŸœ-˜EJšœ(˜(J˜—J˜š œ˜!JšœŸœ ˜"JšœŸœ-˜EJšœ(˜(J˜—J˜š œ˜!JšœŸœ ˜"JšœŸœ-˜EJšœ-˜-J˜—J˜šœ˜"JšœŸœ ˜"JšœŸœ-˜EJšœ)˜)J˜—J˜šœ˜#JšœŸœ ˜"JšœŸœ-˜EJšœ*˜*J˜—J˜š œ˜!JšœŸœ ˜"JšœŸœ-˜EJšœ(˜(J˜—J˜šœ˜JšœŸœ ˜"JšœŸœ-˜EJšœ+˜+JšŸœ ŸœŸœŸœ˜JšœG˜GJ˜—K˜Kš œ Ÿœ˜MJ˜Jšœ Ÿœ˜GJ˜Jš œ Ÿœ˜MJ˜š œŸœŸœ˜MšŸœŸ˜JšœŸœ ˜Jšœ Ÿœ ˜JšœŸœ ˜—JšŸœ˜J˜—K™KšΟl™K˜š œŸœ=˜MK˜KšœŸœŸœ˜K˜8K˜$šŸœŸœŸœΟc%˜OšŸœ6Ÿœ‘˜SšŸœŸœŸ˜)K˜1KšŸœ˜—Kšœ+™+K˜KšœŸœŸœ˜K˜—KšŸœ˜—šŸœŸœ‘:˜Kš œŸœŸœŸœ˜=šœŸœŸœŸœ˜9Kšœ6™6Kšœ5™5šŸœŸœŸœŸ˜K˜ K˜*K˜&KšŸœ‘!œ˜2—K˜—KšŸœ˜%K˜—KšœŸœ Ÿœ˜>K˜Kšœ+™+šŸœŸœŸ˜)šŸœ-Ÿœ‘˜DšŸœŸ œŸœŸ˜3Kšœ2Ÿœ˜:—K˜ KšœŸœŸœ˜K˜—KšŸœ˜—KšŸœŸœ'˜5K˜—KšœV™VKšœ#™#K˜0K˜——J˜J™+˜šœŸœ˜šŸ œŸ˜ J˜—šΟb™˜$J˜A—˜%J˜C—˜%J˜A—˜%J˜=—JšœN˜NJšœN˜NJšœK˜K—J˜šœ ™ ˜%Jšœ@˜@—˜%Jšœ@˜@—˜%Jšœ>˜>—˜%JšœH˜H—˜%JšœJ˜J—˜%JšœJ˜J—J˜2J˜—šœ ™ ˜%J˜O—˜%J˜L—˜%J˜N—˜%J˜J—J˜2J˜—šœ ™ ˜%J˜L—˜%˜;Jšœ/Ÿœ˜9——˜%J˜M—˜%J˜@—J˜/J˜,J˜—š’™˜!J˜A—˜"J˜C—˜"J˜A—˜"J˜=—˜!Jšœ-‘˜;—JšœK˜KJšœK˜KJšœH˜H—J™šœ ™ J˜.J˜—šœ ™ J˜.—J˜šœ ™ J˜+J˜)—J˜š™˜"J˜A—˜#J˜C—JšœL˜LJšœL˜LJšœI˜I—J™šœ ™ J˜/—J˜šœ ™ Jšœ/˜/J˜—šœ ™ Jšœ/˜/Jšœ*˜*—J˜š™˜$J˜C—JšœM˜MJšœM˜MJšœJ˜J—J™šœ ™ Jšœ0˜0J˜—šœ ™ Jšœ0˜0J˜—šœ ™ Jšœ0˜0J˜+—J˜JšŸœ˜——J˜J˜Jšœ2™2Jšœ ™ ˜J˜—J˜JšŸœ˜J˜J˜—…—(ΰ6-