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
Menus used in message set displays
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;
Error message
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;
};
Getting the menu changed
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;
Menus.ChangeNumberOfLines[menu, newLast-1];
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] = {
higher priority means goes above in series of submenus
looks at rope for first item to identify the subMenu.
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;
Menus.ChangeNumberOfLines[menu, newLast+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];
};
ViewerOps.EstablishViewerPosition[viewer, viewer.wx, viewer.wy, viewer.ww, viewer.wh];
ViewerOps.PaintViewer[viewer, all];
ViewerBLT.ChangeNumberOfLines[viewer, newLines];
};