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