5 #include "wtableview.h"
7 #include "wtabledelegates.h"
36 WMPopUpButton
*widget
;
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
)
65 Display
*dpy
= WMScreenDisplay(scr
);
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
);
77 XClearArea(dpy
, d
, rects
[0].x
, rects
[0].y
,
78 rects
[0].width
, rects
[0].height
,
81 WMDrawString(scr
, d
, gc
, font
, x
, y
,
84 XFillRectangles(dpy
, d
, sgc
, rects
, 1);
86 WMDrawString(scr
, d
, stgc
, font
, x
, y
,
90 XSetClipMask(dpy
, gc
, None
);
95 static void pixmapDraw(WMScreen
*scr
, Drawable d
, GC gc
,
96 WMPixmap
*pixmap
, WMRect rect
, Bool selected
)
100 Display
*dpy
= WMScreenDisplay(scr
);
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
);
110 XClearArea(dpy
, d
, rects
[0].x
, rects
[0].y
,
111 rects
[0].width
, rects
[0].height
,
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
);
122 XFillRectangles(dpy
, d
, gc
, rects
, 1);
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
),
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
),
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
;
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
),
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
;
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
,
240 WMTableViewRectForCell(table
, column
, row
),
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
,
256 WMTableViewRectForCell(table
, column
, row
),
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
;
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
),
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
));
308 data
->options
= NULL
;
310 delegate
->data
= data
;
311 delegate
->drawCell
= ESCellPainter
;
312 delegate
->drawSelectedCell
= selectedESCellPainter
;
313 delegate
->beginCellEdit
= beginESCellEdit
;
314 delegate
->endCellEdit
= endESCellEdit
;
320 void WTSetEnumSelectorOptions(WMTableColumnDelegate
*delegate
,
321 char **options
, int count
)
323 EnumSelectorData
*data
= (EnumSelectorData
*)delegate
->data
;
327 i
< WMGetPopUpButtonNumberOfItems(data
->widget
);
329 WMRemovePopUpButtonItem(data
->widget
, 0);
332 data
->options
= options
;
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
);
353 pixmapDraw(scr
, WMViewXID(WMGetTableViewDocumentView(table
)),
354 strdata
->gc
, WMGetSystemPixmap(scr
, WSICheckMark
),
355 WMTableViewRectForCell(table
, column
, row
), False
);
357 pixmapDraw(scr
, WMViewXID(WMGetTableViewDocumentView(table
)),
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
);
373 pixmapDraw(scr
, WMViewXID(WMGetTableViewDocumentView(table
)),
374 strdata
->gc
, WMGetSystemPixmap(scr
, WSICheckMark
),
375 WMTableViewRectForCell(table
, column
, row
), True
);
377 pixmapDraw(scr
, WMViewXID(WMGetTableViewDocumentView(table
)),
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
;
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
));
419 data
->widget
= WMCreateSwitchButton(parent
);
420 W_ReparentView(WMWidgetView(data
->widget
),
421 WMGetTableViewDocumentView(parent
),
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
;
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
),
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
),
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
;
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
)),
510 (WMPixmap
*)WMTableViewDataForCell(table
, column
, row
),
511 WMTableViewRectForCell(table
, column
, row
),
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
)),
525 (WMPixmap
*)WMTableViewDataForCell(table
, column
, row
),
526 WMTableViewRectForCell(table
, column
, row
),
531 WMTableColumnDelegate
*WTCreatePixmapDelegate(WMTableView
*table
)
533 WMTableColumnDelegate
*delegate
= wmalloc(sizeof(WMTableColumnDelegate
));
534 WMScreen
*scr
= WMWidgetScreen(table
);
535 StringData
*data
= wmalloc(sizeof(StringData
));
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
;
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
);
564 data
= WMTableViewDataForCell(table
, column
, row
);
566 str
= (char*)data
[0];
567 pix
= (WMPixmap
*)data
[1];
569 rect
= WMTableViewRectForCell(table
, column
, row
);
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
,
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
;