]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms/src/org/argeo/cms/users/UserRolesPart.java
610c49c7f7f9e2994b1dc97be64135a2728c6ebc
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / users / UserRolesPart.java
1 package org.argeo.cms.users;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import javax.jcr.Item;
7 import javax.jcr.Node;
8 import javax.jcr.RepositoryException;
9
10 import org.argeo.ArgeoException;
11 import org.argeo.cms.internal.auth.JcrSecurityModel;
12 import org.argeo.cms.util.CmsUtils;
13 import org.argeo.cms.viewers.EditablePart;
14 import org.argeo.cms.viewers.NodePart;
15 import org.argeo.cms.widgets.StyledControl;
16 import org.argeo.jcr.ArgeoNames;
17 import org.argeo.security.UserAdminService;
18 import org.argeo.security.jcr.JcrUserDetails;
19 import org.eclipse.jface.viewers.CheckStateChangedEvent;
20 import org.eclipse.jface.viewers.CheckboxTableViewer;
21 import org.eclipse.jface.viewers.ColumnLabelProvider;
22 import org.eclipse.jface.viewers.ICheckStateListener;
23 import org.eclipse.jface.viewers.IStructuredContentProvider;
24 import org.eclipse.jface.viewers.TableViewer;
25 import org.eclipse.jface.viewers.TableViewerColumn;
26 import org.eclipse.jface.viewers.Viewer;
27 import org.eclipse.swt.SWT;
28 import org.eclipse.swt.events.FocusEvent;
29 import org.eclipse.swt.events.FocusListener;
30 import org.eclipse.swt.events.MouseListener;
31 import org.eclipse.swt.layout.GridLayout;
32 import org.eclipse.swt.widgets.Composite;
33 import org.eclipse.swt.widgets.Control;
34 import org.eclipse.swt.widgets.Label;
35 import org.eclipse.swt.widgets.Table;
36 import org.eclipse.swt.widgets.TableColumn;
37 import org.springframework.security.core.GrantedAuthority;
38
39 /** Display a single user main info once it has been created. */
40 public class UserRolesPart extends StyledControl implements EditablePart,
41 NodePart, FocusListener {
42 private static final long serialVersionUID = -6013980335975055846L;
43
44 private CheckboxTableViewer rolesViewer;
45 private Table table;
46
47 private JcrUserDetails userDetails;
48 private UserAdminService userAdminService;
49 private List<String> roles;
50
51 // FIXME
52 // private final Image checked;
53
54 // TODO implement to provide user creation ability for anonymous user?
55 // public UserPart(Composite parent, int swtStyle) {
56 // super(parent, swtStyle);
57 // }
58
59 public UserRolesPart(Composite parent, int style, Item item,
60 UserAdminService userAdminService, JcrSecurityModel jcrSecurityModel)
61 throws RepositoryException {
62 this(parent, style, item, true);
63 }
64
65 public UserRolesPart(Composite parent, int style, Item item,
66 boolean cacheImmediately) throws RepositoryException {
67 super(parent, style, item, cacheImmediately);
68 // checked = new Image(parent, imageData);
69 }
70
71 @Override
72 public Item getItem() throws RepositoryException {
73 return getNode();
74 }
75
76 public void setMouseListener(MouseListener mouseListener) {
77 super.setMouseListener(mouseListener);
78 table.addMouseListener(mouseListener);
79 }
80
81 @Override
82 public Control createControl(Composite box, String style) {
83 // box.setLayout(CmsUtils.noSpaceGridLayout());
84 box.setLayout(new GridLayout());
85
86 Label header = new Label(box, SWT.NONE);
87 header.setText(" Groups");
88 CmsUtils.style(header, UserStyles.USER_FORM_TITLE);
89 header.setLayoutData(CmsUtils.fillWidth());
90
91 int swtStyle = SWT.CHECK | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL;
92 if (!isEditing())
93 swtStyle |= SWT.READ_ONLY;
94
95 table = new Table(box, swtStyle);
96 table.setLinesVisible(true);
97 table.setHeaderVisible(false);
98 CmsUtils.style(table, style);
99
100 rolesViewer = new CheckboxTableViewer(table);
101
102 TableViewerColumn column;
103
104 // check column
105 // TableViewerColumn column = createTableViewerColumn(rolesViewer,
106 // "checked", 20);
107 // column.setLabelProvider(new ColumnLabelProvider() {
108 // public String getText(Object element) {
109 // return null;
110 // }
111
112 // public Image getImage(Object element) {
113 // String role = element.toString();
114 // if (roles.contains(role)) {
115 //
116 // return ROLE_CHECKED;
117 // } else {
118 // return null;
119 // }
120 //
121 // }
122 // );
123 // column.setEditingSupport(new RoleEditingSupport(rolesViewer, part));
124
125 // role column
126 column = createTableViewerColumn(rolesViewer, "Role", 400);
127 column.setLabelProvider(new ColumnLabelProvider() {
128 private static final long serialVersionUID = -7334412925967366255L;
129
130 public String getText(Object element) {
131 return element.toString();
132 }
133 });
134 rolesViewer.setContentProvider(new RolesContentProvider());
135 rolesViewer.setInput(userAdminService.listEditableRoles().toArray());
136
137 // try to prevent edition on read only nodes. Does not work.
138 // rolesViewer.setAllGrayed(!isEditing());
139
140 rolesViewer.addCheckStateListener(new ICheckStateListener() {
141
142 @Override
143 public void checkStateChanged(CheckStateChangedEvent event) {
144 String name = (String) event.getElement();
145 boolean contained = roles.contains(name);
146 boolean checked = event.getChecked();
147 if (checked != contained) {
148 if (!contained)
149 roles.add(name);
150 else
151 roles.remove(name);
152 userDetails = userDetails.cloneWithNewRoles(roles);
153 userAdminService.updateUser(userDetails);
154 }
155 }
156 });
157 return table;
158 }
159
160 // THE LISTENER
161 @Override
162 public void focusGained(FocusEvent e) {
163 // Do nothing
164 }
165
166 @Override
167 public void focusLost(FocusEvent e) {
168 // Save change if needed
169 // Text text = (Text) e.getSource();
170 }
171
172 // private final static Image ROLE_CHECKED = SecurityAdminPlugin
173 // .getImageDescriptor("icons/security.gif").createImage();
174
175 public void setUserAdminService(UserAdminService userAdminService) {
176 this.userAdminService = userAdminService;
177 try {
178 Node currNode = getNode();
179 String username = currNode.getProperty(ArgeoNames.ARGEO_USER_ID)
180 .getString();
181 if (userAdminService.userExists(username)) {
182 JcrUserDetails userDetails = (JcrUserDetails) userAdminService
183 .loadUserByUsername(username);
184 setUserDetails(userDetails);
185 }
186 } catch (Exception e) {
187 throw new ArgeoException("Cannot retrieve userDetails for "
188 + getNode(), e);
189 }
190
191 }
192
193 public void setUserDetails(JcrUserDetails userDetails) {
194 this.userDetails = userDetails;
195 this.roles = new ArrayList<String>();
196 for (GrantedAuthority ga : userDetails.getAuthorities())
197 roles.add(ga.getAuthority());
198 if (rolesViewer != null)
199 rolesViewer.refresh();
200 }
201
202 protected TableViewerColumn createTableViewerColumn(TableViewer viewer,
203 String title, int bound) {
204 final TableViewerColumn viewerColumn = new TableViewerColumn(viewer,
205 SWT.NONE);
206 final TableColumn column = viewerColumn.getColumn();
207 column.setText(title);
208 column.setWidth(bound);
209 column.setResizable(true);
210 column.setMoveable(true);
211 return viewerColumn;
212
213 }
214
215 public List<String> getRoles() {
216 return roles;
217 }
218
219 public void refresh() {
220
221 // return roles.toArray();
222 rolesViewer.setCheckedElements(roles.toArray()); // setSelection(1);
223 // rolesViewer.setInput(roles);
224 rolesViewer.refresh();
225 }
226
227 private class RolesContentProvider implements IStructuredContentProvider {
228 private static final long serialVersionUID = 4119915828862214310L;
229
230 public Object[] getElements(Object inputElement) {
231 return userAdminService.listEditableRoles().toArray();
232 }
233
234 public void dispose() {
235 }
236
237 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
238 viewer.refresh();
239 }
240 }
241
242 // /** Select the columns by editing the checkbox in the first column */
243 // class RoleEditingSupport extends EditingSupport {
244 //
245 // private final TableViewer viewer;
246 //
247 // public RoleEditingSupport(TableViewer viewer) {
248 // super(viewer);
249 // this.viewer = viewer;
250 // }
251 //
252 // @Override
253 // protected CellEditor getCellEditor(Object element) {
254 // return new CheckboxCellEditor(null, SWT.CHECK | SWT.READ_ONLY);
255 //
256 // }
257 //
258 // @Override
259 // protected boolean canEdit(Object element) {
260 // return true;
261 // }
262 //
263 // @Override
264 // protected Object getValue(Object element) {
265 // String role = element.toString();
266 // return roles.contains(role);
267 //
268 // }
269 //
270 // @Override
271 // protected void setValue(Object element, Object value) {
272 // Boolean inRole = (Boolean) value;
273 // String role = element.toString();
274 // if (inRole && !roles.contains(role)) {
275 // roles.add(role);
276 // } else if (!inRole && roles.contains(role)) {
277 // roles.remove(role);
278 // }
279 // viewer.refresh();
280 // }
281 // }
282
283 }