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