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 #ifdef HAVE_CONFIG_H
20 #include "config.h"
21 #endif
22
23 #include <float.h>
24
25 #include "fd_main.h"
26 #include "fd_spec.h"
27 #include "sp_spinner.h"
28 #include "private/pspinner.h"
29 #include "spec/spinner_spec.h"
30
31 static FD_spinnerattrib * spn_attrib;
32 static FL_OBJECT * curobj;
33
34
35 /***************************************
36 ***************************************/
37
38 void
spinner_change_type(FL_OBJECT * obj,int new_type)39 spinner_change_type( FL_OBJECT * obj,
40 int new_type )
41 {
42 FLI_SPINNER_SPEC *sp = obj->spec;
43
44 if ( obj->type == FL_INT_SPINNER )
45 {
46 sp->f_min = sp->i_min;
47 sp->f_max = sp->i_max;
48 sp->f_val = sp->i_val;
49 sp->f_incr = sp->i_incr;
50 }
51 else
52 {
53 sp->i_min = sp->f_min;
54 sp->i_max = sp->f_max;
55 sp->i_val = sp->f_val;
56 sp->i_incr = sp->f_incr;
57 }
58
59 obj->type = new_type;
60 }
61
62
63 /***************************************
64 ***************************************/
65
66 FL_FORM *
spinner_create_spec_form(void)67 spinner_create_spec_form( void )
68 {
69 if ( spn_attrib )
70 return spn_attrib->spinnerattrib;
71
72 spn_attrib = create_form_spinnerattrib( );
73
74 setup_how_return_menu( spn_attrib->returnsetting );
75 fl_set_menu_item_mode( spn_attrib->returnsetting, 5,
76 FL_PUP_BOX | FL_PUP_GRAY );
77 fl_set_menu_item_mode( spn_attrib->returnsetting, 6,
78 FL_PUP_BOX | FL_PUP_GRAY );
79
80 return spn_attrib->spinnerattrib;
81 }
82
83
84 /***************************************
85 ***************************************/
86
87 void
spinner_adjust_spec_form(FL_OBJECT * obj)88 spinner_adjust_spec_form( FL_OBJECT * obj )
89 {
90 curobj = obj;
91
92 if ( obj->type == FL_INT_SPINNER )
93 {
94 fl_hide_object( spn_attrib->prec );
95 }
96 else
97 {
98 fl_set_counter_step( spn_attrib->prec, 1, 2 );
99 fl_set_counter_bounds( spn_attrib->prec, 0, DBL_DIG );
100 fl_set_counter_precision( spn_attrib->prec, 0 );
101 fl_show_object( spn_attrib->prec );
102 }
103
104 fl_set_object_return( spn_attrib->minval, FL_RETURN_END );
105 fl_set_object_return( spn_attrib->maxval, FL_RETURN_END );
106 fl_set_object_return( spn_attrib->initialval, FL_RETURN_END );
107 fl_set_object_return( spn_attrib->step, FL_RETURN_END );
108 }
109
110
111 /***************************************
112 ***************************************/
113
114 void
spinner_fill_in_spec_form(FL_OBJECT * obj)115 spinner_fill_in_spec_form( FL_OBJECT * obj )
116 {
117 FLI_SPINNER_SPEC *sp = obj->spec;
118
119 fl_set_counter_value( spn_attrib->prec, sp->prec );
120
121 if ( obj->type == FL_INT_SPINNER )
122 {
123 set_finput_value( spn_attrib->minval, sp->i_min, 0 );
124 set_finput_value( spn_attrib->maxval, sp->i_max, 0 );
125 set_finput_value( spn_attrib->initialval, sp->i_val, 0 );
126 set_finput_value( spn_attrib->step, sp->i_incr, 0 );
127 }
128 else
129 {
130 set_finput_value( spn_attrib->minval, sp->f_min, sp->prec );
131 set_finput_value( spn_attrib->maxval, sp->f_max, sp->prec );
132 set_finput_value( spn_attrib->initialval, sp->f_val, sp->prec );
133 set_finput_value( spn_attrib->step, sp->f_incr, sp->prec );
134 }
135
136 reset_how_return_menu( spn_attrib->returnsetting, obj->how_return );
137 }
138
139
140 /***************************************
141 ***************************************/
142
143 void
spinner_reread_spec_form(FL_OBJECT * obj)144 spinner_reread_spec_form( FL_OBJECT * obj )
145 {
146 double r1, r2;
147
148 if ( get_checked_float( fl_get_input( spn_attrib->minval ), &r1 )
149 && get_checked_float( fl_get_input( spn_attrib->maxval ), &r2 ) )
150 fl_set_spinner_bounds( obj, r1, r2 );
151
152 if ( get_checked_float( fl_get_input( spn_attrib->initialval ), &r1 ) )
153 fl_set_spinner_value( obj, r1 );
154
155 if ( get_checked_float( fl_get_input( spn_attrib->step ), &r1 ) )
156 fl_set_spinner_step( obj, r1 );
157
158 redraw_the_form( 0 );
159 }
160
161
162 /***************************************
163 ***************************************/
164
165 void
spinner_emit_spec_fd_code(FILE * fp,FL_OBJECT * obj)166 spinner_emit_spec_fd_code( FILE * fp,
167 FL_OBJECT * obj )
168 {
169 FL_OBJECT *defobj = fl_create_spinner( obj->type, 0, 0, 0, 0, "" );
170 FLI_SPINNER_SPEC *sp = obj->spec,
171 *defsp = defobj->spec;
172
173 if ( obj->type == FL_FLOAT_SPINNER && sp->prec != defsp->prec )
174 fprintf( fp, " precision: %d\n", sp->prec );
175
176 if ( obj->type == FL_INT_SPINNER )
177 {
178 if ( sp->i_min != defsp->i_min || sp->i_max != defsp->i_max )
179 fprintf( fp, " bounds: %d %d\n", sp->i_min, sp->i_max );
180
181 if ( sp->i_val != defsp->i_val )
182 fprintf( fp, " value: %d\n", sp->i_val );
183
184 if ( sp->i_incr != defsp->i_incr )
185 fprintf( fp, " step: %d\n", sp->i_incr );
186 }
187 else
188 {
189 if ( sp->f_min != defsp->f_min || sp->f_max != defsp->f_max )
190 fprintf( fp, " bounds: %.*fd %.*f\n",
191 sp->prec, sp->f_min, sp->prec, sp->f_max );
192
193 if ( sp->f_val != defsp->f_val )
194 fprintf( fp, " value: %.*f\n", sp->prec, sp->f_val );
195
196 if ( sp->f_incr != defsp->f_incr )
197 fprintf( fp, " step: %.*f\n", sp->prec, sp->f_incr );
198 }
199
200 fl_free_object( defobj );
201 }
202
203
204 /***************************************
205 ***************************************/
206
207 void
spinner_emit_spec_c_code(FILE * fp,FL_OBJECT * obj)208 spinner_emit_spec_c_code( FILE * fp,
209 FL_OBJECT * obj )
210 {
211 FL_OBJECT *defobj = fl_create_spinner( obj->type, 0, 0, 0, 0, "" );
212 FLI_SPINNER_SPEC *sp = obj->spec,
213 *defsp = defobj->spec;
214
215 if ( obj->type == FL_FLOAT_SPINNER && sp->prec != defsp->prec )
216 fprintf( fp, " fl_set_spinner_precision( obj, %d );\n", sp->prec );
217
218 if ( obj->type == FL_INT_SPINNER )
219 {
220 if ( sp->i_min != defsp->i_min || sp->i_max != defsp->i_max )
221 fprintf( fp, " fl_set_spinner_bounds( obj, %d, %d );\n",
222 sp->i_min, sp->i_max );
223
224 if ( sp->i_val != defsp->i_val )
225 fprintf( fp, " fl_set_spinner_value( obj, %d );\n", sp->i_val );
226
227 if ( sp->i_incr != defsp->i_incr )
228 fprintf( fp, " fl_set_spinner_step( obj, %d );\n", sp->i_incr );
229 }
230 else
231 {
232 if ( sp->f_min != defsp->f_min || sp->f_max != defsp->f_max )
233 fprintf( fp, " fl_set_spinner_bounds( obj, %.*f, %.*f );\n",
234 sp->prec, sp->f_min, sp->prec, sp->f_max );
235
236 if ( sp->f_val != defsp->f_val )
237 fprintf( fp, " fl_set_spinner_value( obj, %.*f );\n",
238 sp->prec, sp->f_val );
239
240 if ( sp->f_incr != defsp->f_incr )
241 fprintf( fp, " fl_set_spinner_step( obj, %.*f );\n",
242 sp->prec, sp->f_incr );
243 }
244
245 if ( obj->lsize != defobj->lsize )
246 fprintf( fp, " fl_set_object_lsize( fl_get_spinner_input( obj ), "
247 "%s );\n", lsize_name( obj->lsize ) );
248
249 if ( obj->lstyle != defobj->lstyle )
250 fprintf( fp, " fl_set_object_lstyle( fl_get_spinner_input( obj ), "
251 "%s );\n", style_name( obj->lstyle ) );
252
253 if ( obj->col1 != defobj->col1 || obj->col2 != defobj->col2 )
254 fprintf( fp, " fl_set_object_color( fl_get_spinner_input( obj ), "
255 "%s, %s );\n", fli_query_colorname( obj->col1 ),
256 fli_query_colorname( obj->col2 ) );
257
258 fl_free_object( defobj );
259 }
260
261
262 /***************************************
263 ***************************************/
264
265 void
spn_precision_cb(FL_OBJECT * obj,long data FL_UNUSED_ARG)266 spn_precision_cb( FL_OBJECT * obj,
267 long data FL_UNUSED_ARG )
268 {
269 fl_set_spinner_precision( curobj, fl_get_counter_value( obj ) );
270
271 spn_minmax_change( NULL, 0 );
272 spn_stepchange_cb( NULL, 0 );
273 spn_initialvalue_change( NULL, 0 );
274 }
275
276
277 /***************************************
278 ***************************************/
279
280 void
spn_minmax_change(FL_OBJECT * obj FL_UNUSED_ARG,long data FL_UNUSED_ARG)281 spn_minmax_change( FL_OBJECT * obj FL_UNUSED_ARG,
282 long data FL_UNUSED_ARG )
283 {
284 FLI_SPINNER_SPEC *sp = curobj->spec;
285
286 set_finput_value( spn_attrib->minval,
287 get_finput_value( spn_attrib->minval ),
288 curobj->type == FL_INT_SPINNER ? 0 : sp->prec );
289 set_finput_value( spn_attrib->maxval,
290 get_finput_value( spn_attrib->maxval ),
291 curobj->type == FL_INT_SPINNER ? 0 : sp->prec );
292
293 fl_set_spinner_bounds( curobj, get_finput_value( spn_attrib->minval ),
294 get_finput_value( spn_attrib->maxval ) );
295 redraw_the_form( 0 );
296 }
297
298
299 /***************************************
300 ***************************************/
301
302 void
spn_stepchange_cb(FL_OBJECT * obj,long data FL_UNUSED_ARG)303 spn_stepchange_cb( FL_OBJECT * obj,
304 long data FL_UNUSED_ARG )
305 {
306 FLI_SPINNER_SPEC *sp = curobj->spec;
307
308 set_finput_value( obj, get_finput_value( obj ),
309 curobj->type == FL_INT_SPINNER ? 0 : sp->prec );
310 fl_set_spinner_step( curobj, get_finput_value( obj ) );
311 redraw_the_form( 0 );
312 }
313
314
315 /***************************************
316 ***************************************/
317
318 void
spn_initialvalue_change(FL_OBJECT * obj,long data FL_UNUSED_ARG)319 spn_initialvalue_change( FL_OBJECT * obj,
320 long data FL_UNUSED_ARG )
321 {
322 FLI_SPINNER_SPEC *sp = curobj->spec;
323
324 set_finput_value( obj, get_finput_value( obj ),
325 curobj->type == FL_INT_SPINNER ? 0 : sp->prec );
326 fl_set_spinner_value( curobj, get_finput_value( obj ) );
327 redraw_the_form( 0 );
328 }
329
330
331 /***************************************
332 ***************************************/
333
334 void
spn_returnsetting_change(FL_OBJECT * obj,long data FL_UNUSED_ARG)335 spn_returnsetting_change( FL_OBJECT * obj,
336 long data FL_UNUSED_ARG )
337 {
338 handle_how_return_changes( obj, curobj );
339 }
340
341
342 #include "spec/spinner_spec.c"
343
344
345 /*
346 * Local variables:
347 * tab-width: 4
348 * indent-tabs-mode: nil
349 * End:
350 */
351