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