<> <> <> <<>> <> <<(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)>> DIRECTORY Menus USING [MouseButton, Menu, MenuEntry, MenuLine, MenuProc, AppendMenuEntry, ChangeNumberOfLines, CreateMenu, CreateEntry, GetNumberOfLines, GetLine, SetLine], PopUpSelection USING [Request], IO, 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, AppendMsgProc, CategoriesProc, DeleteProc, DisplayProc, MoveToProc, NewMailProc, PrintSelectedProc], WalnutOps USING [SizeOfMsgSet], WalnutOpsExtras USING [GetMsgSize], WalnutPrintOps USING [MsgSetPrintProc, MsgSetTOCPrintProc], WalnutSendOps USING [WalnutSendProc], WalnutViewer USING [CreateMenuEntry], WalnutWindowInternal USING [MsgSetButton, Report, walnutQueue]; WalnutDisplayerMenusImpl: CEDAR PROGRAM IMPORTS IO, Rope, WalnutDisplayerInternal, WalnutMsgSetDisplayerPrivate, WalnutOps, WalnutOpsExtras, WalnutPrintOps, WalnutSendOps, WalnutViewer, WalnutWindowInternal, Menus, PopUpSelection, TiogaMenuOps, TiogaOps, ViewerBLT, ViewerOps EXPORTS WalnutMsgSetDisplayerPrivate SHARES Menus = BEGIN OPEN WalnutMsgSetDisplayerPrivate, WalnutPrintOps; <> 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; <> FindProc: Menus.MenuProc = { msViewer: Viewer = NARROW[parent]; msI: MsgSetInfo = NARROW[ViewerOps.FetchProp[msViewer, $MsgSetInfo]]; IF msI = NIL THEN RETURN; 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 msI = NIL THEN RETURN; 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 msI = NIL THEN RETURN; 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]]; IF msI = NIL THEN RETURN; TiogaMenuOps.Position[msI.tiogaViewer]; }; NormalizeProc: Menus.MenuProc = { msViewer: Viewer = NARROW[parent]; msI: MsgSetInfo = NARROW[ViewerOps.FetchProp[msViewer, $MsgSetInfo]]; IF msI = NIL THEN RETURN; TiogaMenuOps.Normalize[msI.tiogaViewer]; }; PrevPlaceProc: Menus.MenuProc = { msViewer: Viewer = NARROW[parent]; msI: MsgSetInfo = NARROW[ViewerOps.FetchProp[msViewer, $MsgSetInfo]]; IF msI = NIL THEN RETURN; TiogaMenuOps.PrevPlace[msI.tiogaViewer]; }; FirstOnlyProc: Menus.MenuProc = { msViewer: Viewer = NARROW[parent]; msI: MsgSetInfo = NARROW[ViewerOps.FetchProp[msViewer, $MsgSetInfo]]; IF msI = NIL THEN RETURN; TiogaMenuOps.FirstLevelOnly[msI.tiogaViewer]; }; MoreLevelsProc: Menus.MenuProc = { msViewer: Viewer = NARROW[parent]; msI: MsgSetInfo = NARROW[ViewerOps.FetchProp[msViewer, $MsgSetInfo]]; IF msI = NIL THEN RETURN; TiogaMenuOps.MoreLevels[msI.tiogaViewer]; }; FewerLevelsProc: Menus.MenuProc = { msViewer: Viewer = NARROW[parent]; msI: MsgSetInfo = NARROW[ViewerOps.FetchProp[msViewer, $MsgSetInfo]]; IF msI = NIL THEN RETURN; TiogaMenuOps.FewerLevels[msI.tiogaViewer]; }; AllLevelsProc: Menus.MenuProc = { msViewer: Viewer = NARROW[parent]; msI: MsgSetInfo = NARROW[ViewerOps.FetchProp[msViewer, $MsgSetInfo]]; IF msI = NIL THEN RETURN; TiogaMenuOps.AllLevels[msI.tiogaViewer]; }; GVIDProc: PROC[msViewer: Viewer, all: BOOL] = { msI: MsgSetInfo = NARROW[ViewerOps.FetchProp[msViewer, $MsgSetInfo]]; selected: MsgSetFieldHandle; IF msI = NIL THEN RETURN; selected _ msI.selected; IF selected = NIL THEN RETURN; WalnutDisplayerInternal.MsgGvId[selected.msgInfo.msg, all]; }; NewMail: Menus.MenuProc = { viewer: Viewer = NARROW[parent]; WalnutMsgSetDisplayerPrivate.NewMailProc[viewer]; }; LevelsProc: Menus.MenuProc = { ChangeMenu[NARROW[parent], levelsMenuEntry] }; 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; }; OpsProc: Menus.MenuProc = { viewer: Viewer = NARROW[parent]; which: INT = PopUpSelection.Request[ header: "MessageOps", choice: LIST["Sender", "Size Of MsgSet", "Categories", "Size Of Msg", "gvID of Msg", "Append Msg", "PressPrintMsgSet", "Interpress3.0PrintMsgSet", "PressPrintSelectedMsg", "Interpress3.0PrintSelectedMsg", "PressPrintTOC", "Interpress3.0PrintTOC" ] ]; SELECT which FROM 1 => WalnutSendOps.WalnutSendProc[fromExec: FALSE]; 2 => { msI: MsgSetInfo = NARROW[ViewerOps.FetchProp[viewer, $MsgSetInfo]]; msgSet: ROPE = msI.button.msgSet.name; num: INT = WalnutOps.SizeOfMsgSet[msgSet].messages; WalnutWindowInternal.Report[ IO.PutFR[" %g msgs in MsgSet %g", IO.int[num], IO.rope[msgSet]]]; }; 3 => WalnutMsgSetDisplayerPrivate.CategoriesProc[viewer]; 4 => { msI: MsgSetInfo = NARROW[ViewerOps.FetchProp[viewer, $MsgSetInfo]]; selected: MsgSetFieldHandle; textLen, formatLen: INT; msg: ROPE; IF msI = NIL THEN RETURN; selected _ msI.selected; IF selected = NIL THEN RETURN; [textLen, formatLen] _ WalnutOpsExtras.GetMsgSize[msg _ selected.msgInfo.msg]; IF formatLen # 0 THEN WalnutWindowInternal.Report[IO.PutFR["Formatted Msg \" %g\" has %g bytes of text", IO.rope[msg], IO.int[textLen] ]] ELSE WalnutWindowInternal.Report[IO.PutFR["Msg \"%g\" has %g bytes of text", IO.rope[msg], IO.int[textLen] ]]; }; 5 => GVIDProc[viewer, mouseButton#red]; 6 => WalnutMsgSetDisplayerPrivate.AppendMsgProc[viewer]; 7 => WalnutPrintOps.MsgSetPrintProc[viewer: viewer, usePress: TRUE]; 8 => WalnutPrintOps.MsgSetPrintProc[viewer: viewer, usePress: FALSE]; 9 => WalnutMsgSetDisplayerPrivate.PrintSelectedProc[viewer: viewer, usePress: TRUE]; 10 => WalnutMsgSetDisplayerPrivate.PrintSelectedProc[viewer: viewer, usePress: FALSE]; 11 => WalnutPrintOps.MsgSetTOCPrintProc[viewer: viewer, usePress: TRUE]; 12 => WalnutPrintOps.MsgSetTOCPrintProc[viewer: viewer, usePress: FALSE]; ENDCASE => NULL; }; <<>> <> 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; IF viewer.destroyed THEN RETURN; 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.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", NewMail]]; -- "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.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.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.ChangeNumberOfLines[readOnlyMenu, 1]; END; <<* * * * * * * * * * * * * * * * * * * * * * * * * >> <> BuildDisplayerMenus[]; END.