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
);
146 // /** Returns filter String or null if no filter Text widget */
147 // private String getFilterString() {
148 // return hasFilter ? filterTxt.getText() : null;
152 * Build repository request : caller might overwrite in order to display a
153 * subset of all users
155 protected List
<User
> listFilteredElements(String filter
) {
156 List
<User
> users
= new ArrayList
<User
>();
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() !=
163 users
.add((User
) role
);
164 } catch (InvalidSyntaxException e
) {
165 throw new ArgeoException("Unable to get roles with filter: "
171 /* GENERIC COMPOSITE METHODS */
173 public boolean setFocus() {
175 return filterTxt
.setFocus();
177 return usersViewer
.getTable().setFocus();
181 public void dispose() {
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());
192 private class UsersContentProvider
implements IStructuredContentProvider
{
193 private static final long serialVersionUID
= 1L;
195 public Object
[] getElements(Object inputElement
) {
196 return (Object
[]) inputElement
;
199 public void dispose() {
202 public void inputChanged(Viewer viewer
, Object oldInput
, Object newInput
) {
207 private void createFilterPart(Composite parent
) {
208 // Text Area for the filter
209 filterTxt
= new Text(parent
, SWT
.BORDER
| SWT
.SEARCH
| SWT
.ICON_SEARCH
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;
216 public void modifyText(ModifyEvent event
) {
217 refreshFilteredList(filterTxt
.getText());
222 private TableViewer
createTableViewer(final Composite parent
) {
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();
230 // TODO the table layout does not works with the scrolled form
232 if (preventTableLayout
) {
233 parent
.setLayout(EclipseUiUtils
.noSpaceGridLayout());
234 table
.setLayoutData(EclipseUiUtils
.fillAll());
236 parent
.setLayout(layout
);
239 if (hasSelectionColumn
)
240 viewer
= new CheckboxTableViewer(table
);
242 viewer
= new TableViewer(table
);
243 table
.setLinesVisible(true);
244 table
.setHeaderVisible(true);
246 TableViewerColumn column
;
248 if (hasSelectionColumn
) {
250 column
= ViewerUtils
.createTableViewerColumn(viewer
, "", SWT
.NONE
,
252 column
.setLabelProvider(new ColumnLabelProvider() {
253 private static final long serialVersionUID
= 1L;
256 public String
getText(Object element
) {
260 SelectionAdapter selectionAdapter
= new SelectionAdapter() {
261 private static final long serialVersionUID
= 1L;
263 boolean allSelected
= false;
266 public void widgetSelected(SelectionEvent e
) {
267 allSelected
= !allSelected
;
268 ((CheckboxTableViewer
) usersViewer
)
269 .setAllChecked(allSelected
);
272 column
.getColumn().addSelectionListener(selectionAdapter
);
275 // NodeViewerComparator comparator = new NodeViewerComparator();
276 // TODO enable the sort by click on the header
278 for (ColumnDefinition colDef
: columnDefs
)
279 createTableColumn(viewer
, layout
, colDef
);
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));
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);
300 /** Default creation of a column for a user table */
301 private TableViewerColumn
createTableColumn(TableViewer tableViewer
,
302 TableColumnLayout layout
, ColumnDefinition columnDef
) {
304 boolean resizable
= true;
305 TableViewerColumn tvc
= new TableViewerColumn(tableViewer
, SWT
.NONE
);
306 TableColumn column
= tvc
.getColumn();
308 column
.setText(columnDef
.getLabel());
309 column
.setWidth(columnDef
.getMinWidth());
310 column
.setResizable(resizable
);
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()
317 tvc
.setLabelProvider(lp
);
319 layout
.setColumnData(column
, new ColumnWeightData(
320 columnDef
.getWeight(), columnDef
.getMinWidth(), resizable
));