1 package org.argeo.people.ui.composites;
2
3 import java.util.List;
4
5 import org.argeo.connect.ui.ConnectColumnDefinition;
6 import org.argeo.eclipse.ui.EclipseUiUtils;
7 import org.argeo.eclipse.ui.specific.EclipseUiSpecificUtils;
8 import org.argeo.eclipse.ui.utils.ViewerUtils;
9 import org.eclipse.jface.viewers.ColumnLabelProvider;
10 import org.eclipse.jface.viewers.IStructuredContentProvider;
11 import org.eclipse.jface.viewers.TableViewer;
12 import org.eclipse.jface.viewers.TableViewerColumn;
13 import org.eclipse.jface.viewers.Viewer;
14 import org.eclipse.jface.viewers.ViewerComparator;
15 import org.eclipse.swt.SWT;
16 import org.eclipse.swt.events.SelectionAdapter;
17 import org.eclipse.swt.events.SelectionEvent;
18 import org.eclipse.swt.layout.GridData;
19 import org.eclipse.swt.layout.GridLayout;
20 import org.eclipse.swt.widgets.Composite;
21 import org.eclipse.swt.widgets.Table;
22 import org.eclipse.swt.widgets.TableColumn;
23
24
25 public class PeopleTableViewer extends Composite {
26 private static final long serialVersionUID = 1L;
27 private TableViewer viewer;
28 private MyViewerComparator comparator;
29
30 private List<ConnectColumnDefinition> colDefs;
31 private int tableStyle;
32
33 public List<ConnectColumnDefinition> getColumnsDef() {
34 return colDefs;
35 }
36
37
38 public PeopleTableViewer(Composite parent, int style,
39 List<ConnectColumnDefinition> columns) {
40 super(parent, SWT.NONE);
41 this.tableStyle = style;
42 this.colDefs = columns;
43 populate();
44 }
45
46 protected void populate() {
47
48 Composite parent = this;
49
50 GridLayout layout = EclipseUiUtils.noSpaceGridLayout();
51 this.setLayout(layout);
52 createTableViewer(parent);
53 EclipseUiSpecificUtils.enableToolTipSupport(viewer);
54 viewer.setContentProvider(new MyTableContentProvider());
55 }
56
57
58 public TableViewer getTableViewer() {
59 return viewer;
60 }
61
62 private void createTableViewer(final Composite parent) {
63
64 Table table = new Table(parent, tableStyle);
65 viewer = new TableViewer(table);
66 comparator = new MyViewerComparator();
67
68
69 table.setLinesVisible(true);
70 table.setHeaderVisible(true);
71 table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
72
73
74 TableViewerColumn column;
75 int i = 0;
76 for (ConnectColumnDefinition colDef : colDefs) {
77 column = ViewerUtils.createTableViewerColumn(viewer,
78 colDef.getHeaderLabel(), SWT.NONE, colDef.getColumnSize());
79 column.setLabelProvider(colDef.getColumnLabelProvider());
80 column.getColumn().addSelectionListener(
81 getSelectionAdapter(column.getColumn(), i));
82 i++;
83 }
84
85 viewer.setComparator(comparator);
86 }
87
88 private SelectionAdapter getSelectionAdapter(final TableColumn column,
89 final int index) {
90 SelectionAdapter selectionAdapter = new SelectionAdapter() {
91 private static final long serialVersionUID = 1L;
92
93 @Override
94 public void widgetSelected(SelectionEvent e) {
95 comparator.setColumn(index);
96 int dir = comparator.getDirection();
97 viewer.getTable().setSortDirection(dir);
98 viewer.getTable().setSortColumn(column);
99 viewer.refresh();
100 }
101 };
102 return selectionAdapter;
103 }
104
105 private class MyTableContentProvider implements IStructuredContentProvider {
106 private static final long serialVersionUID = 7164029504991808317L;
107
108 public Object[] getElements(Object inputElement) {
109 return (Object[]) inputElement;
110 }
111
112 public void dispose() {
113 }
114
115 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
116 }
117 }
118
119
120 private class MyViewerComparator extends ViewerComparator {
121 private static final long serialVersionUID = 1L;
122
123 private int propertyIndex;
124 private static final int DESCENDING = 1;
125 private int direction = 0;
126
127 public MyViewerComparator() {
128 this.propertyIndex = 0;
129 direction = DESCENDING;
130 }
131
132 public int getDirection() {
133 return direction == 1 ? SWT.DOWN : SWT.UP;
134 }
135
136 public void setColumn(int column) {
137 if (column == this.propertyIndex) {
138
139 direction = 1 - direction;
140 } else {
141
142 this.propertyIndex = column;
143 direction = DESCENDING;
144 }
145 }
146
147 @Override
148 public int compare(Viewer viewer, Object e1, Object e2) {
149
150 ColumnLabelProvider labelProvider = colDefs.get(propertyIndex)
151 .getColumnLabelProvider();
152 int rc = labelProvider.getText(e1).compareTo(
153 labelProvider.getText(e2));
154
155
156 if (direction == DESCENDING) {
157 rc = -rc;
158 }
159 return rc;
160 }
161 }
162
163 public void refresh() {
164 viewer.refresh();
165 }
166
167 @Override
168 public boolean setFocus() {
169 viewer.getTable().setFocus();
170 return true;
171 }
172
173
174
175
176
177 }