1 /*
2    Copyright (c) 1999-2002 Perry Rapp
3    "The MIT license"
4    Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
5    The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
7 */
8 /*=============================================================
9  * menuitem.c -- data for menu layout code
10  *   Created: 1999/03 by Perry Rapp
11  *   Brought into repository: 2001/01/28 by Perry Rapp
12  *==============================================================*/
13 
14 #include "llstdlib.h"
15 #include "feedback.h"
16 #include "gedcom.h"
17 #include "menuitem.h"
18 
19 /*********************************************
20  * global/exported variables
21  *********************************************/
22 
23 /* These are not listed as part of the menus below, because these are
24 added on-the-fly to every menu page displayed */
25 MenuItem g_MenuItemOther = { N_("?  Other menu choices"), 0, CMD_MENU_MORE, 0 };
26 MenuItem g_MenuItemQuit = { N_("q  Return to main menu"), 0, CMD_QUIT, 0 };
27 
28 /*********************************************
29  * external/imported variables
30  *********************************************/
31 
32 extern STRING qSttlindibrw, qSttlfambrw, qSttl2perbrw, qSttl2fambrw;
33 extern STRING qSttlauxbrw, qSttllstbrw;
34 
35 /*********************************************
36  * local types
37  *********************************************/
38 
39 struct BrowseScreenInfo {
40 	STRING title;
41 	struct tag_dynmenu dynmenu;
42 };
43 
44 /*********************************************
45  * local function prototypes
46  *********************************************/
47 
48 /* alphabetical */
49 static void browsescreen_init(struct BrowseScreenInfo * sinfo , STRING title, INT MenuRows, INT MenuCols
50 	, INT MinCols, INT MaxCols
51 	, INT MinRows, INT MaxRows
52 	, INT MenuTop, INT MenuLeft, INT MenuWidth
53 	, INT MenuSize, MenuItem ** MenuItems);
54 static void brwsmenu_on_lang_change(VPTR uparm);
55 static void register_brwsmenu_lang_callbacks(BOOLEAN registering);
56 
57 /*********************************************
58  * local variables
59  *********************************************/
60 
61 struct BrowseScreenInfo f_BrowseScreenInfo[MAX_SCREEN+1]; /* init'd by brwsmenu_initialize */
62 static BOOLEAN f_initialized=FALSE;
63 static BOOLEAN f_reloading=FALSE;
64 static INT f_screenheight;
65 static INT f_screenwidth;
66 static INT f_cols;
67 
68 /* normal menu items */
69 static MenuItem f_MenuItemEditIndi = { N_("e  Edit the person"), 0, CMD_EDIT, 0 };
70 static MenuItem f_MenuItemEditFamily = { N_("e  Edit the family"), 0, CMD_EDIT, 0 };
71 static MenuItem f_MenuItemEdit = { N_("e  Edit record"), 0, CMD_EDIT, 0 };
72 static MenuItem f_MenuItemEditTopIndi = { N_("e  Edit top person"), 0, CMD_EDIT, 0 };
73 static MenuItem f_MenuItemEditTopFam = { N_("e  Edit top family"), 0, CMD_EDIT, 0 };
74 static MenuItem f_MenuItemFather = { N_("f  Browse to father"), 0, CMD_FATHER, 0 };
75 static MenuItem f_MenuItemFatherTop = { N_("f  Browse top father"), 0, CMD_FATHER, 0 };
76 static MenuItem f_MenuItemMother = { N_("m  Browse to mother"), 0, CMD_MOTHER, 0 };
77 static MenuItem f_MenuItemMotherTop = { N_("m  Browse top mother"), 0, CMD_MOTHER, 0 };
78 static MenuItem f_MenuItemSpouse = { N_("s  Browse to spouse/s"), 0, CMD_SPOUSE, 0 };
79 static MenuItem f_MenuItemSpouseTop = { N_("s  Browse top spouse/s"), 0, CMD_SPOUSE, 0 };
80 static MenuItem f_MenuItemChildren = { N_("c  Browse to children"), 0, CMD_CHILDREN, 0 };
81 static MenuItem f_MenuItemChildrenTop = { N_("c  Browse top children"), 0, CMD_CHILDREN, 0 };
82 static MenuItem f_MenuItemOlderSib = { N_("o  Browse to older sib"), 0, CMD_UPSIB, 0 };
83 static MenuItem f_MenuItemYoungerSib = { N_("y  Browse to younger sib"), 0, CMD_DOWNSIB, 0 };
84 static MenuItem f_MenuItemFamily = { N_("g  Browse to family"), 0, CMD_FAMILY, 0 };
85 static MenuItem f_MenuItemParents = { N_("u  Browse to parents"), 0, CMD_PARENTS, 0 };
86 static MenuItem f_MenuItemBrowse = { N_("b  Browse to persons"), 0, CMD_BROWSE, 0 };
87 static MenuItem f_MenuItemBrowseTop = { N_("t  Browse to top"), 0, CMD_TOP, 0 };
88 static MenuItem f_MenuItemBrowseBottom = { N_("b  Browse to bottom"), 0, CMD_BOTTOM, 0 };
89 static MenuItem f_MenuItemAddAsSpouse = { N_("h  Add as spouse"), 0, CMD_ADDASSPOUSE, 0 };
90 static MenuItem f_MenuItemAddAsChild = { N_("i  Add as child"), 0, CMD_ADDASCHILD, 0 };
91 static MenuItem f_MenuItemAddSpouse = { N_("s  Add spouse to family"), 0, CMD_ADDSPOUSE, 0 };
92 static MenuItem f_MenuItemAddChild = { N_("a  Add child to family"), 0, CMD_ADDCHILD, 0 };
93 static MenuItem f_MenuItemAddFamily = { N_("a  Add family"), 0, CMD_ADDFAMILY, 0 };
94 static MenuItem f_MenuItemSwapFamilies = { N_("x  Swap two families"), 0, CMD_SWAPFAMILIES, 0 };
95 static MenuItem f_MenuItemSwapChildren = { N_("x  Swap two children"), 0, CMD_SWAPCHILDREN, 0 };
96 /* xgettext:no-c-format */
97 static MenuItem f_MenuItemReorderChild = { N_("%c  Reorder child"), 0, CMD_REORDERCHILD, 0 };
98 static MenuItem f_MenuItemSwitchTopBottom = { N_("x  Switch top/bottom"), 0, CMD_SWAPTOPBOTTOM, 0 };
99 static MenuItem f_MenuItemNewPerson = { N_("n  Create new person"), 0, CMD_NEWPERSON, 0 };
100 static MenuItem f_MenuItemNewFamily = { N_("a  Create new family"), 0, CMD_NEWFAMILY, 0 };
101 static MenuItem f_MenuItemTandem = { N_("tt Enter tandem mode"), 0, CMD_TANDEM, 0 };
102 static MenuItem f_MenuItemTandemFamily = { N_("tt Enter family tandem"), 0, CMD_TANDEM, 0 };
103 static MenuItem f_MenuItemZipIndi = { N_("zi Browse to indi"), 0, CMD_BROWSE_ZIP_INDI, 0 };
104 static MenuItem f_MenuItemZipBrowse = { N_("zz Browse to any"), 0, CMD_BROWSE_ZIP_ANY, 0 };
105 static MenuItem f_MenuItemRemoveAsSpouse = { N_("r  Remove as spouse"), 0, CMD_REMOVEASSPOUSE, 0 };
106 static MenuItem f_MenuItemRemoveAsChild = { N_("d  Remove as child"), 0, CMD_REMOVEASCHILD, 0 };
107 static MenuItem f_MenuItemRemoveSpouseFrom = { N_("r  Remove spouse from"), 0, CMD_REMOVESPOUSE, 0 };
108 static MenuItem f_MenuItemRemoveChildFrom = { N_("d  Remove child from"), 0 , CMD_REMOVECHILD, 0 };
109 static MenuItem f_MenuItemScrollUp = { N_("(  Scroll up"), 0, CMD_SCROLL_UP, 0 };
110 static MenuItem f_MenuItemScrollDown = { N_(")  Scroll down"), 0, CMD_SCROLL_DOWN, 0 };
111 static MenuItem f_MenuItemDepthUp = { N_("]  Increase tree depth"), 0, CMD_DEPTH_UP, 0 };
112 static MenuItem f_MenuItemDepthDown = { N_("[  Decrease tree depth"), 0, CMD_DEPTH_DOWN, 0 };
113 static MenuItem f_MenuItemScrollUpTop = { N_("(t Scroll top up"), 0, CMD_SCROLL_TOP_UP, 0 };
114 static MenuItem f_MenuItemScrollDownTop = { N_(")t Scroll top down"), 0, CMD_SCROLL_TOP_DOWN, 0 };
115 static MenuItem f_MenuItemScrollUpBottom = { N_("(b Scroll bottom up"), 0, CMD_SCROLL_BOTTOM_UP, 0 };
116 static MenuItem f_MenuItemScrollDownBottom = { N_(")b Scroll bottom down"), 0, CMD_SCROLL_BOTTOM_DOWN, 0 };
117 static MenuItem f_MenuItemScrollUpBoth = { N_("(( Scroll both up"), 0, CMD_SCROLL_BOTH_UP, 0 };
118 static MenuItem f_MenuItemScrollDownBoth = { N_(")) Scroll both down"), 0, CMD_SCROLL_BOTH_DOWN, 0 };
119 static MenuItem f_MenuItemToggleChildNos = { N_("#  Toggle childnos"), 0, CMD_TOGGLE_CHILDNUMS, 0 };
120 static MenuItem f_MenuItemModeGedcom = { N_("!g GEDCOM mode"), 0, CMD_MODE_GEDCOM, 0 };
121 static MenuItem f_MenuItemModeGedcomX = { N_("!x GEDCOMX mode"), 0, CMD_MODE_GEDCOMX, 0 };
122 static MenuItem f_MenuItemModeGedcomT = { N_("!t GEDCOMT mode"), 0, CMD_MODE_GEDCOMT, 0 };
123 static MenuItem f_MenuItemModeAncestors = { N_("!a Ancestors mode"), 0, CMD_MODE_ANCESTORS, 0 };
124 static MenuItem f_MenuItemModeDescendants = { N_("!d Descendants mode"), 0, CMD_MODE_DESCENDANTS, 0 };
125 static MenuItem f_MenuItemModeNormal = { N_("!n Normal mode"), 0, CMD_MODE_NORMAL, 0 };
126 static MenuItem f_MenuItemModePedigree = { N_("p  Pedigree mode"), 0, CMD_MODE_PEDIGREE, 0 };
127 static MenuItem f_MenuItemModeCycle = { N_("!! Cycle mode"), 0, CMD_MODE_CYCLE, 0 };
128 /* Note - CMD_CHILD_DIRECT0 has special handling, & is always wired to 123456789 */
129 static MenuItem f_MenuItemDigits = { N_("(1-9)  Browse to child"), 0, CMD_CHILD_DIRECT0, 0 };
130 MenuItem f_MenuItemSyncMoves = { N_("y  Turn on sync"), 0, CMD_NONE, 0 };
131 static MenuItem f_MenuItemAdvanced = { N_("A  Advanced view"), 0, CMD_ADVANCED, 0 };
132 static MenuItem f_MenuItemTandemChildren = { N_("tc Tandem to children"), 0, CMD_TANDEM_CHILDREN, 0 };
133 static MenuItem f_MenuItemTandemFathers = { N_("tf Tandem to father/s"), 0, CMD_TANDEM_FATHERS, 0 };
134 static MenuItem f_MenuItemTandemFamilies = { N_("tg Tandem to family/s"), 0, CMD_TANDEM_FAMILIES, 0 };
135 static MenuItem f_MenuItemBothFathers = { N_("f  Browse to fathers"), 0, CMD_BOTH_FATHERS, 0 };
136 static MenuItem f_MenuItemBothMothers = { N_("m  Browse to mothers"), 0, CMD_BOTH_MOTHERS, 0 };
137 static MenuItem f_MenuItemTandemMothers = { N_("tm Tandem to mother/s"), 0, CMD_TANDEM_MOTHERS, 0 };
138 static MenuItem f_MenuItemTandemSpouses = { N_("ts Tandem to spouse/s"), 0, CMD_TANDEM_SPOUSES, 0 };
139 static MenuItem f_MenuItemTandemParents = { N_("tu Tandem to parents"), 0, CMD_TANDEM_PARENTS, 0 };
140 static MenuItem f_MenuItemEnlargeMenu = { N_("<  Enlarge menu area"), 0, CMD_MENU_GROW, 0 };
141 static MenuItem f_MenuItemShrinkMenu = { N_(">  Shrink menu area"), 0, CMD_MENU_SHRINK, 0 };
142 static MenuItem f_MenuItemMoreCols = { N_("M> More menu cols"), 0, CMD_MENU_MORECOLS, 0 };
143 static MenuItem f_MenuItemLessCols = { N_("M< Less menu cols"), 0, CMD_MENU_LESSCOLS, 0 };
144 static MenuItem f_MenuItemNext = { N_("+  Next in db"), 0, CMD_NEXT, 0 };
145 static MenuItem f_MenuItemPrev = { N_("-  Prev in db"), 0, CMD_PREV, 0 };
146 static MenuItem f_MenuItemCopyTopToBottom = { N_("d  Copy top to bottom"), 0, CMD_COPY_TOP_TO_BOTTOM, 0 };
147 static MenuItem f_MenuItemMergeBottomToTop = { N_("j  Merge bottom to top"), 0, CMD_MERGE_BOTTOM_TO_TOP, 0 };
148 static MenuItem f_MenuItemMoveDownList = { N_("j  Move down list"), 0, CMD_NONE, 0 };
149 static MenuItem f_MenuItemMoveUpList = { N_("k  Move up list"), 0, CMD_NONE, 0 };
150 static MenuItem f_MenuItemEditThis = { N_("e  Edit this person"), 0, CMD_NONE, 0 };
151 static MenuItem f_MenuItemBrowseThis = { N_("i  Browse this person"), 0, CMD_BROWSE_INDI, 0 };
152 static MenuItem f_MenuItemMarkThis = { N_("m  Mark this person"), 0, CMD_NONE, 0 };
153 static MenuItem f_MenuItemDeleteFromList = { N_("d  Delete from list"), 0, CMD_NONE, 0 };
154 static MenuItem f_MenuItemNameList = { N_("n  Name this list"), 0, CMD_NONE, 0 };
155 static MenuItem f_MenuItemBrowseNewPersons = { N_("b  Browse new persons"), 0, CMD_NONE, 0 };
156 static MenuItem f_MenuItemAddToList = { N_("a  Add to this list"), 0, CMD_NONE, 0 };
157 static MenuItem f_MenuItemSwapMarkCurrent = { N_("x  Swap mark/current"), 0, CMD_NONE, 0 };
158 static MenuItem f_MenuItemSources = { N_("$s  List sources"), 0, CMD_SOURCES, 0 };
159 static MenuItem f_MenuItemNotes = { N_("$n  List notes"), 0, CMD_NOTES, 0 };
160 static MenuItem f_MenuItemPointers = { N_("$$  List references"), 0, CMD_POINTERS, 0 };
161 static MenuItem f_MenuItemHistoryBack = { N_("^b  History/back"), 0, CMD_VHISTORY_BACK, 0 };
162 static MenuItem f_MenuItemHistoryFwd = { N_("^f  History/fwd"), 0, CMD_VHISTORY_FWD, 0 };
163 static MenuItem f_MenuItemHistoryList = { N_("^l  History list"), 0, CMD_VHISTORY_LIST, 0 };
164 static MenuItem f_MenuItemHistoryClean = { N_("^c Clear history"), 0, CMD_VHISTORY_CLEAR, 0 };
165 static MenuItem f_MenuItemChHistoryBack = { N_("^xb  ChngHist/back"), 0, CMD_CHISTORY_BACK, 0 };
166 static MenuItem f_MenuItemChHistoryFwd = { N_("^xf  ChngHist/fwd"), 0, CMD_CHISTORY_FWD, 0 };
167 static MenuItem f_MenuItemChHistoryList = { N_("^xl  ChngHist list"), 0, CMD_CHISTORY_LIST, 0 };
168 static MenuItem f_MenuItemChHistoryClean = { N_("^xc Clear ChngHist"), 0, CMD_CHISTORY_CLEAR, 0 };
169 /* xgettext:no-c-format */
170 static MenuItem f_MenuItemAddSour = { N_("%s  Add source"), 0, CMD_ADD_SOUR, 0 };
171 /* xgettext:no-c-format */
172 static MenuItem f_MenuItemAddEven = { N_("%e  Add event"), 0, CMD_ADD_EVEN, 0 };
173 /* xgettext:no-c-format */
174 static MenuItem f_MenuItemAddOthr = { N_("%o  Add other"), 0, CMD_ADD_OTHR, 0 };
175 
176 
177 static MenuItem f_MenuItemBrowseFamily = { N_("B  Browse new family"), 0, CMD_BROWSE_FAM, 0 };
178 
179 
180 /* Actual menus initializations
181  NB: All menus include g_MenuItemOther & g_MenuItemQuit, and they are not listed
182 */
183 
184 static MenuItem * f_MenuPerson[] =
185 {
186 	&f_MenuItemEditIndi,
187 	&f_MenuItemFather,
188 	&f_MenuItemMother,
189 	&f_MenuItemSpouse,
190 	&f_MenuItemChildren,
191 	&f_MenuItemOlderSib,
192 	&f_MenuItemYoungerSib,
193 	&f_MenuItemFamily,
194 	&f_MenuItemParents,
195 	&f_MenuItemBrowse,
196 	&f_MenuItemAddAsSpouse,
197 	&f_MenuItemAddAsChild,
198 	&f_MenuItemRemoveAsSpouse,
199 	&f_MenuItemRemoveAsChild,
200 	&f_MenuItemNewPerson,
201 	&f_MenuItemNewFamily,
202 	&f_MenuItemAddSour,
203 	&f_MenuItemAddEven,
204 	&f_MenuItemAddOthr,
205 	&f_MenuItemSwapFamilies,
206 	&f_MenuItemTandem,
207 	&f_MenuItemZipBrowse,
208 	&f_MenuItemZipIndi,
209 	&f_MenuItemScrollUp,
210 	&f_MenuItemScrollDown,
211 	&f_MenuItemToggleChildNos,
212 	&f_MenuItemDigits,
213 	&f_MenuItemModeGedcom,
214 	&f_MenuItemModeGedcomX,
215 	&f_MenuItemModeGedcomT,
216 	&f_MenuItemModeNormal,
217 	&f_MenuItemModePedigree,
218 	&f_MenuItemModeAncestors,
219 	&f_MenuItemModeDescendants,
220 	&f_MenuItemModeCycle,
221 	&f_MenuItemAdvanced,
222 	&f_MenuItemTandemChildren,
223 	&f_MenuItemTandemFathers,
224 	&f_MenuItemTandemFamilies,
225 	&f_MenuItemTandemMothers,
226 	&f_MenuItemTandemSpouses,
227 	&f_MenuItemTandemParents,
228 	&f_MenuItemDepthUp,
229 	&f_MenuItemDepthDown,
230 	&f_MenuItemEnlargeMenu,
231 	&f_MenuItemShrinkMenu,
232 	&f_MenuItemMoreCols,
233 	&f_MenuItemLessCols,
234 	&f_MenuItemSources,
235 	&f_MenuItemNotes,
236 	&f_MenuItemPointers,
237 	&f_MenuItemNext,
238 	&f_MenuItemPrev,
239 	&f_MenuItemHistoryBack,
240 	&f_MenuItemHistoryFwd,
241 	&f_MenuItemHistoryList,
242 	&f_MenuItemHistoryClean,
243 	&f_MenuItemChHistoryBack,
244 	&f_MenuItemChHistoryFwd,
245 	&f_MenuItemChHistoryList,
246 	&f_MenuItemChHistoryClean,
247 	0
248 };
249 
250 static MenuItem * f_MenuFamily[] =
251 {
252 	&f_MenuItemEditFamily,
253 	&f_MenuItemFather,
254 	&f_MenuItemMother,
255 	&f_MenuItemChildren,
256 	&f_MenuItemNewPerson,
257 	&f_MenuItemAddSour,
258 	&f_MenuItemAddEven,
259 	&f_MenuItemAddOthr,
260 	&f_MenuItemAddSpouse,
261 	&f_MenuItemAddChild,
262 	&f_MenuItemRemoveSpouseFrom,
263 	&f_MenuItemRemoveChildFrom,
264 	&f_MenuItemSwapChildren,
265 	&f_MenuItemReorderChild,
266 	&f_MenuItemTandemFamily,
267 	&f_MenuItemBrowse,
268 	&f_MenuItemZipBrowse,
269 	&f_MenuItemZipIndi,
270 	&f_MenuItemBrowseFamily,
271 	&f_MenuItemScrollUp,
272 	&f_MenuItemScrollDown,
273 	&f_MenuItemToggleChildNos,
274 	&f_MenuItemDigits,
275 	&f_MenuItemModeGedcom,
276 	&f_MenuItemModeGedcomX,
277 	&f_MenuItemModeGedcomT,
278 	&f_MenuItemModeNormal,
279 	&f_MenuItemModeCycle,
280 	&f_MenuItemAdvanced,
281 	&f_MenuItemTandemChildren,
282 	&f_MenuItemTandemFathers,
283 	&f_MenuItemTandemMothers,
284 	&f_MenuItemEnlargeMenu,
285 	&f_MenuItemShrinkMenu,
286 	&f_MenuItemMoreCols,
287 	&f_MenuItemLessCols,
288 	&f_MenuItemSources,
289 	&f_MenuItemNotes,
290 	&f_MenuItemPointers,
291 	&f_MenuItemNext,
292 	&f_MenuItemPrev,
293 	&f_MenuItemHistoryBack,
294 	&f_MenuItemHistoryFwd,
295 	&f_MenuItemHistoryList,
296 	&f_MenuItemHistoryClean,
297 	0
298 };
299 
300 static MenuItem * f_Menu2Person[] =
301 {
302 	&f_MenuItemEditTopIndi,
303 	&f_MenuItemBrowseTop,
304 	&f_MenuItemFatherTop,
305 	&f_MenuItemMotherTop,
306 	&f_MenuItemSpouseTop,
307 	&f_MenuItemChildrenTop,
308 /*
309 	&f_MenuItemParentsBoth,
310 	&f_MenuItemFamiliesBoth,
311 	&f_MenuItemBrowse,
312 	&f_MenuItemToggleChildNos,
313 	&f_MenuItemDigits,
314 	&f_MenuItemSyncMoves,
315 	*/
316 	&f_MenuItemCopyTopToBottom,
317 	&f_MenuItemAddFamily,
318 	&f_MenuItemMergeBottomToTop,
319 	&f_MenuItemSwitchTopBottom,
320 	&f_MenuItemModeGedcom,
321 	&f_MenuItemModeGedcomX,
322 	&f_MenuItemModeGedcomT,
323 	&f_MenuItemModeNormal,
324 	&f_MenuItemModePedigree,
325 	&f_MenuItemModeAncestors,
326 	&f_MenuItemModeDescendants,
327 	&f_MenuItemModeCycle,
328 	&f_MenuItemScrollUpTop,
329 	&f_MenuItemScrollDownTop,
330 	&f_MenuItemScrollUpBottom,
331 	&f_MenuItemScrollDownBottom,
332 	&f_MenuItemScrollUpBoth,
333 	&f_MenuItemScrollDownBoth,
334 	&f_MenuItemDepthUp,
335 	&f_MenuItemDepthDown,
336 	&f_MenuItemEnlargeMenu,
337 	&f_MenuItemShrinkMenu,
338 	&f_MenuItemMoreCols,
339 	&f_MenuItemLessCols,
340 	&f_MenuItemBrowse,
341 	0
342 };
343 
344 static MenuItem * f_Menu2Family[] =
345 {
346 	&f_MenuItemEditTopFam,
347 	&f_MenuItemBrowseTop,
348 	&f_MenuItemBrowseBottom,
349 	&f_MenuItemBothFathers,
350 	&f_MenuItemBothMothers,
351 	&f_MenuItemScrollUpTop,
352 	&f_MenuItemScrollDownTop,
353 	&f_MenuItemScrollUpBottom,
354 	&f_MenuItemScrollDownBottom,
355 	&f_MenuItemScrollUpBoth,
356 	&f_MenuItemScrollDownBoth,
357 	&f_MenuItemToggleChildNos,
358 	&f_MenuItemDigits,
359 	&f_MenuItemMergeBottomToTop,
360 	&f_MenuItemSwitchTopBottom,
361 	&f_MenuItemModeGedcom,
362 	&f_MenuItemModeGedcomX,
363 	&f_MenuItemModeGedcomT,
364 	&f_MenuItemModeNormal,
365 	&f_MenuItemModeCycle,
366 	&f_MenuItemEnlargeMenu,
367 	&f_MenuItemShrinkMenu,
368 	&f_MenuItemMoreCols,
369 	&f_MenuItemLessCols,
370 	0
371 };
372 
373 static MenuItem * f_MenuAux[] =
374 {
375 	&f_MenuItemEdit,
376 	&f_MenuItemAddSour,
377 	&f_MenuItemAddEven,
378 	&f_MenuItemAddOthr,
379 	&f_MenuItemZipBrowse,
380 	&f_MenuItemZipIndi,
381 	&f_MenuItemScrollUp,
382 	&f_MenuItemScrollDown,
383 	&f_MenuItemEnlargeMenu,
384 	&f_MenuItemShrinkMenu,
385 	&f_MenuItemMoreCols,
386 	&f_MenuItemLessCols,
387 	&f_MenuItemModeGedcom,
388 	&f_MenuItemModeGedcomX,
389 	&f_MenuItemModeGedcomT,
390 	&f_MenuItemNotes,
391 	&f_MenuItemPointers,
392 	&f_MenuItemNext,
393 	&f_MenuItemPrev,
394 	&f_MenuItemHistoryBack,
395 	&f_MenuItemHistoryFwd,
396 	&f_MenuItemHistoryList,
397 	&f_MenuItemHistoryClean,
398 	0
399 };
400 
401 static MenuItem * f_MenuListPersons[] =
402 {
403 	&f_MenuItemMoveDownList,
404 	&f_MenuItemMoveUpList,
405 	&f_MenuItemEditThis,
406 	&f_MenuItemBrowseThis,
407 	&f_MenuItemMarkThis,
408 	&f_MenuItemDeleteFromList,
409 	&f_MenuItemTandem,
410 	&f_MenuItemNameList,
411 	&f_MenuItemBrowseNewPersons,
412 	&f_MenuItemAddToList,
413 	&f_MenuItemSwapMarkCurrent,
414 	&f_MenuItemEnlargeMenu,
415 	&f_MenuItemShrinkMenu,
416 	&f_MenuItemMoreCols,
417 	&f_MenuItemLessCols,
418 	0
419 };
420 
421 /*********************************************
422  * local function definitions
423  * body of module
424  *********************************************/
425 
426 /*============================
427  * browsescreen_init - initialize one browse screen
428  * title is strsaved inside here
429  * Can be called to reinitialize an existing browsescreen
430  * Created: 2002/10/27, Perry Rapp
431  *==========================*/
432 static void
browsescreen_init(struct BrowseScreenInfo * sinfo,STRING title,INT MenuRows,INT MenuCols,INT MinCols,INT MaxCols,INT MinRows,INT MaxRows,INT MenuTop,INT MenuLeft,INT MenuWidth,INT MenuSize,MenuItem ** MenuItems)433 browsescreen_init (struct BrowseScreenInfo * sinfo , STRING title, INT MenuRows, INT MenuCols
434 	, INT MinCols, INT MaxCols
435 	, INT MinRows, INT MaxRows
436 	, INT MenuTop, INT MenuLeft, INT MenuWidth
437 	, INT MenuSize, MenuItem ** MenuItems)
438 {
439 	DYNMENU dynmenu = &sinfo->dynmenu;
440 
441 	strfree(&sinfo->title);
442 	sinfo->title = strsave(title);
443 	dynmenu_init(dynmenu, title, MenuRows, MenuCols
444 		, MinCols, MaxCols
445 		, MinRows, MaxRows
446 		, MenuTop, MenuLeft, MenuWidth
447 		, MenuSize, MenuItems);
448 }
449 /*============================
450  * brwsmenu_initialize -- set up menu arrays
451  *  screenheightx:  [IN]  user's terminal width
452  *  screenweidthx:  [IN]  user's terminal height
453  *   (After the first time, these are passed as 0, meaning use earlier values)
454  * Created: 2001/01/28, Perry Rapp
455  *==========================*/
456 void
brwsmenu_initialize(INT screenheightx,INT screenwidthx)457 brwsmenu_initialize (INT screenheightx, INT screenwidthx)
458 {
459 	INT i;
460 	INT scr;
461 	INT MenuRows, MenuCols, MenuSize;
462 	MenuItem ** MenuItems;
463 	struct BrowseScreenInfo * sinfo=0;
464 	char title[120];
465 	/* defaults used by all browse screens except list browse */
466 	INT MinRows=4;
467 	INT MaxRows=10;
468 	INT MinCols=1;
469 	INT MaxCols=7;
470 	INT MenuTop=0;
471 	INT MenuLeft=3;
472 	INT MenuWidth=0;
473 	if (screenheightx > 0)
474 		f_screenheight = screenheightx;
475 	if (screenwidthx > 0) {
476 		f_screenwidth = screenwidthx;
477 		f_cols = (f_screenwidth-5)/22; /* # of menu cols to start with */
478 	}
479 	MenuWidth = f_screenwidth-6;
480 	MenuCols = f_cols;
481 
482 	if (!f_initialized) {
483 		memset(f_BrowseScreenInfo, 0, sizeof(f_BrowseScreenInfo));
484 		for (i=1; i<=MAX_SCREEN; i++)
485 		{
486                         /*
487 			DYNMENU dynmenu;
488 			dynmenu = get_screen_dynmenu(i);
489                         */
490 			sinfo = &f_BrowseScreenInfo[i];
491 			memset(sinfo, 0, sizeof(*sinfo));
492 			sinfo->title = strsave(_("Missing title"));
493 		}
494 		f_initialized = TRUE;
495 	}
496 
497 	scr = ONE_PER_SCREEN;
498 	sinfo = &f_BrowseScreenInfo[scr];
499 	llstrncpy(title, _(qSttlindibrw), ARRSIZE(title), uu8);
500 	MenuRows = 8;
501 	MenuTop = f_screenheight-MenuRows - 3;
502 	MenuSize = ARRSIZE(f_MenuPerson)-1;
503 	MenuItems = f_MenuPerson;
504 	browsescreen_init(sinfo, title, MenuRows, MenuCols
505 		, MinCols, MaxCols
506 		, MinRows, MaxRows
507 		, MenuTop, MenuLeft, MenuWidth
508 		, MenuSize, MenuItems);
509 
510 	scr = ONE_FAM_SCREEN;
511 	sinfo = &f_BrowseScreenInfo[scr];
512 	llstrncpy(title, _(qSttlfambrw), ARRSIZE(title), uu8);
513 	MenuRows = 6;
514 	MenuTop = f_screenheight-MenuRows - 3;
515 	MenuSize = ARRSIZE(f_MenuFamily)-1;
516 	MenuItems = f_MenuFamily;
517 	browsescreen_init(sinfo, title, MenuRows, MenuCols
518 		, MinCols, MaxCols
519 		, MinRows, MaxRows
520 		, MenuTop, MenuLeft, MenuWidth
521 		, MenuSize, MenuItems);
522 
523 	scr = TWO_PER_SCREEN;
524 	sinfo = &f_BrowseScreenInfo[scr];
525 	llstrncpy(title, _(qSttl2perbrw), ARRSIZE(title), uu8);
526 	MenuRows = 5;
527 	MenuTop = f_screenheight-MenuRows - 3;
528 	MenuSize = ARRSIZE(f_Menu2Person)-1;
529 	MenuItems = f_Menu2Person;
530 	browsescreen_init(sinfo, title, MenuRows, MenuCols
531 		, MinCols, MaxCols
532 		, MinRows, MaxRows
533 		, MenuTop, MenuLeft, MenuWidth
534 		, MenuSize, MenuItems);
535 
536 	scr = TWO_FAM_SCREEN;
537 	sinfo = &f_BrowseScreenInfo[scr];
538 	llstrncpy(title, _(qSttl2fambrw), ARRSIZE(title), uu8);
539 	MenuRows = 5;
540 	MenuTop = f_screenheight-MenuRows - 3;
541 	MenuSize = ARRSIZE(f_Menu2Family)-1;
542 	MenuItems = f_Menu2Family;
543 	browsescreen_init(sinfo, title, MenuRows, MenuCols
544 		, MinCols, MaxCols
545 		, MinRows, MaxRows
546 		, MenuTop, MenuLeft, MenuWidth
547 		, MenuSize, MenuItems);
548 
549 	scr = AUX_SCREEN;
550 	sinfo = &f_BrowseScreenInfo[scr];
551 	llstrncpy(title, _(qSttlauxbrw), ARRSIZE(title), uu8);
552 	MenuRows = 4;
553 	MenuTop = f_screenheight-MenuRows - 3;
554 	MenuSize = ARRSIZE(f_MenuAux)-1;
555 	MenuItems = f_MenuAux;
556 	browsescreen_init(sinfo, title, MenuRows, MenuCols
557 		, MinCols, MaxCols
558 		, MinRows, MaxRows
559 		, MenuTop, MenuLeft, MenuWidth
560 		, MenuSize, MenuItems);
561 
562 	/* TO DO: this is not used right now */
563 	scr = LIST_SCREEN;
564 	sinfo = &f_BrowseScreenInfo[scr];
565 	llstrncpy(title, _(qSttllstbrw), ARRSIZE(title), uu8);
566 	MenuRows = 13;
567 	MenuCols = 1;
568 	MenuSize = ARRSIZE(f_MenuListPersons)-1;
569 	MenuItems = f_MenuListPersons;
570 	MinRows = 5;
571 	MaxRows = 14;
572 	browsescreen_init(sinfo, title, MenuRows, MenuCols
573 		, MinCols, MaxCols
574 		, MinRows, MaxRows
575 		, MenuTop, MenuLeft, MenuWidth
576 		, MenuSize, MenuItems);
577 
578 	if (!f_reloading) {
579 		register_brwsmenu_lang_callbacks(TRUE);
580 	}
581 }
582 /*============================
583  * menuitem_terminate_worker -- free menu arrays
584  *==========================*/
585 void
menuitem_terminate(void)586 menuitem_terminate (void)
587 {
588 	INT i;
589 	if (!f_reloading) {
590 		register_brwsmenu_lang_callbacks(FALSE);
591 	}
592 	for (i=1; i<=MAX_SCREEN; i++) {
593 		struct BrowseScreenInfo * sinfo=&f_BrowseScreenInfo[i];
594 		dynmenu_clear(&sinfo->dynmenu);
595 		strfree(&sinfo->title);
596 	}
597 	f_initialized = FALSE;
598 }
599 /*============================
600  * register_brwsmenu_lang_callbacks -- (un)register our callbacks
601  *  for language or codeset changes
602  *==========================*/
603 static void
register_brwsmenu_lang_callbacks(BOOLEAN registering)604 register_brwsmenu_lang_callbacks (BOOLEAN registering)
605 {
606 	if (registering) {
607 		register_uilang_callback(brwsmenu_on_lang_change, 0);
608 		register_uicodeset_callback(brwsmenu_on_lang_change, 0);
609 	} else {
610 		unregister_uilang_callback(brwsmenu_on_lang_change, 0);
611 		unregister_uicodeset_callback(brwsmenu_on_lang_change, 0);
612 	}
613 }
614 /*============================
615  * brwsmenu_on_lang_change -- UI language or codeset has changed
616  *==========================*/
617 static void
brwsmenu_on_lang_change(VPTR uparm)618 brwsmenu_on_lang_change (VPTR uparm)
619 {
620 	uparm = uparm; /* unused */
621 	f_reloading = TRUE;
622 	menuitem_terminate();
623 	brwsmenu_initialize(0, 0); /* 0 means use stored values */
624 	f_reloading = FALSE;
625 }
626 /*============================
627  * get_screen_menuset -- get menuset of specified browse screen
628  * Created: 2002/10/27, Perry Rapp
629  *==========================*/
630 MENUSET
get_screen_menuset(INT screen)631 get_screen_menuset (INT screen)
632 {
633 	return dynmenu_get_menuset(get_screen_dynmenu(screen));
634 }
635 /*============================
636  * get_screen_dynmenu -- get dynmenu of specified browse screen
637  * Created: 2002/10/27, Perry Rapp
638  *==========================*/
639 DYNMENU
get_screen_dynmenu(INT screen)640 get_screen_dynmenu (INT screen)
641 {
642 	return &f_BrowseScreenInfo[screen].dynmenu;
643 }
644 /*============================
645  * get_screen_title -- get title of specified browse screen
646  * Created: 2002/10/27, Perry Rapp
647  *==========================*/
648 STRING
get_screen_title(INT screen)649 get_screen_title (INT screen)
650 {
651 	return f_BrowseScreenInfo[screen].title;
652 }
653 
654