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
.JcrColumnDefinition
;
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
;
50 * Composite that contains a JFace table to display users that are stored in JCR
51 * following the Argeo Conventions (See {@link ArgeoNames}
53 public class JcrUsersTable
extends Composite
implements ArgeoNames
{
54 // private final static Log log =
55 // LogFactory.getLog(UserTableComposite.class);
57 private static final long serialVersionUID
= -7385959046279360420L;
59 private Session session
;
61 private boolean hasFilter
;
62 private boolean hasSelectionColumn
;
63 private int tableStyle
;
65 private TableViewer usersViewer
;
66 private Text filterTxt
;
67 private String filterHelpMsg
= "Type filter criterion "
68 + "separated by a space";
73 /** Overwrite to display other columns */
74 public List
<JcrColumnDefinition
> getColumnsDef() {
75 List
<JcrColumnDefinition
> columnDefs
= new ArrayList
<JcrColumnDefinition
>();
78 columnDefs
.add(new JcrColumnDefinition(ARGEO_USER_ID
,
79 PropertyType
.STRING
, "User ID", 100));
81 columnDefs
.add(new JcrColumnDefinition(Property
.JCR_TITLE
,
82 PropertyType
.STRING
, "Name", 150));
85 columnDefs
.add(new JcrColumnDefinition(ARGEO_PRIMARY_EMAIL
,
86 PropertyType
.STRING
, "E-mail", 150));
89 columnDefs
.add(new JcrColumnDefinition(Property
.JCR_DESCRIPTION
,
90 PropertyType
.STRING
, "Description", 200));
95 public JcrUsersTable(Composite parent
, int style
, Session session
) {
96 super(parent
, SWT
.NO_FOCUS
);
97 this.tableStyle
= style
;
98 this.session
= session
;
104 * choose to add a field to filter results or not
105 * @param addSelection
106 * choose to add a column to select some of the displayed results
109 public void populate(boolean addFilter
, boolean addSelection
) {
111 Composite parent
= this;
112 italic
= EclipseUiUtils
.getItalicFont(parent
);
113 bold
= EclipseUiUtils
.getBoldFont(parent
);
114 hasFilter
= addFilter
;
115 hasSelectionColumn
= addSelection
;
118 GridLayout layout
= EclipseUiUtils
.noSpaceGridLayout();
119 layout
.verticalSpacing
= 5;
120 this.setLayout(layout
);
122 createFilterPart(parent
);
123 usersViewer
= createTableViewer(parent
);
124 // EclipseUiSpecificUtils.enableToolTipSupport(usersViewer);
125 usersViewer
.setContentProvider(new UsersContentProvider());
126 refreshFilteredList();
129 public List
<Node
> getSelectedUsers() {
130 if (hasSelectionColumn
) {
131 Object
[] elements
= ((CheckboxTableViewer
) usersViewer
)
132 .getCheckedElements();
134 List
<Node
> result
= new ArrayList
<Node
>();
135 for (Object obj
: elements
) {
136 result
.add((Node
) obj
);
140 throw new ArgeoException("Unvalid request: no selection column "
141 + "has been created for the current table");
144 /** Returns the User table viewer, typically to add doubleclick listener */
145 public TableViewer
getTableViewer() {
149 /** Returns filter String or null */
150 protected String
getFilterString() {
151 return hasFilter ? filterTxt
.getText() : null;
154 private TableViewer
createTableViewer(final Composite parent
) {
155 int style
= tableStyle
| SWT
.H_SCROLL
| SWT
.V_SCROLL
;
156 if (hasSelectionColumn
)
157 style
= style
| SWT
.CHECK
;
159 Table table
= new Table(parent
, style
);
160 table
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
163 if (hasSelectionColumn
)
164 viewer
= new CheckboxTableViewer(table
);
166 viewer
= new TableViewer(table
);
167 table
.setLinesVisible(true);
168 table
.setHeaderVisible(true);
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
<JcrColumnDefinition
> colDefs
= getColumnsDef();
202 NodeViewerComparator comparator
= new NodeViewerComparator();
204 for (JcrColumnDefinition 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 JcrColumnDefinition 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()))
244 Node userProfile
= (Node
) elem
;
245 if (!userProfile
.getProperty(ARGEO_ENABLED
).getBoolean())
249 } catch (RepositoryException e
) {
250 throw new ArgeoException("Cannot get font for " + username
, e
);
256 public boolean setFocus() {
257 usersViewer
.getTable().setFocus();
262 public void dispose() {
266 public void refresh() {
267 refreshFilteredList();
270 private String
getProperty(Object element
, String name
) {
272 Node userProfile
= (Node
) element
;
273 return userProfile
.hasProperty(name
) ? userProfile
274 .getProperty(name
).getString() : "";
275 } catch (RepositoryException e
) {
276 throw new ArgeoException("Cannot get property " + name
, e
);
280 private class UsersContentProvider
implements IStructuredContentProvider
{
281 private static final long serialVersionUID
= 1L;
283 public Object
[] getElements(Object inputElement
) {
284 return (Object
[]) inputElement
;
287 public void dispose() {
290 public void inputChanged(Viewer viewer
, Object oldInput
, Object newInput
) {
295 private void createFilterPart(Composite parent
) {
296 // Text Area for the filter
297 filterTxt
= new Text(parent
, SWT
.BORDER
| SWT
.SEARCH
| SWT
.ICON_SEARCH
299 filterTxt
.setMessage(filterHelpMsg
);
300 filterTxt
.setLayoutData(new GridData(GridData
.GRAB_HORIZONTAL
301 | GridData
.HORIZONTAL_ALIGN_FILL
));
302 filterTxt
.addModifyListener(new ModifyListener() {
303 private static final long serialVersionUID
= 1L;
305 public void modifyText(ModifyEvent event
) {
306 refreshFilteredList();
312 * Refresh the user list: caller might overwrite in order to display a
313 * subset of all users, typically to remove current user from the list
315 protected void refreshFilteredList() {
318 nodes
= JcrUtils
.nodeIteratorToList(listFilteredElements(session
,
319 hasFilter ? filterTxt
.getText() : null));
320 usersViewer
.setInput(nodes
.toArray());
321 } catch (RepositoryException e
) {
322 throw new ArgeoException("Unable to list users", e
);
327 * Build repository request : caller might overwrite in order to display a
328 * subset of all users
330 protected NodeIterator
listFilteredElements(Session session
, String filter
)
331 throws RepositoryException
{
332 QueryManager queryManager
= session
.getWorkspace().getQueryManager();
333 QueryObjectModelFactory factory
= queryManager
.getQOMFactory();
335 Selector source
= factory
.selector(ArgeoTypes
.ARGEO_USER_PROFILE
,
336 ArgeoTypes
.ARGEO_USER_PROFILE
);
338 // Dynamically build constraint depending on the filter String
339 Constraint defaultC
= null;
340 if (filter
!= null && !"".equals(filter
.trim())) {
341 String
[] strs
= filter
.trim().split(" ");
342 for (String token
: strs
) {
343 StaticOperand so
= factory
.literal(session
.getValueFactory()
344 .createValue("*" + token
+ "*"));
345 Constraint currC
= factory
.fullTextSearch(
346 source
.getSelectorName(), null, so
);
347 if (defaultC
== null)
350 defaultC
= factory
.and(defaultC
, currC
);
354 Ordering order
= factory
.ascending(factory
.propertyValue(
355 source
.getSelectorName(), ARGEO_USER_ID
));
356 Ordering
[] orderings
= { order
};
358 QueryObjectModel query
= factory
.createQuery(source
, defaultC
,
361 QueryResult result
= query
.execute();
362 return result
.getNodes();