]> git.argeo.org Git - lgpl/argeo-commons.git/blob - eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtTabularPart.java
8fd4065ad92bce617dbcd2f195da80ddf6a49320
[lgpl/argeo-commons.git] / eclipse / org.argeo.cms.swt / src / org / argeo / cms / swt / widgets / SwtTabularPart.java
1 package org.argeo.cms.swt.widgets;
2
3 import java.util.function.Consumer;
4
5 import org.argeo.api.cms.ux.CmsIcon;
6 import org.argeo.cms.swt.CmsSwtTheme;
7 import org.argeo.cms.swt.CmsSwtUtils;
8 import org.argeo.cms.ux.widgets.Column;
9 import org.argeo.cms.ux.widgets.TabularPart;
10 import org.eclipse.swt.SWT;
11 import org.eclipse.swt.events.SelectionEvent;
12 import org.eclipse.swt.events.SelectionListener;
13 import org.eclipse.swt.graphics.Image;
14 import org.eclipse.swt.widgets.Composite;
15 import org.eclipse.swt.widgets.Table;
16 import org.eclipse.swt.widgets.TableColumn;
17 import org.eclipse.swt.widgets.TableItem;
18
19 /** {@link TabularPart} implementation based on a {@link Table}. */
20 public class SwtTabularPart implements TabularPart {
21 private Composite area;
22
23 private final Table table;
24
25 private Consumer<Object> onSelected;
26 private Consumer<Object> onAction;
27
28 private CmsSwtTheme theme;
29
30 public SwtTabularPart(Composite parent, int style) {
31 theme = CmsSwtUtils.getCmsTheme(parent);
32 area = new Composite(parent, style);
33 area.setLayout(CmsSwtUtils.noSpaceGridLayout());
34 table = new Table(area, SWT.VIRTUAL | SWT.BORDER);
35 table.setLinesVisible(true);
36 }
37
38 @Override
39 public void refresh() {
40 // TODO optimise
41 table.clearAll();
42 table.addListener(SWT.SetData, event -> {
43 TableItem item = (TableItem) event.item;
44 refreshItem(item);
45 });
46 table.setItemCount(getItemCount());
47 CmsSwtUtils.fill(table);
48
49 table.addSelectionListener(new SelectionListener() {
50 private static final long serialVersionUID = -5225905921522775948L;
51
52 @Override
53 public void widgetSelected(SelectionEvent e) {
54 if (onSelected != null)
55 onSelected.accept(getDataFromEvent(e));
56 }
57
58 @Override
59 public void widgetDefaultSelected(SelectionEvent e) {
60 if (onAction != null)
61 onAction.accept(getDataFromEvent(e));
62 }
63 });
64
65 }
66
67 protected Object getDataFromEvent(SelectionEvent e) {
68 Object data = e.item.getData();
69 if (data == null)
70 data = getData(getTable().indexOf((TableItem) e.item));
71 return data;
72 }
73
74 @Override
75 public void setInput(Object data) {
76 area.setData(data);
77 refresh();
78 }
79
80 @Override
81 public Object getInput() {
82 return area.getData();
83 }
84
85 protected void refreshItem(TableItem item) {
86 int row = getTable().indexOf(item);
87 for (int i = 0; i < item.getParent().getColumnCount(); i++) {
88 Column<Object> column = (Column<Object>) item.getParent().getColumn(i).getData();
89 Object data = getData(row);
90 item.setData(data);
91 String text = data != null ? column.getText(data) : "";
92 if (text != null)
93 item.setText(i, text);
94 CmsIcon icon = column.getIcon(data);
95 if (icon != null) {
96 Image image = theme.getSmallIcon(icon);
97 item.setImage(i, image);
98 }
99 }
100 }
101
102 protected int getItemCount() {
103 return 0;
104 }
105
106 protected Object getData(int row) {
107 return null;
108 }
109
110 protected Table getTable() {
111 return table;
112 }
113
114 public void onSelected(Consumer<Object> onSelected) {
115 this.onSelected = onSelected;
116 }
117
118 public void onAction(Consumer<Object> onAction) {
119 this.onAction = onAction;
120 }
121
122 @Override
123 public void addColumn(Column<?> column) {
124 TableColumn swtColumn = new TableColumn(table, SWT.NONE);
125 swtColumn.setWidth(column.getWidth());
126 swtColumn.setData(column);
127
128 }
129
130 public Composite getArea() {
131 return area;
132 }
133
134 }