]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserTableViewer.java
fix wrong hierarchy
[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 // /** Returns filter String or null if no filter Text widget */
147 // private String getFilterString() {
148 // return hasFilter ? filterTxt.getText() : null;
149 // }
150
151 /**
152 * Build repository request : caller might overwrite in order to display a
153 * subset of all users
154 */
155 protected List<User> listFilteredElements(String filter) {
156 List<User> users = new ArrayList<User>();
157 try {
158 Role[] roles = userAdmin.getRoles(filter);
159 // Display all users and groups
160 for (Role role : roles)
161 // if (role.getType() == Role.USER && role.getType() !=
162 // Role.GROUP)
163 users.add((User) role);
164 } catch (InvalidSyntaxException e) {
165 throw new ArgeoException("Unable to get roles with filter: "
166 + filter, e);
167 }
168 return users;
169 }
170
171 /* GENERIC COMPOSITE METHODS */
172 @Override
173 public boolean setFocus() {
174 if (hasFilter)
175 return filterTxt.setFocus();
176 else
177 return usersViewer.getTable().setFocus();
178 }
179
180 @Override
181 public void dispose() {
182 super.dispose();
183 }
184
185 /* LOCAL CLASSES AND METHODS */
186 // Will be usefull to rather use a virtual table viewer
187 private void refreshFilteredList(String filter) {
188 List<User> users = listFilteredElements(filter);
189 usersViewer.setInput(users.toArray());
190 }
191
192 private class UsersContentProvider implements IStructuredContentProvider {
193 private static final long serialVersionUID = 1L;
194
195 public Object[] getElements(Object inputElement) {
196 return (Object[]) inputElement;
197 }
198
199 public void dispose() {
200 }
201
202 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
203 }
204 }
205
206 /* MANAGE FILTER */
207 private void createFilterPart(Composite parent) {
208 // Text Area for the filter
209 filterTxt = new Text(parent, SWT.BORDER | SWT.SEARCH | SWT.ICON_SEARCH
210 | SWT.ICON_CANCEL);
211 filterTxt.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
212 | GridData.HORIZONTAL_ALIGN_FILL));
213 filterTxt.addModifyListener(new ModifyListener() {
214 private static final long serialVersionUID = 1L;
215
216 public void modifyText(ModifyEvent event) {
217 refreshFilteredList(filterTxt.getText());
218 }
219 });
220 }
221
222 private TableViewer createTableViewer(final Composite parent) {
223
224 int style = tableStyle | SWT.H_SCROLL | SWT.V_SCROLL;
225 if (hasSelectionColumn)
226 style = style | SWT.CHECK;
227 Table table = new Table(parent, style);
228 TableColumnLayout layout = new TableColumnLayout();
229
230 // TODO the table layout does not works with the scrolled form
231
232 if (preventTableLayout) {
233 parent.setLayout(EclipseUiUtils.noSpaceGridLayout());
234 table.setLayoutData(EclipseUiUtils.fillAll());
235 } else
236 parent.setLayout(layout);
237
238 TableViewer viewer;
239 if (hasSelectionColumn)
240 viewer = new CheckboxTableViewer(table);
241 else
242 viewer = new TableViewer(table);
243 table.setLinesVisible(true);
244 table.setHeaderVisible(true);
245
246 TableViewerColumn column;
247 int offset = 0;
248 if (hasSelectionColumn) {
249 offset = 1;
250 column = ViewerUtils.createTableViewerColumn(viewer, "", SWT.NONE,
251 25);
252 column.setLabelProvider(new ColumnLabelProvider() {
253 private static final long serialVersionUID = 1L;
254
255 @Override
256 public String getText(Object element) {
257 return null;
258 }
259 });
260 SelectionAdapter selectionAdapter = new SelectionAdapter() {
261 private static final long serialVersionUID = 1L;
262
263 boolean allSelected = false;
264
265 @Override
266 public void widgetSelected(SelectionEvent e) {
267 allSelected = !allSelected;
268 ((CheckboxTableViewer) usersViewer)
269 .setAllChecked(allSelected);
270 }
271 };
272 column.getColumn().addSelectionListener(selectionAdapter);
273 }
274
275 // NodeViewerComparator comparator = new NodeViewerComparator();
276 // TODO enable the sort by click on the header
277 int i = offset;
278 for (ColumnDefinition colDef : columnDefs)
279 createTableColumn(viewer, layout, colDef);
280
281 // column = ViewerUtils.createTableViewerColumn(viewer,
282 // colDef.getHeaderLabel(), SWT.NONE, colDef.getColumnSize());
283 // column.setLabelProvider(new CLProvider(colDef.getPropertyName()));
284 // column.getColumn().addSelectionListener(
285 // JcrUiUtils.getNodeSelectionAdapter(i,
286 // colDef.getPropertyType(), colDef.getPropertyName(),
287 // comparator, viewer));
288 // i++;
289 // }
290
291 // IMPORTANT: initialize comparator before setting it
292 // ColumnDefinition firstCol = colDefs.get(0);
293 // comparator.setColumn(firstCol.getPropertyType(),
294 // firstCol.getPropertyName());
295 // viewer.setComparator(comparator);
296
297 return viewer;
298 }
299
300 /** Default creation of a column for a user table */
301 private TableViewerColumn createTableColumn(TableViewer tableViewer,
302 TableColumnLayout layout, ColumnDefinition columnDef) {
303
304 boolean resizable = true;
305 TableViewerColumn tvc = new TableViewerColumn(tableViewer, SWT.NONE);
306 TableColumn column = tvc.getColumn();
307
308 column.setText(columnDef.getLabel());
309 column.setWidth(columnDef.getMinWidth());
310 column.setResizable(resizable);
311
312 ColumnLabelProvider lp = columnDef.getLabelProvider();
313 // add a reference to the display to enable font management
314 if (lp instanceof UserAdminAbstractLP)
315 ((UserAdminAbstractLP) lp).setDisplay(tableViewer.getTable()
316 .getDisplay());
317 tvc.setLabelProvider(lp);
318
319 layout.setColumnData(column, new ColumnWeightData(
320 columnDef.getWeight(), columnDef.getMinWidth(), resizable));
321
322 return tvc;
323 }
324 }