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