1
2 #include <stdint.h>
3 #include <WINGs/WINGsP.h>
4
5 #include "wtableview.h"
6
7 #include "wtabledelegates.h"
8
9 typedef struct {
10 WMTableView *table;
11 WMFont *font;
12 GC gc;
13 GC selGC;
14 WMColor *textColor;
15 } StringData;
16
17 typedef struct {
18 WMTableView *table;
19 GC selGc;
20 } PixmapData;
21
22 typedef struct {
23 WMTextField *widget;
24 WMTableView *table;
25 WMFont *font;
26 GC gc;
27 GC selGC;
28 WMColor *textColor;
29 } StringEditorData;
30
31 typedef struct {
32 WMPopUpButton *widget;
33 WMTableView *table;
34 WMFont *font;
35 char **options;
36 int count;
37 GC gc;
38 GC selGC;
39 WMColor *textColor;
40 } EnumSelectorData;
41
42 typedef struct {
43 WMButton *widget;
44 WMTableView *table;
45 Bool state;
46 GC gc;
47 GC selGC;
48 } BooleanSwitchData;
49
50 static char *SelectionColor = "#bbbbcc";
51
52 static void
stringDraw(WMScreen * scr,Drawable d,GC gc,GC sgc,WMColor * textColor,WMFont * font,void * data,WMRect rect,Bool selected)53 stringDraw(WMScreen * scr, Drawable d, GC gc, GC sgc, WMColor * textColor,
54 WMFont * font, void *data, WMRect rect, Bool selected)
55 {
56 int x, y;
57 XRectangle rects[1];
58 Display *dpy = WMScreenDisplay(scr);
59
60 x = rect.pos.x + 5;
61 y = rect.pos.y + (rect.size.height - WMFontHeight(font)) / 2;
62
63 rects[0].x = rect.pos.x + 1;
64 rects[0].y = rect.pos.y + 1;
65 rects[0].width = rect.size.width - 1;
66 rects[0].height = rect.size.height - 1;
67 XSetClipRectangles(dpy, gc, 0, 0, rects, 1, YXSorted);
68
69 if (!selected) {
70 XFillRectangles(dpy, d, gc, rects, 1);
71
72 WMDrawString(scr, d, textColor, font, x, y, data, strlen(data));
73 } else {
74 XFillRectangles(dpy, d, sgc, rects, 1);
75
76 WMDrawString(scr, d, textColor, font, x, y, data, strlen(data));
77 }
78
79 XSetClipMask(dpy, gc, None);
80 }
81
pixmapDraw(WMScreen * scr,Drawable d,GC gc,GC sgc,WMPixmap * pixmap,WMRect rect,Bool selected)82 static void pixmapDraw(WMScreen * scr, Drawable d, GC gc, GC sgc, WMPixmap * pixmap, WMRect rect, Bool selected)
83 {
84 int x, y;
85 XRectangle rects[1];
86 Display *dpy = WMScreenDisplay(scr);
87 WMSize size;
88
89 rects[0].x = rect.pos.x + 1;
90 rects[0].y = rect.pos.y + 1;
91 rects[0].width = rect.size.width - 1;
92 rects[0].height = rect.size.height - 1;
93 XSetClipRectangles(dpy, gc, 0, 0, rects, 1, YXSorted);
94
95 if (!selected) {
96 XFillRectangles(dpy, d, gc, rects, 1);
97
98 if (pixmap) {
99 size = WMGetPixmapSize(pixmap);
100 x = rect.pos.x + (rect.size.width - size.width) / 2;
101 y = rect.pos.y + (rect.size.height - size.height) / 2;
102
103 WMDrawPixmap(pixmap, d, x, y);
104 }
105 } else {
106 XFillRectangles(dpy, d, sgc, rects, 1);
107
108 if (pixmap) {
109 size = WMGetPixmapSize(pixmap);
110 x = rect.pos.x + (rect.size.width - size.width) / 2;
111 y = rect.pos.y + (rect.size.height - size.height) / 2;
112
113 WMDrawPixmap(pixmap, d, x, y);
114 }
115 }
116
117 XSetClipMask(dpy, gc, None);
118 }
119
120 /* ---------------------------------------------------------------------- */
121
SECellPainter(WMTableColumnDelegate * self,WMTableColumn * column,int row,Drawable d)122 static void SECellPainter(WMTableColumnDelegate * self, WMTableColumn * column, int row, Drawable d)
123 {
124 StringEditorData *strdata = (StringEditorData *) self->data;
125 WMTableView *table = WMGetTableColumnTableView(column);
126
127 stringDraw(WMWidgetScreen(table), d,
128 strdata->gc, strdata->selGC, strdata->textColor, strdata->font,
129 WMTableViewDataForCell(table, column, row), WMTableViewRectForCell(table, column, row), False);
130 }
131
selectedSECellPainter(WMTableColumnDelegate * self,WMTableColumn * column,int row,Drawable d)132 static void selectedSECellPainter(WMTableColumnDelegate * self, WMTableColumn * column, int row, Drawable d)
133 {
134 StringEditorData *strdata = (StringEditorData *) self->data;
135 WMTableView *table = WMGetTableColumnTableView(column);
136
137 stringDraw(WMWidgetScreen(table), d,
138 strdata->gc, strdata->selGC, strdata->textColor, strdata->font,
139 WMTableViewDataForCell(table, column, row), WMTableViewRectForCell(table, column, row), True);
140 }
141
beginSECellEdit(WMTableColumnDelegate * self,WMTableColumn * column,int row)142 static void beginSECellEdit(WMTableColumnDelegate * self, WMTableColumn * column, int row)
143 {
144 StringEditorData *strdata = (StringEditorData *) self->data;
145 WMRect rect = WMTableViewRectForCell(strdata->table, column, row);
146 void *data = WMTableViewDataForCell(strdata->table, column, row);
147
148 WMSetTextFieldText(strdata->widget, (char *)data);
149 WMMoveWidget(strdata->widget, rect.pos.x, rect.pos.y);
150 WMResizeWidget(strdata->widget, rect.size.width + 1, rect.size.height + 1);
151
152 WMMapWidget(strdata->widget);
153 }
154
endSECellEdit(WMTableColumnDelegate * self,WMTableColumn * column,int row)155 static void endSECellEdit(WMTableColumnDelegate * self, WMTableColumn * column, int row)
156 {
157 StringEditorData *strdata = (StringEditorData *) self->data;
158 char *text;
159
160 WMUnmapWidget(strdata->widget);
161
162 text = WMGetTextFieldText(strdata->widget);
163 WMSetTableViewDataForCell(strdata->table, column, row, (void *)text);
164 }
165
WTCreateStringEditorDelegate(WMTableView * parent)166 WMTableColumnDelegate *WTCreateStringEditorDelegate(WMTableView * parent)
167 {
168 WMTableColumnDelegate *delegate = wmalloc(sizeof(WMTableColumnDelegate));
169 WMScreen *scr = WMWidgetScreen(parent);
170 StringEditorData *data = wmalloc(sizeof(StringEditorData));
171
172 data->widget = WMCreateTextField(parent);
173 W_ReparentView(WMWidgetView(data->widget), WMGetTableViewDocumentView(parent), 0, 0);
174 data->table = parent;
175 data->font = WMSystemFontOfSize(scr, 12);
176 data->gc = WMColorGC(WMWhiteColor(scr));
177 data->selGC = WMColorGC(WMCreateNamedColor(scr, SelectionColor, False));
178 data->textColor = WMBlackColor(scr);
179
180 delegate->data = data;
181 delegate->drawCell = SECellPainter;
182 delegate->drawSelectedCell = selectedSECellPainter;
183 delegate->beginCellEdit = beginSECellEdit;
184 delegate->endCellEdit = endSECellEdit;
185
186 return delegate;
187 }
188
189 /* ---------------------------------------------------------------------- */
190
ESCellPainter(WMTableColumnDelegate * self,WMTableColumn * column,int row,Drawable d)191 static void ESCellPainter(WMTableColumnDelegate * self, WMTableColumn * column, int row, Drawable d)
192 {
193 EnumSelectorData *strdata = (EnumSelectorData *) self->data;
194 WMTableView *table = WMGetTableColumnTableView(column);
195 uintptr_t i = (uintptr_t)WMTableViewDataForCell(table, column, row);
196
197 stringDraw(WMWidgetScreen(table), d,
198 strdata->gc, strdata->selGC, strdata->textColor, strdata->font,
199 strdata->options[i], WMTableViewRectForCell(table, column, row), False);
200 }
201
selectedESCellPainter(WMTableColumnDelegate * self,WMTableColumn * column,int row,Drawable d)202 static void selectedESCellPainter(WMTableColumnDelegate * self, WMTableColumn * column, int row, Drawable d)
203 {
204 EnumSelectorData *strdata = (EnumSelectorData *) self->data;
205 WMTableView *table = WMGetTableColumnTableView(column);
206 uintptr_t i = (uintptr_t)WMTableViewDataForCell(table, column, row);
207
208 stringDraw(WMWidgetScreen(table), d,
209 strdata->gc, strdata->selGC, strdata->textColor, strdata->font,
210 strdata->options[i], WMTableViewRectForCell(table, column, row), True);
211 }
212
beginESCellEdit(WMTableColumnDelegate * self,WMTableColumn * column,int row)213 static void beginESCellEdit(WMTableColumnDelegate * self, WMTableColumn * column, int row)
214 {
215 EnumSelectorData *strdata = (EnumSelectorData *) self->data;
216 WMRect rect = WMTableViewRectForCell(strdata->table, column, row);
217 uintptr_t data = (uintptr_t)WMTableViewDataForCell(strdata->table, column, row);
218
219 wassertr(data < strdata->count);
220
221 WMSetPopUpButtonSelectedItem(strdata->widget, data);
222
223 WMMoveWidget(strdata->widget, rect.pos.x, rect.pos.y);
224 WMResizeWidget(strdata->widget, rect.size.width, rect.size.height + 1);
225
226 WMMapWidget(strdata->widget);
227 }
228
endESCellEdit(WMTableColumnDelegate * self,WMTableColumn * column,int row)229 static void endESCellEdit(WMTableColumnDelegate * self, WMTableColumn * column, int row)
230 {
231 EnumSelectorData *strdata = (EnumSelectorData *) self->data;
232 int option;
233
234 WMUnmapWidget(strdata->widget);
235
236 option = WMGetPopUpButtonSelectedItem(strdata->widget);
237 WMSetTableViewDataForCell(strdata->table, column, row, (void *)(uintptr_t) option);
238 }
239
WTCreateEnumSelectorDelegate(WMTableView * parent)240 WMTableColumnDelegate *WTCreateEnumSelectorDelegate(WMTableView * parent)
241 {
242 WMTableColumnDelegate *delegate = wmalloc(sizeof(WMTableColumnDelegate));
243 WMScreen *scr = WMWidgetScreen(parent);
244 EnumSelectorData *data = wmalloc(sizeof(EnumSelectorData));
245
246 data->widget = WMCreatePopUpButton(parent);
247 W_ReparentView(WMWidgetView(data->widget), WMGetTableViewDocumentView(parent), 0, 0);
248 data->table = parent;
249 data->font = WMSystemFontOfSize(scr, 12);
250 data->gc = WMColorGC(WMWhiteColor(scr));
251 data->selGC = WMColorGC(WMCreateNamedColor(scr, SelectionColor, False));
252 data->textColor = WMBlackColor(scr);
253 data->count = 0;
254 data->options = NULL;
255
256 delegate->data = data;
257 delegate->drawCell = ESCellPainter;
258 delegate->drawSelectedCell = selectedESCellPainter;
259 delegate->beginCellEdit = beginESCellEdit;
260 delegate->endCellEdit = endESCellEdit;
261
262 return delegate;
263 }
264
WTSetEnumSelectorOptions(WMTableColumnDelegate * delegate,char ** options,int count)265 void WTSetEnumSelectorOptions(WMTableColumnDelegate * delegate, char **options, int count)
266 {
267 EnumSelectorData *data = (EnumSelectorData *) delegate->data;
268 int i;
269
270 for (i = 0; i < WMGetPopUpButtonNumberOfItems(data->widget); i++) {
271 WMRemovePopUpButtonItem(data->widget, 0);
272 }
273
274 data->options = options;
275 data->count = count;
276
277 for (i = 0; i < count; i++) {
278 WMAddPopUpButtonItem(data->widget, options[i]);
279 }
280 }
281
282 /* ---------------------------------------------------------------------- */
283
BSCellPainter(WMTableColumnDelegate * self,WMTableColumn * column,int row,Drawable d)284 static void BSCellPainter(WMTableColumnDelegate * self, WMTableColumn * column, int row, Drawable d)
285 {
286 BooleanSwitchData *strdata = (BooleanSwitchData *) self->data;
287 WMTableView *table = WMGetTableColumnTableView(column);
288 uintptr_t i = (uintptr_t)WMTableViewDataForCell(table, column, row);
289 WMScreen *scr = WMWidgetScreen(table);
290
291 if (i) {
292 pixmapDraw(scr, d,
293 strdata->gc, strdata->selGC, WMGetSystemPixmap(scr, WSICheckMark),
294 WMTableViewRectForCell(table, column, row), False);
295 } else {
296 pixmapDraw(scr, d,
297 strdata->gc, strdata->selGC, NULL, WMTableViewRectForCell(table, column, row), False);
298 }
299 }
300
selectedBSCellPainter(WMTableColumnDelegate * self,WMTableColumn * column,int row,Drawable d)301 static void selectedBSCellPainter(WMTableColumnDelegate * self, WMTableColumn * column, int row, Drawable d)
302 {
303 BooleanSwitchData *strdata = (BooleanSwitchData *) self->data;
304 WMTableView *table = WMGetTableColumnTableView(column);
305 uintptr_t i = (uintptr_t)WMTableViewDataForCell(table, column, row);
306 WMScreen *scr = WMWidgetScreen(table);
307
308 if (i) {
309 pixmapDraw(scr, d,
310 strdata->gc, strdata->selGC, WMGetSystemPixmap(scr, WSICheckMark),
311 WMTableViewRectForCell(table, column, row), True);
312 } else {
313 pixmapDraw(scr, d,
314 strdata->gc, strdata->selGC, NULL, WMTableViewRectForCell(table, column, row), True);
315 }
316 }
317
beginBSCellEdit(WMTableColumnDelegate * self,WMTableColumn * column,int row)318 static void beginBSCellEdit(WMTableColumnDelegate * self, WMTableColumn * column, int row)
319 {
320 BooleanSwitchData *strdata = (BooleanSwitchData *) self->data;
321 WMRect rect = WMTableViewRectForCell(strdata->table, column, row);
322 uintptr_t data = (uintptr_t)WMTableViewDataForCell(strdata->table, column, row);
323
324 WMSetButtonSelected(strdata->widget, data);
325 WMMoveWidget(strdata->widget, rect.pos.x + 1, rect.pos.y + 1);
326 WMResizeWidget(strdata->widget, rect.size.width - 1, rect.size.height - 1);
327
328 WMMapWidget(strdata->widget);
329 }
330
endBSCellEdit(WMTableColumnDelegate * self,WMTableColumn * column,int row)331 static void endBSCellEdit(WMTableColumnDelegate * self, WMTableColumn * column, int row)
332 {
333 BooleanSwitchData *strdata = (BooleanSwitchData *) self->data;
334 int value;
335
336 value = WMGetButtonSelected(strdata->widget);
337 WMSetTableViewDataForCell(strdata->table, column, row, (void *)(uintptr_t) value);
338 WMUnmapWidget(strdata->widget);
339 }
340
WTCreateBooleanSwitchDelegate(WMTableView * parent)341 WMTableColumnDelegate *WTCreateBooleanSwitchDelegate(WMTableView * parent)
342 {
343 WMTableColumnDelegate *delegate = wmalloc(sizeof(WMTableColumnDelegate));
344 WMScreen *scr = WMWidgetScreen(parent);
345 BooleanSwitchData *data = wmalloc(sizeof(BooleanSwitchData));
346 WMColor *color;
347
348 data->widget = WMCreateSwitchButton(parent);
349 W_ReparentView(WMWidgetView(data->widget), WMGetTableViewDocumentView(parent), 0, 0);
350 WMSetButtonText(data->widget, NULL);
351 WMSetButtonImagePosition(data->widget, WIPImageOnly);
352 WMSetButtonImage(data->widget, NULL);
353 WMSetButtonAltImage(data->widget, WMGetSystemPixmap(scr, WSICheckMark));
354
355 data->table = parent;
356 color = WMCreateNamedColor(scr, SelectionColor, False);
357 WMSetWidgetBackgroundColor(data->widget, color);
358 data->gc = WMColorGC(WMWhiteColor(scr));
359 data->selGC = WMColorGC(color);
360
361 delegate->data = data;
362 delegate->drawCell = BSCellPainter;
363 delegate->drawSelectedCell = selectedBSCellPainter;
364 delegate->beginCellEdit = beginBSCellEdit;
365 delegate->endCellEdit = endBSCellEdit;
366
367 return delegate;
368 }
369
370 /* ---------------------------------------------------------------------- */
371
SCellPainter(WMTableColumnDelegate * self,WMTableColumn * column,int row,Drawable d)372 static void SCellPainter(WMTableColumnDelegate * self, WMTableColumn * column, int row, Drawable d)
373 {
374 StringData *strdata = (StringData *) self->data;
375 WMTableView *table = WMGetTableColumnTableView(column);
376
377 stringDraw(WMWidgetScreen(table), d,
378 strdata->gc, strdata->selGC, strdata->textColor, strdata->font,
379 WMTableViewDataForCell(table, column, row), WMTableViewRectForCell(table, column, row), False);
380 }
381
selectedSCellPainter(WMTableColumnDelegate * self,WMTableColumn * column,int row,Drawable d)382 static void selectedSCellPainter(WMTableColumnDelegate * self, WMTableColumn * column, int row, Drawable d)
383 {
384 StringData *strdata = (StringData *) self->data;
385 WMTableView *table = WMGetTableColumnTableView(column);
386
387 stringDraw(WMWidgetScreen(table), d,
388 strdata->gc, strdata->selGC, strdata->textColor, strdata->font,
389 WMTableViewDataForCell(table, column, row), WMTableViewRectForCell(table, column, row), True);
390 }
391
WTCreateStringDelegate(WMTableView * parent)392 WMTableColumnDelegate *WTCreateStringDelegate(WMTableView * parent)
393 {
394 WMTableColumnDelegate *delegate = wmalloc(sizeof(WMTableColumnDelegate));
395 WMScreen *scr = WMWidgetScreen(parent);
396 StringData *data = wmalloc(sizeof(StringData));
397
398 data->table = parent;
399 data->font = WMSystemFontOfSize(scr, 12);
400 data->gc = WMColorGC(WMWhiteColor(scr));
401 data->selGC = WMColorGC(WMCreateNamedColor(scr, SelectionColor, False));
402 data->textColor = WMBlackColor(scr);
403
404 delegate->data = data;
405 delegate->drawCell = SCellPainter;
406 delegate->drawSelectedCell = selectedSCellPainter;
407 delegate->beginCellEdit = NULL;
408 delegate->endCellEdit = NULL;
409
410 return delegate;
411 }
412
413 /* ---------------------------------------------------------------------- */
414
PCellPainter(WMTableColumnDelegate * self,WMTableColumn * column,int row,Drawable d)415 static void PCellPainter(WMTableColumnDelegate * self, WMTableColumn * column, int row, Drawable d)
416 {
417 StringData *strdata = (StringData *) self->data;
418 WMTableView *table = WMGetTableColumnTableView(column);
419
420 pixmapDraw(WMWidgetScreen(table), d,
421 strdata->gc, strdata->selGC,
422 (WMPixmap *) WMTableViewDataForCell(table, column, row),
423 WMTableViewRectForCell(table, column, row), False);
424 }
425
selectedPCellPainter(WMTableColumnDelegate * self,WMTableColumn * column,int row,Drawable d)426 static void selectedPCellPainter(WMTableColumnDelegate * self, WMTableColumn * column, int row, Drawable d)
427 {
428 StringData *strdata = (StringData *) self->data;
429 WMTableView *table = WMGetTableColumnTableView(column);
430
431 pixmapDraw(WMWidgetScreen(table), d,
432 strdata->gc, strdata->selGC,
433 (WMPixmap *) WMTableViewDataForCell(table, column, row),
434 WMTableViewRectForCell(table, column, row), True);
435 }
436
WTCreatePixmapDelegate(WMTableView * table)437 WMTableColumnDelegate *WTCreatePixmapDelegate(WMTableView * table)
438 {
439 WMTableColumnDelegate *delegate = wmalloc(sizeof(WMTableColumnDelegate));
440 WMScreen *scr = WMWidgetScreen(table);
441 StringData *data = wmalloc(sizeof(StringData));
442
443 data->table = table;
444 data->gc = WMColorGC(WMWhiteColor(scr));
445 data->selGC = WMColorGC(WMCreateNamedColor(scr, SelectionColor, False));
446
447 delegate->data = data;
448 delegate->drawCell = PCellPainter;
449 delegate->drawSelectedCell = selectedPCellPainter;
450 delegate->beginCellEdit = NULL;
451 delegate->endCellEdit = NULL;
452
453 return delegate;
454 }
455
456 /* ---------------------------------------------------------------------- */
457
drawPSCell(WMTableColumnDelegate * self,Drawable d,WMTableColumn * column,int row,Bool selected)458 static void drawPSCell(WMTableColumnDelegate * self, Drawable d, WMTableColumn * column, int row, Bool selected)
459 {
460 StringData *strdata = (StringData *) self->data;
461 WMTableView *table = WMGetTableColumnTableView(column);
462 void **data;
463 WMPixmap *pix;
464 char *str;
465 WMRect rect;
466 WMSize size;
467
468 data = WMTableViewDataForCell(table, column, row);
469
470 str = (char *)data[0];
471 pix = (WMPixmap *) data[1];
472
473 rect = WMTableViewRectForCell(table, column, row);
474
475 if (pix) {
476 int owidth = rect.size.width;
477
478 size = WMGetPixmapSize(pix);
479 rect.size.width = size.width;
480
481 pixmapDraw(WMWidgetScreen(table),
482 WMViewXID(WMGetTableViewDocumentView(table)),
483 strdata->gc, strdata->selGC, pix, rect, selected);
484
485 rect.pos.x += size.width - 1;
486 rect.size.width = owidth - size.width + 1;
487 }
488
489 stringDraw(WMWidgetScreen(table), d, strdata->gc, strdata->selGC,
490 strdata->textColor, strdata->font, str, rect, selected);
491 }
492
PSCellPainter(WMTableColumnDelegate * self,WMTableColumn * column,int row,Drawable d)493 static void PSCellPainter(WMTableColumnDelegate * self, WMTableColumn * column, int row, Drawable d)
494 {
495 drawPSCell(self, d, column, row, False);
496 }
497
selectedPSCellPainter(WMTableColumnDelegate * self,WMTableColumn * column,int row,Drawable d)498 static void selectedPSCellPainter(WMTableColumnDelegate * self, WMTableColumn * column, int row, Drawable d)
499 {
500 drawPSCell(self, d, column, row, True);
501 }
502
WTCreatePixmapStringDelegate(WMTableView * parent)503 WMTableColumnDelegate *WTCreatePixmapStringDelegate(WMTableView * parent)
504 {
505 WMTableColumnDelegate *delegate = wmalloc(sizeof(WMTableColumnDelegate));
506 WMScreen *scr = WMWidgetScreen(parent);
507 StringData *data = wmalloc(sizeof(StringData));
508
509 data->table = parent;
510 data->font = WMSystemFontOfSize(scr, 12);
511 data->gc = WMColorGC(WMWhiteColor(scr));
512 data->selGC = WMColorGC(WMCreateNamedColor(scr, SelectionColor, False));
513 data->textColor = WMBlackColor(scr);
514
515 delegate->data = data;
516 delegate->drawCell = PSCellPainter;
517 delegate->drawSelectedCell = selectedPSCellPainter;
518 delegate->beginCellEdit = NULL;
519 delegate->endCellEdit = NULL;
520
521 return delegate;
522 }
523