]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms/src/org/argeo/cms/users/UserRolesPart.java
be13ed8a27213fb3902022fe75e10abafc8d352e
[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.Table;
33 import org.eclipse.swt.widgets.TableColumn;
34 import org.eclipse.swt.widgets.Text;
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
41 // A static list of supported properties.
42 private List<Text> texts;
43 private final static String KEY_PROP_NAME = "jcr:propertyName";
44
45 private CheckboxTableViewer rolesViewer;
46 private JcrUserDetails userDetails;
47 private UserAdminService userAdminService;
48 private List<String> roles;
49
50 // FIXME
51 // private final Image checked;
52
53 // TODO implement to provide user creation ability for anonymous user?
54 // public UserPart(Composite parent, int swtStyle) {
55 // super(parent, swtStyle);
56 // }
57
58 public UserRolesPart(Composite parent, int style, Item item,
59 UserAdminService userAdminService, JcrSecurityModel jcrSecurityModel)
60 throws RepositoryException {
61 this(parent, style, item, true);
62 }
63
64 public UserRolesPart(Composite parent, int style, Item item,
65 boolean cacheImmediately) throws RepositoryException {
66 super(parent, style, item, cacheImmediately);
67
68 // checked = new Image(parent, imageData);
69
70 }
71
72 @Override
73 public Item getItem() throws RepositoryException {
74 return getNode();
75 }
76
77 // Experimental, remove
78 public void setMouseListener(MouseListener mouseListener) {
79 super.setMouseListener(mouseListener);
80
81 for (Text txt : texts)
82 txt.addMouseListener(mouseListener);
83
84 }
85
86 @Override
87 protected Control createControl(Composite box, String style) {
88 Table table = new Table(box, SWT.CHECK | SWT.MULTI | SWT.H_SCROLL
89 | SWT.V_SCROLL);
90 table.setLinesVisible(true);
91 table.setHeaderVisible(false);
92 CmsUtils.style(table, style);
93
94 rolesViewer = new CheckboxTableViewer(table);
95
96 TableViewerColumn column;
97
98 // check column
99 // TableViewerColumn column = createTableViewerColumn(rolesViewer,
100 // "checked", 20);
101 // column.setLabelProvider(new ColumnLabelProvider() {
102 // public String getText(Object element) {
103 // return null;
104 // }
105
106 // public Image getImage(Object element) {
107 // String role = element.toString();
108 // if (roles.contains(role)) {
109 //
110 // return ROLE_CHECKED;
111 // } else {
112 // return null;
113 // }
114 //
115 // }
116 // );
117 // column.setEditingSupport(new RoleEditingSupport(rolesViewer, part));
118
119 // role column
120 column = createTableViewerColumn(rolesViewer, "Role", 400);
121 column.setLabelProvider(new ColumnLabelProvider() {
122 private static final long serialVersionUID = -7334412925967366255L;
123
124 public String getText(Object element) {
125 return element.toString();
126 }
127 });
128 rolesViewer.setContentProvider(new RolesContentProvider());
129 rolesViewer.setInput(userAdminService.listEditableRoles().toArray());
130
131 rolesViewer.addCheckStateListener(new ICheckStateListener() {
132
133 @Override
134 public void checkStateChanged(CheckStateChangedEvent event) {
135 String name = (String) event.getElement();
136 boolean contained = roles.contains(name);
137 boolean checked = event.getChecked();
138 if (checked != contained) {
139 if (contained)
140 roles.add(name);
141 else
142 roles.remove(name);
143 userDetails = userDetails.cloneWithNewRoles(roles);
144 userAdminService.updateUser(userDetails);
145 }
146 }
147 });
148 return table;
149 }
150
151 // void refresh() {
152 // for (Text txt : texts) {
153 // }
154 // }
155
156 // THE LISTENER
157 @Override
158 public void focusGained(FocusEvent e) {
159 // Do nothing
160 }
161
162 @Override
163 public void focusLost(FocusEvent e) {
164 // Save change if needed
165 // Text text = (Text) e.getSource();
166 }
167
168 // private final static Image ROLE_CHECKED = SecurityAdminPlugin
169 // .getImageDescriptor("icons/security.gif").createImage();
170
171 public void setUserAdminService(UserAdminService userAdminService) {
172 this.userAdminService = userAdminService;
173
174 try {
175 String username = getNode().getProperty(ArgeoNames.ARGEO_USER_ID)
176 .getString();
177 // ;
178
179 if (userAdminService.userExists(username)) {
180 JcrUserDetails userDetails = (JcrUserDetails) userAdminService
181 .loadUserByUsername(username);
182 setUserDetails(userDetails);
183 }
184 } catch (Exception e) {
185 throw new ArgeoException("Cannot retrieve userDetails for "// +
186 // username
187 , e);
188 }
189
190 }
191
192 public void setUserDetails(JcrUserDetails userDetails) {
193 this.userDetails = userDetails;
194
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 }