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