1 package org
.argeo
.eclipse
.ui
.parts
;
3 import java
.util
.ArrayList
;
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
;
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
;
49 public class UsersTable
extends Composite
implements ArgeoNames
{
50 // private final static Log log =
51 // LogFactory.getLog(UserTableComposite.class);
53 private static final long serialVersionUID
= -7385959046279360420L;
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
;
64 private boolean hasFilter
;
65 private boolean hasSelectionColumn
;
67 // private List<Node> selectedItems = new ArrayList<Node>();
70 * Overwrite to display other columns
72 public List
<ColumnDefinition
> getColumnsDef() {
73 List
<ColumnDefinition
> columnDefs
= new ArrayList
<ColumnDefinition
>();
76 columnDefs
.add(new ColumnDefinition(null, ARGEO_USER_ID
,
77 PropertyType
.STRING
, "User ID", 100));
79 columnDefs
.add(new ColumnDefinition(null, Property
.JCR_TITLE
,
80 PropertyType
.STRING
, "Name", 150));
83 columnDefs
.add(new ColumnDefinition(null, ARGEO_PRIMARY_EMAIL
,
84 PropertyType
.STRING
, "E-mail", 150));
87 columnDefs
.add(new ColumnDefinition(null, Property
.JCR_DESCRIPTION
,
88 PropertyType
.STRING
, "Description", 200));
93 public UsersTable(Composite parent
, int style
, Session session
) {
95 this.session
= session
;
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
106 public void populate(boolean addFilter
, boolean addSelection
) {
108 Composite parent
= this;
109 italic
= EclipseUiUtils
.getItalicFont(parent
);
110 bold
= EclipseUiUtils
.getBoldFont(parent
);
111 hasFilter
= addFilter
;
112 hasSelectionColumn
= addSelection
;
115 this.setLayout(new GridLayout(1, false));
117 createFilterPart(parent
);
118 usersViewer
= createTableViewer(parent
);
119 // EclipseUiSpecificUtils.enableToolTipSupport(usersViewer);
120 usersViewer
.setContentProvider(new UsersContentProvider());
121 refreshFilteredList();
124 public List
<Node
> getSelectedUsers() {
125 if (hasSelectionColumn
) {
126 Object
[] elements
= ((CheckboxTableViewer
) usersViewer
)
127 .getCheckedElements();
129 List
<Node
> result
= new ArrayList
<Node
>();
130 for (Object obj
: elements
) {
131 result
.add((Node
) obj
);
135 throw new ArgeoException("Unvalid request: no selection column "
136 + "has been created for the current table");
139 /** Returns the User table viewer, typically to add doubleclick listener */
140 public TableViewer
getTableViewer() {
144 /** Returns filter String or null*/
145 protected String
getFilterString() {
146 return hasFilter ? filterTxt
.getText() : null;
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
;
156 Table table
= new Table(parent
, style
);
157 table
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
160 if (hasSelectionColumn
)
161 viewer
= new CheckboxTableViewer(table
);
163 viewer
= new TableViewer(table
);
164 table
.setLinesVisible(true);
165 table
.setHeaderVisible(true);
167 // pass a mapping between col index and property name to the comparator.
168 // List<String> propertiesList = new ArrayList<String>();
170 TableViewerColumn column
;
172 if (hasSelectionColumn
) {
174 column
= ViewerUtils
.createTableViewerColumn(viewer
, "", SWT
.NONE
,
176 column
.setLabelProvider(new ColumnLabelProvider() {
177 private static final long serialVersionUID
= 1L;
180 public String
getText(Object element
) {
184 SelectionAdapter selectionAdapter
= new SelectionAdapter() {
185 private static final long serialVersionUID
= 1L;
187 boolean allSelected
= false;
190 public void widgetSelected(SelectionEvent e
) {
191 allSelected
= !allSelected
;
192 ((CheckboxTableViewer
) usersViewer
)
193 .setAllChecked(allSelected
);
196 column
.getColumn().addSelectionListener(selectionAdapter
);
199 // Create other columns
200 List
<ColumnDefinition
> colDefs
= getColumnsDef();
202 NodeViewerComparator comparator
= new NodeViewerComparator();
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
));
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
);
224 private class CLProvider
extends SimpleJcrNodeLabelProvider
{
226 private static final long serialVersionUID
= 1L;
228 public CLProvider(String propertyName
) {
232 public String
getToolTipText(Object element
) {
233 return getText(element
);
237 public Font
getFont(Object elem
) {
239 String username
= getProperty(elem
, ARGEO_USER_ID
);
240 if (username
.equals(session
.getUserID()))
245 Node userProfile
= (Node
) elem
;
246 // Node userProfile = userHome.getNode(ARGEO_PROFILE);
247 if (!userProfile
.getProperty(ARGEO_ENABLED
).getBoolean())
251 } catch (RepositoryException e
) {
252 throw new ArgeoException("Cannot get font for " + username
, e
);
258 public boolean setFocus() {
259 usersViewer
.getTable().setFocus();
264 public void dispose() {
268 public void refresh() {
269 refreshFilteredList();
272 private String
getProperty(Object element
, String name
) {
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
);
282 private class UsersContentProvider
implements IStructuredContentProvider
{
283 private static final long serialVersionUID
= 1L;
285 public Object
[] getElements(Object inputElement
) {
286 return (Object
[]) inputElement
;
289 public void dispose() {
292 public void inputChanged(Viewer viewer
, Object oldInput
, Object newInput
) {
297 private void createFilterPart(Composite parent
) {
298 // Text Area for the filter
299 filterTxt
= new Text(parent
, SWT
.BORDER
| SWT
.SEARCH
| SWT
.ICON_SEARCH
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;
307 public void modifyText(ModifyEvent event
) {
308 refreshFilteredList();
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
317 protected void refreshFilteredList() {
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
);
329 * Build repository request : caller might overwrite in order to display a
330 * subset of all users
332 protected NodeIterator
listFilteredElements(Session session
, String filter
)
333 throws RepositoryException
{
334 QueryManager queryManager
= session
.getWorkspace().getQueryManager();
335 QueryObjectModelFactory factory
= queryManager
.getQOMFactory();
337 Selector source
= factory
.selector(ArgeoTypes
.ARGEO_USER_PROFILE
,
338 ArgeoTypes
.ARGEO_USER_PROFILE
);
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)
352 defaultC
= factory
.and(defaultC
, currC
);
356 Ordering order
= factory
.ascending(factory
.propertyValue(
357 source
.getSelectorName(), ARGEO_USER_ID
));
358 Ordering
[] orderings
= { order
};
360 QueryObjectModel query
= factory
.createQuery(source
, defaultC
,
363 QueryResult result
= query
.execute();
364 return result
.getNodes();