]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.eclipse.ui/src/org/argeo/eclipse/ui/parts/UsersTable.java
enhance user management strategies
[lgpl/argeo-commons.git] / org.argeo.eclipse.ui / src / org / argeo / eclipse / ui / parts / UsersTable.java
1 package org.argeo.eclipse.ui.parts;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import javax.jcr.Node;
7 import javax.jcr.NodeIterator;
8 import javax.jcr.Property;
9 import javax.jcr.PropertyType;
10 import javax.jcr.RepositoryException;
11 import javax.jcr.Session;
12 import javax.jcr.query.QueryManager;
13 import javax.jcr.query.QueryResult;
14 import javax.jcr.query.qom.Constraint;
15 import javax.jcr.query.qom.Ordering;
16 import javax.jcr.query.qom.QueryObjectModel;
17 import javax.jcr.query.qom.QueryObjectModelFactory;
18 import javax.jcr.query.qom.Selector;
19 import javax.jcr.query.qom.StaticOperand;
20
21 import org.argeo.ArgeoException;
22 import org.argeo.eclipse.ui.EclipseUiUtils;
23 import org.argeo.eclipse.ui.jcr.JcrUiUtils;
24 import org.argeo.eclipse.ui.jcr.lists.ColumnDefinition;
25 import org.argeo.eclipse.ui.jcr.lists.NodeViewerComparator;
26 import org.argeo.eclipse.ui.jcr.lists.SimpleJcrNodeLabelProvider;
27 import org.argeo.eclipse.ui.utils.ViewerUtils;
28 import org.argeo.jcr.ArgeoNames;
29 import org.argeo.jcr.ArgeoTypes;
30 import org.argeo.jcr.JcrUtils;
31 import org.eclipse.jface.viewers.CheckboxTableViewer;
32 import org.eclipse.jface.viewers.ColumnLabelProvider;
33 import org.eclipse.jface.viewers.IStructuredContentProvider;
34 import org.eclipse.jface.viewers.TableViewer;
35 import org.eclipse.jface.viewers.TableViewerColumn;
36 import org.eclipse.jface.viewers.Viewer;
37 import org.eclipse.swt.SWT;
38 import org.eclipse.swt.events.ModifyEvent;
39 import org.eclipse.swt.events.ModifyListener;
40 import org.eclipse.swt.events.SelectionAdapter;
41 import org.eclipse.swt.events.SelectionEvent;
42 import org.eclipse.swt.graphics.Font;
43 import org.eclipse.swt.layout.GridData;
44 import org.eclipse.swt.layout.GridLayout;
45 import org.eclipse.swt.widgets.Composite;
46 import org.eclipse.swt.widgets.Table;
47 import org.eclipse.swt.widgets.Text;
48
49 public class UsersTable extends Composite implements ArgeoNames {
50 // private final static Log log =
51 // LogFactory.getLog(UserTableComposite.class);
52
53 private static final long serialVersionUID = -7385959046279360420L;
54
55 private TableViewer usersViewer;
56 private Text filterTxt;
57 private final static String FILTER_HELP_MSG = "Type filter criterion "
58 + "separated by a space";
59 private Session session;
60
61 private Font italic;
62 private Font bold;
63
64 private boolean hasFilter;
65 private boolean hasSelectionColumn;
66
67 // private List<Node> selectedItems = new ArrayList<Node>();
68
69 /**
70 * Overwrite to display other columns
71 */
72 public List<ColumnDefinition> getColumnsDef() {
73 List<ColumnDefinition> columnDefs = new ArrayList<ColumnDefinition>();
74
75 // User ID
76 columnDefs.add(new ColumnDefinition(null, ARGEO_USER_ID,
77 PropertyType.STRING, "User ID", 100));
78 // Displayed name
79 columnDefs.add(new ColumnDefinition(null, Property.JCR_TITLE,
80 PropertyType.STRING, "Name", 150));
81
82 // E-mail
83 columnDefs.add(new ColumnDefinition(null, ARGEO_PRIMARY_EMAIL,
84 PropertyType.STRING, "E-mail", 150));
85
86 // Description
87 columnDefs.add(new ColumnDefinition(null, Property.JCR_DESCRIPTION,
88 PropertyType.STRING, "Description", 200));
89
90 return columnDefs;
91 }
92
93 public UsersTable(Composite parent, int style, Session session) {
94 super(parent, style);
95 this.session = session;
96 }
97
98 /**
99 *
100 * @param addFilter
101 * choose to add a field to filter results or not
102 * @param addSelection
103 * choose to add a column to select some of the displayed results
104 * or not
105 */
106 public void populate(boolean addFilter, boolean addSelection) {
107 // initialization
108 Composite parent = this;
109 italic = EclipseUiUtils.getItalicFont(parent);
110 bold = EclipseUiUtils.getBoldFont(parent);
111 hasFilter = addFilter;
112 hasSelectionColumn = addSelection;
113
114 // Main Layout
115 this.setLayout(new GridLayout(1, false));
116 if (hasFilter)
117 createFilterPart(parent);
118 usersViewer = createTableViewer(parent);
119 // EclipseUiSpecificUtils.enableToolTipSupport(usersViewer);
120 usersViewer.setContentProvider(new UsersContentProvider());
121 refreshFilteredList();
122 }
123
124 public List<Node> getSelectedUsers() {
125 if (hasSelectionColumn) {
126 Object[] elements = ((CheckboxTableViewer) usersViewer)
127 .getCheckedElements();
128
129 List<Node> result = new ArrayList<Node>();
130 for (Object obj : elements) {
131 result.add((Node) obj);
132 }
133 return result;
134 } else
135 throw new ArgeoException("Unvalid request: no selection column "
136 + "has been created for the current table");
137 }
138
139 /** Returns the User table viewer, typically to add doubleclick listener */
140 public TableViewer getTableViewer() {
141 return usersViewer;
142 }
143
144 /** Returns filter String or null*/
145 protected String getFilterString() {
146 return hasFilter ? filterTxt.getText() : null;
147 }
148
149
150
151 private TableViewer createTableViewer(final Composite parent) {
152 int style = SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL;
153 if (hasSelectionColumn)
154 style = style | SWT.CHECK;
155
156 Table table = new Table(parent, style);
157 table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
158
159 TableViewer viewer;
160 if (hasSelectionColumn)
161 viewer = new CheckboxTableViewer(table);
162 else
163 viewer = new TableViewer(table);
164 table.setLinesVisible(true);
165 table.setHeaderVisible(true);
166
167 // pass a mapping between col index and property name to the comparator.
168 // List<String> propertiesList = new ArrayList<String>();
169
170 TableViewerColumn column;
171 int offset = 0;
172 if (hasSelectionColumn) {
173 offset = 1;
174 column = ViewerUtils.createTableViewerColumn(viewer, "", SWT.NONE,
175 25);
176 column.setLabelProvider(new ColumnLabelProvider() {
177 private static final long serialVersionUID = 1L;
178
179 @Override
180 public String getText(Object element) {
181 return null;
182 }
183 });
184 SelectionAdapter selectionAdapter = new SelectionAdapter() {
185 private static final long serialVersionUID = 1L;
186
187 boolean allSelected = false;
188
189 @Override
190 public void widgetSelected(SelectionEvent e) {
191 allSelected = !allSelected;
192 ((CheckboxTableViewer) usersViewer)
193 .setAllChecked(allSelected);
194 }
195 };
196 column.getColumn().addSelectionListener(selectionAdapter);
197 }
198
199 // Create other columns
200 List<ColumnDefinition> colDefs = getColumnsDef();
201
202 NodeViewerComparator comparator = new NodeViewerComparator();
203 int i = offset;
204 for (ColumnDefinition colDef : colDefs) {
205 column = ViewerUtils.createTableViewerColumn(viewer,
206 colDef.getHeaderLabel(), SWT.NONE, colDef.getColumnSize());
207 column.setLabelProvider(new CLProvider(colDef.getPropertyName()));
208 column.getColumn().addSelectionListener(
209 JcrUiUtils.getNodeSelectionAdapter(i,
210 colDef.getPropertyType(), colDef.getPropertyName(),
211 comparator, viewer));
212 i++;
213 }
214
215 // IMPORTANT: initialize comparator before setting it
216 ColumnDefinition firstCol = colDefs.get(0);
217 comparator.setColumn(firstCol.getPropertyType(),
218 firstCol.getPropertyName());
219 viewer.setComparator(comparator);
220
221 return viewer;
222 }
223
224 private class CLProvider extends SimpleJcrNodeLabelProvider {
225
226 private static final long serialVersionUID = 1L;
227
228 public CLProvider(String propertyName) {
229 super(propertyName);
230 }
231
232 public String getToolTipText(Object element) {
233 return getText(element);
234 }
235
236 @Override
237 public Font getFont(Object elem) {
238 // self
239 String username = getProperty(elem, ARGEO_USER_ID);
240 if (username.equals(session.getUserID()))
241 return bold;
242
243 // disabled
244 try {
245 Node userProfile = (Node) elem;
246 // Node userProfile = userHome.getNode(ARGEO_PROFILE);
247 if (!userProfile.getProperty(ARGEO_ENABLED).getBoolean())
248 return italic;
249 else
250 return null;
251 } catch (RepositoryException e) {
252 throw new ArgeoException("Cannot get font for " + username, e);
253 }
254 }
255 }
256
257 @Override
258 public boolean setFocus() {
259 usersViewer.getTable().setFocus();
260 return true;
261 }
262
263 @Override
264 public void dispose() {
265 super.dispose();
266 }
267
268 public void refresh() {
269 refreshFilteredList();
270 }
271
272 private String getProperty(Object element, String name) {
273 try {
274 Node userProfile = (Node) element;
275 return userProfile.hasProperty(name) ? userProfile
276 .getProperty(name).getString() : "";
277 } catch (RepositoryException e) {
278 throw new ArgeoException("Cannot get property " + name, e);
279 }
280 }
281
282 private class UsersContentProvider implements IStructuredContentProvider {
283 private static final long serialVersionUID = 1L;
284
285 public Object[] getElements(Object inputElement) {
286 return (Object[]) inputElement;
287 }
288
289 public void dispose() {
290 }
291
292 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
293 }
294 }
295
296 /* MANAGE FILTER */
297 private void createFilterPart(Composite parent) {
298 // Text Area for the filter
299 filterTxt = new Text(parent, SWT.BORDER | SWT.SEARCH | SWT.ICON_SEARCH
300 | SWT.ICON_CANCEL);
301 filterTxt.setMessage(FILTER_HELP_MSG);
302 filterTxt.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
303 | GridData.HORIZONTAL_ALIGN_FILL));
304 filterTxt.addModifyListener(new ModifyListener() {
305 private static final long serialVersionUID = 1L;
306
307 public void modifyText(ModifyEvent event) {
308 refreshFilteredList();
309 }
310 });
311 }
312
313 /**
314 * Refresh the user list: caller might overwrite in order to display a
315 * subset of all users, typically to remove current user from the list
316 */
317 protected void refreshFilteredList() {
318 List<Node> nodes;
319 try {
320 nodes = JcrUtils.nodeIteratorToList(listFilteredElements(session,
321 hasFilter ? filterTxt.getText() : null));
322 usersViewer.setInput(nodes.toArray());
323 } catch (RepositoryException e) {
324 throw new ArgeoException("Unable to list users", e);
325 }
326 }
327
328 /**
329 * Build repository request : caller might overwrite in order to display a
330 * subset of all users
331 */
332 protected NodeIterator listFilteredElements(Session session, String filter)
333 throws RepositoryException {
334 QueryManager queryManager = session.getWorkspace().getQueryManager();
335 QueryObjectModelFactory factory = queryManager.getQOMFactory();
336
337 Selector source = factory.selector(ArgeoTypes.ARGEO_USER_PROFILE,
338 ArgeoTypes.ARGEO_USER_PROFILE);
339
340 // Dynamically build constraint depending on the filter String
341 Constraint defaultC = null;
342 if (filter != null && !"".equals(filter.trim())) {
343 String[] strs = filter.trim().split(" ");
344 for (String token : strs) {
345 StaticOperand so = factory.literal(session.getValueFactory()
346 .createValue("*" + token + "*"));
347 Constraint currC = factory.fullTextSearch(
348 source.getSelectorName(), null, so);
349 if (defaultC == null)
350 defaultC = currC;
351 else
352 defaultC = factory.and(defaultC, currC);
353 }
354 }
355
356 Ordering order = factory.ascending(factory.propertyValue(
357 source.getSelectorName(), ARGEO_USER_ID));
358 Ordering[] orderings = { order };
359
360 QueryObjectModel query = factory.createQuery(source, defaultC,
361 orderings, null);
362
363 QueryResult result = query.execute();
364 return result.getNodes();
365 }
366 }