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 License
15  *  along with XForms.  If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 
19 /**
20  * \file fd_objects.c
21  *
22  *  This file is part of XForms package
23  *  Copyright (c) 1996-2002  T.C. Zhao and Mark Overmars
24  *  All rights reserved.
25  *
26  * This file is part of the Form Designer.
27  *
28  * It contains routines to keep track of all different object classes
29  * and the types inside each class. To add a class of object to the
30  * form designer, only this file has to be changed slightly:
31  *      - in init_classes() the class and types must be added.
32  *      - in add_an_object() the way of adding it should be added.
33  *
34  * Also to support output fully, fd_spec.c needs to be modified
35  */
36 
37 #ifdef HAVE_CONFIG_H
38 #include "config.h"
39 #endif
40 
41 #include <string.h>
42 #include <stdio.h>
43 #include <math.h>
44 
45 #include "fd_main.h"
46 #include "sp_freeobj.h"
47 #include "xpm/broken.xpm"
48 #include "xpm/broken.xbm"
49 
50 #define VN( a )        a,#a
51 #define OBJNAME( a )   #a,fl_create_##a,fl_add_##a
52 
53 typedef struct {
54     int defined;
55     char tname[ MAX_TYPE_NAME_LEN ];
56 } TDEF;
57 
58 typedef FL_OBJECT * ( * FL_ADDPTR ) ( int, FL_Coord, FL_Coord, FL_Coord,
59                                       FL_Coord, const char * );
60 
61 typedef struct {
62     int          cn;
63     FL_OBJECT  * defobj;                              /* default */
64     TDEF         types[ MAXTYPES ];
65     char         cname[ MAX_CLASS_NAME_LEN ];         /* add_XXX */
66     char         formal_cname[ MAX_CLASS_NAME_LEN ];
67     FL_OBJECT  * defobj1;                             /* to specific type */
68     FL_ADDPTR    createit,
69                  addit;
70     int          var_boxtype;   /* means default boxtype may depend on type */
71     int          default_type;
72     const char * default_label;
73     int          bline;
74 } CDEF;
75 
76 static CDEF classes[ MAXCLASSES ];
77 static int cnumb = 0;
78 
79 typedef FL_OBJECT * ( * FL_ADDFREEPTR )( int, FL_Coord, FL_Coord, FL_Coord,
80                                          FL_Coord, const char *, FL_HANDLEPTR );
81 
82 
83 /***************************************
84  * Adds a class definition
85  ***************************************/
86 
87 static void
add_class_def(int numb,char * formal_name,char * name,FL_ADDPTR createit,FL_ADDPTR addit,int bl)88 add_class_def( int         numb,
89                char      * formal_name,
90                char      * name,
91                FL_ADDPTR   createit,
92                FL_ADDPTR   addit,
93                int         bl )
94 {
95     int i;
96 
97     if ( cnumb == MAXCLASSES )
98     {
99         fprintf( stderr, "exceeding maxclass allowed\n" );
100         return;
101     }
102 
103     classes[ cnumb ].cn = numb;
104     strcpy( classes[ cnumb ].cname, name );
105     strcpy( classes[ cnumb ].formal_cname, formal_name );
106     if ( createit )
107         classes[ cnumb ].defobj = createit( 1, 0, 0, 1, 1, "" );
108     classes[ cnumb ].createit = createit;
109     classes[ cnumb ].addit = addit;
110     classes[ cnumb ].bline = bl;
111 
112     for ( i = 0; i < MAXTYPES; i++ )
113         classes[ cnumb ].types[ i ].defined = FL_FALSE;
114     cnumb++;
115 }
116 
117 
118 /***************************************
119  ***************************************/
120 
121 static CDEF *
find_class_struct(int n)122 find_class_struct( int n )
123 {
124     int i;
125 
126     for ( i = 0; i < cnumb; i++ )
127     {
128         if ( classes[ i ].cn == n )
129             return classes + i;
130     }
131 
132     M_err( "find_class_struct", "Can't find class %d", n );
133     return NULL;
134 }
135 
136 
137 /***************************************
138  * Adds a type definition to a class
139  ***************************************/
140 
141 static void
add_type_def(int cn,int tn,char name[])142 add_type_def( int  cn,
143               int  tn,
144               char name[ ] )
145 {
146     int i;
147 
148     if ( tn >= MAXTYPES || tn < 0 )
149     {
150         M_err( "add_type_def", "Bad type: %d", tn );
151         return;
152     }
153 
154     for ( i = 0; i < cnumb; i++ )
155         if ( classes[ i ].cn == cn )
156         {
157             classes[ i ].types[ tn ].defined = FL_TRUE;
158             strcpy( classes[ i ].types[ tn ].tname, name );
159         }
160 }
161 
162 
163 /***************************************
164  * Sets a default type and label for class cn
165  ***************************************/
166 
167 static void
set_class_default(int cn,int def_type,char * label)168 set_class_default( int    cn,
169                    int    def_type,
170                    char * label )
171 {
172     int i;
173 
174     for ( i = 0; i < cnumb; i++ )
175         if ( classes[ i ].cn == cn )
176         {
177             classes[ i ].default_type = def_type;
178             classes[ i ].default_label = label;     /* note: no copy */
179         }
180 }
181 
182 
183 /***************************************
184  ***************************************/
185 
186 static void
set_var_boxtype(int cn,int yes FL_UNUSED_ARG)187 set_var_boxtype( int cn,
188                  int yes  FL_UNUSED_ARG )
189 {
190     int i;
191 
192     for ( i = 0; i < cnumb; i++ )
193         if ( classes[ i ].cn == cn )
194             classes[ i ].var_boxtype = 1;
195 }
196 
197 
198 /***************************************
199  ***************************************/
200 
201 static FL_OBJECT *
fd_create_free(int type,FL_Coord x,FL_Coord y,FL_Coord w,FL_Coord h,const char * l)202 fd_create_free( int          type,
203                 FL_Coord     x,
204                 FL_Coord     y,
205                 FL_Coord     w,
206                 FL_Coord     h,
207                 const char * l )
208 {
209     return fl_create_free( type, x, y, w, h, l, noop_handle );
210 }
211 
212 
213 /***************************************
214  ***************************************/
215 
216 static FL_OBJECT *
fd_add_free(int type,FL_Coord x,FL_Coord y,FL_Coord w,FL_Coord h,const char * l)217 fd_add_free( int          type,
218              FL_Coord     x,
219              FL_Coord     y,
220              FL_Coord     w,
221              FL_Coord     h,
222              const char * l )
223 {
224     FL_OBJECT *obj = fl_add_free( type, x, y, w, h, l, noop_handle );
225 
226     obj->c_vdata = NULL;
227     return obj;
228 }
229 
230 
231 /****
232   INITIALIZING THE CLASSES
233 ****/
234 
235 int cur_class = -1;     /* class selected in the object class browser */
236 
237 
238 /****
239   CALLBACK ROUTINES
240 ****/
241 
242 /***************************************
243  * Handles a class change event
244  ***************************************/
245 
246 void
object_cb(FL_OBJECT * obj,long arg FL_UNUSED_ARG)247 object_cb( FL_OBJECT * obj,
248            long        arg  FL_UNUSED_ARG )
249 {
250     int line = fl_get_browser( obj );
251 
252     clear_selection( );
253     redraw_the_form( 0 );
254 
255     cur_class = -1;
256 
257     if ( line > 0 )
258     {
259         const char *name = fl_get_browser_line( obj, line );
260         int i;
261 
262         for ( i = 0; *classes[ i ].cname && i < MAXCLASSES; i++ )
263             if ( ! strcmp( classes[ i ].cname, name ) )
264             {
265                 cur_class = classes[ i ].cn;
266                 break;
267             }
268     }
269 
270     select_pallette_entry( cur_class );
271 }
272 
273 
274 /***************************************
275  ***************************************/
276 
277 static void
add_button_types(int button_class)278 add_button_types( int button_class )
279 {
280     add_type_def( button_class, FL_NORMAL_BUTTON,     "NORMAL_BUTTON" );
281     add_type_def( button_class, FL_PUSH_BUTTON,       "PUSH_BUTTON" );
282     add_type_def( button_class, FL_RADIO_BUTTON,      "RADIO_BUTTON" );
283     add_type_def( button_class, FL_TOUCH_BUTTON,      "TOUCH_BUTTON" );
284     add_type_def( button_class, FL_HIDDEN_BUTTON,     "HIDDEN_BUTTON" );
285     add_type_def( button_class, FL_INOUT_BUTTON,      "INOUT_BUTTON" );
286     add_type_def( button_class, FL_MENU_BUTTON,       "MENU_BUTTON" );
287     add_type_def( button_class, FL_RETURN_BUTTON,     "RETURN_BUTTON" );
288     add_type_def( button_class, FL_HIDDEN_RET_BUTTON, "HIDDEN_RET_BUTTON" );
289 }
290 
291 
292 /***************************************
293  ***************************************/
294 
295 static void
add_frame_types(int frame_class)296 add_frame_types( int frame_class )
297 {
298     add_type_def( frame_class, FL_NO_FRAME,       "NO_FRAME" );
299     add_type_def( frame_class, FL_UP_FRAME,       "UP_FRAME" );
300     add_type_def( frame_class, FL_DOWN_FRAME,     "DOWN_FRAME" );
301     add_type_def( frame_class, FL_BORDER_FRAME,   "BORDER_FRAME" );
302     add_type_def( frame_class, FL_ENGRAVED_FRAME, "ENGRAVED_FRAME" );
303     add_type_def( frame_class, FL_ROUNDED_FRAME,  "ROUNDED_FRAME" );
304     add_type_def( frame_class, FL_EMBOSSED_FRAME, "EMBOSSED_FRAME" );
305     add_type_def( frame_class, FL_SHADOW_FRAME,   "SHADOW_FRAME" );
306     add_type_def( frame_class, FL_OVAL_FRAME,     "OVAL_FRAME" );
307 }
308 
309 
310 /***************************************
311  ***************************************/
312 
313 static void
add_slider_types(int sclass)314 add_slider_types( int sclass )
315 {
316     add_type_def( sclass, FL_VERT_SLIDER,         "VERT_SLIDER"         );
317     add_type_def( sclass, FL_HOR_SLIDER,          "HOR_SLIDER"          );
318     add_type_def( sclass, FL_VERT_FILL_SLIDER,    "VERT_FILL_SLIDER"    );
319     add_type_def( sclass, FL_HOR_FILL_SLIDER,     "HOR_FILL_SLIDER"     );
320     add_type_def( sclass, FL_VERT_NICE_SLIDER,    "VERT_NICE_SLIDER"    );
321     add_type_def( sclass, FL_HOR_NICE_SLIDER,     "HOR_NICE_SLIDER"     );
322     add_type_def( sclass, FL_VERT_BROWSER_SLIDER, "VERT_BROWSER_SLIDER" );
323     add_type_def( sclass, FL_HOR_BROWSER_SLIDER,  "HOR_BROWSER_SLIDER"  );
324     add_type_def( sclass, FL_VERT_PROGRESS_BAR,   "VERT_PROGRESS_BAR"   );
325     add_type_def( sclass, FL_HOR_PROGRESS_BAR,    "HOR_PROGRESS_BAR"    );
326 }
327 
328 /***************************************
329  ***************************************/
330 
331 static void
add_scrollbar_types(int sclass)332 add_scrollbar_types( int sclass )
333 {
334     add_type_def( sclass, FL_VERT_SCROLLBAR,      "VERT_SCROLLBAR"        );
335     add_type_def( sclass, FL_HOR_SCROLLBAR,       "HOR_SCROLLBAR"         );
336     add_type_def( sclass, FL_VERT_THIN_SCROLLBAR, "VERT_THIN_SCROLLBAR"   );
337     add_type_def( sclass, FL_HOR_THIN_SCROLLBAR,  "HOR_THIN_SCROLLBAR"    );
338     add_type_def( sclass, FL_VERT_NICE_SCROLLBAR, "VERT_NICE_SCROLLBAR"   );
339     add_type_def( sclass, FL_HOR_NICE_SCROLLBAR,  "HOR_NICE_SCROLLBAR"    );
340     add_type_def( sclass, FL_VERT_PLAIN_SCROLLBAR, "VERT_PLAIN_SCROLLBAR" );
341     add_type_def( sclass, FL_HOR_PLAIN_SCROLLBAR, "HOR_PLAIN_SCROLLBAR"   );
342 }
343 
344 
345 /***************************************
346  ***************************************/
347 
348 static void
add_chart_types(int cclass)349 add_chart_types( int cclass )
350 {
351     add_type_def( cclass, FL_BAR_CHART,        "BAR_CHART"        );
352     add_type_def( cclass, FL_HORBAR_CHART,     "HORBAR_CHART"     );
353     add_type_def( cclass, FL_LINE_CHART,       "LINE_CHART"       );
354     add_type_def( cclass, FL_FILLED_CHART,     "FILLED_CHART"     );
355     add_type_def( cclass, FL_SPIKE_CHART,      "SPIKE_CHART"      );
356     add_type_def( cclass, FL_PIE_CHART,        "PIE_CHART"        );
357     add_type_def( cclass, FL_SPECIALPIE_CHART, "SPECIALPIE_CHART" );
358 }
359 
360 
361 /***************************************
362  ***************************************/
363 
364 static void
add_xyplot_types(int xyclass)365 add_xyplot_types( int xyclass )
366 {
367     add_type_def( xyclass, FL_NORMAL_XYPLOT,     "NORMAL_XYPLOT"     );
368     add_type_def( xyclass, FL_ACTIVE_XYPLOT,     "ACTIVE_XYPLOT"     );
369     add_type_def( xyclass, FL_SQUARE_XYPLOT,     "SQUARE_XYPLOT"     );
370     add_type_def( xyclass, FL_CIRCLE_XYPLOT,     "CIRCLE_XYPLOT"     );
371     add_type_def( xyclass, FL_POINTS_XYPLOT,     "POINTS_XYPLOT"     );
372     add_type_def( xyclass, FL_LINEPOINTS_XYPLOT, "LINEPOINTS_XYPLOT" );
373     add_type_def( xyclass, FL_DASHED_XYPLOT,     "DASHED_XYPLOT"     );
374     add_type_def( xyclass, FL_DOTTED_XYPLOT,     "DOTTED_XYPLOT"     );
375     add_type_def( xyclass, FL_DOTDASHED_XYPLOT,  "DOTDASHED_XYPLOT"  );
376     add_type_def( xyclass, FL_LONGDASHED_XYPLOT, "LONGDASHED_XYPLOT" );
377     add_type_def( xyclass, FL_FILL_XYPLOT,       "FILL_XYPLOT"       );
378     add_type_def( xyclass, FL_IMPULSE_XYPLOT,    "IMPULSE_XYPLOT"    );
379     add_type_def( xyclass, FL_EMPTY_XYPLOT,      "EMPTY_XYPLOT"      );
380 }
381 
382 
383 /***************************************
384  * Initializes all the classes and types. Must be adapted
385  * to add new classes and types.
386  ***************************************/
387 
388 void
init_classes(void)389 init_classes( void )
390 {
391     static int initialized;
392     VN_pair *vp;
393     int bl = 0;
394 
395     if ( initialized )
396         return;
397 
398     initialized = 1;
399 
400     fl_set_browser_fontstyle( fd_control->objectbrowser, FL_TIMES_STYLE );
401 
402     fl_add_browser_line( fd_control->objectbrowser, "box" );
403     add_class_def( VN( FL_BOX ), OBJNAME( box ), ++bl );
404     for ( vp = vn_btype; vp->val >= 0; vp++ )
405         add_type_def( FL_BOX, vp->val, vp->name + 3 );
406     set_class_default( FL_BOX, FL_UP_BOX, "" );
407 
408     fl_add_browser_line( fd_control->objectbrowser, "frame" );
409     add_class_def( VN( FL_FRAME ), OBJNAME( frame ), ++bl );
410     add_frame_types( FL_FRAME );
411     set_class_default( FL_FRAME, FL_ENGRAVED_FRAME, "" );
412 
413     fl_add_browser_line( fd_control->objectbrowser, "labelframe" );
414     add_class_def( VN( FL_LABELFRAME ), OBJNAME( labelframe ), ++bl );
415     add_frame_types( FL_LABELFRAME );
416     set_class_default( FL_LABELFRAME, FL_ENGRAVED_FRAME, "frame" );
417 
418     fl_add_browser_line( fd_control->objectbrowser, "text" );
419     add_class_def( VN( FL_TEXT ), OBJNAME( text ), ++bl );
420     add_type_def( FL_TEXT, FL_NORMAL_TEXT, "NORMAL_TEXT" );
421     set_class_default( FL_TEXT, FL_NORMAL_TEXT, "text" );
422 
423     fl_add_browser_line( fd_control->objectbrowser, "bitmap" );
424     add_class_def( VN( FL_BITMAP ), OBJNAME( bitmap ), ++bl );
425     add_type_def( FL_BITMAP, FL_NORMAL_BITMAP, "NORMAL_BITMAP" );
426 
427     fl_add_browser_line( fd_control->objectbrowser, "pixmap" );
428     add_class_def( VN( FL_PIXMAP ), OBJNAME( pixmap ), ++bl );
429     add_type_def( FL_PIXMAP, FL_NORMAL_PIXMAP, "NORMAL_PIXMAP" );
430 
431     fl_add_browser_line( fd_control->objectbrowser, "chart" );
432     add_class_def( VN( FL_CHART ), OBJNAME( chart ), ++bl );
433     add_chart_types( FL_CHART );
434 
435     fl_add_browser_line( fd_control->objectbrowser, "clock" );
436     add_class_def( VN( FL_CLOCK ), OBJNAME( clock ), ++bl );
437     add_type_def( FL_CLOCK, FL_ANALOG_CLOCK,  "ANALOG_CLOCK" );
438     add_type_def( FL_CLOCK, FL_DIGITAL_CLOCK, "DIGITAL_CLOCK" );
439     set_class_default( FL_CLOCK, FL_ANALOG_CLOCK, "" );
440 
441     fl_add_browser_line( fd_control->objectbrowser, "@-" );
442     bl++;
443 
444     fl_add_browser_line( fd_control->objectbrowser, "button" );
445     add_class_def( VN( FL_BUTTON ), OBJNAME( button ), ++bl );
446     add_button_types( FL_BUTTON );
447     set_class_default( FL_BUTTON, FL_NORMAL_BUTTON, "button" );
448 
449     fl_add_browser_line( fd_control->objectbrowser, "roundbutton" );
450     add_class_def( VN( FL_ROUNDBUTTON ), OBJNAME( roundbutton ), ++bl );
451     add_button_types( FL_ROUNDBUTTON );
452     set_class_default( FL_ROUNDBUTTON, FL_PUSH_BUTTON, "button" );
453 
454     fl_add_browser_line( fd_control->objectbrowser, "round3dbutton" );
455     add_class_def( VN( FL_ROUND3DBUTTON ), OBJNAME( round3dbutton ), ++bl );
456     add_button_types( FL_ROUND3DBUTTON );
457     set_class_default( FL_ROUND3DBUTTON, FL_PUSH_BUTTON, "button" );
458 
459     fl_add_browser_line( fd_control->objectbrowser, "checkbutton" );
460     add_class_def( VN( FL_CHECKBUTTON ), OBJNAME( checkbutton ), ++bl );
461     add_button_types( FL_CHECKBUTTON );
462     set_class_default( FL_CHECKBUTTON, FL_PUSH_BUTTON, "button" );
463 
464     fl_add_browser_line( fd_control->objectbrowser, "lightbutton" );
465     add_class_def( VN( FL_LIGHTBUTTON ), OBJNAME( lightbutton ), ++bl );
466     add_button_types( FL_LIGHTBUTTON );
467     set_class_default( FL_LIGHTBUTTON, FL_PUSH_BUTTON, "button" );
468 
469     fl_add_browser_line( fd_control->objectbrowser, "scrollbutton" );
470     add_class_def( VN( FL_SCROLLBUTTON ), OBJNAME( scrollbutton ), ++bl );
471     add_button_types( FL_SCROLLBUTTON );
472     set_class_default( FL_SCROLLBUTTON, FL_TOUCH_BUTTON, "8" );
473 
474     fl_add_browser_line( fd_control->objectbrowser, "bitmapbutton" );
475     add_class_def( VN( FL_BITMAPBUTTON ), OBJNAME( bitmapbutton ), ++bl );
476     add_button_types( FL_BITMAPBUTTON );
477 
478     fl_add_browser_line( fd_control->objectbrowser, "pixmapbutton" );
479     add_class_def( VN( FL_PIXMAPBUTTON ), OBJNAME( pixmapbutton ), ++bl );
480     add_button_types( FL_PIXMAPBUTTON );
481 
482     fl_add_browser_line( fd_control->objectbrowser, "labelbutton" );
483     add_class_def( VN( FL_LABELBUTTON ), OBJNAME( labelbutton ), ++bl );
484     add_button_types( FL_LABELBUTTON );
485 
486     fl_add_browser_line( fd_control->objectbrowser, "@-" );
487     bl++;
488 
489     fl_add_browser_line( fd_control->objectbrowser, "slider" );
490     add_class_def( VN( FL_SLIDER ), OBJNAME( slider ), ++bl );
491     add_slider_types( FL_SLIDER );
492 
493     fl_add_browser_line( fd_control->objectbrowser, "valslider" );
494     add_class_def( VN( FL_VALSLIDER ), OBJNAME( valslider ), ++bl );
495     add_slider_types( FL_VALSLIDER );
496 
497     fl_add_browser_line( fd_control->objectbrowser, "scrollbar" );
498     add_class_def( VN( FL_SCROLLBAR ), OBJNAME( scrollbar ), ++bl );
499     add_scrollbar_types( FL_SCROLLBAR );
500 
501     fl_add_browser_line( fd_control->objectbrowser, "dial" );
502     add_class_def( VN( FL_DIAL ), OBJNAME( dial ), ++bl );
503     add_type_def( FL_DIAL, FL_NORMAL_DIAL, "NORMAL_DIAL" );
504     add_type_def( FL_DIAL, FL_LINE_DIAL, "LINE_DIAL" );
505     add_type_def( FL_DIAL, FL_FILL_DIAL, "FILL_DIAL" );
506     set_var_boxtype( FL_DIAL, 1 );
507 
508     fl_add_browser_line( fd_control->objectbrowser, "positioner" );
509     add_class_def( VN( FL_POSITIONER ), OBJNAME( positioner ), ++bl );
510     add_type_def( FL_POSITIONER, FL_NORMAL_POSITIONER,  "NORMAL_POSITIONER" );
511     add_type_def( FL_POSITIONER, FL_OVERLAY_POSITIONER, "OVERLAY_POSITIONER" );
512     add_type_def( FL_POSITIONER, FL_INVISIBLE_POSITIONER,
513                   "INVISIBLE_POSITIONER" );
514     set_var_boxtype( FL_POSITIONER, 1 );
515 
516     fl_add_browser_line( fd_control->objectbrowser, "thumbwheel" );
517     add_class_def( VN( FL_THUMBWHEEL ), OBJNAME( thumbwheel ), ++bl );
518     add_type_def( FL_THUMBWHEEL, FL_HOR_THUMBWHEEL,  "HOR_THUMBWHEEL" );
519     add_type_def( FL_THUMBWHEEL, FL_VERT_THUMBWHEEL, "VERT_THUMBWHEEL" );
520 
521     fl_add_browser_line( fd_control->objectbrowser, "counter" );
522     add_class_def( VN( FL_COUNTER ), OBJNAME( counter ), ++bl );
523     add_type_def( FL_COUNTER, FL_NORMAL_COUNTER, "NORMAL_COUNTER" );
524     add_type_def( FL_COUNTER, FL_SIMPLE_COUNTER, "SIMPLE_COUNTER" );
525 
526     fl_add_browser_line( fd_control->objectbrowser, "spinner" );
527     add_class_def( VN( FL_SPINNER ), OBJNAME( spinner ), ++bl );
528     add_type_def( FL_SPINNER, FL_INT_SPINNER, "INT_SPINNER" );
529     add_type_def( FL_SPINNER, FL_FLOAT_SPINNER, "FLOAT_SPINNER" );
530 
531     fl_add_browser_line( fd_control->objectbrowser, "@-" );
532     bl++;
533 
534     fl_add_browser_line( fd_control->objectbrowser, "input" );
535     add_class_def( VN( FL_INPUT ), OBJNAME( input ), ++bl );
536     add_type_def( FL_INPUT, FL_NORMAL_INPUT,    "NORMAL_INPUT" );
537     add_type_def( FL_INPUT, FL_FLOAT_INPUT,     "FLOAT_INPUT" );
538     add_type_def( FL_INPUT, FL_INT_INPUT,       "INT_INPUT" );
539     add_type_def( FL_INPUT, FL_HIDDEN_INPUT,    "HIDDEN_INPUT" );
540     add_type_def( FL_INPUT, FL_MULTILINE_INPUT, "MULTILINE_INPUT" );
541     add_type_def( FL_INPUT, FL_SECRET_INPUT,    "SECRET_INPUT" );
542     add_type_def( FL_INPUT, FL_DATE_INPUT,      "DATE_INPUT" );
543 
544     fl_add_browser_line( fd_control->objectbrowser, "@-" );
545     bl++;
546 
547     fl_add_browser_line( fd_control->objectbrowser, "menu" );
548     add_class_def( VN( FL_MENU ), OBJNAME( menu ), ++bl );
549     add_type_def( FL_MENU, FL_PUSH_MENU,     "PUSH_MENU" );
550     add_type_def( FL_MENU, FL_PULLDOWN_MENU, "PULLDOWN_MENU" );
551     add_type_def( FL_MENU, FL_TOUCH_MENU,    "TOUCH_MENU" );
552     set_var_boxtype( FL_MENU, 1 );
553 
554     fl_add_browser_line( fd_control->objectbrowser, "choice" );
555     add_class_def( VN( FL_CHOICE ), OBJNAME( choice ), ++bl );
556     add_type_def( FL_CHOICE, FL_NORMAL_CHOICE,   "NORMAL_CHOICE" );
557     add_type_def( FL_CHOICE, FL_NORMAL_CHOICE2,  "NORMAL_CHOICE2" );
558     add_type_def( FL_CHOICE, FL_DROPLIST_CHOICE, "DROPLIST_CHOICE" );
559     set_var_boxtype( FL_CHOICE, 1 );
560 
561     fl_add_browser_line( fd_control->objectbrowser, "browser" );
562     add_class_def( VN( FL_BROWSER), OBJNAME( browser ), ++bl );
563     add_type_def( FL_BROWSER, FL_NORMAL_BROWSER, "NORMAL_BROWSER" );
564     add_type_def( FL_BROWSER, FL_SELECT_BROWSER, "SELECT_BROWSER" );
565     add_type_def( FL_BROWSER, FL_HOLD_BROWSER,   "HOLD_BROWSER" );
566     add_type_def( FL_BROWSER, FL_DESELECTABLE_HOLD_BROWSER,
567                                                  "DESELECTABLE_HOLD_BROWSER" );
568     add_type_def( FL_BROWSER, FL_MULTI_BROWSER,  "MULTI_BROWSER" );
569 
570     fl_add_browser_line( fd_control->objectbrowser, "@-" );
571     bl++;
572 
573     fl_add_browser_line( fd_control->objectbrowser, "timer" );
574     add_class_def( VN( FL_TIMER ), OBJNAME( timer ), ++bl );
575     add_type_def( FL_TIMER, FL_NORMAL_TIMER, "NORMAL_TIMER" );
576     add_type_def( FL_TIMER, FL_VALUE_TIMER,  "VALUE_TIMER" );
577     add_type_def( FL_TIMER, FL_HIDDEN_TIMER, "HIDDEN_TIMER" );
578     set_class_default( FL_TIMER, FL_NORMAL_TIMER, "timer" );
579 
580     fl_add_browser_line( fd_control->objectbrowser, "@-" );
581     bl++;
582 
583     fl_add_browser_line( fd_control->objectbrowser, "xyplot" );
584     add_class_def( VN( FL_XYPLOT ), OBJNAME( xyplot ), ++bl );
585     add_xyplot_types( FL_XYPLOT );
586 
587     fl_add_browser_line( fd_control->objectbrowser, "@-" );
588     bl++;
589 
590     fl_add_browser_line( fd_control->objectbrowser, "canvas" );
591     add_class_def( VN( FL_CANVAS ), "canvas",
592                    fl_create_simu_canvas, fl_add_simu_canvas, ++bl );
593     add_type_def( FL_CANVAS, FL_NORMAL_CANVAS,   "NORMAL_CANVAS" );
594     add_type_def( FL_CANVAS, FL_SCROLLED_CANVAS, "SCROLLED_CANVAS" );
595     set_class_default( FL_CANVAS, FL_NORMAL_CANVAS, "" );
596 
597     fl_add_browser_line( fd_control->objectbrowser, "glcanvas" );
598     add_class_def( VN( FL_GLCANVAS ), "glcanvas",
599                    fl_create_simu_glcanvas, fl_add_simu_glcanvas, ++bl );
600     add_type_def( FL_GLCANVAS, FL_NORMAL_CANVAS,   "NORMAL_CANVAS" );
601     add_type_def( FL_GLCANVAS, FL_SCROLLED_CANVAS, "SCROLLED_CANVAS" );
602     set_class_default( FL_GLCANVAS, FL_NORMAL_CANVAS, "" );
603 
604     fl_add_browser_line( fd_control->objectbrowser, "@-" );
605     bl++;
606 
607     fl_add_browser_line( fd_control->objectbrowser, "tabfolder" );
608     add_class_def( FL_NTABFOLDER, "FL_TABFOLDER", "tabfolder",
609                    fl_create_ntabfolder, fl_add_ntabfolder, ++bl );
610     add_type_def( FL_NTABFOLDER, FL_TOP_TABFOLDER, "TOP_TABFOLDER" );
611     add_type_def( FL_NTABFOLDER, FL_BOTTOM_TABFOLDER, "BOTTOM_TABFOLDER" );
612     set_class_default( FL_NTABFOLDER, FL_TOP_TABFOLDER, "" );
613 
614     fl_add_browser_line( fd_control->objectbrowser, "formbrowser" );
615     add_class_def( FL_FORMBROWSER, "FL_FORMBROWSER", "formbrowser",
616                    fl_create_nformbrowser, fl_add_nformbrowser, ++bl );
617     add_type_def( FL_FORMBROWSER, FL_NORMAL_FORMBROWSER, "NORMAL_FORMBROWSER" );
618 
619     fl_add_browser_line( fd_control->objectbrowser, "@-" );
620     bl++;
621 
622     fl_add_browser_line( fd_control->objectbrowser, "freeobject" );
623     add_class_def( VN( FL_FREE ), "freeobject", fd_create_free, fd_add_free,
624                    ++bl );
625     add_type_def( FL_FREE, FL_NORMAL_FREE,     "NORMAL_FREE" );
626     add_type_def( FL_FREE, FL_INACTIVE_FREE,   "INACTIVE_FREE" );
627     add_type_def( FL_FREE, FL_INPUT_FREE,      "INPUT_FREE" );
628     add_type_def( FL_FREE, FL_CONTINUOUS_FREE, "CONTINUOUS_FREE" );
629     add_type_def( FL_FREE, FL_ALL_FREE, "ALL_FREE" );
630 
631     /* ADD NEW CLASSES HERE */
632 
633     /* Group must be last, palette.c need this */
634 
635     add_class_def( VN( FL_BEGIN_GROUP ), "group", 0, 0, 0 );
636     add_type_def( FL_BEGIN_GROUP, 0, "0" );
637 
638     add_class_def( VN( FL_END_GROUP ), "endgroup", 0, 0, 0 );
639     add_type_def( FL_END_GROUP, 0, "0" );
640 }
641 
642 
643 /***************************************
644  ***************************************/
645 
646 void
select_object_by_class(int cn)647 select_object_by_class( int cn )
648 {
649     int i;
650 
651     for ( i = 0; i < cnumb; i++ )
652         if ( classes[ i ].cn == cn )
653         {
654             fl_select_browser_line( fd_control->objectbrowser,
655                                     classes[ i ].bline );
656             fl_show_browser_line( fd_control->objectbrowser,
657                                   classes[ i ].bline );
658             cur_class = cn;
659             break;
660         }
661 }
662 
663 
664 /****
665   GETTING INFORMATION ABOUT CLASSES AND TYPES
666 ****/
667 
668 /***************************************
669  * Returns a pointer to the (short) name of the class
670  ***************************************/
671 
672 char *
find_class_name(int cln)673 find_class_name( int cln )
674 {
675     int i;
676     static char buf[ MAX_CLASS_NAME_LEN ];
677 
678     for ( i = 0; i < cnumb; i++ )
679         if ( classes[ i ].cn == cln )
680             return classes[ i ].cname;
681     sprintf( buf, "%d", cln );
682     return buf;
683 }
684 
685 
686 /***************************************
687  * Returns a pointer to the formal name of the class
688  ***************************************/
689 
690 char *
class_name(int cls)691 class_name( int cls )
692 {
693     int i;
694     static char buf[ MAX_CLASS_NAME_LEN ];
695 
696     for ( i = 0; i < cnumb; i++ )
697         if ( classes[ i ].cn == cls )
698             return classes[ i ].formal_cname;
699     sprintf( buf, "%d", cls );
700     return buf;
701 }
702 
703 
704 /***************************************
705  * Returns the class value
706  ***************************************/
707 
708 int
class_val(const char * name)709 class_val( const char * name )
710 {
711     int i;
712 
713     for ( i = 0; i < cnumb; i++ )
714     {
715         if (    strcmp( classes[ i ].cname, name ) == 0
716              || strcmp( classes[ i ].formal_cname, name ) == 0 )
717             return classes[ i ].cn;
718     }
719 
720     return atoi( name );
721 }
722 
723 
724 /***************************************
725  * Returns a pointer to the default object of the class. var_boxtype
726  * means different type may have different boxtypes
727  ***************************************/
728 
729 FL_OBJECT *
find_class_default(int cln,int t)730 find_class_default( int cln,
731                     int t )
732 {
733     int i;
734     CDEF *c = classes;
735 
736     for ( i = 0; i < cnumb; i++, c++ )
737         if ( c->cn == cln )
738         {
739             if ( c->var_boxtype )
740             {
741                 if ( c->defobj1 )
742                     fl_free_object( c->defobj1 );
743                 return c->defobj1 = c->createit( t, 0, 0, 1, 1, "" );
744             }
745             else
746                 return c->defobj;
747         }
748 
749     return NULL;
750 }
751 
752 
753 /***************************************
754  * Returns the number of types in the class
755  ***************************************/
756 
757 int
find_class_maxtype(int cln)758 find_class_maxtype( int cln )
759 {
760     int i, j,
761         n = 0;
762 
763     for ( i = 0; i < cnumb; i++ )
764         if ( classes[ i ].cn == cln )
765             for ( j = 0; j < MAXTYPES; j++ )
766                 if ( classes[ i ].types[ j ].defined )
767                     n++;
768     return n;
769 }
770 
771 
772 /***************************************
773  * Returns a pointer to the name of the type in the class
774  ***************************************/
775 
776 const char *
find_type_name(int cln,int tyn)777 find_type_name( int cln,
778                 int tyn )
779 {
780     int i;
781     static char buf[ MAX_TYPE_NAME_LEN ];
782 
783     for ( i = 0; i < cnumb; i++ )
784         if ( classes[ i ].cn == cln )
785             return classes[ i ].types[ tyn ].tname;
786     sprintf( buf, "%d", tyn );
787     return buf;
788 }
789 
790 
791 /***************************************
792  * Returns a integer indicating the value of a type
793  ***************************************/
794 
795 int
find_type_value(int cln,const char * type_name)796 find_type_value( int          cln,
797                  const char * type_name )
798 {
799     int i,
800         jmax = find_class_maxtype( cln ),
801         j;
802 
803     for ( i = 0; i < cnumb; i++ )
804         if ( classes[ i ].cn == cln )
805             for ( j = 0; j < jmax; j++ )
806                 if (    ! strcmp( classes[ i ].types[ j ].tname, type_name )
807                      || (    ! strncmp( type_name, "FL_", 3 )
808                           && ! strcmp( classes[ i ].types[ j ].tname,
809                                        type_name + 3 ) ) )
810                     return j;
811 
812     M_err( "TypeValue", "type %s is unknown", type_name );
813     return -1;
814 }
815 
816 
817 /****
818   ADDING OBJECTS
819 ****/
820 
821 #define pm_width  28
822 #define pm_height 28
823 
824 
825 /***************************************
826  ***************************************/
827 
828 void
set_testing_pixmap(FL_OBJECT * ob)829 set_testing_pixmap( FL_OBJECT * ob )
830 {
831     fl_set_pixmap_data( ob, broken );
832 }
833 
834 
835 /***************************************
836  ***************************************/
837 
838 void
set_testing_bitmap(FL_OBJECT * obj)839 set_testing_bitmap( FL_OBJECT * obj )
840 {
841     if ( obj->objclass == FL_BITMAP )
842         fl_set_bitmap_data( obj, broken_width, broken_height,
843                             ( unsigned char * ) broken_bits );
844     else
845         fl_set_bitmapbutton_data( obj, broken_width, broken_height,
846                                   ( unsigned char * ) broken_bits );
847 }
848 
849 
850 /***************************************
851  * Adds an object to the current form  type = -1 means default type
852  ***************************************/
853 
854 FL_OBJECT *
add_an_object(int objclass,int type,FL_Coord x,FL_Coord y,FL_Coord w,FL_Coord h)855 add_an_object( int      objclass,
856                int      type,
857                FL_Coord x,
858                FL_Coord y,
859                FL_Coord w,
860                FL_Coord h )
861 {
862     FL_OBJECT *obj = NULL;
863     CDEF *cls;
864     static FL_FORM *cf = NULL;
865 
866     if ( cur_form == NULL )
867         return NULL;
868 
869     /* This routine is called with X coordinate system, need to translate to
870        up-right coordinate system */
871 
872     if ( ! ( cls = find_class_struct( objclass ) ) )
873     {
874         fprintf( stderr, "unknown class %d\n", objclass );
875         return 0;
876     }
877 
878     if ( ! cf )
879         fl_addto_form( cur_form );
880 
881     switch ( objclass )
882     {
883         case FL_BEGIN_GROUP:
884             cf = cur_form;
885             obj = fl_bgn_group( );
886             break;
887 
888         case FL_END_GROUP:
889             obj = fli_end_group( );
890             break;
891 
892         case FL_BITMAP:
893             if ( type == -1 )
894                 type = FL_NORMAL_BITMAP;
895             obj = cls->addit( type, x, y, w, h, "" );
896             if ( ! fdopt.conv_only )
897                 set_testing_bitmap( obj );
898             break;
899 
900         case FL_PIXMAP:
901             if ( type == -1 )
902                 type = FL_NORMAL_PIXMAP;
903             obj = cls->addit( type, x, y, w, h, "" );
904             if ( ! fdopt.conv_only )
905                 set_testing_pixmap( obj );
906             break;
907 
908         case FL_CHART:
909             if ( type == -1 )
910                 type = FL_BAR_CHART;
911             obj = cls->addit( type, x, y, w, h, "" );
912             fl_add_chart_value( obj, 4.0, "item 1", 2 );
913             fl_add_chart_value( obj, 8.0, "item 2", 3 );
914             fl_add_chart_value( obj, 2.0, "item 3", 4 );
915             fl_add_chart_value( obj, 5.0, "item 4", 5 );
916             break;
917 
918         case FL_BITMAPBUTTON:
919             if ( type == -1 )
920                 type = FL_NORMAL_BUTTON;
921             obj = cls->addit( type, x, y, w, h, "" );
922             if ( ! fdopt.conv_only )
923                 set_testing_bitmap( obj );
924             break;
925 
926         case FL_PIXMAPBUTTON:
927             if ( type == -1 )
928                 type = FL_NORMAL_BUTTON;
929             obj = cls->addit( type, x, y, w, h, "" );
930             if ( ! fdopt.conv_only )
931                 set_testing_pixmap( obj );
932             break;
933 
934         case FL_SLIDER:
935             if ( type == -1 )
936                 type = h > w ? FL_VERT_BROWSER_SLIDER : FL_HOR_BROWSER_SLIDER;
937             obj = cls->addit( type, x, y, w, h, "" );
938             break;
939 
940         case FL_VALSLIDER:
941             if ( type == -1 )
942                 type = h > w ? FL_VERT_BROWSER_SLIDER : FL_HOR_BROWSER_SLIDER;
943             obj = cls->addit( type, x, y, w, h, "" );
944             break;
945 
946         case FL_SCROLLBAR:
947             if ( type == -1 )
948                 type = h > w ? FL_VERT_SCROLLBAR : FL_HOR_SCROLLBAR;
949             obj = cls->addit( type, x, y, w, h, "" );
950             break;
951 
952         case FL_THUMBWHEEL:
953             if ( type == -1 )
954                 type = h > w ? FL_VERT_THUMBWHEEL : FL_HOR_THUMBWHEEL;
955             obj = cls->addit( type, x, y, w, h, "" );
956             break;
957 
958         case FL_INPUT:
959             if ( type == -1 )
960                 type = h < 60 ? FL_NORMAL_INPUT : FL_MULTILINE_INPUT;
961             obj = cls->addit( type, x, y, w, h, "Input" );
962             fl_set_input_hscrollbar( obj, FL_OFF );
963             fl_set_input_vscrollbar( obj, FL_OFF );
964             break;
965 
966         case FL_MENU:
967             if ( type == -1 )
968                 type = FL_PULLDOWN_MENU;
969             obj = cls->addit( type, x, y, w, h, "Menu" );
970             get_superspec( obj );       /* super spec must exist for testing */
971             break;
972 
973         case FL_CHOICE:
974             if ( type == -1 )
975                 type = FL_NORMAL_CHOICE2;
976             obj = cls->addit( type, x, y, w, h, "" );
977             get_superspec( obj );       /* super spec must exist for testing */
978             break;
979 
980         case FL_BROWSER:
981             if ( type == -1 )
982                 type = FL_NORMAL_BROWSER;
983             obj = cls->addit( type, x, y, w, h, "" );
984             get_superspec( obj );       /* super spec must exist for testing */
985             break;
986 
987         case FL_XYPLOT:
988             if ( type == -1 )
989                 type = FL_NORMAL_XYPLOT;
990             {
991                 float xx[ 30 ],
992                       yy[ 30 ];
993                 int i;
994 
995                 for ( i = 0; i < 30; i++ )
996                 {
997                     xx[ i ] = 3.1415 * ( i + 0.5 ) / 8.0;
998                     yy[ i ] = FL_abs( sin( 2 * xx[ i ] ) + cos( xx[ i ] ) );
999                 }
1000 
1001                 obj = cls->addit( type, x, y, w, h, "" );
1002                 fl_set_xyplot_data( obj, xx, yy, 30, "", "", "" );
1003             }
1004             break;
1005 
1006         case FL_FREE:
1007             if ( type == -1 )
1008                 type = FL_NORMAL_FREE;
1009             obj = fl_add_free( type, x, y, w, h, "", noop_handle );
1010             break;
1011 
1012         default:
1013             if ( type == -1 )
1014                 type = cls->default_type;
1015             obj = cls->addit( type, x, y, w, h, cls->default_label );
1016             break;
1017     }
1018 
1019     if ( ! obj )
1020     {
1021         fprintf( stderr, "Failed to create object (class = %d type = %d)\n",
1022                  objclass, type );
1023         return NULL;
1024     }
1025 
1026     obj->fl1 = obj->x;
1027     obj->fr1 = cur_form->w_hr - obj->fl1;
1028     obj->ft1 = obj->y;
1029     obj->fb1 = cur_form->h_hr - obj->ft1;
1030 
1031     obj->fl2 = obj->x + obj->w;
1032     obj->fr2 = cur_form->w - obj->fl2;
1033     obj->ft2 = obj->y + obj->h;
1034     obj->fb2 = cur_form->h - obj->ft2;
1035 
1036     if ( ! cf || objclass == FL_END_GROUP )
1037     {
1038         fl_end_form( );
1039         cf = NULL;
1040     }
1041 
1042     obj->active = 1;
1043 
1044     return obj;
1045 }
1046 
1047 
1048 /*
1049  * Local variables:
1050  * tab-width: 4
1051  * indent-tabs-mode: nil
1052  * End:
1053  */
1054