1 #   include	"appFrameConfig.h"
2 
3 #   include	<stdio.h>
4 
5 #   include	"guiWidgets.h"
6 #   include	"guiOptionmenu.h"
7 #   include	"guiWidgetsImpl.h"
8 
9 #   include	<appDebugon.h>
10 
11 #   ifdef USE_GTK
12 
13 #   define	USE_OPT_MENU	1
14 
15 /************************************************************************/
16 
appGuiGetOptionmenuFindItem(GtkWidget * w,GtkMenuItem * it)17 static int appGuiGetOptionmenuFindItem(	GtkWidget *	w,
18 					GtkMenuItem *	it )
19     {
20     int		rval= -1;
21     GList *	glf= (GList *)0;
22 
23     if  ( GTK_IS_CONTAINER( w ) )
24 	{
25 	GList *	gl;
26 	int	idx= 0;
27 
28 	gl= glf= gtk_container_children( GTK_CONTAINER( w ) );
29 
30 	while( gl )
31 	    {
32 	    GtkWidget *	c= (GtkWidget *)gl->data;
33 
34 	    if  ( GTK_IS_MENU_ITEM( c )		)
35 		{
36 		if  ( GTK_MENU_ITEM( c ) == it	)
37 		    { rval= idx; goto ready;	}
38 
39 		idx++;
40 		}
41 	    else{
42 		if  ( GTK_IS_CONTAINER( c ) )
43 		    {
44 		    rval= appGuiGetOptionmenuFindItem( c, it );
45 
46 		    if  ( rval >= 0 )
47 			{ goto ready;	}
48 		    }
49 		}
50 
51 	    gl= gl->next;
52 	    }
53 	}
54 
55   ready:
56     if  ( glf )
57 	{ g_list_free( glf );	}
58 
59     return rval;
60     }
61 
appOptionMenuGtkCallback(GtkMenuItem * it,void * voidaom)62 static void appOptionMenuGtkCallback(	GtkMenuItem *	it,
63 					void *		voidaom )
64     {
65     AppOptionmenu *	aom= (AppOptionmenu *)voidaom;
66     int			idx;
67 
68     idx= appGuiGetOptionmenuFindItem( aom->aomPulldown, it );
69     if  ( idx < 0 )
70 	{ LDEB(idx); return;	}
71 
72     if  ( aom->aomCallback )
73 	{ (*aom->aomCallback)( idx, aom->aomTarget ); }
74     }
75 
76 static int GTKcomboSetting= 0;
77 
appComboBoxGtkCallback(GtkComboBox * combo,void * voidaom)78 static void appComboBoxGtkCallback(	GtkComboBox *	combo,
79 					void *		voidaom )
80     {
81     AppOptionmenu *	aom= (AppOptionmenu *)voidaom;
82     int			idx;
83 
84     if  ( GTKcomboSetting )
85 	{ return;	}
86 
87     idx= gtk_combo_box_get_active( combo );
88     if  ( idx < 0 )
89 	{ LDEB(idx); return;	}
90 
91     if  ( aom->aomCallback )
92 	{ (*aom->aomCallback)( idx, aom->aomTarget ); }
93     }
94 
95 /************************************************************************/
96 /*									*/
97 /*  Used to get around Motif's ridiculous resize behavior. Probably	*/
98 /*  not needed for GTK.							*/
99 /*									*/
100 /************************************************************************/
101 
appOptionmenuRefreshWidth(AppOptionmenu * aom)102 void appOptionmenuRefreshWidth(	AppOptionmenu *		aom )
103     { return;	}
104 
appMakeOptionmenuInRow(AppOptionmenu * aom,APP_WIDGET row,int column,int colspan,OptionmenuCallback callBack,void * target)105 void appMakeOptionmenuInRow(		AppOptionmenu *		aom,
106 					APP_WIDGET		row,
107 					int			column,
108 					int			colspan,
109 					OptionmenuCallback	callBack,
110 					void *			target )
111     {
112     APP_WIDGET	pulldown;
113     APP_WIDGET	inplace;
114 
115     pulldown= gtk_menu_new();
116 #   if USE_OPT_MENU
117     inplace= gtk_option_menu_new();
118 #   else
119     inplace= gtk_combo_box_new_text();
120 #   endif
121 
122     gtk_widget_set_name(GTK_WIDGET (pulldown), "tedRowOptMenu");
123     gtk_widget_set_name(GTK_WIDGET (inplace), "tedRowOptMenu");
124 
125     gtk_table_attach( GTK_TABLE( row ),
126 			inplace,
127 			column, column+ colspan,
128 			0, 1,
129 			GTK_FILL | GTK_EXPAND | GTK_SHRINK,
130 			GTK_FILL | GTK_EXPAND | GTK_SHRINK,
131 			ROW_XPADDING_GTK, ROW_YPADDING_GTK );
132 
133     gtk_widget_show( inplace );
134 
135     if  ( GTK_IS_OPTION_MENU( inplace ) )
136 	{
137 	gtk_option_menu_set_menu( GTK_OPTION_MENU( inplace ), pulldown );
138 	}
139 
140     if  ( GTK_IS_COMBO_BOX( inplace ) && callBack )
141 	{
142 	gtk_signal_connect( GTK_OBJECT( inplace ), "changed",
143 				(GtkSignalFunc)appComboBoxGtkCallback, aom );
144 	}
145 
146     aom->aomPulldown= pulldown;
147     aom->aomInplace= inplace;
148     aom->aomCallback= callBack;
149     aom->aomTarget= target;
150 
151     return;
152     }
153 
appMakeOptionmenuInColumn(AppOptionmenu * aom,APP_WIDGET column,OptionmenuCallback callBack,void * target)154 void appMakeOptionmenuInColumn(		AppOptionmenu *		aom,
155 					APP_WIDGET		column,
156 					OptionmenuCallback	callBack,
157 					void *			target )
158     {
159     APP_WIDGET	pulldown;
160     APP_WIDGET	inplace;
161 
162     pulldown= gtk_menu_new();
163 #   if USE_OPT_MENU
164     inplace= gtk_option_menu_new();
165 #   else
166     inplace= gtk_combo_box_new_text();
167 #   endif
168 
169     gtk_widget_set_name(GTK_WIDGET (pulldown), "tedRowOptMenu");
170     gtk_widget_set_name(GTK_WIDGET (inplace), "tedRowOptMenu");
171 
172     gtk_box_pack_start( GTK_BOX( column ), inplace, FALSE, TRUE, 0 );
173 
174     gtk_widget_show( inplace );
175 
176     if  ( GTK_IS_OPTION_MENU( inplace ) )
177 	{
178 	gtk_option_menu_set_menu( GTK_OPTION_MENU( inplace ), pulldown );
179 	}
180 
181     if  ( GTK_IS_COMBO_BOX( inplace ) && callBack )
182 	{
183 	gtk_signal_connect( GTK_OBJECT( inplace ), "changed",
184 				(GtkSignalFunc)appComboBoxGtkCallback, aom );
185 	}
186 
187     aom->aomPulldown= pulldown;
188     aom->aomInplace= inplace;
189     aom->aomCallback= callBack;
190     aom->aomTarget= target;
191 
192     return;
193     }
194 
195 /************************************************************************/
196 /*									*/
197 /*  Add an option to a pulldown.					*/
198 /*									*/
199 /************************************************************************/
200 
appAddItemToOptionmenu(AppOptionmenu * aom,const char * label)201 APP_WIDGET appAddItemToOptionmenu(	AppOptionmenu *		aom,
202 					const char *		label )
203     {
204     APP_WIDGET	option;
205 
206     option= gtk_menu_item_new_with_label( label );
207     gtk_widget_set_name( GTK_WIDGET(option), "tedOptMenuItem");
208 
209     gtk_menu_append( GTK_MENU( aom->aomPulldown ), option );
210 
211     if  ( GTK_IS_COMBO_BOX( aom->aomInplace ) )
212 	{
213 	if  ( ! label )
214 	    { label= "";	}
215 
216 	gtk_combo_box_append_text( GTK_COMBO_BOX( aom->aomInplace ), label );
217 	}
218 
219     gtk_widget_show( option );
220 
221     if  ( aom->aomCallback )
222 	{
223 	gtk_signal_connect( GTK_OBJECT( option ), "activate",
224 				(GtkSignalFunc)appOptionMenuGtkCallback, aom );
225 	}
226 
227     return option;
228     }
229 
230 /************************************************************************/
231 /*									*/
232 /*  Select a particular option in an option menu.			*/
233 /*									*/
234 /************************************************************************/
235 
appSetOptionmenu(AppOptionmenu * aom,int num)236 void appSetOptionmenu(	AppOptionmenu *	aom,
237 			int		num )
238     {
239     if  ( GTK_IS_OPTION_MENU( aom->aomInplace ) )
240 	{
241 	gtk_option_menu_set_history( GTK_OPTION_MENU( aom->aomInplace ), num );
242 	}
243 
244     if  ( GTK_IS_COMBO_BOX( aom->aomInplace ) )
245 	{
246 	GTKcomboSetting++;
247 	gtk_combo_box_set_active( GTK_COMBO_BOX( aom->aomInplace ), num );
248 	GTKcomboSetting--;
249 	}
250 
251     return;
252     }
253 
appEmptyOptionmenu(AppOptionmenu * aom)254 void appEmptyOptionmenu(	AppOptionmenu *		aom )
255     {
256     appEmptyParentWidget( aom->aomPulldown );
257     }
258 
appGuiEnableOptionmenu(AppOptionmenu * aom,int sensitive)259 void appGuiEnableOptionmenu(	AppOptionmenu *		aom,
260 				int			sensitive )
261     {
262     gtk_widget_set_sensitive( aom->aomInplace, sensitive != 0 );
263     }
264 
appInitOptionmenu(AppOptionmenu * aom)265 void appInitOptionmenu(		AppOptionmenu *		aom )
266     {
267     aom->aomPulldown= (APP_WIDGET)0;
268     aom->aomInplace= (APP_WIDGET)0;
269 
270     aom->aomCallback= (OptionmenuCallback)0;
271     aom->aomTarget= (void *)0;
272     }
273 
appOptionmenuItemSetVisibility(APP_WIDGET w,int visible)274 void appOptionmenuItemSetVisibility(	APP_WIDGET	w,
275 					int		visible )
276     {
277     visible= ( visible != 0 );
278 
279     if  ( GTK_WIDGET_VISIBLE( w ) == visible )
280 	{ return;	}
281 
282     if  ( visible )
283 	{ gtk_widget_show( w );	}
284     else{ gtk_widget_hide( w );	}
285 
286     return;
287     }
288 
289 #   endif
290