1 package org.argeo.eclipse.ui.parts;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import org.argeo.eclipse.ui.ColumnDefinition;
7 import org.argeo.eclipse.ui.EclipseUiException;
8 import org.argeo.eclipse.ui.EclipseUiUtils;
9 import org.argeo.eclipse.ui.util.ViewerUtils;
10 import org.eclipse.jface.layout.TableColumnLayout;
11 import org.eclipse.jface.viewers.CheckboxTableViewer;
12 import org.eclipse.jface.viewers.ColumnLabelProvider;
13 import org.eclipse.jface.viewers.ColumnWeightData;
14 import org.eclipse.jface.viewers.IStructuredContentProvider;
15 import org.eclipse.jface.viewers.TableViewer;
16 import org.eclipse.jface.viewers.TableViewerColumn;
17 import org.eclipse.jface.viewers.Viewer;
18 import org.eclipse.swt.SWT;
19 import org.eclipse.swt.events.ModifyEvent;
20 import org.eclipse.swt.events.ModifyListener;
21 import org.eclipse.swt.events.SelectionAdapter;
22 import org.eclipse.swt.events.SelectionEvent;
23 import org.eclipse.swt.layout.GridData;
24 import org.eclipse.swt.layout.GridLayout;
25 import org.eclipse.swt.widgets.Composite;
26 import org.eclipse.swt.widgets.Link;
27 import org.eclipse.swt.widgets.Table;
28 import org.eclipse.swt.widgets.TableColumn;
29 import org.eclipse.swt.widgets.Text;
30 import org.osgi.service.useradmin.User;
31
32
33
34
35
36
37
38
39
40 public abstract class LdifUsersTable extends Composite {
41 private static final long serialVersionUID = -7385959046279360420L;
42
43
44
45
46
47 private List<ColumnDefinition> columnDefs = new ArrayList<ColumnDefinition>();
48 private boolean hasFilter;
49 private boolean preventTableLayout = false;
50 private boolean hasSelectionColumn;
51 private int tableStyle;
52
53
54 private TableViewer usersViewer;
55 private Text filterTxt;
56
57
58
59
60
61
62
63 public LdifUsersTable(Composite parent, int style) {
64 super(parent, SWT.NO_FOCUS);
65 this.tableStyle = style;
66 }
67
68
69 public LdifUsersTable(Composite parent, int style, boolean preventTableLayout) {
70 super(parent, SWT.NO_FOCUS);
71 this.tableStyle = style;
72 this.preventTableLayout = preventTableLayout;
73 }
74
75
76 public void setColumnDefinitions(List<ColumnDefinition> columnDefinitions) {
77 this.columnDefs = columnDefinitions;
78 }
79
80
81
82
83
84
85
86
87
88 public void populate(boolean addFilter, boolean addSelection) {
89
90 Composite parent = this;
91 hasFilter = addFilter;
92 hasSelectionColumn = addSelection;
93
94
95 GridLayout layout = EclipseUiUtils.noSpaceGridLayout();
96 layout.verticalSpacing = 5;
97 this.setLayout(layout);
98 if (hasFilter)
99 createFilterPart(parent);
100
101 Composite tableComp = new Composite(parent, SWT.NO_FOCUS);
102 tableComp.setLayoutData(EclipseUiUtils.fillAll());
103 usersViewer = createTableViewer(tableComp);
104 usersViewer.setContentProvider(new UsersContentProvider());
105 }
106
107
108
109
110
111
112
113
114
115 public void populateWithStaticFilters(boolean showMore, boolean addSelection) {
116
117 Composite parent = this;
118 hasFilter = true;
119 hasSelectionColumn = addSelection;
120
121
122 GridLayout layout = EclipseUiUtils.noSpaceGridLayout();
123 layout.verticalSpacing = 5;
124 this.setLayout(layout);
125 createStaticFilterPart(parent, showMore);
126
127 Composite tableComp = new Composite(parent, SWT.NO_FOCUS);
128 tableComp.setLayoutData(EclipseUiUtils.fillAll());
129 usersViewer = createTableViewer(tableComp);
130 usersViewer.setContentProvider(new UsersContentProvider());
131 }
132
133
134 public List<User> getSelectedUsers() {
135 if (hasSelectionColumn) {
136 Object[] elements = ((CheckboxTableViewer) usersViewer).getCheckedElements();
137
138 List<User> result = new ArrayList<User>();
139 for (Object obj : elements) {
140 result.add((User) obj);
141 }
142 return result;
143 } else
144 throw new EclipseUiException(
145 "Unvalid request: no selection column " + "has been created for the current table");
146 }
147
148
149 public TableViewer getTableViewer() {
150 return usersViewer;
151 }
152
153
154
155
156
157 public void refresh() {
158 String filter = hasFilter ? filterTxt.getText().trim() : null;
159 if ("".equals(filter))
160 filter = null;
161 refreshFilteredList(filter);
162 }
163
164
165 abstract protected List<User> listFilteredElements(String filter);
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182 @Override
183 public boolean setFocus() {
184 if (hasFilter)
185 return filterTxt.setFocus();
186 else
187 return usersViewer.getTable().setFocus();
188 }
189
190 @Override
191 public void dispose() {
192 super.dispose();
193 }
194
195
196
197 private void refreshFilteredList(String filter) {
198 List<User> users = listFilteredElements(filter);
199 usersViewer.setInput(users.toArray());
200 }
201
202 private class UsersContentProvider implements IStructuredContentProvider {
203 private static final long serialVersionUID = 1L;
204
205 public Object[] getElements(Object inputElement) {
206 return (Object[]) inputElement;
207 }
208
209 public void dispose() {
210 }
211
212 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
213 }
214 }
215
216
217 private void createFilterPart(Composite parent) {
218
219 filterTxt = new Text(parent, SWT.BORDER | SWT.SEARCH | SWT.ICON_SEARCH | SWT.ICON_CANCEL);
220 filterTxt.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false));
221 filterTxt.addModifyListener(new ModifyListener() {
222 private static final long serialVersionUID = 1L;
223
224 public void modifyText(ModifyEvent event) {
225 refreshFilteredList(filterTxt.getText());
226 }
227 });
228 }
229
230 private void createStaticFilterPart(Composite parent, boolean showMore) {
231 Composite filterComp = new Composite(parent, SWT.NO_FOCUS);
232 filterComp.setLayout(new GridLayout(2, false));
233 filterComp.setLayoutData(EclipseUiUtils.fillWidth());
234
235 filterTxt = new Text(filterComp, SWT.BORDER | SWT.SEARCH | SWT.ICON_SEARCH | SWT.ICON_CANCEL);
236 filterTxt.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false));
237
238
239 filterTxt.addModifyListener(new ModifyListener() {
240 private static final long serialVersionUID = 1L;
241
242 public void modifyText(ModifyEvent event) {
243 refreshFilteredList(filterTxt.getText());
244 }
245 });
246
247
248 Link moreLk = new Link(filterComp, SWT.NONE);
249 Composite staticFilterCmp = new Composite(filterComp, SWT.NO_FOCUS);
250 staticFilterCmp.setLayoutData(EclipseUiUtils.fillWidth(2));
251 populateStaticFilters(staticFilterCmp);
252
253 MoreLinkListener listener = new MoreLinkListener(moreLk, staticFilterCmp, showMore);
254
255 listener.refresh();
256 moreLk.addSelectionListener(listener);
257 }
258
259
260 protected void populateStaticFilters(Composite staticFilterCmp) {
261 }
262
263
264
265
266 private class MoreLinkListener extends SelectionAdapter {
267 private static final long serialVersionUID = -524987616510893463L;
268 private boolean isShown;
269 private final Composite staticFilterCmp;
270 private final Link moreLk;
271
272 public MoreLinkListener(Link moreLk, Composite staticFilterCmp, boolean isShown) {
273 this.moreLk = moreLk;
274 this.staticFilterCmp = staticFilterCmp;
275 this.isShown = isShown;
276 }
277
278 @Override
279 public void widgetSelected(SelectionEvent e) {
280 isShown = !isShown;
281 refresh();
282 }
283
284 public void refresh() {
285 GridData gd = (GridData) staticFilterCmp.getLayoutData();
286 if (isShown) {
287 moreLk.setText("<a> Less... </a>");
288 gd.heightHint = SWT.DEFAULT;
289 } else {
290 moreLk.setText("<a> More... </a>");
291 gd.heightHint = 0;
292 }
293 forceLayout();
294 }
295 }
296
297 private void forceLayout() {
298 LdifUsersTable.this.getParent().layout(true, true);
299 }
300
301 private TableViewer createTableViewer(final Composite parent) {
302
303 int style = tableStyle | SWT.H_SCROLL | SWT.V_SCROLL;
304 if (hasSelectionColumn)
305 style = style | SWT.CHECK;
306 Table table = new Table(parent, style);
307 TableColumnLayout layout = new TableColumnLayout();
308
309
310
311 if (preventTableLayout) {
312 parent.setLayout(EclipseUiUtils.noSpaceGridLayout());
313 table.setLayoutData(EclipseUiUtils.fillAll());
314 } else
315 parent.setLayout(layout);
316
317 TableViewer viewer;
318 if (hasSelectionColumn)
319 viewer = new CheckboxTableViewer(table);
320 else
321 viewer = new TableViewer(table);
322 table.setLinesVisible(true);
323 table.setHeaderVisible(true);
324
325 TableViewerColumn column;
326
327 if (hasSelectionColumn) {
328
329 column = ViewerUtils.createTableViewerColumn(viewer, "", SWT.NONE, 25);
330 column.setLabelProvider(new ColumnLabelProvider() {
331 private static final long serialVersionUID = 1L;
332
333 @Override
334 public String getText(Object element) {
335 return null;
336 }
337 });
338 layout.setColumnData(column.getColumn(), new ColumnWeightData(25, 25, false));
339
340 SelectionAdapter selectionAdapter = new SelectionAdapter() {
341 private static final long serialVersionUID = 1L;
342
343 boolean allSelected = false;
344
345 @Override
346 public void widgetSelected(SelectionEvent e) {
347 allSelected = !allSelected;
348 ((CheckboxTableViewer) usersViewer).setAllChecked(allSelected);
349 }
350 };
351 column.getColumn().addSelectionListener(selectionAdapter);
352 }
353
354
355
356
357 for (ColumnDefinition colDef : columnDefs)
358 createTableColumn(viewer, layout, colDef);
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376 return viewer;
377 }
378
379
380 private TableViewerColumn createTableColumn(TableViewer tableViewer, TableColumnLayout layout,
381 ColumnDefinition columnDef) {
382
383 boolean resizable = true;
384 TableViewerColumn tvc = new TableViewerColumn(tableViewer, SWT.NONE);
385 TableColumn column = tvc.getColumn();
386
387 column.setText(columnDef.getLabel());
388 column.setWidth(columnDef.getMinWidth());
389 column.setResizable(resizable);
390
391 ColumnLabelProvider lp = columnDef.getLabelProvider();
392
393
394
395
396 tvc.setLabelProvider(lp);
397
398 layout.setColumnData(column, new ColumnWeightData(columnDef.getWeight(), columnDef.getMinWidth(), resizable));
399
400 return tvc;
401 }
402 }