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