1 package org
.argeo
.security
.ui
.admin
.internal
;
3 import java
.util
.ArrayList
;
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
;
35 * Generic composite that display a filter and a table viewer to display users
36 * (can also be groups)
38 * Warning: this class does not extends <code>TableViewer</code>. Use the
39 * getTableViewer to acces it.
42 public class UserTableViewer
extends Composite
{
43 private static final long serialVersionUID
= -7385959046279360420L;
46 private UserAdmin userAdmin
;
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
;
56 private TableViewer usersViewer
;
57 private Text filterTxt
;
66 public UserTableViewer(Composite parent
, int style
, UserAdmin userAdmin
) {
67 super(parent
, SWT
.NO_FOCUS
);
68 this.tableStyle
= style
;
69 this.userAdmin
= userAdmin
;
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
;
81 /** This must be called before the call to populate method */
82 public void setColumnDefinitions(List
<ColumnDefinition
> columnDefinitions
) {
83 this.columnDefs
= columnDefinitions
;
89 * choose to add a field to filter results or not
91 * choose to add a column to select some of the displayed results
94 public void populate(boolean addFilter
, boolean addSelection
) {
96 Composite parent
= this;
97 hasFilter
= addFilter
;
98 hasSelectionColumn
= addSelection
;
101 GridLayout layout
= EclipseUiUtils
.noSpaceGridLayout();
102 layout
.verticalSpacing
= 5;
103 this.setLayout(layout
);
105 createFilterPart(parent
);
107 Composite tableComp
= new Composite(parent
, SWT
.NO_FOCUS
);
108 tableComp
.setLayoutData(EclipseUiUtils
.fillAll());
109 usersViewer
= createTableViewer(tableComp
);
111 usersViewer
.setContentProvider(new UsersContentProvider());
114 /** Enable access to the selected users or groups */
115 public List
<User
> getSelectedUsers() {
116 if (hasSelectionColumn
) {
117 Object
[] elements
= ((CheckboxTableViewer
) usersViewer
)
118 .getCheckedElements();
120 List
<User
> result
= new ArrayList
<User
>();
121 for (Object obj
: elements
) {
122 result
.add((User
) obj
);
126 throw new ArgeoException("Unvalid request: no selection column "
127 + "has been created for the current table");
130 /** Returns the User table viewer, typically to add doubleclick listener */
131 public TableViewer
getTableViewer() {
136 * Force the refresh of the underlying table using the current filter string
139 public void refresh() {
140 String filter
= hasFilter ? filterTxt
.getText() : null;
141 if ("".equals(filter
.trim()))
143 refreshFilteredList(filter
);
147 * Build repository request : caller might overwrite in order to display a
148 * subset of all users
150 protected List
<User
> listFilteredElements(String filter
) {
151 List
<User
> users
= new ArrayList
<User
>();
153 Role
[] roles
= userAdmin
.getRoles(filter
);
154 // Display all users and groups
155 for (Role role
: roles
)
156 users
.add((User
) role
);
157 } catch (InvalidSyntaxException e
) {
158 throw new ArgeoException("Unable to get roles with filter: "
164 /* GENERIC COMPOSITE METHODS */
166 public boolean setFocus() {
168 return filterTxt
.setFocus();
170 return usersViewer
.getTable().setFocus();
174 public void dispose() {
178 /* LOCAL CLASSES AND METHODS */
179 // Will be usefull to rather use a virtual table viewer
180 private void refreshFilteredList(String filter
) {
181 List
<User
> users
= listFilteredElements(filter
);
182 usersViewer
.setInput(users
.toArray());
185 private class UsersContentProvider
implements IStructuredContentProvider
{
186 private static final long serialVersionUID
= 1L;
188 public Object
[] getElements(Object inputElement
) {
189 return (Object
[]) inputElement
;
192 public void dispose() {
195 public void inputChanged(Viewer viewer
, Object oldInput
, Object newInput
) {
200 private void createFilterPart(Composite parent
) {
201 // Text Area for the filter
202 filterTxt
= new Text(parent
, SWT
.BORDER
| SWT
.SEARCH
| SWT
.ICON_SEARCH
204 filterTxt
.setLayoutData(new GridData(GridData
.GRAB_HORIZONTAL
205 | GridData
.HORIZONTAL_ALIGN_FILL
));
206 filterTxt
.addModifyListener(new ModifyListener() {
207 private static final long serialVersionUID
= 1L;
209 public void modifyText(ModifyEvent event
) {
210 refreshFilteredList(filterTxt
.getText());
215 private TableViewer
createTableViewer(final Composite parent
) {
217 int style
= tableStyle
| SWT
.H_SCROLL
| SWT
.V_SCROLL
;
218 if (hasSelectionColumn
)
219 style
= style
| SWT
.CHECK
;
220 Table table
= new Table(parent
, style
);
221 TableColumnLayout layout
= new TableColumnLayout();
223 // TODO the table layout does not works with the scrolled form
225 if (preventTableLayout
) {
226 parent
.setLayout(EclipseUiUtils
.noSpaceGridLayout());
227 table
.setLayoutData(EclipseUiUtils
.fillAll());
229 parent
.setLayout(layout
);
232 if (hasSelectionColumn
)
233 viewer
= new CheckboxTableViewer(table
);
235 viewer
= new TableViewer(table
);
236 table
.setLinesVisible(true);
237 table
.setHeaderVisible(true);
239 TableViewerColumn column
;
241 if (hasSelectionColumn
) {
243 column
= ViewerUtils
.createTableViewerColumn(viewer
, "", SWT
.NONE
,
245 column
.setLabelProvider(new ColumnLabelProvider() {
246 private static final long serialVersionUID
= 1L;
249 public String
getText(Object element
) {
253 SelectionAdapter selectionAdapter
= new SelectionAdapter() {
254 private static final long serialVersionUID
= 1L;
256 boolean allSelected
= false;
259 public void widgetSelected(SelectionEvent e
) {
260 allSelected
= !allSelected
;
261 ((CheckboxTableViewer
) usersViewer
)
262 .setAllChecked(allSelected
);
265 column
.getColumn().addSelectionListener(selectionAdapter
);
268 // NodeViewerComparator comparator = new NodeViewerComparator();
269 // TODO enable the sort by click on the header
271 for (ColumnDefinition colDef
: columnDefs
)
272 createTableColumn(viewer
, layout
, colDef
);
274 // column = ViewerUtils.createTableViewerColumn(viewer,
275 // colDef.getHeaderLabel(), SWT.NONE, colDef.getColumnSize());
276 // column.setLabelProvider(new CLProvider(colDef.getPropertyName()));
277 // column.getColumn().addSelectionListener(
278 // JcrUiUtils.getNodeSelectionAdapter(i,
279 // colDef.getPropertyType(), colDef.getPropertyName(),
280 // comparator, viewer));
284 // IMPORTANT: initialize comparator before setting it
285 // ColumnDefinition firstCol = colDefs.get(0);
286 // comparator.setColumn(firstCol.getPropertyType(),
287 // firstCol.getPropertyName());
288 // viewer.setComparator(comparator);
293 /** Default creation of a column for a user table */
294 private TableViewerColumn
createTableColumn(TableViewer tableViewer
,
295 TableColumnLayout layout
, ColumnDefinition columnDef
) {
297 boolean resizable
= true;
298 TableViewerColumn tvc
= new TableViewerColumn(tableViewer
, SWT
.NONE
);
299 TableColumn column
= tvc
.getColumn();
301 column
.setText(columnDef
.getLabel());
302 column
.setWidth(columnDef
.getMinWidth());
303 column
.setResizable(resizable
);
305 ColumnLabelProvider lp
= columnDef
.getLabelProvider();
306 // add a reference to the display to enable font management
307 if (lp
instanceof UserAdminAbstractLP
)
308 ((UserAdminAbstractLP
) lp
).setDisplay(tableViewer
.getTable()
310 tvc
.setLabelProvider(lp
);
312 layout
.setColumnData(column
, new ColumnWeightData(
313 columnDef
.getWeight(), columnDef
.getMinWidth(), resizable
));