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