1/* Copyright    Massachusetts Institute of Technology    1985	*/
2
3#include "copyright.h"
4
5
6/*
7 * XMenu:	MIT Project Athena, X Window system menu package
8 *
9 * 	XMenuRecompute - Recompute XMenu object dependencies.
10 *
11 *	Author:		Tony Della Fera, DEC
12 *			September, 1985
13 *
14 */
15
16#include "XMenuInt.h"
17
18int
19XMenuRecompute(display, menu)
20    Display *display;
21    register XMenu *menu;	/* Menu object to be recomputed. */
22{
23    register XMPane *p_ptr;	/* Pane pointer. */
24    register XMSelect *s_ptr;	/* Selection pointer. */
25
26    register int p_num;		/* Pane serial number. */
27    register int s_num;		/* Selection serial number. */
28
29    /*
30     * If there are no panes in the menu then return failure
31     * because the menu is not initialized.
32     */
33    if (menu->p_count == 0) {
34	_XMErrorCode = XME_NOT_INIT;
35	return(XM_FAILURE);
36    }
37
38    /*
39     * Recompute menu wide global values: pane window size,
40     * selection size and maximum selection count.
41     */
42    _XMRecomputeGlobals(display, menu);
43
44    /*
45     * For each pane in the menu...
46     */
47
48    p_num = 0;
49    for (
50	p_ptr = menu->p_list->next;
51	p_ptr != menu->p_list;
52	p_ptr = p_ptr->next
53    ){
54	/*
55	 * Recompute pane dependencies.
56	 */
57	if (_XMRecomputePane(display, menu, p_ptr, p_num) == _FAILURE) {
58	    return(XM_FAILURE);
59	}
60        p_num++;
61
62	/*
63	 * For each selection in the pane...
64	 */
65	s_num = 0;
66	for (
67	    s_ptr = p_ptr->s_list->next;
68	    s_ptr != p_ptr->s_list;
69	    s_ptr = s_ptr->next
70	) {
71	    /*
72	     * Recompute selection dependencies.
73	     */
74	    if (_XMRecomputeSelection(display, menu, s_ptr, s_num) == _FAILURE) {
75		return(XM_FAILURE);
76	    }
77	    s_num++;
78	}
79    }
80
81    /*
82     * Recompute menu size.
83     */
84    if (menu->menu_style == CENTER) {
85	menu->width = menu->p_width + (menu->p_bdr_width << 1);
86    }
87    else {
88	menu->width = menu->p_width + (menu->p_bdr_width << 1) +
89	    ((menu->p_count - 1) * menu->p_x_off);
90    }
91    menu->height = menu->p_height + (menu->p_bdr_width << 1) +
92	((menu->p_count - 1) * menu->p_y_off);
93
94    /*
95     * Reset the recompute flag.
96     */
97    menu->recompute = 0;
98
99    /*
100     * Return successfully.
101     */
102    _XMErrorCode = XME_NO_ERROR;
103    return(XM_SUCCESS);
104}
105
106/* arch-tag: 1fe99b82-3873-4aab-b2b3-f277c93e00d9
107   (do not change this comment) */
108