]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserTableViewer.java
ed29315e44c42532645f8d061167ff31bbde5345
[lgpl/argeo-commons.git] / org.argeo.security.ui.admin / src / org / argeo / security / ui / admin / internal / UserTableViewer.java
1 package org.argeo.security.ui.admin.internal;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import org.argeo.ArgeoException;
7 import org.argeo.eclipse.ui.EclipseUiUtils;
8 import org.argeo.eclipse.ui.utils.ViewerUtils;
9 import org.argeo.security.ui.admin.internal.providers.UserAdminAbstractLP;
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.Table;
27 import org.eclipse.swt.widgets.TableColumn;
28 import org.eclipse.swt.widgets.Text;
29 import org.osgi.framework.InvalidSyntaxException;
30 import org.osgi.service.useradmin.Role;
31 import org.osgi.service.useradmin.User;
32 import org.osgi.service.useradmin.UserAdmin;
33
34 /**
35 * Generic composite that display a filter and a table viewer to display users
36 * (can also be groups)
37 *
38 * Warning: this class does not extends <code>TableViewer</code>. Use the
39 * getTableViewer to acces it.
40 *
41 */
42 public class UserTableViewer extends Composite {
43 private static final long serialVersionUID = -7385959046279360420L;
44
45 // Context
46 private UserAdmin userAdmin;
47
48 // Configuration
49 private List<ColumnDefinition> columnDefs = new ArrayList<ColumnDefinition>();
50 private boolean hasFilter;
51 private boolean preventTableLayout = false;
52 private boolean hasSelectionColumn;
53 private int tableStyle;
54
55 // Local UI Objects
56 private TableViewer usersViewer;
57 private Text filterTxt;
58
59 /* EXPOSED METHODS */
60
61 /**
62 * @param parent
63 * @param style
64 * @param userAdmin
65 */
66 public UserTableViewer(Composite parent, int style, UserAdmin userAdmin) {
67 super(parent, SWT.NO_FOCUS);
68 this.tableStyle = style;
69 this.userAdmin = userAdmin;
70 }
71
72 // TODO workaround the bug of the table layout in the Form
73 public UserTableViewer(Composite parent, int style, UserAdmin userAdmin,
74 boolean preventTableLayout) {
75 super(parent, SWT.NO_FOCUS);
76 this.tableStyle = style;
77 this.userAdmin = userAdmin;
78 this.preventTableLayout = preventTableLayout;
79 }
80
81 /** This must be called before the call to populate method */
82 public void setColumnDefinitions(List<ColumnDefinition> columnDefinitions) {
83 this.columnDefs = columnDefinitions;
84 }
85
86 /**
87 *
88 * @param addFilter
89 * choose to add a field to filter results or not
90 * @param addSelection
91 * choose to add a column to select some of the displayed results
92 * or not
93 */
94 public void populate(boolean addFilter, boolean addSelection) {
95 // initialization
96 Composite parent = this;
97 hasFilter = addFilter;
98 hasSelectionColumn = addSelection;
99
100 // Main Layout
101 GridLayout layout = EclipseUiUtils.noSpaceGridLayout();
102 layout.verticalSpacing = 5;
103 this.setLayout(layout);
104 if (hasFilter)
105 createFilterPart(parent);
106
107 Composite tableComp = new Composite(parent, SWT.NO_FOCUS);
108 tableComp.setLayoutData(EclipseUiUtils.fillAll());
109 usersViewer = createTableViewer(tableComp);
110
111 usersViewer.setContentProvider(new UsersContentProvider());
112 }
113
114 /** Enable access to the selected users or groups */
115 public List<User> getSelectedUsers() {
116 if (hasSelectionColumn) {
117 Object[] elements = ((CheckboxTableViewer) usersViewer)
118 .getCheckedElements();
119
120 List<User> result = new ArrayList<User>();
121 for (Object obj : elements) {
122 result.add((User) obj);
123 }
124 return result;
125 } else
126 throw new ArgeoException("Unvalid request: no selection column "
127 + "has been created for the current table");
128 }
129
130 /** Returns the User table viewer, typically to add doubleclick listener */
131 public TableViewer getTableViewer() {
132 return usersViewer;
133 }
134
135 /**
136 * Force the refresh of the underlying table using the current filter string
137 * if relevant
138 */
139 public void refresh() {
140 String filter = hasFilter ? filterTxt.getText() : null;
141 if ("".equals(filter.trim()))
142 filter = null;
143 refreshFilteredList(filter);
144 }
145
146 /**
147 * Build repository request : caller might overwrite in order to display a
148 * subset of all users
149 */
150 protected List<User> listFilteredElements(String filter) {
151 List<User> users = new ArrayList<User>();
152 try {
153 Role[] roles = userAdmin.getRoles(filter);
154 // Display all users and groups
155 for (Role role : roles)
156 users.add((User) role);
157 } catch (InvalidSyntaxException e) {
158 throw new ArgeoException("Unable to get roles with filter: "
159 + filter, e);
160 }
161 return users;
162 }
163
164 /* GENERIC COMPOSITE METHODS */
165 @Override
166 public boolean setFocus() {
167 if (hasFilter)
168 return filterTxt.setFocus();
169 else
170 return usersViewer.getTable().setFocus();
171 }
172
173 @Override
174 public void dispose() {
175 super.dispose();
176 }
177
178 /* LOCAL CLASSES AND METHODS */
179 // Will be usefull to rather use a virtual table viewer
180 private void refreshFilteredList(String filter) {
181 List<User> users = listFilteredElements(filter);
182 usersViewer.setInput(users.toArray());
183 }
184
185 private class UsersContentProvider implements IStructuredContentProvider {
186 private static final long serialVersionUID = 1L;
187
188 public Object[] getElements(Object inputElement) {
189 return (Object[]) inputElement;
190 }
191
192 public void dispose() {
193 }
194
195 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
196 }
197 }
198
199 /* MANAGE FILTER */
200 private void createFilterPart(Composite parent) {
201 // Text Area for the filter
202 filterTxt = new Text(parent, SWT.BORDER | SWT.SEARCH | SWT.ICON_SEARCH
203 | SWT.ICON_CANCEL);
204 filterTxt.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
205 | GridData.HORIZONTAL_ALIGN_FILL));
206 filterTxt.addModifyListener(new ModifyListener() {
207 private static final long serialVersionUID = 1L;
208
209 public void modifyText(ModifyEvent event) {
210 refreshFilteredList(filterTxt.getText());
211 }
212 });
213 }
214
215 private TableViewer createTableViewer(final Composite parent) {
216
217 int style = tableStyle | SWT.H_SCROLL | SWT.V_SCROLL;
218 if (hasSelectionColumn)
219 style = style | SWT.CHECK;
220 Table table = new Table(parent, style);
221 TableColumnLayout layout = new TableColumnLayout();
222
223 // TODO the table layout does not works with the scrolled form
224
225 if (preventTableLayout) {
226 parent.setLayout(EclipseUiUtils.noSpaceGridLayout());
227 table.setLayoutData(EclipseUiUtils.fillAll());
228 } else
229 parent.setLayout(layout);
230
231 TableViewer viewer;
232 if (hasSelectionColumn)
233 viewer = new CheckboxTableViewer(table);
234 else
235 viewer = new TableViewer(table);
236 table.setLinesVisible(true);
237 table.setHeaderVisible(true);
238
239 TableViewerColumn column;
240 int offset = 0;
241 if (hasSelectionColumn) {
242 offset = 1;
243 column = ViewerUtils.createTableViewerColumn(viewer, "", SWT.NONE,
244 25);
245 column.setLabelProvider(new ColumnLabelProvider() {
246 private static final long serialVersionUID = 1L;
247
248 @Override
249 public String getText(Object element) {
250 return null;
251 }
252 });
253 SelectionAdapter selectionAdapter = new SelectionAdapter() {
254 private static final long serialVersionUID = 1L;
255
256 boolean allSelected = false;
257
258 @Override
259 public void widgetSelected(SelectionEvent e) {
260 allSelected = !allSelected;
261 ((CheckboxTableViewer) usersViewer)
262 .setAllChecked(allSelected);
263 }
264 };
265 column.getColumn().addSelectionListener(selectionAdapter);
266 }
267
268 // NodeViewerComparator comparator = new NodeViewerComparator();
269 // TODO enable the sort by click on the header
270 int i = offset;
271 for (ColumnDefinition colDef : columnDefs)
272 createTableColumn(viewer, layout, colDef);
273
274 // column = ViewerUtils.createTableViewerColumn(viewer,
275 // colDef.getHeaderLabel(), SWT.NONE, colDef.getColumnSize());
276 // column.setLabelProvider(new CLProvider(colDef.getPropertyName()));
277 // column.getColumn().addSelectionListener(
278 // JcrUiUtils.getNodeSelectionAdapter(i,
279 // colDef.getPropertyType(), colDef.getPropertyName(),
280 // comparator, viewer));
281 // i++;
282 // }
283
284 // IMPORTANT: initialize comparator before setting it
285 // ColumnDefinition firstCol = colDefs.get(0);
286 // comparator.setColumn(firstCol.getPropertyType(),
287 // firstCol.getPropertyName());
288 // viewer.setComparator(comparator);
289
290 return viewer;
291 }
292
293 /** Default creation of a column for a user table */
294 private TableViewerColumn createTableColumn(TableViewer tableViewer,
295 TableColumnLayout layout, ColumnDefinition columnDef) {
296
297 boolean resizable = true;
298 TableViewerColumn tvc = new TableViewerColumn(tableViewer, SWT.NONE);
299 TableColumn column = tvc.getColumn();
300
301 column.setText(columnDef.getLabel());
302 column.setWidth(columnDef.getMinWidth());
303 column.setResizable(resizable);
304
305 ColumnLabelProvider lp = columnDef.getLabelProvider();
306 // add a reference to the display to enable font management
307 if (lp instanceof UserAdminAbstractLP)
308 ((UserAdminAbstractLP) lp).setDisplay(tableViewer.getTable()
309 .getDisplay());
310 tvc.setLabelProvider(lp);
311
312 layout.setColumnData(column, new ColumnWeightData(
313 columnDef.getWeight(), columnDef.getMinWidth(), resizable));
314
315 return tvc;
316 }
317 }