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
.eclipse
.jface
.layout
.TableColumnLayout
;
10 import org
.eclipse
.jface
.viewers
.CheckboxTableViewer
;
11 import org
.eclipse
.jface
.viewers
.ColumnLabelProvider
;
12 import org
.eclipse
.jface
.viewers
.ColumnWeightData
;
13 import org
.eclipse
.jface
.viewers
.IStructuredContentProvider
;
14 import org
.eclipse
.jface
.viewers
.TableViewer
;
15 import org
.eclipse
.jface
.viewers
.TableViewerColumn
;
16 import org
.eclipse
.jface
.viewers
.Viewer
;
17 import org
.eclipse
.swt
.SWT
;
18 import org
.eclipse
.swt
.events
.ModifyEvent
;
19 import org
.eclipse
.swt
.events
.ModifyListener
;
20 import org
.eclipse
.swt
.events
.SelectionAdapter
;
21 import org
.eclipse
.swt
.events
.SelectionEvent
;
22 import org
.eclipse
.swt
.layout
.GridData
;
23 import org
.eclipse
.swt
.layout
.GridLayout
;
24 import org
.eclipse
.swt
.widgets
.Composite
;
25 import org
.eclipse
.swt
.widgets
.Table
;
26 import org
.eclipse
.swt
.widgets
.TableColumn
;
27 import org
.eclipse
.swt
.widgets
.Text
;
28 import org
.osgi
.framework
.InvalidSyntaxException
;
29 import org
.osgi
.service
.useradmin
.Role
;
30 import org
.osgi
.service
.useradmin
.User
;
31 import org
.osgi
.service
.useradmin
.UserAdmin
;
34 * Generic composite that display a filter and a table viewer to display users
35 * (can also be groups)
37 * Warning: this class does not extends <code>TableViewer</code>. Use the
38 * getTableViewer to acces it.
41 public class UserTableViewer
extends Composite
{
42 private static final long serialVersionUID
= -7385959046279360420L;
45 private UserAdmin userAdmin
;
48 private List
<ColumnDefinition
> columnDefs
= new ArrayList
<ColumnDefinition
>();
49 private boolean hasFilter
;
50 private boolean preventTableLayout
= false;
51 private boolean hasSelectionColumn
;
52 private int tableStyle
;
55 private TableViewer usersViewer
;
56 private Text filterTxt
;
65 public UserTableViewer(Composite parent
, int style
, UserAdmin userAdmin
) {
66 super(parent
, SWT
.NO_FOCUS
);
67 this.tableStyle
= style
;
68 this.userAdmin
= userAdmin
;
71 // TODO workaround the bug of the table layout in the Form
72 public UserTableViewer(Composite parent
, int style
, UserAdmin userAdmin
,
73 boolean preventTableLayout
) {
74 super(parent
, SWT
.NO_FOCUS
);
75 this.tableStyle
= style
;
76 this.userAdmin
= userAdmin
;
77 this.preventTableLayout
= preventTableLayout
;
80 /** This must be called before the call to populate method */
81 public void setColumnDefinitions(List
<ColumnDefinition
> columnDefinitions
) {
82 this.columnDefs
= columnDefinitions
;
88 * choose to add a field to filter results or not
90 * choose to add a column to select some of the displayed results
93 public void populate(boolean addFilter
, boolean addSelection
) {
95 Composite parent
= this;
96 hasFilter
= addFilter
;
97 hasSelectionColumn
= addSelection
;
100 GridLayout layout
= EclipseUiUtils
.noSpaceGridLayout();
101 layout
.verticalSpacing
= 5;
102 this.setLayout(layout
);
104 createFilterPart(parent
);
106 Composite tableComp
= new Composite(parent
, SWT
.NO_FOCUS
);
107 tableComp
.setLayoutData(EclipseUiUtils
.fillAll());
108 usersViewer
= createTableViewer(tableComp
);
110 usersViewer
.setContentProvider(new UsersContentProvider());
113 /** Enable access to the selected users or groups */
114 public List
<User
> getSelectedUsers() {
115 if (hasSelectionColumn
) {
116 Object
[] elements
= ((CheckboxTableViewer
) usersViewer
)
117 .getCheckedElements();
119 List
<User
> result
= new ArrayList
<User
>();
120 for (Object obj
: elements
) {
121 result
.add((User
) obj
);
125 throw new ArgeoException("Unvalid request: no selection column "
126 + "has been created for the current table");
129 /** Returns the User table viewer, typically to add doubleclick listener */
130 public TableViewer
getTableViewer() {
135 * Force the refresh of the underlying table using the current filter string
138 public void refresh() {
139 String filter
= hasFilter ? filterTxt
.getText() : null;
140 if ("".equals(filter
.trim()))
142 refreshFilteredList(filter
);
145 // /** Returns filter String or null if no filter Text widget */
146 // private String getFilterString() {
147 // return hasFilter ? filterTxt.getText() : null;
151 * Build repository request : caller might overwrite in order to display a
152 * subset of all users
154 protected List
<User
> listFilteredElements(String filter
) {
155 List
<User
> users
= new ArrayList
<User
>();
157 Role
[] roles
= userAdmin
.getRoles(filter
);
158 // Display all users and groups
159 for (Role role
: roles
)
160 // if (role.getType() == Role.USER && role.getType() !=
162 users
.add((User
) role
);
163 } catch (InvalidSyntaxException e
) {
164 throw new ArgeoException("Unable to get roles with filter: "
170 /* GENERIC COMPOSITE METHODS */
172 public boolean setFocus() {
174 return filterTxt
.setFocus();
176 return usersViewer
.getTable().setFocus();
180 public void dispose() {
184 /* LOCAL CLASSES AND METHODS */
185 // Will be usefull to rather use a virtual table viewer
186 private void refreshFilteredList(String filter
) {
187 List
<User
> users
= listFilteredElements(filter
);
188 usersViewer
.setInput(users
.toArray());
191 private class UsersContentProvider
implements IStructuredContentProvider
{
192 private static final long serialVersionUID
= 1L;
194 public Object
[] getElements(Object inputElement
) {
195 return (Object
[]) inputElement
;
198 public void dispose() {
201 public void inputChanged(Viewer viewer
, Object oldInput
, Object newInput
) {
206 private void createFilterPart(Composite parent
) {
207 // Text Area for the filter
208 filterTxt
= new Text(parent
, SWT
.BORDER
| SWT
.SEARCH
| SWT
.ICON_SEARCH
210 filterTxt
.setLayoutData(new GridData(GridData
.GRAB_HORIZONTAL
211 | GridData
.HORIZONTAL_ALIGN_FILL
));
212 filterTxt
.addModifyListener(new ModifyListener() {
213 private static final long serialVersionUID
= 1L;
215 public void modifyText(ModifyEvent event
) {
216 refreshFilteredList(filterTxt
.getText());
221 private TableViewer
createTableViewer(final Composite parent
) {
223 int style
= tableStyle
| SWT
.H_SCROLL
| SWT
.V_SCROLL
;
224 if (hasSelectionColumn
)
225 style
= style
| SWT
.CHECK
;
226 Table table
= new Table(parent
, style
);
227 TableColumnLayout layout
= new TableColumnLayout();
229 // TODO the table layout does not works with the scrolled form
231 if (preventTableLayout
) {
232 parent
.setLayout(EclipseUiUtils
.noSpaceGridLayout());
233 table
.setLayoutData(EclipseUiUtils
.fillAll());
235 parent
.setLayout(layout
);
238 if (hasSelectionColumn
)
239 viewer
= new CheckboxTableViewer(table
);
241 viewer
= new TableViewer(table
);
242 table
.setLinesVisible(true);
243 table
.setHeaderVisible(true);
245 TableViewerColumn column
;
247 if (hasSelectionColumn
) {
249 column
= ViewerUtils
.createTableViewerColumn(viewer
, "", SWT
.NONE
,
251 column
.setLabelProvider(new ColumnLabelProvider() {
252 private static final long serialVersionUID
= 1L;
255 public String
getText(Object element
) {
259 SelectionAdapter selectionAdapter
= new SelectionAdapter() {
260 private static final long serialVersionUID
= 1L;
262 boolean allSelected
= false;
265 public void widgetSelected(SelectionEvent e
) {
266 allSelected
= !allSelected
;
267 ((CheckboxTableViewer
) usersViewer
)
268 .setAllChecked(allSelected
);
271 column
.getColumn().addSelectionListener(selectionAdapter
);
274 // NodeViewerComparator comparator = new NodeViewerComparator();
275 // TODO enable the sort by click on the header
277 for (ColumnDefinition colDef
: columnDefs
)
278 createTableColumn(viewer
, layout
, colDef
);
280 // column = ViewerUtils.createTableViewerColumn(viewer,
281 // colDef.getHeaderLabel(), SWT.NONE, colDef.getColumnSize());
282 // column.setLabelProvider(new CLProvider(colDef.getPropertyName()));
283 // column.getColumn().addSelectionListener(
284 // JcrUiUtils.getNodeSelectionAdapter(i,
285 // colDef.getPropertyType(), colDef.getPropertyName(),
286 // comparator, viewer));
290 // IMPORTANT: initialize comparator before setting it
291 // ColumnDefinition firstCol = colDefs.get(0);
292 // comparator.setColumn(firstCol.getPropertyType(),
293 // firstCol.getPropertyName());
294 // viewer.setComparator(comparator);
299 /** Default creation of a column for a user table */
300 private TableViewerColumn
createTableColumn(TableViewer tableViewer
,
301 TableColumnLayout layout
, ColumnDefinition columnDef
) {
303 boolean resizable
= true;
304 TableViewerColumn tvc
= new TableViewerColumn(tableViewer
, SWT
.NONE
);
305 TableColumn column
= tvc
.getColumn();
307 column
.setText(columnDef
.getLabel());
308 column
.setWidth(columnDef
.getMinWidth());
309 column
.setResizable(resizable
);
311 ColumnLabelProvider lp
= columnDef
.getLabelProvider();
312 // add a reference to the display to enable font management
313 if (lp
instanceof UserAdminAbstractLP
)
314 ((UserAdminAbstractLP
) lp
).setDisplay(tableViewer
.getTable()
316 tvc
.setLabelProvider(lp
);
318 layout
.setColumnData(column
, new ColumnWeightData(
319 columnDef
.getWeight(), columnDef
.getMinWidth(), resizable
));