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