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