*** empty log message ***
[wmaker-crm.git] / WINGs / Extras / wtabledelegates.c
blob5cca34f53c80f14c384c1893b7a3a8e22305c6eb
3 #include <WINGs.h>
5 #include "wtableview.h"
7 #include "wtabledelegates.h"
9 typedef struct {
10 WMTableView *table;
11 WMFont *font;
12 GC gc;
13 GC selGc;
14 GC selTextGc;
15 } StringData;
18 typedef struct {
19 WMTableView *table;
20 GC selGc;
21 } PixmapData;
25 typedef struct {
26 WMTextField *widget;
27 WMTableView *table;
28 WMFont *font;
29 GC gc;
30 GC selGc;
31 GC selTextGc;
32 } StringEditorData;
35 typedef struct {
36 WMPopUpButton *widget;
37 WMTableView *table;
38 WMFont *font;
39 char **options;
40 int count;
41 GC gc;
42 GC selGc;
43 GC selTextGc;
44 } EnumSelectorData;
47 typedef struct {
48 WMButton *widget;
49 WMTableView *table;
50 Bool state;
51 GC gc;
52 } BooleanSwitchData;
55 static char *SelectionColor = "#bbbbcc";
59 static void stringDraw(WMScreen *scr, Drawable d, GC gc,
60 GC sgc, GC stgc, WMFont *font, void *data,
61 WMRect rect, Bool selected)
63 int x, y;
64 XRectangle rects[1];
65 Display *dpy = WMScreenDisplay(scr);
67 x = rect.pos.x + 5;
68 y = rect.pos.y + (rect.size.height - WMFontHeight(font))/2;
70 rects[0].x = rect.pos.x+1;
71 rects[0].y = rect.pos.y+1;
72 rects[0].width = rect.size.width-1;
73 rects[0].height = rect.size.height-1;
74 XSetClipRectangles(dpy, gc, 0, 0, rects, 1, YXSorted);
76 if (!selected) {
77 XClearArea(dpy, d, rects[0].x, rects[0].y,
78 rects[0].width, rects[0].height,
79 False);
81 WMDrawString(scr, d, gc, font, x, y,
82 data, strlen(data));
83 } else {
84 XFillRectangles(dpy, d, sgc, rects, 1);
86 WMDrawString(scr, d, stgc, font, x, y,
87 data, strlen(data));
90 XSetClipMask(dpy, gc, None);
95 static void pixmapDraw(WMScreen *scr, Drawable d, GC gc,
96 WMPixmap *pixmap, WMRect rect, Bool selected)
98 int x, y;
99 XRectangle rects[1];
100 Display *dpy = WMScreenDisplay(scr);
101 WMSize size;
103 rects[0].x = rect.pos.x+1;
104 rects[0].y = rect.pos.y+1;
105 rects[0].width = rect.size.width-1;
106 rects[0].height = rect.size.height-1;
107 XSetClipRectangles(dpy, gc, 0, 0, rects, 1, YXSorted);
109 if (!selected) {
110 XClearArea(dpy, d, rects[0].x, rects[0].y,
111 rects[0].width, rects[0].height,
112 False);
114 if (pixmap) {
115 size = WMGetPixmapSize(pixmap);
116 x = rect.pos.x + (rect.size.width - size.width) / 2;
117 y = rect.pos.y + (rect.size.height - size.height) / 2;
119 WMDrawPixmap(pixmap, d, x, y);
121 } else {
122 XFillRectangles(dpy, d, gc, rects, 1);
124 if (pixmap) {
125 size = WMGetPixmapSize(pixmap);
126 x = rect.pos.x + (rect.size.width - size.width) / 2;
127 y = rect.pos.y + (rect.size.height - size.height) / 2;
129 WMDrawPixmap(pixmap, d, x, y);
133 XSetClipMask(dpy, gc, None);
137 /* ---------------------------------------------------------------------- */
141 static void SECellPainter(WMTableColumnDelegate *self,
142 WMTableColumn *column, int row)
144 StringEditorData *strdata = (StringEditorData*)self->data;
145 WMTableView *table = WMGetTableColumnTableView(column);
147 stringDraw(WMWidgetScreen(table),
148 WMViewXID(WMGetTableViewDocumentView(table)),
149 strdata->gc, strdata->selGc, strdata->selTextGc, strdata->font,
150 WMTableViewDataForCell(table, column, row),
151 WMTableViewRectForCell(table, column, row),
152 False);
156 static void selectedSECellPainter(WMTableColumnDelegate *self,
157 WMTableColumn *column, int row)
159 StringEditorData *strdata = (StringEditorData*)self->data;
160 WMTableView *table = WMGetTableColumnTableView(column);
162 stringDraw(WMWidgetScreen(table),
163 WMViewXID(WMGetTableViewDocumentView(table)),
164 strdata->gc, strdata->selGc, strdata->selTextGc, strdata->font,
165 WMTableViewDataForCell(table, column, row),
166 WMTableViewRectForCell(table, column, row),
167 True);
171 static void beginSECellEdit(WMTableColumnDelegate *self,
172 WMTableColumn *column, int row)
174 StringEditorData *strdata = (StringEditorData*)self->data;
175 WMRect rect = WMTableViewRectForCell(strdata->table, column, row);
176 void *data = WMTableViewDataForCell(strdata->table, column, row);
178 WMSetTextFieldText(strdata->widget, (char*)data);
179 WMMoveWidget(strdata->widget, rect.pos.x, rect.pos.y);
180 WMResizeWidget(strdata->widget, rect.size.width+1, rect.size.height+1);
182 WMMapWidget(strdata->widget);
186 static void endSECellEdit(WMTableColumnDelegate *self,
187 WMTableColumn *column, int row)
189 StringEditorData *strdata = (StringEditorData*)self->data;
190 char *text;
192 WMUnmapWidget(strdata->widget);
194 text = WMGetTextFieldText(strdata->widget);
195 WMSetTableViewDataForCell(strdata->table, column, row, (void*)text);
199 WMTableColumnDelegate *WTCreateStringEditorDelegate(WMTableView *parent)
201 WMTableColumnDelegate *delegate = wmalloc(sizeof(WMTableColumnDelegate));
202 WMScreen *scr = WMWidgetScreen(parent);
203 StringEditorData *data = wmalloc(sizeof(StringEditorData));
205 data->widget = WMCreateTextField(parent);
206 W_ReparentView(WMWidgetView(data->widget),
207 WMGetTableViewDocumentView(parent),
208 0, 0);
209 data->table = parent;
210 data->font = WMSystemFontOfSize(scr, 12);
211 data->selGc = WMColorGC(WMCreateNamedColor(scr, SelectionColor, False));
212 data->selTextGc = WMColorGC(WMBlackColor(scr));
213 data->gc = WMColorGC(WMBlackColor(scr));
215 delegate->data = data;
216 delegate->drawCell = SECellPainter;
217 delegate->drawSelectedCell = selectedSECellPainter;
218 delegate->beginCellEdit = beginSECellEdit;
219 delegate->endCellEdit = endSECellEdit;
221 return delegate;
226 /* ---------------------------------------------------------------------- */
229 static void ESCellPainter(WMTableColumnDelegate *self,
230 WMTableColumn *column, int row)
232 EnumSelectorData *strdata = (EnumSelectorData*)self->data;
233 WMTableView *table = WMGetTableColumnTableView(column);
234 int i = (int)WMTableViewDataForCell(table, column, row);
236 stringDraw(WMWidgetScreen(table),
237 WMViewXID(WMGetTableViewDocumentView(table)),
238 strdata->gc, strdata->selGc, strdata->selTextGc, strdata->font,
239 strdata->options[i],
240 WMTableViewRectForCell(table, column, row),
241 False);
245 static void selectedESCellPainter(WMTableColumnDelegate *self,
246 WMTableColumn *column, int row)
248 EnumSelectorData *strdata = (EnumSelectorData*)self->data;
249 WMTableView *table = WMGetTableColumnTableView(column);
250 int i = (int)WMTableViewDataForCell(table, column, row);
252 stringDraw(WMWidgetScreen(table),
253 WMViewXID(WMGetTableViewDocumentView(table)),
254 strdata->gc, strdata->selGc, strdata->selTextGc, strdata->font,
255 strdata->options[i],
256 WMTableViewRectForCell(table, column, row),
257 True);
261 static void beginESCellEdit(WMTableColumnDelegate *self,
262 WMTableColumn *column, int row)
264 EnumSelectorData *strdata = (EnumSelectorData*)self->data;
265 WMRect rect = WMTableViewRectForCell(strdata->table, column, row);
266 int data = (int)WMTableViewDataForCell(strdata->table, column, row);
268 wassertr(data < strdata->count);
270 WMSetPopUpButtonSelectedItem(strdata->widget, data);
272 WMMoveWidget(strdata->widget, rect.pos.x, rect.pos.y);
273 WMResizeWidget(strdata->widget, rect.size.width, rect.size.height+1);
275 WMMapWidget(strdata->widget);
279 static void endESCellEdit(WMTableColumnDelegate *self,
280 WMTableColumn *column, int row)
282 EnumSelectorData *strdata = (EnumSelectorData*)self->data;
283 int option;
285 WMUnmapWidget(strdata->widget);
287 option = WMGetPopUpButtonSelectedItem(strdata->widget);
288 WMSetTableViewDataForCell(strdata->table, column, row, (void*)option);
292 WMTableColumnDelegate *WTCreateEnumSelectorDelegate(WMTableView *parent)
294 WMTableColumnDelegate *delegate = wmalloc(sizeof(WMTableColumnDelegate));
295 WMScreen *scr = WMWidgetScreen(parent);
296 EnumSelectorData *data = wmalloc(sizeof(EnumSelectorData));
298 data->widget = WMCreatePopUpButton(parent);
299 W_ReparentView(WMWidgetView(data->widget),
300 WMGetTableViewDocumentView(parent),
301 0, 0);
302 data->table = parent;
303 data->font = WMSystemFontOfSize(scr, 12);
304 data->selGc = WMColorGC(WMCreateNamedColor(scr, SelectionColor, False));
305 data->selTextGc = WMColorGC(WMBlackColor(scr));
306 data->gc = WMColorGC(WMBlackColor(scr));
307 data->count = 0;
308 data->options = NULL;
310 delegate->data = data;
311 delegate->drawCell = ESCellPainter;
312 delegate->drawSelectedCell = selectedESCellPainter;
313 delegate->beginCellEdit = beginESCellEdit;
314 delegate->endCellEdit = endESCellEdit;
316 return delegate;
320 void WTSetEnumSelectorOptions(WMTableColumnDelegate *delegate,
321 char **options, int count)
323 EnumSelectorData *data = (EnumSelectorData*)delegate->data;
324 int i;
326 for (i = 0;
327 i < WMGetPopUpButtonNumberOfItems(data->widget);
328 i++) {
329 WMRemovePopUpButtonItem(data->widget, 0);
332 data->options = options;
333 data->count = count;
335 for (i = 0; i < count; i++) {
336 WMAddPopUpButtonItem(data->widget, options[i]);
342 /* ---------------------------------------------------------------------- */
344 static void BSCellPainter(WMTableColumnDelegate *self,
345 WMTableColumn *column, int row)
347 BooleanSwitchData *strdata = (BooleanSwitchData*)self->data;
348 WMTableView *table = WMGetTableColumnTableView(column);
349 int i = (int)WMTableViewDataForCell(table, column, row);
350 WMScreen *scr = WMWidgetScreen(table);
352 if (i) {
353 pixmapDraw(scr, WMViewXID(WMGetTableViewDocumentView(table)),
354 strdata->gc, WMGetSystemPixmap(scr, WSICheckMark),
355 WMTableViewRectForCell(table, column, row), False);
356 } else {
357 pixmapDraw(scr, WMViewXID(WMGetTableViewDocumentView(table)),
358 strdata->gc, NULL,
359 WMTableViewRectForCell(table, column, row), False);
364 static void selectedBSCellPainter(WMTableColumnDelegate *self,
365 WMTableColumn *column, int row)
367 BooleanSwitchData *strdata = (BooleanSwitchData*)self->data;
368 WMTableView *table = WMGetTableColumnTableView(column);
369 int i = (int)WMTableViewDataForCell(table, column, row);
370 WMScreen *scr = WMWidgetScreen(table);
372 if (i) {
373 pixmapDraw(scr, WMViewXID(WMGetTableViewDocumentView(table)),
374 strdata->gc, WMGetSystemPixmap(scr, WSICheckMark),
375 WMTableViewRectForCell(table, column, row), True);
376 } else {
377 pixmapDraw(scr, WMViewXID(WMGetTableViewDocumentView(table)),
378 strdata->gc, NULL,
379 WMTableViewRectForCell(table, column, row), True);
385 static void beginBSCellEdit(WMTableColumnDelegate *self,
386 WMTableColumn *column, int row)
388 BooleanSwitchData *strdata = (BooleanSwitchData*)self->data;
389 WMRect rect = WMTableViewRectForCell(strdata->table, column, row);
390 int data = (int)WMTableViewDataForCell(strdata->table, column, row);
392 WMSetButtonSelected(strdata->widget, data);
393 WMMoveWidget(strdata->widget, rect.pos.x+1, rect.pos.y+1);
394 WMResizeWidget(strdata->widget, rect.size.width-1, rect.size.height-1);
396 WMMapWidget(strdata->widget);
400 static void endBSCellEdit(WMTableColumnDelegate *self,
401 WMTableColumn *column, int row)
403 BooleanSwitchData *strdata = (BooleanSwitchData*)self->data;
404 int value;
406 value = WMGetButtonSelected(strdata->widget);
407 WMSetTableViewDataForCell(strdata->table, column, row, (void*)value);
408 WMUnmapWidget(strdata->widget);
412 WMTableColumnDelegate *WTCreateBooleanSwitchDelegate(WMTableView *parent)
414 WMTableColumnDelegate *delegate = wmalloc(sizeof(WMTableColumnDelegate));
415 WMScreen *scr = WMWidgetScreen(parent);
416 BooleanSwitchData *data = wmalloc(sizeof(BooleanSwitchData));
417 WMColor *color;
419 data->widget = WMCreateSwitchButton(parent);
420 W_ReparentView(WMWidgetView(data->widget),
421 WMGetTableViewDocumentView(parent),
422 0, 0);
423 WMSetButtonText(data->widget, NULL);
424 WMSetButtonImagePosition(data->widget, WIPImageOnly);
425 WMSetButtonImage(data->widget, NULL);
426 WMSetButtonAltImage(data->widget, WMGetSystemPixmap(scr, WSICheckMark));
428 data->table = parent;
429 color = WMCreateNamedColor(scr, SelectionColor, False);
430 WMSetWidgetBackgroundColor(data->widget, color);
431 data->gc = WMColorGC(color);
433 delegate->data = data;
434 delegate->drawCell = BSCellPainter;
435 delegate->drawSelectedCell = selectedBSCellPainter;
436 delegate->beginCellEdit = beginBSCellEdit;
437 delegate->endCellEdit = endBSCellEdit;
439 return delegate;
443 /* ---------------------------------------------------------------------- */
446 static void SCellPainter(WMTableColumnDelegate *self,
447 WMTableColumn *column, int row)
449 StringData *strdata = (StringData*)self->data;
450 WMTableView *table = WMGetTableColumnTableView(column);
452 stringDraw(WMWidgetScreen(table),
453 WMViewXID(WMGetTableViewDocumentView(table)),
454 strdata->gc, strdata->selGc, strdata->selTextGc, strdata->font,
455 WMTableViewDataForCell(table, column, row),
456 WMTableViewRectForCell(table, column, row),
457 False);
461 static void selectedSCellPainter(WMTableColumnDelegate *self,
462 WMTableColumn *column, int row)
464 StringData *strdata = (StringData*)self->data;
465 WMTableView *table = WMGetTableColumnTableView(column);
467 stringDraw(WMWidgetScreen(table),
468 WMViewXID(WMGetTableViewDocumentView(table)),
469 strdata->gc, strdata->selGc, strdata->selTextGc, strdata->font,
470 WMTableViewDataForCell(table, column, row),
471 WMTableViewRectForCell(table, column, row),
472 True);
476 WMTableColumnDelegate *WTCreateStringDelegate(WMTableView *parent)
478 WMTableColumnDelegate *delegate = wmalloc(sizeof(WMTableColumnDelegate));
479 WMScreen *scr = WMWidgetScreen(parent);
480 StringData *data = wmalloc(sizeof(StringData));
482 data->table = parent;
483 data->font = WMSystemFontOfSize(scr, 12);
484 data->selGc = WMColorGC(WMCreateNamedColor(scr, SelectionColor, False));
485 data->selTextGc = WMColorGC(WMBlackColor(scr));
486 data->gc = WMColorGC(WMBlackColor(scr));
488 delegate->data = data;
489 delegate->drawCell = SCellPainter;
490 delegate->drawSelectedCell = selectedSCellPainter;
491 delegate->beginCellEdit = NULL;
492 delegate->endCellEdit = NULL;
494 return delegate;
498 /* ---------------------------------------------------------------------- */
501 static void PCellPainter(WMTableColumnDelegate *self,
502 WMTableColumn *column, int row)
504 StringData *strdata = (StringData*)self->data;
505 WMTableView *table = WMGetTableColumnTableView(column);
507 pixmapDraw(WMWidgetScreen(table),
508 WMViewXID(WMGetTableViewDocumentView(table)),
509 strdata->selGc,
510 (WMPixmap*)WMTableViewDataForCell(table, column, row),
511 WMTableViewRectForCell(table, column, row),
512 False);
516 static void selectedPCellPainter(WMTableColumnDelegate *self,
517 WMTableColumn *column, int row)
519 StringData *strdata = (StringData*)self->data;
520 WMTableView *table = WMGetTableColumnTableView(column);
522 pixmapDraw(WMWidgetScreen(table),
523 WMViewXID(WMGetTableViewDocumentView(table)),
524 strdata->selGc,
525 (WMPixmap*)WMTableViewDataForCell(table, column, row),
526 WMTableViewRectForCell(table, column, row),
527 True);
531 WMTableColumnDelegate *WTCreatePixmapDelegate(WMTableView *table)
533 WMTableColumnDelegate *delegate = wmalloc(sizeof(WMTableColumnDelegate));
534 WMScreen *scr = WMWidgetScreen(table);
535 StringData *data = wmalloc(sizeof(StringData));
537 data->table = table;
538 data->selGc = WMColorGC(WMCreateNamedColor(scr, SelectionColor, False));
540 delegate->data = data;
541 delegate->drawCell = PCellPainter;
542 delegate->drawSelectedCell = selectedPCellPainter;
543 delegate->beginCellEdit = NULL;
544 delegate->endCellEdit = NULL;
546 return delegate;
550 /* ---------------------------------------------------------------------- */
553 static void drawPSCell(WMTableColumnDelegate *self,
554 WMTableColumn *column, int row, Bool selected)
556 StringData *strdata = (StringData*)self->data;
557 WMTableView *table = WMGetTableColumnTableView(column);
558 void **data;
559 WMPixmap *pix;
560 char *str;
561 WMRect rect;
562 WMSize size;
564 data = WMTableViewDataForCell(table, column, row);
566 str = (char*)data[0];
567 pix = (WMPixmap*)data[1];
569 rect = WMTableViewRectForCell(table, column, row);
571 if (pix) {
572 int owidth = rect.size.width;
574 size = WMGetPixmapSize(pix);
575 rect.size.width = size.width;
577 pixmapDraw(WMWidgetScreen(table),
578 WMViewXID(WMGetTableViewDocumentView(table)),
579 strdata->selGc, pix, rect,
580 selected);
582 rect.pos.x += size.width-1;
583 rect.size.width = owidth-size.width+1;
586 stringDraw(WMWidgetScreen(table),
587 WMViewXID(WMGetTableViewDocumentView(table)),
588 strdata->gc, strdata->selGc, strdata->selTextGc, strdata->font,
589 str, rect, selected);
593 static void PSCellPainter(WMTableColumnDelegate *self,
594 WMTableColumn *column, int row)
596 drawPSCell(self, column, row, False);
600 static void selectedPSCellPainter(WMTableColumnDelegate *self,
601 WMTableColumn *column, int row)
603 drawPSCell(self, column, row, True);
607 WMTableColumnDelegate *WTCreatePixmapStringDelegate(WMTableView *parent)
609 WMTableColumnDelegate *delegate = wmalloc(sizeof(WMTableColumnDelegate));
610 WMScreen *scr = WMWidgetScreen(parent);
611 StringData *data = wmalloc(sizeof(StringData));
613 data->table = parent;
614 data->font = WMSystemFontOfSize(scr, 12);
615 data->selGc = WMColorGC(WMCreateNamedColor(scr, SelectionColor, False));
616 data->selTextGc = WMColorGC(WMBlackColor(scr));
617 data->gc = WMColorGC(WMBlackColor(scr));
619 delegate->data = data;
620 delegate->drawCell = PSCellPainter;
621 delegate->drawSelectedCell = selectedPSCellPainter;
622 delegate->beginCellEdit = NULL;
623 delegate->endCellEdit = NULL;
625 return delegate;