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 sp_scrollbar.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  * Settting slider class specific attributes.
27  */
28 
29 #ifdef HAVE_CONFIG_H
30 #include "config.h"
31 #endif
32 
33 #include "fd_main.h"
34 #include "fd_spec.h"
35 #include "sp_scrollbar.h"
36 #include "spec/scrollbar_spec.h"
37 #include "private/pscrollbar.h"
38 
39 
40 static FD_scrollbarattrib *scb_attrib;
41 static FL_OBJECT * curobj;
42 
43 
44 /***************************************
45  ***************************************/
46 
47 FL_FORM *
scrollbar_create_spec_form(void)48 scrollbar_create_spec_form( void )
49 {
50     if ( scb_attrib )
51         return scb_attrib->scrollbarattrib;
52 
53     scb_attrib = create_form_scrollbarattrib( );
54 
55     setup_how_return_menu( scb_attrib->returnsetting );
56     fl_set_menu_item_mode( scb_attrib->returnsetting, 5,
57                            FL_PUP_BOX | FL_PUP_GRAY );
58     fl_set_menu_item_mode( scb_attrib->returnsetting, 6,
59                            FL_PUP_BOX | FL_PUP_GRAY );
60 
61     return scb_attrib->scrollbarattrib;
62 }
63 
64 
65 /***************************************
66  ***************************************/
67 
68 #define is_vert( t ) (    t == FL_VERT_SCROLLBAR      \
69                        || t == FL_VERT_NICE_SCROLLBAR \
70                        || t == FL_VERT_THIN_SCROLLBAR )
71 
72 
73 void
scrollbar_adjust_spec_form(FL_OBJECT * obj)74 scrollbar_adjust_spec_form( FL_OBJECT * obj )
75 {
76     curobj = obj;
77 
78     if ( is_vert( obj->type ) )
79     {
80         fl_set_object_label( scb_attrib->minval, "Value at top" );
81         fl_set_object_label( scb_attrib->maxval, "Value at bottom" );
82     }
83     else
84     {
85         fl_set_object_label( scb_attrib->minval, "Value at left" );
86         fl_set_object_label( scb_attrib->maxval, "Value at right" );
87     }
88 }
89 
90 
91 /***************************************
92  ***************************************/
93 
94 void
scrollbar_fill_in_spec_form(FL_OBJECT * obj)95 scrollbar_fill_in_spec_form( FL_OBJECT * obj )
96 {
97     double r1, r2;
98 
99     fl_get_scrollbar_bounds( obj, &r1, &r2 );
100     set_finput_value( scb_attrib->minval, r1, -1 );
101     set_finput_value( scb_attrib->maxval, r2, -1 );
102 
103     set_finput_value( scb_attrib->initial_val,
104                       fl_get_scrollbar_value( obj ), -1 );
105 
106     set_finput_value( scb_attrib->slsize, fl_get_scrollbar_size( obj ), 2 );
107 
108     fl_get_scrollbar_increment( obj, &r1, &r2 );
109     set_finput_value( scb_attrib->ldelta, r1, -1 );
110     set_finput_value( scb_attrib->rdelta, r2, -1 );
111 
112     reset_how_return_menu( scb_attrib->returnsetting, obj->how_return );
113 }
114 
115 
116 /***************************************
117  ***************************************/
118 
119 void
scrollbar_reread_spec_form(FL_OBJECT * obj)120 scrollbar_reread_spec_form( FL_OBJECT * obj )
121 {
122     double r1, r2;
123 
124     if (    get_checked_float( fl_get_input( scb_attrib->minval ), &r1 )
125          && get_checked_float( fl_get_input( scb_attrib->maxval ), &r2 ) )
126         fl_set_scrollbar_bounds( obj, r1, r2 );
127 
128     if ( get_checked_float( fl_get_input( scb_attrib->initial_val ), &r1 ) )
129          fl_set_scrollbar_value( obj, r1 );
130 
131     if ( get_checked_float( fl_get_input( scb_attrib->slsize ), &r1 ) )
132         fl_set_scrollbar_size( obj, r1 );
133 
134     if (    get_checked_float( fl_get_input( scb_attrib->ldelta ), &r1 )
135          && get_checked_float( fl_get_input( scb_attrib->ldelta ), &r2 ) )
136         fl_set_scrollbar_increment( obj, r1, r2 );
137 
138     redraw_the_form( 0 );
139 }
140 
141 
142 /***************************************
143  ***************************************/
144 
145 void
scrollbar_emit_spec_fd_code(FILE * fp,FL_OBJECT * obj)146 scrollbar_emit_spec_fd_code( FILE      * fp,
147                              FL_OBJECT * obj )
148 {
149     FL_OBJECT *defobj = fl_create_scrollbar( obj->type, 0, 0, 0, 0, "" );
150     double r1, r2, def_r1, def_r2;
151 
152     fl_get_scrollbar_bounds( obj, &r1, &r2 );
153     fl_get_scrollbar_bounds( defobj, &def_r1, &def_r2 );
154 
155     if ( r1 != def_r1 || r2 != def_r2 )
156         fprintf( fp, "    bounds: %g %g\n", r1, r2 );
157 
158     r1     = fl_get_scrollbar_value( obj );
159     def_r1 = fl_get_scrollbar_value( defobj );
160 
161     if ( r1 != def_r1 )
162         fprintf( fp, "    value: %g\n", r1 );
163 
164     r1     = fl_get_scrollbar_size( obj );
165     def_r1 = fl_get_scrollbar_size( defobj );
166 
167     if ( r1 != def_r1 )
168         fprintf( fp, "    slsize: %.2f\n", r1 );
169 
170     fl_get_scrollbar_increment( obj, &r1, &r2 );
171     fl_get_scrollbar_increment( defobj, &def_r1, &def_r2 );
172 
173     if ( r1 != def_r1 || r2 != def_r2 )
174         fprintf( fp, "    increment: %g %g\n", r1, r2 );
175 }
176 
177 
178 /***************************************
179  ***************************************/
180 
181 void
scrollbar_emit_spec_c_code(FILE * fp,FL_OBJECT * obj)182 scrollbar_emit_spec_c_code( FILE      * fp,
183                             FL_OBJECT * obj )
184 {
185     FL_OBJECT *defobj = fl_create_scrollbar( obj->type, 0, 0, 0, 0, "" );
186     double r1, r2, def_r1, def_r2;
187 
188     fl_get_scrollbar_bounds( obj, &r1, &r2 );
189     fl_get_scrollbar_bounds( defobj, &def_r1, &def_r2 );
190 
191     if ( r1 != def_r1 || r2 != def_r2 )
192         fprintf( fp, "    fl_set_scrollbar_bounds( obj, %g, %g );\n",
193                  r1, r2 );
194 
195     r1     = fl_get_scrollbar_value( obj );
196     def_r1 = fl_get_scrollbar_value( defobj );
197 
198     if ( r1 != def_r1 )
199         fprintf( fp, "    fl_set_scrollbar_value( obj, %g );\n", r1 );
200 
201     r1     = fl_get_scrollbar_size( obj );
202     def_r1 = fl_get_scrollbar_size( defobj );
203 
204     if ( r1 != def_r1 )
205         fprintf( fp, "    fl_set_scrollbar_size( obj, %.2f );\n", r1 );
206 
207     fl_get_scrollbar_increment( obj, &r1, &r2 );
208     fl_get_scrollbar_increment( defobj, &def_r1, &def_r2 );
209 
210     if ( r1 != def_r1 || r2 != def_r2 )
211         fprintf( fp, "    fl_set_scrollbar_increment( obj, %g, %g );\n",
212                  r1, r2 );
213 }
214 
215 
216 /***************************************
217  ***************************************/
218 
219 void
scb_minmax_change(FL_OBJECT * obj FL_UNUSED_ARG,long data FL_UNUSED_ARG)220 scb_minmax_change( FL_OBJECT * obj   FL_UNUSED_ARG,
221                    long        data  FL_UNUSED_ARG )
222 {
223     double min = get_finput_value( scb_attrib->minval );
224     double max = get_finput_value( scb_attrib->maxval );
225 
226     fl_set_scrollbar_bounds( curobj, min, max );
227     redraw_the_form( 0 );
228 }
229 
230 
231 /***************************************
232  ***************************************/
233 
234 void
scb_delta_change(FL_OBJECT * obj FL_UNUSED_ARG,long data FL_UNUSED_ARG)235 scb_delta_change( FL_OBJECT * obj   FL_UNUSED_ARG,
236                   long        data  FL_UNUSED_ARG )
237 {
238     double ldelta = get_finput_value( scb_attrib->ldelta );
239     double rdelta = get_finput_value( scb_attrib->rdelta );
240 
241     fl_set_scrollbar_increment( curobj, ldelta, rdelta );
242     redraw_the_form( 0 );
243 }
244 
245 
246 /***************************************
247  ***************************************/
248 
249 void
scb_slsize_change(FL_OBJECT * obj,long data FL_UNUSED_ARG)250 scb_slsize_change( FL_OBJECT * obj,
251                    long        data  FL_UNUSED_ARG )
252 {
253     double slsize = get_finput_value( obj );
254 
255     fl_set_scrollbar_size( curobj, slsize );
256     redraw_the_form( 0 );
257 }
258 
259 
260 /***************************************
261  ***************************************/
262 
263 void
scb_initialvalue_change(FL_OBJECT * obj,long data FL_UNUSED_ARG)264 scb_initialvalue_change( FL_OBJECT * obj,
265                          long        data  FL_UNUSED_ARG )
266 {
267     double val = get_finput_value( obj );
268 
269     fl_set_scrollbar_value( curobj, val );
270     redraw_the_form( 0 );
271 }
272 
273 
274 /***************************************
275  ***************************************/
276 
277 void
scb_returnsetting_change(FL_OBJECT * obj,long data FL_UNUSED_ARG)278 scb_returnsetting_change( FL_OBJECT * obj,
279                           long        data  FL_UNUSED_ARG )
280 {
281     handle_how_return_changes( obj, curobj );
282 }
283 
284 
285 #include "spec/scrollbar_spec.c"
286 
287 
288 /*
289  * Local variables:
290  * tab-width: 4
291  * indent-tabs-mode: nil
292  * End:
293  */
294