1 /*
2  *  This file is part of XForms.
3  *
4  *  XForms is free software; you can redistribute it and/or modify it
5  *  under the terms of the GNU Lesser General Public License as
6  *  published by the Free Software Foundation; either version 2.1, or
7  *  (at your option) any later version.
8  *
9  *  XForms is distributed in the hope that it will be useful, but
10  *  WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  *  Lesser General Public License for more details.
13  *
14  *  You should have received a copy of the GNU Lesser General Public
15  *  License along with XForms; see the file COPYING.  If not, write to
16  *  the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
17  *  MA 02111-1307, USA.
18  */
19 
20 
21 /*
22  * popup tester
23  *
24  * This file is part of xforms package
25  * T.C. Zhao and Mark Overmars
26  */
27 
28 #ifdef HAVE_CONFIG_H
29 #include "config.h"
30 #endif
31 
32 #include "include/forms.h"
33 
34 typedef struct {
35     FL_FORM *   pupform;
36     void *      vdata;
37     char *      cdata;
38     long        ldata;
39     FL_OBJECT * menu;
40     FL_OBJECT * button;
41     FL_OBJECT * choice;
42     FL_OBJECT * status;
43     FL_OBJECT * done_cb;
44 } FD_pupform;
45 
46 extern FD_pupform * create_form_pupform( void );
47 extern void menu_callback( FL_OBJECT *, long );
48 extern void dopup_callback( FL_OBJECT *, long );
49 extern void choice_callback( FL_OBJECT *, long );
50 
51 static void init_menu( FL_OBJECT * );
52 static void init_choice( FL_OBJECT * );
53 
54 FD_pupform *fd_pupform;
55 
56 
57 /***************************************
58  ***************************************/
59 
60 int
main(int argc,char * argv[])61 main( int    argc,
62       char * argv[ ] )
63 {
64     fl_initialize( &argc, argv, 0, 0, 0 );
65 
66     fd_pupform = create_form_pupform( );
67 
68     /* fill-in form initialization code */
69 
70     init_menu( fd_pupform->menu );
71     init_choice( fd_pupform->choice );
72 
73     /* show the first form */
74 
75     fl_show_form( fd_pupform->pupform, FL_PLACE_CENTER, FL_FULLBORDER,
76                   "pupform" );
77 
78     fl_do_forms( );
79 
80     return 0;
81 }
82 
83 
84 /********* MENU ***********************************************/
85 
86 /***************************************
87  ***************************************/
88 
89 void
menu_callback(FL_OBJECT * ob,long data FL_UNUSED_ARG)90 menu_callback( FL_OBJECT * ob,
91                long        data  FL_UNUSED_ARG )
92 {
93     FD_pupform *fdui = ob->form->fdui;
94     char buf[ 128 ];
95 
96     sprintf( buf, "item %d (%s) selected",
97              fl_get_menu( ob ), fl_get_menu_text( ob ) );
98     fl_set_object_label( fdui->status, buf );
99 }
100 
101 
102 /* menu initialization entries. No callbacks for the item */
103 
104 FL_PUP_ENTRY menu_entries[ ] =
105 {
106     { "Menu Item 1",   NULL, NULL, 0 },
107     { "Menu Item 2",   NULL, NULL, 0 },
108     { "_Menu Item 3",  NULL, NULL, 0 },
109     { "/_Menu Item 4", NULL, NULL, 0 },
110         { "Menu Item 5",  NULL, NULL, 0 },
111         { "Menu Item 6",  NULL, NULL, 0 },
112         { "/Menu Item 7", NULL, NULL, 0 },
113             { "Menu Item 8",  NULL, NULL, 0 },
114             { "/Menu Item 9", NULL, NULL, 0 },
115                 { "Menu Item 10", NULL, NULL, 0 },
116                 { "Menu Item 11", NULL, NULL, 0 },
117                 { NULL,           NULL, NULL, 0 },
118             { "Menu Item 13",  NULL, NULL, 0 },
119             { NULL,            NULL, NULL, 0 },
120         { NULL,           NULL, NULL, 0 },
121     { "Menu Item 15",  NULL, NULL, 0 },
122     { "menu Item 16",  NULL, NULL, 0 },
123     { "menu Item 17",  NULL, NULL, 0 },
124     { NULL,            NULL, NULL, 0 }
125 };
126 
127 
128 /***************************************
129  ***************************************/
130 
131 static void
menuitem_entercb(int n,void * data)132 menuitem_entercb( int    n,
133                   void * data )
134 {
135     char buf[ 128 ];
136     FD_pupform *fdui = data;
137 
138     sprintf( buf, "Entered %d (%s)",
139              n, fl_get_menu_item_text( fdui->menu, n ) );
140     fl_set_object_label( fdui->status, buf );
141 }
142 
143 
144 /***************************************
145  ***************************************/
146 
147 static void
init_menu(FL_OBJECT * menu)148 init_menu( FL_OBJECT *menu )
149 {
150     /* if no entercb is desired, set_menu_entries is much simpler */
151 #if 0
152     fl_set_menu_entries( menu, menu_entries );
153 #else
154     int n = fl_newpup( FL_ObjWin( menu ) );
155 
156     fl_setpup_entries( n, menu_entries );
157     fl_setpup_entercb( n, menuitem_entercb, menu->form->fdui );
158 //    fl_setpup_bw( n, -2 );
159     fl_set_menu_popup( menu, n );
160 #endif
161 }
162 
163 
164 /*********** End of menu *************************/
165 
166 
167 /******* PopUP ***********************************/
168 
169 static int pupID = -1;
170 
171 
172 /***************************************
173  ***************************************/
174 
175 static int
pupitem_cb(int selected)176 pupitem_cb( int selected )
177 {
178     char buf[ 128 ];
179 
180     sprintf( buf,"Item %d (%s) selected",
181              selected, fl_getpup_text( pupID, selected ) );
182     fl_set_object_label( fd_pupform->status, buf );
183     return selected;
184 }
185 
186 
187 FL_PUP_ENTRY pup_entries[ ] =
188 {
189     { "Popup item 1",  pupitem_cb, "1",  FL_PUP_RADIO },
190     { "Popup Item 2",  pupitem_cb, "2",  FL_PUP_RADIO },
191     { "Popup Item 3",  pupitem_cb, "3",  FL_PUP_RADIO },
192     { "/Popup Item 4", pupitem_cb, "4",  FL_PUP_NONE  },
193         { "Popup Item 5", pupitem_cb, NULL, FL_PUP_GRAY },
194         { "Popup Item 6", pupitem_cb, NULL, 0 },
195         { "Popup Item 7", pupitem_cb, NULL, 0 },
196         { "Popup Item 8", pupitem_cb, NULL, 0 },
197         { NULL,           NULL,       NULL, 0 },
198     { "Popup Item 10", pupitem_cb, NULL, FL_PUP_GRAY },
199     { "Popup Item 11", pupitem_cb, NULL, 0 },
200     { NULL,            NULL,       NULL, 0 }
201 };
202 
203 
204 /***************************************
205  ***************************************/
206 
207 static void
pup_entercb(int n,void * data)208 pup_entercb( int    n,
209              void * data)
210 {
211     FD_pupform *fdui = data;
212     char buf[ 128 ];
213 
214     sprintf( buf, "Entered %d (%s)", n, pup_entries[ n - 1 ].text );
215     fl_set_object_label( fdui->status, buf );
216 }
217 
218 
219 /***************************************
220  ***************************************/
221 
222 void
dopup_callback(FL_OBJECT * ob,long data FL_UNUSED_ARG)223 dopup_callback( FL_OBJECT * ob,
224                 long        data  FL_UNUSED_ARG )
225 {
226     if ( pupID < 0 )
227     {
228         pupID = fl_newpup( FL_ObjWin( ob ) );
229 #if 0
230         int subm;
231         subm = fl_newpup( FL_ObjWin( ob ) );
232 #else
233         fl_setpup_entries( pupID, pup_entries );
234 #endif
235 #if 0
236         fl_addtopup( pupID, "Popup item 1%f%s%R1", pupitem_cb, "1" );
237         fl_addtopup( pupID, "Popup item 2%f%s%r1", pupitem_cb, "2" );
238         fl_addtopup( pupID, "Popup item 3%l%f%s%r1", pupitem_cb, "3" );
239         fl_addtopup( pupID, "Popup item 4%l%f%s%m", pupitem_cb, "4", subm );
240 
241         fl_addtopup( subm, "Popup Item 5%f%x5", pupitem_cb );
242         fl_addtopup( subm, "Popup Item 6%f%x6", pupitem_cb );
243         fl_addtopup( subm, "Popup Item 7%f%x7", pupitem_cb );
244         fl_addtopup( subm, "Popup Item 8%f%x8", pupitem_cb );
245 
246         fl_addtopup( pupID, "Popup item 9%x9%f%i", pupitem_cb );
247         fl_addtopup( pupID, "Popup item 10%x10%f", pupitem_cb );
248 #endif
249         fl_setpup_entercb( pupID, pup_entercb, ob->form->fdui );
250 #if 0
251         fl_setpup_entercb( subm, pup_entercb, ob->form->fdui );
252 #endif
253     }
254 
255     /* since each item has its own callback, ignore the return value */
256 
257     fl_dopup( pupID );
258 }
259 
260 /********* End of pup *****************/
261 
262 /***************************************
263  ***************************************/
264 
265 static void
init_choice(FL_OBJECT * ob)266 init_choice( FL_OBJECT *ob )
267 {
268     fl_addto_choice( ob,"Choice1|Choice2|Choice3" );
269     fl_addto_choice( ob,"Choice4|Choice5|Choice6" );
270     fl_addto_choice( ob,"Choice7|Choice8|Choice9" );
271 }
272 
273 
274 /***************************************
275  ***************************************/
276 
277 void
choice_callback(FL_OBJECT * ob,long data FL_UNUSED_ARG)278 choice_callback( FL_OBJECT * ob,
279                  long        data  FL_UNUSED_ARG )
280 {
281     char buf[ 128 ];
282     FD_pupform *fdui = ob->form->fdui;
283 
284     sprintf( buf, "%d (%s) selected",
285              fl_get_choice( ob ), fl_get_choice_text( ob ) );
286     fl_set_object_label( fdui->status, buf );
287 }
288 
289 
290 /* Form definition file generated with fdesign. */
291 
292 #include <stdlib.h>
293 
294 
295 /***************************************
296  ***************************************/
297 
298 FD_pupform *
create_form_pupform(void)299 create_form_pupform( void )
300 {
301     FL_OBJECT *obj;
302     FD_pupform *fdui = fl_calloc( 1, sizeof *fdui );
303 
304     fdui->pupform = fl_bgn_form( FL_NO_BOX, 320, 250 );
305 
306     fl_add_box( FL_UP_BOX, 0, 0, 320, 250, "" );
307 
308     fdui->menu = obj = fl_add_menu( FL_PULLDOWN_MENU, 20, 90, 60, 30, "Menu" );
309     fl_set_object_boxtype( obj, FL_FLAT_BOX );
310     fl_set_object_callback( obj, menu_callback, 0 );
311     fl_set_object_shortcut( obj, "#MM", 1 );
312 
313     fdui->button = obj = fl_add_button( FL_MENU_BUTTON, 100, 90, 75, 30,
314                                         "Button" );
315     fl_set_object_callback( obj, dopup_callback, 0 );
316     fl_set_object_shortcut( obj, "#BB", 1 );
317 
318     fdui->choice = obj = fl_add_choice( FL_NORMAL_CHOICE2, 195, 90, 105, 30,
319                                         "" );
320     fl_set_object_callback( obj, choice_callback, 0 );
321 
322     fdui->status = obj = fl_add_text( FL_NORMAL_TEXT, 25, 30, 265, 30, "" );
323     fl_set_object_boxtype( obj, FL_FRAME_BOX );
324     fl_set_object_lalign( obj, FL_ALIGN_CENTER );
325     fl_set_object_dblbuffer( obj, 1 );
326 
327     fdui->done_cb = obj = fl_add_button( FL_NORMAL_BUTTON, 210, 200, 85, 30,
328                                          "Done" );
329 
330     fl_end_form( );
331 
332     fl_adjust_form_size( fdui->pupform );
333     fdui->pupform->fdui = fdui;
334 
335     return fdui;
336 }
337 
338 
339 /*
340  * Local variables:
341  * tab-width: 4
342  * indent-tabs-mode: nil
343  * End:
344  */
345