1 #!/usr/bin/env dub
2 /+
3 dub.sdl:
4     name "snippet_paint_item"
5     dependency "dwt" path="../../../../../../"
6     stringImportPaths "../../../../../res"
7     libs \
8       "atk-1.0" \
9       "cairo" \
10       "dl" \
11       "fontconfig" \
12       "gdk-x11-2.0" \
13       "gdk_pixbuf-2.0" \
14       "glib-2.0" \
15       "gmodule-2.0" \
16       "gnomeui-2" \
17       "gnomevfs-2" \
18       "gobject-2.0" \
19       "gthread-2.0" \
20       "gtk-x11-2.0" \
21       "pango-1.0" \
22       "pangocairo-1.0" \
23       "X11" \
24       "Xcomposite" \
25       "Xcursor" \
26       "Xdamage" \
27       "Xext" \
28       "Xfixes" \
29       "Xi" \
30       "Xinerama" \
31       "Xrandr" \
32       "Xrender" \
33       "Xtst" \
34       platform="linux"
35 +/
36 
37 /**
38  * Author: kntroh
39  * License: CC0(http://creativecommons.org/publicdomain/zero/1.0/)
40  */
41 module org.eclipse.swt.snippets.SnippetPaintItem;
42 
43 /*
44  * Example for custom drawing a TableItem.
45  *
46  * For more information on custom drawing, see the this articles:
47  * https://www.eclipse.org/articles/article.php?file=Article-CustomDrawingTableAndTreeItems/index.html
48  */
49 
50 import org.eclipse.swt.all;
51 
52 import java.io.ByteArrayInputStream;
53 import java.lang.all;
54 
55 void main() {
56     auto d = new Display;
57     auto s = new Shell(d);
58     s.setText("SnippetPaintItem");
59     s.setLayout(new FillLayout);
60     s.setSize(200, 150);
61 
62     auto table = new Table(s, SWT.FULL_SELECTION);
63     table.setHeaderVisible(true);
64     auto column0 = new TableColumn(table, SWT.NONE);
65     column0.setText("Column0");
66     column0.setWidth(80);
67     auto column1 = new TableColumn(table, SWT.NONE);
68     column1.setText("Column1");
69     column1.setWidth(80);
70 
71     auto image = new Image(d, new ImageData(new ByteArrayInputStream(cast(byte[])import("eclipse.png"))));
72     auto item0 = new TableItem(table, SWT.NONE);
73     item0.setImage(0, image);
74     item0.setText(0, "TableItem - 0-0");
75     item0.setText(1, "TableItem - 0-1");
76     auto item1 = new TableItem(table, SWT.NONE);
77     item1.setImage(1, image);
78     item1.setText(0, "TableItem - 1-0");
79     item1.setText(1, "TableItem - 1-1");
80     auto item2 = new TableItem(table, SWT.NONE);
81     item2.setText(0, "TableItem - 2-0");
82     item2.setText(1, "TableItem - 2-1");
83 
84     table.addListener(SWT.EraseItem, new class Listener {
85         override void handleEvent(Event e) {
86             e.gc.fillRectangle(e.x, e.y, e.width, e.height);
87             e.detail = e.detail & ~SWT.FOREGROUND;
88         }
89     });
90     table.addListener(SWT.PaintItem, new class Listener {
91         override void handleEvent(Event e) {
92             auto item = cast(TableItem)e.item;
93             auto column = e.index;
94             auto index = table.indexOf(item);
95             auto image = item.getImage(column);
96             if (image) {
97                 auto imageBounds = item.getImageBounds(column);
98                 auto iconBounds = image.getBounds();
99                 if (column == 1) {
100                     e.gc.setAlpha(128);
101                 }
102                 e.gc.drawImage(image, imageBounds.x, imageBounds.y + (imageBounds.height - iconBounds.height) / 2);
103                 e.gc.setAlpha(255);
104             }
105             auto textBounds = item.getTextBounds(column);
106             string text;
107             switch (index) {
108             case 0:
109                 text = "one";
110                 break;
111             case 1:
112                 text = "two";
113                 break;
114             case 2:
115                 text = "three";
116                 break;
117             default:
118                 assert (0);
119             }
120             if (column == 1) {
121                 text = "sub-" ~ text;
122             }
123             auto textHeight = e.gc.textExtent(text).y;
124             e.gc.drawText(text, textBounds.x, textBounds.y + (textBounds.height - textHeight) / 2, true);
125         }
126     });
127 
128     s.open();
129     while (!s.isDisposed()) {
130         if (!d.readAndDispatch()) {
131             d.sleep();
132         }
133     }
134     image.dispose();
135     d.dispose();
136 }