comparison lwlib/xlwcheckbox.c @ 398:74fd4e045ea6 r21-2-29

Import from CVS: tag r21-2-29
author cvs
date Mon, 13 Aug 2007 11:13:30 +0200
parents
children de805c49cfc1
comparison
equal deleted inserted replaced
397:f4aeb21a5bad 398:74fd4e045ea6
1 /* Checkbox Widget for XEmacs.
2 Copyright (C) 1999 Edward A. Falk
3
4 This file is part of XEmacs.
5
6 XEmacs is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
9 later version.
10
11 XEmacs is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with XEmacs; see the file COPYING. If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
20
21 /* Synched up with: Checkbox.c 1.1 */
22
23 /*
24 * Checkbox.c - Checkbox button widget
25 *
26 * Author: Edward A. Falk
27 * falk@falconer.vip.best.com
28 *
29 * Date: June 30, 1997
30 *
31 * Overview: This widget is identical to the Radio widget in behavior,
32 * except that the button is square and has a check mark.
33 */
34
35
36 #include <config.h>
37 #include <stdio.h>
38
39 #include <X11/IntrinsicP.h>
40 #include <X11/StringDefs.h>
41 #include ATHENA_INCLUDE(XawInit.h)
42 #include "../src/xmu.h"
43 #include "xlwcheckboxP.h"
44
45
46 /* by using the same size for the checkbox as for the diamond box,
47 * we can let the Radio widget do the vast majority of the work.
48 */
49
50 #define BOX_SIZE 8
51 #define DRAW_CHECK 0 /* don't draw the check mark */
52
53 #define cclass(w) ((CheckboxWidgetClass)((w)->core.widget_class))
54
55 #ifdef _ThreeDP_h
56 #define swid(cw) ((cw)->threeD.shadow_width)
57 #else
58 #define swid(cw) ((cw)->core.border_width)
59 #endif
60
61 #define bsize(cw) (cclass(cw)->radio_class.dsize)
62 #define bs(cw) (bsize(cw) + 2*swid(cw))
63
64
65 #if DRAW_CHECK
66 #define check_width 14
67 #define check_height 14
68 static u_char check_bits[] = {
69 0x00, 0x00, 0x00, 0x20, 0x00, 0x18, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x03,
70 0x8c, 0x03, 0xde, 0x01, 0xff, 0x01, 0xfe, 0x00, 0xfc, 0x00, 0x78, 0x00,
71 0x70, 0x00, 0x20, 0x00};
72 #endif
73
74
75 /****************************************************************
76 *
77 * Full class record constant
78 *
79 ****************************************************************/
80
81
82 #if DRAW_CHECK
83 static char defaultTranslations[] =
84 "<EnterWindow>: highlight()\n\
85 <LeaveWindow>: unpress(draw) unhighlight()\n\
86 <Btn1Down>: press()\n\
87 <Btn1Down>,<Btn1Up>: unpress(nodraw) toggle() notify()";
88 #endif
89
90
91
92 #define offset(field) XtOffsetOf(CheckboxRec, field)
93 static XtResource resources[] = {
94 {XtNtristate, XtCTristate, XtRBoolean, sizeof(Boolean),
95 offset(checkbox.tristate), XtRImmediate, (XtPointer)FALSE},
96 } ;
97 #undef offset
98
99 /* Member functions */
100
101 static void CheckboxClassInit (void);
102 static void CheckboxInit (Widget, Widget, ArgList, Cardinal *);
103 #if DRAW_CHECK
104 static void CheckboxRealize (Widget, Mask *, XSetWindowAttributes *);
105 #endif
106 static void DrawCheck (Widget);
107
108
109 /* Action procs */
110 #if DRAW_CHECK
111 static void CheckboxPress (Widget, XEvent *, String *, Cardinal *);
112 static void CheckboxUnpress (Widget, XEvent *, String *, Cardinal *);
113 #endif
114
115 /* internal privates */
116
117 #if DRAW_CHECK
118 static XtActionsRec actionsList[] =
119 {
120 {"press", CheckboxPress},
121 {"unpress", CheckboxUnpress},
122 } ;
123 #endif
124
125 #define SuperClass ((RadioWidgetClass)&radioClassRec)
126
127 CheckboxClassRec checkboxClassRec = {
128 {
129 (WidgetClass) SuperClass, /* superclass */
130 "Checkbox", /* class_name */
131 sizeof(CheckboxRec), /* size */
132 CheckboxClassInit, /* class_initialize */
133 NULL, /* class_part_initialize */
134 FALSE, /* class_inited */
135 CheckboxInit, /* initialize */
136 NULL, /* initialize_hook */
137 #if DRAW_CHECK
138 CheckboxRealize, /* realize */
139 actionsList, /* actions */
140 XtNumber(actionsList), /* num_actions */
141 #else
142 XtInheritRealize, /* realize */
143 NULL, /* actions */
144 0, /* num_actions */
145 #endif
146 resources, /* resources */
147 XtNumber(resources), /* resource_count */
148 NULLQUARK, /* xrm_class */
149 TRUE, /* compress_motion */
150 TRUE, /* compress_exposure */
151 TRUE, /* compress_enterleave */
152 FALSE, /* visible_interest */
153 NULL, /* destroy */
154 XtInheritResize, /* resize */
155 XtInheritExpose, /* expose */
156 NULL, /* set_values */
157 NULL, /* set_values_hook */
158 XtInheritSetValuesAlmost, /* set_values_almost */
159 NULL, /* get_values_hook */
160 NULL, /* accept_focus */
161 XtVersion, /* version */
162 NULL, /* callback_private */
163 #if DRAW_CHECK
164 defaultTranslations, /* tm_table */
165 #else
166 XtInheritTranslations, /* tm_table */
167 #endif
168 XtInheritQueryGeometry, /* query_geometry */
169 XtInheritDisplayAccelerator, /* display_accelerator */
170 NULL /* extension */
171 }, /* CoreClass fields initialization */
172 {
173 XtInheritChangeSensitive /* change_sensitive */
174 }, /* SimpleClass fields initialization */
175 #ifdef _ThreeDP_h
176 {
177 XtInheritXaw3dShadowDraw /* field not used */
178 }, /* ThreeDClass fields initialization */
179 #endif
180 {
181 0 /* field not used */
182 }, /* LabelClass fields initialization */
183 {
184 0 /* field not used */
185 }, /* CommandClass fields initialization */
186 {
187 RadioSet, /* Set Procedure. */
188 RadioUnset, /* Unset Procedure. */
189 NULL /* extension. */
190 }, /* ToggleClass fields initialization */
191 {
192 BOX_SIZE,
193 DrawCheck, /* draw procedure */
194 NULL /* extension. */
195 }, /* RadioClass fields initialization */
196 {
197 NULL /* extension. */
198 }, /* CheckboxClass fields initialization */
199 };
200
201 /* for public consumption */
202 WidgetClass checkboxWidgetClass = (WidgetClass) &checkboxClassRec;
203
204
205
206
207
208
209 /****************************************************************
210 *
211 * Class Methods
212 *
213 ****************************************************************/
214
215 static void
216 CheckboxClassInit (void)
217 {
218 XawInitializeWidgetSet();
219 }
220
221
222 /*ARGSUSED*/
223 static void
224 CheckboxInit (Widget request,
225 Widget new,
226 ArgList args,
227 Cardinal *num_args)
228 {
229 #if DRAW_CHECK
230 CheckboxWidget cw = (CheckboxWidget) new;
231 cw->checkbox.checkmark = None ;
232 cw->checkbox.checkmark_GC = None ;
233 #endif
234 }
235
236
237 #if DRAW_CHECK
238 static void
239 CheckboxRealize(Widget w,
240 Mask *valueMask,
241 XSetWindowAttributes *attributes)
242 {
243 CheckboxWidget cw = (CheckboxWidget) w;
244 XtGCMask value_mask, dynamic_mask, dontcare_mask ;
245 XGCValues values ;
246
247 /* first, call superclass realize */
248 (*checkboxWidgetClass->core_class.superclass->core_class.realize)
249 (w, valueMask, attributes);
250
251 /* TODO: cache this via xmu */
252 if( cw->checkbox.checkmark == None )
253 cw->checkbox.checkmark =
254 XCreateBitmapFromData( XtDisplay(w), XtWindow(w),
255 check_bits,check_width,check_height);
256
257 values.fill_style = FillStippled ;
258 values.stipple = cw->checkbox.checkmark ;
259 values.foreground = cw->label.foreground ;
260 value_mask = GCFillStyle | GCStipple | GCForeground ;
261 dynamic_mask = GCTileStipXOrigin | GCTileStipYOrigin ;
262 dontcare_mask = GCLineWidth | GCLineStyle | GCCapStyle | GCJoinStyle |
263 GCFont | GCSubwindowMode | GCGraphicsExposures |
264 GCDashOffset | GCDashList | GCArcMode ;
265 cw->checkbox.checkmark_GC =
266 XtAllocateGC(w, 0, value_mask, &values, dynamic_mask, dontcare_mask) ;
267 }
268 #endif
269
270
271 /* Function Name: CheckboxDestroy
272 * Description: Destroy Callback for checkbox widget.
273 * Arguments: w - the checkbox widget that is being destroyed.
274 * junk, grabage - not used.
275 * Returns: none.
276 */
277
278 /* ARGSUSED */
279 static void
280 CheckboxDestroy (Widget w,
281 XtPointer junk,
282 XtPointer garbage)
283 {
284 #if DRAW_CHECK
285 CheckboxWidget cw = (CheckboxWidget) w;
286
287 /* TODO: cache this via xmu */
288 if( cw->checkbox.checkmark != None )
289 XFreePixmap( XtDisplay(w), cw->checkbox.checkmark ) ;
290 if( cw->checkbox.checkmark_GC != None )
291 XtReleaseGC(w, cw->checkbox.checkmark_GC) ;
292 #endif
293 }
294
295
296
297 #if DRAW_CHECK
298 /************************************************************
299 *
300 * Actions Procedures
301 *
302 ************************************************************/
303
304 /* ARGSUSED */
305 static void
306 CheckboxPress (Widget w,
307 XEvent *event,
308 String *params, /* unused */
309 Cardinal *num_params) /* unused */
310 {
311 CheckboxWidget cw = (CheckboxWidget) w ;
312 if( !cw->checkbox.pressed ) {
313 cw->checkbox.pressed = TRUE ;
314 ((CheckboxWidgetClass)(w->core.widget_class))->radio_class.drawDiamond(w) ;
315 }
316 }
317
318 static void
319 CheckboxUnpress (Widget w,
320 XEvent *event,
321 String *params, /* unused */
322 Cardinal *num_params) /* unused */
323 {
324 CheckboxWidget cw = (CheckboxWidget) w ;
325 int i ;
326
327 if( cw->checkbox.pressed ) {
328 cw->checkbox.pressed = FALSE ;
329 if( *num_params > 0 && **params == 'd' )
330 ((CheckboxWidgetClass)(w->core.widget_class))->radio_class.drawDiamond(w);
331 }
332 }
333 #endif
334
335
336
337
338
339 /************************************************************
340 *
341 * Internal Procedures
342 *
343 ************************************************************/
344
345 static void
346 DrawCheck (Widget w)
347 {
348 CheckboxWidget cw = (CheckboxWidget) w ;
349 Display *dpy = XtDisplay(w) ;
350 Window win = XtWindow(w) ;
351 GC gc ;
352
353 #ifdef _ThreeDP_h
354 XPoint pts[6] ;
355 #endif
356 Dimension s = swid(cw);
357 Dimension bsz = bsize(cw);
358 Position bx,by ; /* Check upper-left */
359 Dimension bw,bh ;
360 #ifdef _ThreeDP_h
361 GC top, bot;
362 #endif
363 GC ctr ;
364
365 /* foreground GC */
366 gc = XtIsSensitive(w) ? cw->command.normal_GC : cw->label.gray_GC ;
367
368 bw = bh = bs(cw) ;
369 bx = cw->label.internal_width ;
370 by = cw->core.height/2 - bh/2 ;
371
372 #ifdef _ThreeDP_h
373 if( !cw->command.set ) {
374 top = cw->threeD.top_shadow_GC ;
375 bot = cw->threeD.bot_shadow_GC ;
376 } else {
377 top = cw->threeD.bot_shadow_GC ;
378 bot = cw->threeD.top_shadow_GC ;
379 }
380 ctr = cw->command.inverse_GC ;
381 #else
382 ctr = cw->command.set ? cw->command.normal_GC : cw->command.inverse_GC ;
383 #endif
384
385 XFillRectangle(dpy,win,ctr, bx+s,by+s, bsz,bsz) ;
386
387 #ifdef _ThreeDP_h
388 /* top-left shadow */
389 pts[0].x = bx ; pts[0].y = by ;
390 pts[1].x = bw ; pts[1].y = 0 ;
391 pts[2].x = -s ; pts[2].y = s ;
392 pts[3].x = -bsz ; pts[3].y = 0 ;
393 pts[4].x = 0 ; pts[4].y = bsz ;
394 pts[5].x = -s ; pts[5].y = s ;
395 XFillPolygon(dpy,win,top, pts,6, Nonconvex,CoordModePrevious) ;
396 /* bottom-right shadow */
397 pts[0].x = bx+bw ; pts[0].y = by+bh ;
398 pts[1].x = -bw ; pts[1].y = 0 ;
399 pts[2].x = s ; pts[2].y = -s ;
400 pts[3].x = bsz ; pts[3].y = 0 ;
401 pts[4].x = 0 ; pts[4].y = -bsz ;
402 pts[5].x = s ; pts[5].y = -s ;
403 XFillPolygon(dpy,win,bot, pts,6, Nonconvex,CoordModePrevious) ;
404 #else
405 XDrawRectangle(dpy,win,gc, bx+s,by+s, bsz,bsz) ;
406 #endif
407
408 #if DRAW_CHECK
409 if( cw->command.set && cw->checkbox.checkmark_GC != None ) {
410 XSetTSOrigin(dpy,cw->checkbox.checkmark_GC, bx+s, by+s) ;
411 XFillRectangle(dpy,win,cw->checkbox.checkmark_GC,
412 bx+s, by+s, check_width,check_height) ;
413 }
414 #endif
415 }