1 /********************************************************************
2 This file is part of the abs 0.907 distribution. abs is a spreadsheet
3 with graphical user interface.
4
5 Copyright (C) 1998-2001 Andr� Bertin (Andre.Bertin@ping.be)
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version if in the same spirit as version 2.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20
21 Concact: abs@pi.be
22 http://home.pi.be/bertin/abs.shtml
23
24 *********************************************************************/
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 #include "button.h"
53
54
55
56
57
58 #include "check0.xpm"
59 #include "check1.xpm"
60 #include "radio0.xpm"
61 #include "radio1.xpm"
62
63
64 Pixmap
make_bitmap_from_data(parent,bits,w,h)65 make_bitmap_from_data (parent, bits, w, h)
66 Widget parent;
67 char *bits;
68 int w, h;
69 {
70 return
71 XCreateBitmapFromData (XtDisplay (parent),
72 DefaultRootWindow (XtDisplay (parent)), bits, w, h);
73 }
74
75 int
make_pixmap_from_data(Widget parent,char ** bits,Pixmap * bm)76 make_pixmap_from_data (Widget parent, char **bits, Pixmap * bm)
77 {
78 XpmAttributes xpm_attr;
79 XpmColorSymbol none_color =
80 {NULL, "None", (Pixel) 0};
81
82
83 xpm_attr.valuemask = XpmSize | XpmCloseness;
84 xpm_attr.closeness = 40000;
85 xpm_attr.numsymbols = 1;
86 xpm_attr.colorsymbols = &none_color;
87 XtVaGetValues (parent, XtNbackground, &none_color.pixel, NULL);
88 XpmCreatePixmapFromData (XtDisplay (parent),
89 DefaultRootWindow (XtDisplay (parent)), bits, bm, NULL, &xpm_attr);
90
91 return 0;
92 }
93
94 Widget
make_button_pixmap(Widget parent,char * name,char ** pix_bits,void (* ftccallback)(),XtPointer param)95 make_button_pixmap (Widget parent, char *name, char **pix_bits,
96 void (*ftccallback) (), XtPointer param)
97 {
98 Widget button;
99 Pixmap bm;
100 Arg args[20];
101 register int n;
102
103 n = 0;
104 make_pixmap_from_data (parent, pix_bits, &bm);
105 XtSetArg (args[n], XtNbitmap, bm);
106 n++;
107 XtSetArg (args[n], XtNlabel, "");
108 n++;
109
110 if (ftccallback != NULL)
111 {
112 XtSetArg (args[n], XtNhighlightThickness, 1);
113 n++;
114 XtSetArg (args[n], XtNborderWidth, 0);
115 n++;
116 XtSetArg (args[n], XtNinternalHeight, 1);
117 n++;
118 XtSetArg (args[n], XtNinternalWidth, 1);
119 n++;
120 }
121 else
122 {
123 XtSetArg (args[n], XtNhighlightThickness, 0);
124 n++;
125 XtSetArg (args[n], XtNborderWidth, 0);
126 n++;
127 XtSetArg (args[n], XtNinternalHeight, 1);
128 n++;
129 XtSetArg (args[n], XtNinternalWidth, 1);
130 n++;
131 }
132 button = XtCreateManagedWidget (name, commandWidgetClass, parent, args, n);
133 if (ftccallback != NULL)
134 XtAddCallback (button, XtNcallback, ftccallback, param);
135 return button;
136 }
137
138
139 Widget
make_bar_button_pixmap(Widget menu_bar,char * name,char ** pix_bits)140 make_bar_button_pixmap (Widget menu_bar, char *name, char **pix_bits)
141 {
142 Pixmap bm;
143 Arg args[20];
144 register int n;
145
146 n = 0;
147 make_pixmap_from_data (menu_bar, pix_bits, &bm);
148 XtSetArg (args[n], XtNbitmap, bm);
149 n++;
150 XtSetArg (args[n], XtNlabel, "");
151 n++;
152
153 XtSetArg (args[n], XtNhighlightThickness, 1);
154 n++;
155 XtSetArg (args[n], XtNborderWidth, 0);
156 n++;
157 XtSetArg (args[n], XtNinternalHeight, 1);
158 n++;
159 XtSetArg (args[n], XtNinternalWidth, 1);
160 n++;
161 return XtCreateManagedWidget
162 (name, menuButtonWidgetClass, menu_bar, args, n);
163 }
164
165
166 Widget
make_repeater_pixmap(Widget parent,char * name,char ** pix_bits,void (* ftccallback)(),XtPointer param)167 make_repeater_pixmap (Widget parent, char *name, char **pix_bits,
168 void (*ftccallback) (), XtPointer param)
169 {
170 Widget button;
171 Pixmap bm;
172 Arg args[20];
173 register int n;
174
175 n = 0;
176 make_pixmap_from_data (parent, pix_bits, &bm);
177 XtSetArg (args[n], XtNbitmap, bm);
178 n++;
179 XtSetArg (args[n], XtNlabel, "");
180 n++;
181
182 XtSetArg (args[n], XtNhighlightThickness, 1);
183 n++;
184 XtSetArg (args[n], XtNborderWidth, 0);
185 n++;
186 XtSetArg (args[n], XtNinternalHeight, 1);
187 n++;
188 XtSetArg (args[n], XtNinternalWidth, 1);
189 n++;
190 button = XtCreateManagedWidget (name, repeaterWidgetClass, parent, args, n);
191 XtAddCallback (button, XtNcallback, ftccallback, param);
192 return button;
193 }
194
195 Widget
make_toggle_pixmap(parent,name,pix_bits,ftccallback,param)196 make_toggle_pixmap (parent, name, pix_bits, ftccallback, param)
197 Widget parent;
198 char *name;
199 char **pix_bits;
200 void (*ftccallback) ();
201 XtPointer param;
202 {
203 Widget button;
204 Pixmap bm;
205 Arg args[20];
206 register int n;
207
208 n = 0;
209 make_pixmap_from_data (parent, pix_bits, &bm);
210 XtSetArg (args[n], XtNbitmap, bm);
211 n++;
212 XtSetArg (args[n], XtNlabel, "");
213 n++;
214
215 XtSetArg (args[n], XtNhighlightThickness, 1);
216 n++;
217 XtSetArg (args[n], XtNborderWidth, 0);
218 n++;
219 XtSetArg (args[n], XtNinternalHeight, 1);
220 n++;
221 XtSetArg (args[n], XtNinternalWidth, 1);
222 n++;
223 button = XtCreateManagedWidget (name, toggleWidgetClass, parent, args, n);
224 if (ftccallback != NULL)
225 XtAddCallback (button, XtNcallback, ftccallback, param);
226 return button;
227 }
228
229 Widget
make_menu_button_pixmap(Widget parent,char * name,char ** pix_bits,void (* ftccallback)(),XtPointer param)230 make_menu_button_pixmap (Widget parent, char *name, char **pix_bits,
231 void (*ftccallback) (), XtPointer param)
232 {
233 Pixmap bm;
234 Arg args[20];
235 register int n;
236
237 n = 0;
238 make_pixmap_from_data (parent, pix_bits, &bm);
239 XtSetArg (args[n], XtNbitmap, bm);
240 n++;
241 XtSetArg (args[n], XtNlabel, "");
242 n++;
243
244 XtSetArg (args[n], XtNhighlightThickness, 1);
245 n++;
246 XtSetArg (args[n], XtNborderWidth, 0);
247 n++;
248 XtSetArg (args[n], XtNinternalHeight, 1);
249 n++;
250 XtSetArg (args[n], XtNinternalWidth, 1);
251 n++;
252 return XtCreateManagedWidget (name, menuButtonWidgetClass, parent, args, n);
253
254
255
256 }
257
258
259
260 static int first_check = 1;
261 static Pixmap check0;
262 static Pixmap check1;
263
264 void
changecheck(w,closure,call_data)265 changecheck (w, closure, call_data)
266 Widget w;
267 XtPointer closure, call_data;
268 {
269 Arg args[1];
270 Boolean on;
271
272 XtSetArg (args[0], XtNstate, &on);
273 XtGetValues (w, args, 1);
274
275 if (on)
276 XtSetArg (args[0], XtNbitmap, check1);
277 else
278 XtSetArg (args[0], XtNbitmap, check0);
279
280 XtSetValues (w, args, 1);
281 }
282
283 int
setcheck(w,on)284 setcheck (w, on)
285 Widget w;
286 int on;
287 {
288 Arg args[2];
289
290 XtSetArg (args[0], XtNstate, on);
291
292 if (on)
293 XtSetArg (args[1], XtNbitmap, check1);
294 else
295 XtSetArg (args[1], XtNbitmap, check0);
296
297 XtSetValues (w, args, 2);
298 return on;
299 }
300
301 Boolean
getcheck(w)302 getcheck (w)
303 Widget w;
304 {
305 Boolean on;
306 Arg args[1];
307 XtSetArg (args[0], XtNstate, &on);
308 XtGetValues (w, args, 1);
309 return on;
310 }
311
312
313 Widget
make_check(parent,name,ftccallback,param)314 make_check (parent, name, ftccallback, param)
315 Widget parent;
316 char *name;
317 void (*ftccallback) ();
318 XtPointer param;
319 {
320 Widget button;
321 Arg args[20];
322 register int n;
323
324 if (first_check)
325 {
326 make_pixmap_from_data (parent, check0_xpm, &check0);
327 make_pixmap_from_data (parent, check1_xpm, &check1);
328 first_check = 0;
329 }
330
331 n = 0;
332 XtSetArg (args[n], XtNbitmap, check0);
333 n++;
334 XtSetArg (args[n], XtNlabel, "");
335 n++;
336
337 XtSetArg (args[n], XtNhighlightThickness, 0);
338 n++;
339 XtSetArg (args[n], XtNborderWidth, 0);
340 n++;
341 XtSetArg (args[n], XtNinternalHeight, 0);
342 n++;
343 XtSetArg (args[n], XtNinternalWidth, 0);
344 n++;
345 button = XtCreateManagedWidget (name, toggleWidgetClass, parent, args, n);
346
347 XtAddCallback (button, XtNcallback, changecheck, NULL);
348
349 if (ftccallback != NULL)
350 XtAddCallback (button, XtNcallback, ftccallback, param);
351 return button;
352 }
353
354
355
356 static int first_radio = 1;
357 static Pixmap radio0;
358 static Pixmap radio1;
359
360 void
changeradio(w,closure,call_data)361 changeradio (w, closure, call_data)
362 Widget w;
363 XtPointer closure, call_data;
364 {
365 Arg args[1];
366 Boolean on;
367
368 XtSetArg (args[0], XtNstate, &on);
369 XtGetValues (w, args, 1);
370
371 if (on)
372 XtSetArg (args[0], XtNbitmap, radio1);
373 else
374 XtSetArg (args[0], XtNbitmap, radio0);
375
376 XtSetValues (w, args, 1);
377 }
378
379 int
setradio(w,on)380 setradio (w, on)
381 Widget w;
382 int on;
383 {
384 Arg args[2];
385
386 XtSetArg (args[0], XtNstate, on);
387
388 if (on)
389 XtSetArg (args[1], XtNbitmap, radio1);
390 else
391 XtSetArg (args[1], XtNbitmap, radio0);
392
393 XtSetValues (w, args, 2);
394 return on;
395 }
396
397 Boolean
getradio(w)398 getradio (w)
399 Widget w;
400 {
401 Boolean on;
402 Arg args[1];
403 XtSetArg (args[0], XtNstate, &on);
404 XtGetValues (w, args, 1);
405 return on;
406 }
407
408
409 Widget
make_radio(Widget parent,char * name,Widget group,void (* ftccallback)(),XtPointer param)410 make_radio (Widget parent, char *name, Widget group, void (*ftccallback) (), XtPointer param)
411 {
412 Widget button;
413 Arg args[20];
414 register int n;
415
416 if (first_radio)
417 {
418 make_pixmap_from_data (parent, radio0_xpm, &radio0);
419 make_pixmap_from_data (parent, radio1_xpm, &radio1);
420 first_radio = 0;
421 }
422
423 n = 0;
424 XtSetArg (args[n], XtNlabel, "");
425 n++;
426
427 XtSetArg (args[n], XtNhighlightThickness, 0);
428 n++;
429 XtSetArg (args[n], XtNborderWidth, 0);
430 n++;
431 XtSetArg (args[n], XtNinternalHeight, 0);
432 n++;
433 XtSetArg (args[n], XtNinternalWidth, 0);
434 n++;
435 if (group != NULL)
436 {
437 XtSetArg (args[n], XtNradioGroup, group);
438 n++;
439 XtSetArg (args[n], XtNbitmap, radio0);
440 n++;
441 }
442 else
443 {
444 XtSetArg (args[n], XtNstate, True);
445 n++;
446 XtSetArg (args[n], XtNbitmap, radio1);
447 n++;
448 }
449 button = XtCreateManagedWidget (name, toggleWidgetClass, parent, args, n);
450
451 XtAddCallback (button, XtNcallback, changeradio, NULL);
452
453 if (ftccallback != NULL)
454 XtAddCallback (button, XtNcallback, ftccallback, param);
455 return button;
456 }
457