From 94c54deff25c97eb8143594c15c2a3dea06c5811 Mon Sep 17 00:00:00 2001 From: Bruno Sinou Date: Fri, 4 Sep 2015 13:15:48 +0000 Subject: [PATCH] Work on userAdmin UI: + Add filter to user and group view + Display the list of all members of a group + Some code cleaning git-svn-id: https://svn.argeo.org/commons/trunk@8365 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../ui/admin/editors/GroupMainPage.java | 360 ++++-------------- .../security/ui/admin/editors/UserEditor.java | 16 +- .../ui/admin/editors/UserMainPage.java | 2 +- .../ui/admin/internal/ColumnDefinition.java | 59 +++ .../ui/admin/internal/CommonNameLP.java | 17 + .../security/ui/admin/internal/MailLP.java | 17 + .../ui/admin/internal/RoleIconLP.java | 24 ++ .../ui/admin/internal/UiAdminUtils.java | 23 ++ .../admin/internal/UserAdminAbstractLP.java | 53 +++ .../{ => internal}/UserAdminConstants.java | 2 +- .../ui/admin/internal/UserNameLP.java | 13 + .../UserTableDefaultDClickListener.java | 40 ++ .../ui/admin/internal/UserTableViewer.java | 323 ++++++++++++++++ .../security/ui/admin/views/GroupsView.java | 115 +++--- .../security/ui/admin/views/UsersView.java | 299 +++------------ 15 files changed, 768 insertions(+), 595 deletions(-) create mode 100644 org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/ColumnDefinition.java create mode 100644 org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/CommonNameLP.java create mode 100644 org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/MailLP.java create mode 100644 org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/RoleIconLP.java create mode 100644 org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UiAdminUtils.java create mode 100644 org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserAdminAbstractLP.java rename org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/{ => internal}/UserAdminConstants.java (83%) create mode 100644 org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserNameLP.java create mode 100644 org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserTableDefaultDClickListener.java create mode 100644 org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserTableViewer.java diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/editors/GroupMainPage.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/editors/GroupMainPage.java index 3d75b56fd..7e880bfc4 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/editors/GroupMainPage.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/editors/GroupMainPage.java @@ -22,28 +22,19 @@ import javax.jcr.RepositoryException; import org.argeo.ArgeoException; import org.argeo.eclipse.ui.EclipseUiUtils; -import org.argeo.eclipse.ui.utils.ViewerUtils; import org.argeo.jcr.ArgeoNames; -import org.argeo.security.ui.admin.SecurityAdminImages; -import org.argeo.security.ui.admin.UserAdminConstants; -import org.eclipse.jface.layout.TableColumnLayout; -import org.eclipse.jface.viewers.ColumnLabelProvider; -import org.eclipse.jface.viewers.ColumnWeightData; -import org.eclipse.jface.viewers.IStructuredContentProvider; +import org.argeo.security.ui.admin.internal.ColumnDefinition; +import org.argeo.security.ui.admin.internal.CommonNameLP; +import org.argeo.security.ui.admin.internal.MailLP; +import org.argeo.security.ui.admin.internal.RoleIconLP; +import org.argeo.security.ui.admin.internal.UserAdminConstants; +import org.argeo.security.ui.admin.internal.UserNameLP; +import org.argeo.security.ui.admin.internal.UserTableDefaultDClickListener; +import org.argeo.security.ui.admin.internal.UserTableViewer; import org.eclipse.jface.viewers.TableViewer; -import org.eclipse.jface.viewers.TableViewerColumn; -import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; -import org.eclipse.swt.events.ModifyEvent; -import org.eclipse.swt.events.ModifyListener; -import org.eclipse.swt.graphics.Font; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Table; -import org.eclipse.swt.widgets.Text; import org.eclipse.ui.forms.AbstractFormPart; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.SectionPart; @@ -52,11 +43,12 @@ import org.eclipse.ui.forms.editor.FormPage; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.forms.widgets.Section; +import org.osgi.service.useradmin.Group; import org.osgi.service.useradmin.Role; import org.osgi.service.useradmin.User; import org.osgi.service.useradmin.UserAdmin; -/** Display/edit the properties of the groups */ +/** Display/edit main properties of a given group */ public class GroupMainPage extends FormPage implements ArgeoNames { final static String ID = "GroupEditor.mainPage"; @@ -73,10 +65,10 @@ public class GroupMainPage extends FormPage implements ArgeoNames { protected void createFormContent(final IManagedForm mf) { try { ScrolledForm form = mf.getForm(); + form.getBody().getParent().setLayoutData(EclipseUiUtils.fillAll()); + form.setExpandHorizontal(true); refreshFormTitle(form); - GridLayout mainLayout = new GridLayout(1, true); - form.getBody().setLayout(mainLayout); - + // GridLayout mainLayout = new GridLayout(1, true); createGeneralPart(form.getBody()); } catch (RepositoryException e) { throw new ArgeoException("Cannot create form content", e); @@ -86,303 +78,105 @@ public class GroupMainPage extends FormPage implements ArgeoNames { /** Creates the general section */ protected void createGeneralPart(Composite parent) throws RepositoryException { + parent.setLayout(new GridLayout()); + FormToolkit tk = getManagedForm().getToolkit(); Section section = tk.createSection(parent, Section.TITLE_BAR); - section.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + section.setLayoutData(EclipseUiUtils.fillAll()); section.setText("Members of " + editor.getProperty(UserAdminConstants.KEY_CN)); - Composite body = tk.createComposite(section, SWT.WRAP); + + // Composite body = tk.createComposite(section, SWT.NONE); + Composite body = new Composite(section, SWT.NO_FOCUS); section.setClient(body); body.setLayoutData(EclipseUiUtils.fillAll()); - body.setLayout(new GridLayout()); - new Label(body, SWT.NONE) - .setText("Display a table with members for this group"); - - // final Text firstName = createLT(body, "First name", - // getProperty(ARGEO_FIRST_NAME)); - // final Text lastName = createLT(body, "Last name", - // getProperty(ARGEO_LAST_NAME)); - // final Text email = createLT(body, "Email", - // editor.getProperty(UserAdminConstants.KEY_MAIL)); - // // final Text description = createLMT(body, "Description", - // getProperty(Property.JCR_DESCRIPTION)); + createMemberPart(body); // create form part (controller) AbstractFormPart part = new SectionPart(section) { public void commit(boolean onSave) { - // TODO check mail validity - // editor.setProperty(UserAdminConstants.KEY_MAIL, - // email.getText()); - - // userProfile.getSession().getWorkspace().getVersionManager() - // .checkout(userProfile.getPath()); - // userProfile.setProperty(Property.JCR_TITLE, - // commonName.getText()); - // userProfile.setProperty(ARGEO_FIRST_NAME, - // firstName.getText()); - // userProfile - // .setProperty(ARGEO_LAST_NAME, lastName.getText()); - // userProfile.setProperty(ARGEO_PRIMARY_EMAIL, - // email.getText()); - // userProfile.setProperty(Property.JCR_DESCRIPTION, - // description.getText()); - // userProfile.getSession().save(); - // userProfile.getSession().getWorkspace().getVersionManager() - // .checkin(userProfile.getPath()); super.commit(onSave); } }; - // if (username != null) - // username.addModifyListener(new FormPartML(part)); - // commonName.addModifyListener(new FormPartML(part)); - // firstName.addModifyListener(new FormPartML(part)); - // lastName.addModifyListener(new FormPartML(part)); - // email.addModifyListener(new FormPartML(part)); getManagedForm().addPart(part); } - private void refreshFormTitle(ScrolledForm form) throws RepositoryException { - // form.setText(getProperty(Property.JCR_TITLE) - // + (userProfile.getProperty(ARGEO_ENABLED).getBoolean() ? "" - // : " [DISABLED]")); - } - - // /** @return the property, or the empty string if not set */ - // protected String getProperty(String name) throws RepositoryException { - // return userProfile.hasProperty(name) ? userProfile.getProperty(name) - // .getString() : ""; - // } - - /** Creates label and text. */ - protected Text createLT(Composite body, String label, String value) { - FormToolkit toolkit = getManagedForm().getToolkit(); - Label lbl = toolkit.createLabel(body, label); - lbl.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false)); - Text text = toolkit.createText(body, value, SWT.BORDER); - text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); - return text; - } - - /** Creates label and multiline text. */ - protected Text createLMT(Composite body, String label, String value) { - FormToolkit toolkit = getManagedForm().getToolkit(); - Label lbl = toolkit.createLabel(body, label); - lbl.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false)); - Text text = toolkit.createText(body, value, SWT.BORDER | SWT.MULTI); - text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true)); - return text; - } - - private class FormPartML implements ModifyListener { - private static final long serialVersionUID = 6299808129505381333L; - private AbstractFormPart formPart; + // UI Objects + private UserTableViewer userTableViewerCmp; + private TableViewer userViewer; + private List columnDefs = new ArrayList(); - public FormPartML(AbstractFormPart generalPart) { - this.formPart = generalPart; - } + public void createMemberPart(Composite parent) { + // parent.setLayout(EclipseUiUtils.noSpaceGridLayout()); + // parent2.setLayoutData(EclipseUiUtils.fillAll()); + // Composite parent = new Composite(parent2, SWT.NO_FOCUS); + // parent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false)); + // parent.setLayoutData(EclipseUiUtils.fillAll()); - public void modifyText(ModifyEvent e) { - formPart.markDirty(); - } - } - - // Manage the user table - public List getColumnsDef() { - List columnDefs = new ArrayList(); - - // Icon - columnDefs.add(new ColumnDefinition(new UserNameLP(), "", 0, 26)); - // Distinguished Name - columnDefs.add(new ColumnDefinition(new CommonNameLP(), - "Distinguished Name", 150)); - // Displayed name + parent.setLayout(EclipseUiUtils.noSpaceGridLayout()); + // Define the displayed columns + columnDefs.add(new ColumnDefinition(new RoleIconLP(), "", 0, 24)); + columnDefs.add(new ColumnDefinition(new UserNameLP(), + "Distinguished Name", 240)); columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Common Name", 150)); - return columnDefs; - } + columnDefs.add(new ColumnDefinition(new MailLP(), "Primary Mail", 150)); - private void createUserTable(Composite parent) { + // Create and configure the table + userTableViewerCmp = new MyUserTableViewer(parent, SWT.MULTI + | SWT.H_SCROLL | SWT.V_SCROLL, userAdmin); - // Main Layout - GridLayout layout = EclipseUiUtils.noSpaceGridLayout(); - layout.verticalSpacing = 5; - parent.setLayout(layout); - - // usersViewer = createTableViewer(parent); - // usersViewer.setContentProvider(new UsersContentProvider()); + userTableViewerCmp.setColumnDefinitions(columnDefs); + userTableViewerCmp.populate(true, false); + // userTableViewerCmp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, + // false, false)); + userTableViewerCmp.setLayoutData(EclipseUiUtils.fillAll()); + // Links + userViewer = userTableViewerCmp.getTableViewer(); + userViewer.addDoubleClickListener(new UserTableDefaultDClickListener()); // Really? - refreshFilteredList(null); - - // Configure - // usersViewer.addDoubleClickListener(new ViewDoubleClickListener()); - // getViewSite().setSelectionProvider(usersViewer); - } - - private TableViewer createTableViewer(final Composite parent) { - int style = SWT.H_SCROLL | SWT.V_SCROLL; - - Composite tableCmp = new Composite(parent, SWT.NO_FOCUS); - tableCmp.setLayoutData(EclipseUiUtils.fillAll()); - - Table table = new Table(tableCmp, style); - TableViewer viewer = new TableViewer(table); - table.setLinesVisible(true); - table.setHeaderVisible(true); - - TableColumnLayout tableColumnLayout = new TableColumnLayout(); - TableViewerColumn column; - - // Create other columns - List colDefs = getColumnsDef(); - for (ColumnDefinition colDef : colDefs) { - column = ViewerUtils.createTableViewerColumn(viewer, colDef.label, - SWT.NONE, colDef.weight); - column.setLabelProvider(colDef.provider); - tableColumnLayout.setColumnData(column.getColumn(), - new ColumnWeightData(colDef.weight, colDef.minWidth, true)); - } - - tableCmp.setLayout(tableColumnLayout); - return viewer; - } - - @Override - public void dispose() { - super.dispose(); - } - - private class UsersContentProvider implements IStructuredContentProvider { - private static final long serialVersionUID = 1L; - - public Object[] getElements(Object inputElement) { - return (Object[]) inputElement; - } - - public void dispose() { - } - - public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { - } - } - - /** - * Refresh the user list: caller might overwrite in order to display a - * subset of all users, typically to remove current user from the list - */ - protected void refreshFilteredList(String filter) { - // try { - // // Role[] roles = userAdmin.getRoles(filter); - // // List users = new ArrayList(); - // // for (Role role : roles) - // // if (role.getType() == Role.USER && role.getType() != Role.GROUP) - // // users.add((User) role); - // // usersViewer.setInput(users.toArray()); - // } catch (InvalidSyntaxException e) { - // throw new ArgeoException("Unable to get roles with filter: " - // + filter, e); - // } - } - - // Local helpers - - private abstract class UseradminAbstractLP extends ColumnLabelProvider { - private static final long serialVersionUID = 137336765024922368L; - - @Override - public Font getFont(Object element) { - // TODO manage fonts - // // self - // String username = getProperty(elem, ARGEO_USER_ID); - // if (username.equals(session.getUserID())) - // return bold; - // // disabled - // try { - // Node userProfile = (Node) elem; - // if (!userProfile.getProperty(ARGEO_ENABLED).getBoolean()) - // return italic; - // else - // return null; - // } catch (RepositoryException e) { - // throw new ArgeoException("Cannot get font for " + username, e); - // } - // } - - return super.getFont(element); - } - - @Override - public String getText(Object element) { - User user = (User) element; - return getText(user); - } - - public abstract String getText(User user); + userTableViewerCmp.refresh(); } - private class IconLP extends UseradminAbstractLP { - private static final long serialVersionUID = 6550449442061090388L; + private class MyUserTableViewer extends UserTableViewer { + private static final long serialVersionUID = 8467999509931900367L; - @Override - public String getText(User user) { - return ""; + public MyUserTableViewer(Composite parent, int style, + UserAdmin userAdmin) { + super(parent, style, userAdmin, true); } @Override - public Image getImage(Object element) { - User user = (User) element; - if (user.getType() == Role.GROUP) - return SecurityAdminImages.ICON_GROUP; - else - return SecurityAdminImages.ICON_USER; + protected List listFilteredElements(String filter) { + Group group = (Group) editor.getDisplayedUser(); + Role[] roles = group.getMembers(); + List users = new ArrayList(); + for (Role role : roles) + // if (role.getType() == Role.GROUP) + users.add((User) role); + return users; } } - private class UserNameLP extends UseradminAbstractLP { - private static final long serialVersionUID = 6550449442061090388L; - - @Override - public String getText(User user) { - return user.getName(); - } - } - - private class CommonNameLP extends UseradminAbstractLP { - private static final long serialVersionUID = 5256703081044911941L; - - @Override - public String getText(User user) { - Object obj = user.getProperties().get(UserAdminConstants.KEY_CN); - if (obj != null) - return (String) obj; - else - return ""; - } + private void refreshFormTitle(ScrolledForm form) throws RepositoryException { + // form.setText(getProperty(Property.JCR_TITLE) + // + (userProfile.getProperty(ARGEO_ENABLED).getBoolean() ? "" + // : " [DISABLED]")); } - protected class ColumnDefinition { - protected ColumnLabelProvider provider; - protected String label; - protected int weight; - protected int minWidth; - - public ColumnDefinition(ColumnLabelProvider provider, String label, - int weight) { - this.provider = provider; - this.label = label; - this.weight = weight; - this.minWidth = weight; - } - - public ColumnDefinition(ColumnLabelProvider provider, String label, - int weight, int minWidth) { - this.provider = provider; - this.label = label; - this.weight = weight; - this.minWidth = minWidth; - - } - } + // private class FormPartML implements ModifyListener { + // private static final long serialVersionUID = 6299808129505381333L; + // private AbstractFormPart formPart; + // + // public FormPartML(AbstractFormPart generalPart) { + // this.formPart = generalPart; + // } + // + // public void modifyText(ModifyEvent e) { + // formPart.markDirty(); + // } + // } } \ No newline at end of file diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/editors/UserEditor.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/editors/UserEditor.java index 7518b8084..a811f8621 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/editors/UserEditor.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/editors/UserEditor.java @@ -16,9 +16,8 @@ package org.argeo.security.ui.admin.editors; import org.argeo.ArgeoException; -import org.argeo.security.ui.admin.SecurityAdminImages; import org.argeo.security.ui.admin.SecurityAdminPlugin; -import org.argeo.security.ui.admin.UserAdminConstants; +import org.argeo.security.ui.admin.internal.UserAdminConstants; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorSite; @@ -28,7 +27,7 @@ import org.osgi.service.useradmin.Role; import org.osgi.service.useradmin.User; import org.osgi.service.useradmin.UserAdmin; -/** Editor for an Argeo user. */ +/** Editor for a user, might be a user or a group. */ public class UserEditor extends FormEditor implements UserAdminConstants { private static final long serialVersionUID = 8357851520380820241L; @@ -59,16 +58,19 @@ public class UserEditor extends FormEditor implements UserAdminConstants { setPartName(commonName != null ? commonName : "username"); } + /** Exposes the user (or group) that is displayed by the current editor */ + protected User getDisplayedUser() { + return user; + } + protected void addPages() { try { - + if (user.getType() == Role.GROUP) addPage(new GroupMainPage(this, userAdmin)); else addPage(new UserMainPage(this)); - - - + } catch (Exception e) { throw new ArgeoException("Cannot add pages", e); } diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/editors/UserMainPage.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/editors/UserMainPage.java index 812cbe9ed..745bbff53 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/editors/UserMainPage.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/editors/UserMainPage.java @@ -21,7 +21,7 @@ import javax.jcr.RepositoryException; import org.argeo.ArgeoException; import org.argeo.jcr.ArgeoNames; -import org.argeo.security.ui.admin.UserAdminConstants; +import org.argeo.security.ui.admin.internal.UserAdminConstants; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/ColumnDefinition.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/ColumnDefinition.java new file mode 100644 index 000000000..ad24c6226 --- /dev/null +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/ColumnDefinition.java @@ -0,0 +1,59 @@ +package org.argeo.security.ui.admin.internal; + +import org.eclipse.jface.viewers.ColumnLabelProvider; + +/** Centralize the colum definition for the various tables of the useradmin UI */ +public class ColumnDefinition { + private ColumnLabelProvider labelProvider; + private String label; + private int weight; + private int minWidth; + + public ColumnDefinition(ColumnLabelProvider labelProvider, String label, + int weight, int minimumWidth) { + this.labelProvider = labelProvider; + this.label = label; + this.weight = weight; + this.minWidth = minimumWidth; + } + + public ColumnDefinition(ColumnLabelProvider labelProvider, String label, + int weight) { + this.labelProvider = labelProvider; + this.label = label; + this.weight = weight; + this.minWidth = weight; + } + + public ColumnLabelProvider getLabelProvider() { + return labelProvider; + } + + public void setLabelProvider(ColumnLabelProvider labelProvider) { + this.labelProvider = labelProvider; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public int getWeight() { + return weight; + } + + public void setWeight(int weight) { + this.weight = weight; + } + + public int getMinWidth() { + return minWidth; + } + + public void setMinWidth(int minWidth) { + this.minWidth = minWidth; + } +} diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/CommonNameLP.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/CommonNameLP.java new file mode 100644 index 000000000..7f999588b --- /dev/null +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/CommonNameLP.java @@ -0,0 +1,17 @@ +package org.argeo.security.ui.admin.internal; + +import org.osgi.service.useradmin.User; + +/** Simply declare a label provider that returns the common name of a user */ +public class CommonNameLP extends UserAdminAbstractLP { + private static final long serialVersionUID = 5256703081044911941L; + + @Override + public String getText(User user) { + Object obj = user.getProperties().get(KEY_CN); + if (obj != null) + return (String) obj; + else + return ""; + } +} \ No newline at end of file diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/MailLP.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/MailLP.java new file mode 100644 index 000000000..bf01c660b --- /dev/null +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/MailLP.java @@ -0,0 +1,17 @@ +package org.argeo.security.ui.admin.internal; + +import org.osgi.service.useradmin.User; + +/** Simply declare a label provider that returns the Primary Mail for a user */ +public class MailLP extends UserAdminAbstractLP { + private static final long serialVersionUID = 8329764452141982707L; + + @Override + public String getText(User user) { + Object obj = user.getProperties().get(KEY_MAIL); + if (obj != null) + return (String) obj; + else + return ""; + } +} \ No newline at end of file diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/RoleIconLP.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/RoleIconLP.java new file mode 100644 index 000000000..cce1916ed --- /dev/null +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/RoleIconLP.java @@ -0,0 +1,24 @@ +package org.argeo.security.ui.admin.internal; + +import org.argeo.security.ui.admin.SecurityAdminImages; +import org.eclipse.swt.graphics.Image; +import org.osgi.service.useradmin.Role; +import org.osgi.service.useradmin.User; + +public class RoleIconLP extends UserAdminAbstractLP { + private static final long serialVersionUID = 6550449442061090388L; + + @Override + public String getText(User user) { + return ""; + } + + @Override + public Image getImage(Object element) { + User user = (User) element; + if (user.getType() == Role.GROUP) + return SecurityAdminImages.ICON_GROUP; + else + return SecurityAdminImages.ICON_USER; + } +} \ No newline at end of file diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UiAdminUtils.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UiAdminUtils.java new file mode 100644 index 000000000..d1596190a --- /dev/null +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UiAdminUtils.java @@ -0,0 +1,23 @@ +package org.argeo.security.ui.admin.internal; + +import java.security.AccessController; +import java.security.Principal; + +import javax.security.auth.Subject; +import javax.security.auth.x500.X500Principal; + +/** First effort to centralize back end methods used by the user admin UI */ +public class UiAdminUtils { + public final static String getUsername() { + Subject subject = Subject.getSubject(AccessController.getContext()); + Principal principal = subject.getPrincipals(X500Principal.class) + .iterator().next(); + return principal.getName(); + + } + + /* + * INTERNAL METHODS: Below methods are meant to stay here and are not part + * of a potential generic backend to manage the useradmin + */ +} \ No newline at end of file diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserAdminAbstractLP.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserAdminAbstractLP.java new file mode 100644 index 000000000..6c07b8c3a --- /dev/null +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserAdminAbstractLP.java @@ -0,0 +1,53 @@ +package org.argeo.security.ui.admin.internal; + +import org.eclipse.jface.resource.JFaceResources; +import org.eclipse.jface.viewers.ColumnLabelProvider; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Font; +import org.eclipse.swt.widgets.Display; +import org.osgi.service.useradmin.User; + +/** + * Utility class that add font modifications to a column label provider + * depending on the given user properties + */ +public abstract class UserAdminAbstractLP extends ColumnLabelProvider implements + UserAdminConstants { + private static final long serialVersionUID = 137336765024922368L; + + // private Font italic; + private Font bold; + + @Override + public Font getFont(Object element) { + + // Self as bold + String selfUserName = UiAdminUtils.getUsername(); + String userName = ((User) element).getName(); + if (userName.equals(selfUserName)) + return bold; + + // Disabled as Italic + // Node userProfile = (Node) elem; + // if (!userProfile.getProperty(ARGEO_ENABLED).getBoolean()) + // return italic; + + return null; + // return super.getFont(element); + } + + @Override + public String getText(Object element) { + User user = (User) element; + return getText(user); + } + + public void setDisplay(Display display) { + // italic = JFaceResources.getFontRegistry().defaultFontDescriptor() + // .setStyle(SWT.ITALIC).createFont(display); + bold = JFaceResources.getFontRegistry().defaultFontDescriptor() + .setStyle(SWT.BOLD).createFont(display); + } + + public abstract String getText(User user); +} diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/UserAdminConstants.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserAdminConstants.java similarity index 83% rename from org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/UserAdminConstants.java rename to org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserAdminConstants.java index f17800bad..f5eae0f7c 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/UserAdminConstants.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserAdminConstants.java @@ -1,4 +1,4 @@ -package org.argeo.security.ui.admin; +package org.argeo.security.ui.admin.internal; /** Temporary centralization of the user admin constants */ public interface UserAdminConstants { diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserNameLP.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserNameLP.java new file mode 100644 index 000000000..083cc6a09 --- /dev/null +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserNameLP.java @@ -0,0 +1,13 @@ +package org.argeo.security.ui.admin.internal; + +import org.osgi.service.useradmin.User; + +/** Simply declare a label provider that returns the username of a user */ +public class UserNameLP extends UserAdminAbstractLP { + private static final long serialVersionUID = 6550449442061090388L; + + @Override + public String getText(User user) { + return user.getName(); + } +} diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserTableDefaultDClickListener.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserTableDefaultDClickListener.java new file mode 100644 index 000000000..fc4ebd85d --- /dev/null +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserTableDefaultDClickListener.java @@ -0,0 +1,40 @@ +package org.argeo.security.ui.admin.internal; + +import org.argeo.ArgeoException; +import org.argeo.eclipse.ui.workbench.WorkbenchUiPlugin; +import org.argeo.security.ui.admin.editors.UserEditor; +import org.argeo.security.ui.admin.editors.UserEditorInput; +import org.eclipse.jface.viewers.DoubleClickEvent; +import org.eclipse.jface.viewers.IDoubleClickListener; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.PartInitException; +import org.osgi.service.useradmin.User; + +/** + * Default double click listener for the various user tables, will open the + * clicked item in the editor + */ +public class UserTableDefaultDClickListener implements IDoubleClickListener { + public void doubleClick(DoubleClickEvent evt) { + if (evt.getSelection().isEmpty()) + return; + Object obj = ((IStructuredSelection) evt.getSelection()) + .getFirstElement(); + User user = (User) obj; + // IWorkbench iw = + IWorkbenchWindow iww = WorkbenchUiPlugin.getDefault().getWorkbench() + .getActiveWorkbenchWindow(); + IWorkbenchPage iwp = iww.getActivePage(); + UserEditorInput uei = new UserEditorInput(user.getName()); + + try { + // IEditorPart editor = + iwp.openEditor(uei, UserEditor.ID); + } catch (PartInitException pie) { + throw new ArgeoException("Unable to open UserEditor for " + user, + pie); + } + } +} \ No newline at end of file diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserTableViewer.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserTableViewer.java new file mode 100644 index 000000000..adaf81df8 --- /dev/null +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserTableViewer.java @@ -0,0 +1,323 @@ +package org.argeo.security.ui.admin.internal; + +import java.util.ArrayList; +import java.util.List; + +import org.argeo.ArgeoException; +import org.argeo.eclipse.ui.EclipseUiUtils; +import org.argeo.eclipse.ui.utils.ViewerUtils; +import org.eclipse.jface.layout.TableColumnLayout; +import org.eclipse.jface.viewers.CheckboxTableViewer; +import org.eclipse.jface.viewers.ColumnLabelProvider; +import org.eclipse.jface.viewers.ColumnWeightData; +import org.eclipse.jface.viewers.IStructuredContentProvider; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.TableViewerColumn; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.swt.widgets.Text; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.service.useradmin.Role; +import org.osgi.service.useradmin.User; +import org.osgi.service.useradmin.UserAdmin; + +/** + * Generic composite that display a filter and a table viewer to display users + * (can also be groups) + * + * Warning: this class does not extends TableViewer. Use the + * getTableViewer to acces it. + * + */ +public class UserTableViewer extends Composite { + private static final long serialVersionUID = -7385959046279360420L; + + // Context + private UserAdmin userAdmin; + + // Configuration + private List columnDefs = new ArrayList(); + private boolean hasFilter; + private boolean preventTableLayout = false; + private boolean hasSelectionColumn; + private int tableStyle; + + // Local UI Objects + private TableViewer usersViewer; + private Text filterTxt; + + /* EXPOSED METHODS */ + + /** + * @param parent + * @param style + * @param userAdmin + */ + public UserTableViewer(Composite parent, int style, UserAdmin userAdmin) { + super(parent, SWT.NO_FOCUS); + this.tableStyle = style; + this.userAdmin = userAdmin; + } + + // TODO workaround the bug of the table layout in the Form + public UserTableViewer(Composite parent, int style, UserAdmin userAdmin, + boolean preventTableLayout) { + super(parent, SWT.NO_FOCUS); + this.tableStyle = style; + this.userAdmin = userAdmin; + this.preventTableLayout = preventTableLayout; + } + + /** This must be called before the call to populate method */ + public void setColumnDefinitions(List columnDefinitions) { + this.columnDefs = columnDefinitions; + } + + /** + * + * @param addFilter + * choose to add a field to filter results or not + * @param addSelection + * choose to add a column to select some of the displayed results + * or not + */ + public void populate(boolean addFilter, boolean addSelection) { + // initialization + Composite parent = this; + hasFilter = addFilter; + hasSelectionColumn = addSelection; + + // Main Layout + GridLayout layout = EclipseUiUtils.noSpaceGridLayout(); + layout.verticalSpacing = 5; + this.setLayout(layout); + if (hasFilter) + createFilterPart(parent); + + Composite tableComp = new Composite(parent, SWT.NO_FOCUS); + tableComp.setLayoutData(EclipseUiUtils.fillAll()); + usersViewer = createTableViewer(tableComp); + + usersViewer.setContentProvider(new UsersContentProvider()); + } + + /** Enable access to the selected users or groups */ + public List getSelectedUsers() { + if (hasSelectionColumn) { + Object[] elements = ((CheckboxTableViewer) usersViewer) + .getCheckedElements(); + + List result = new ArrayList(); + for (Object obj : elements) { + result.add((User) obj); + } + return result; + } else + throw new ArgeoException("Unvalid request: no selection column " + + "has been created for the current table"); + } + + /** Returns the User table viewer, typically to add doubleclick listener */ + public TableViewer getTableViewer() { + return usersViewer; + } + + /** + * Force the refresh of the underlying table using the current filter string + * if relevant + */ + public void refresh() { + String filter = hasFilter ? filterTxt.getText() : null; + if ("".equals(filter.trim())) + filter = null; + refreshFilteredList(filter); + } + + // /** Returns filter String or null if no filter Text widget */ + // private String getFilterString() { + // return hasFilter ? filterTxt.getText() : null; + // } + + /** + * Build repository request : caller might overwrite in order to display a + * subset of all users + */ + protected List listFilteredElements(String filter) { + List users = new ArrayList(); + try { + Role[] roles = userAdmin.getRoles(filter); + // Display all users and groups + for (Role role : roles) + // if (role.getType() == Role.USER && role.getType() != + // Role.GROUP) + users.add((User) role); + } catch (InvalidSyntaxException e) { + throw new ArgeoException("Unable to get roles with filter: " + + filter, e); + } + return users; + } + + /* GENERIC COMPOSITE METHODS */ + @Override + public boolean setFocus() { + if (hasFilter) + return filterTxt.setFocus(); + else + return usersViewer.getTable().setFocus(); + } + + @Override + public void dispose() { + super.dispose(); + } + + /* LOCAL CLASSES AND METHODS */ + // Will be usefull to rather use a virtual table viewer + private void refreshFilteredList(String filter) { + List users = listFilteredElements(filter); + usersViewer.setInput(users.toArray()); + } + + private class UsersContentProvider implements IStructuredContentProvider { + private static final long serialVersionUID = 1L; + + public Object[] getElements(Object inputElement) { + return (Object[]) inputElement; + } + + public void dispose() { + } + + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + } + } + + /* MANAGE FILTER */ + private void createFilterPart(Composite parent) { + // Text Area for the filter + filterTxt = new Text(parent, SWT.BORDER | SWT.SEARCH | SWT.ICON_SEARCH + | SWT.ICON_CANCEL); + filterTxt.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL + | GridData.HORIZONTAL_ALIGN_FILL)); + filterTxt.addModifyListener(new ModifyListener() { + private static final long serialVersionUID = 1L; + + public void modifyText(ModifyEvent event) { + refreshFilteredList(filterTxt.getText()); + } + }); + } + + private TableViewer createTableViewer(final Composite parent) { + + int style = tableStyle | SWT.H_SCROLL | SWT.V_SCROLL; + if (hasSelectionColumn) + style = style | SWT.CHECK; + Table table = new Table(parent, style); + TableColumnLayout layout = new TableColumnLayout(); + + // TODO the table layout does not works with the scrolled form + + if (preventTableLayout) { + parent.setLayout(EclipseUiUtils.noSpaceGridLayout()); + table.setLayoutData(EclipseUiUtils.fillAll()); + } else + parent.setLayout(layout); + + TableViewer viewer; + if (hasSelectionColumn) + viewer = new CheckboxTableViewer(table); + else + viewer = new TableViewer(table); + table.setLinesVisible(true); + table.setHeaderVisible(true); + + TableViewerColumn column; + int offset = 0; + if (hasSelectionColumn) { + offset = 1; + column = ViewerUtils.createTableViewerColumn(viewer, "", SWT.NONE, + 25); + column.setLabelProvider(new ColumnLabelProvider() { + private static final long serialVersionUID = 1L; + + @Override + public String getText(Object element) { + return null; + } + }); + SelectionAdapter selectionAdapter = new SelectionAdapter() { + private static final long serialVersionUID = 1L; + + boolean allSelected = false; + + @Override + public void widgetSelected(SelectionEvent e) { + allSelected = !allSelected; + ((CheckboxTableViewer) usersViewer) + .setAllChecked(allSelected); + } + }; + column.getColumn().addSelectionListener(selectionAdapter); + } + + // NodeViewerComparator comparator = new NodeViewerComparator(); + // TODO enable the sort by click on the header + int i = offset; + for (ColumnDefinition colDef : columnDefs) + createTableColumn(viewer, layout, colDef); + + // column = ViewerUtils.createTableViewerColumn(viewer, + // colDef.getHeaderLabel(), SWT.NONE, colDef.getColumnSize()); + // column.setLabelProvider(new CLProvider(colDef.getPropertyName())); + // column.getColumn().addSelectionListener( + // JcrUiUtils.getNodeSelectionAdapter(i, + // colDef.getPropertyType(), colDef.getPropertyName(), + // comparator, viewer)); + // i++; + // } + + // IMPORTANT: initialize comparator before setting it + // ColumnDefinition firstCol = colDefs.get(0); + // comparator.setColumn(firstCol.getPropertyType(), + // firstCol.getPropertyName()); + // viewer.setComparator(comparator); + + return viewer; + } + + /** Default creation of a column for a user table */ + private TableViewerColumn createTableColumn(TableViewer tableViewer, + TableColumnLayout layout, ColumnDefinition columnDef) { + + boolean resizable = true; + TableViewerColumn tvc = new TableViewerColumn(tableViewer, SWT.NONE); + TableColumn column = tvc.getColumn(); + + column.setText(columnDef.getLabel()); + column.setWidth(columnDef.getMinWidth()); + column.setResizable(resizable); + + ColumnLabelProvider lp = columnDef.getLabelProvider(); + // add a reference to the display to enable font management + if (lp instanceof UserAdminAbstractLP) + ((UserAdminAbstractLP) lp).setDisplay(tableViewer.getTable() + .getDisplay()); + tvc.setLabelProvider(lp); + + layout.setColumnData(column, new ColumnWeightData( + columnDef.getWeight(), columnDef.getMinWidth(), resizable)); + + return tvc; + } +} \ No newline at end of file diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/views/GroupsView.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/views/GroupsView.java index 34bda0e69..bb64a3d4b 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/views/GroupsView.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/views/GroupsView.java @@ -19,82 +19,99 @@ import java.util.ArrayList; import java.util.List; import org.argeo.ArgeoException; +import org.argeo.eclipse.ui.EclipseUiUtils; import org.argeo.jcr.ArgeoNames; import org.argeo.security.ui.admin.SecurityAdminPlugin; -import org.argeo.security.ui.admin.UserAdminConstants; -import org.eclipse.jface.viewers.ColumnLabelProvider; +import org.argeo.security.ui.admin.internal.ColumnDefinition; +import org.argeo.security.ui.admin.internal.CommonNameLP; +import org.argeo.security.ui.admin.internal.UserNameLP; +import org.argeo.security.ui.admin.internal.UserTableDefaultDClickListener; +import org.argeo.security.ui.admin.internal.UserTableViewer; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; import org.osgi.framework.InvalidSyntaxException; import org.osgi.service.useradmin.Role; import org.osgi.service.useradmin.User; +import org.osgi.service.useradmin.UserAdmin; /** List all groups with filter */ public class GroupsView extends UsersView implements ArgeoNames { public final static String ID = SecurityAdminPlugin.PLUGIN_ID + ".groupsView"; - // The displayed columns - /** Overwrite to display other columns */ - public List getColumnsDef() { - List columnDefs = new ArrayList(); - // Group ID + /* DEPENDENCY INJECTION */ + private UserAdmin userAdmin; + + // UI Objects + private UserTableViewer userTableViewerCmp; + private TableViewer userViewer; + private List columnDefs = new ArrayList(); + + @Override + public void createPartControl(Composite parent) { + parent.setLayout(EclipseUiUtils.noSpaceGridLayout()); + // Define the displayed columns columnDefs.add(new ColumnDefinition(new UserNameLP(), "Distinguished Name", 200)); - // Displayed name columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Common Name", 150)); - return columnDefs; - } - /** - * Refresh the user list: caller might overwrite in order to display a - * subset of all users, typically to remove current user from the list - */ - protected void refreshFilteredList(String filter) { - try { - Role[] roles = userAdmin().getRoles(filter); - List users = new ArrayList(); - for (Role role : roles) - if (role.getType() == Role.GROUP) - users.add((User) role); - getViewer().setInput(users.toArray()); - } catch (InvalidSyntaxException e) { - throw new ArgeoException("Unable to get roles with filter: " - + filter, e); - } - } + // Create and configure the table + userTableViewerCmp = new MyUserTableViewer(parent, SWT.MULTI + | SWT.H_SCROLL | SWT.V_SCROLL, userAdmin); - private abstract class GroupAdminAbstractLP extends ColumnLabelProvider { - private static final long serialVersionUID = 137336765024922368L; + userTableViewerCmp.setColumnDefinitions(columnDefs); + userTableViewerCmp.populate(true, false); + userTableViewerCmp.setLayoutData(EclipseUiUtils.fillAll()); - @Override - public String getText(Object element) { - User user = (User) element; - return getText(user); - } + // Links + userViewer = userTableViewerCmp.getTableViewer(); + userViewer.addDoubleClickListener(new UserTableDefaultDClickListener()); + getViewSite().setSelectionProvider(userViewer); - public abstract String getText(User user); + // Really? + userTableViewerCmp.refresh(); } - private class UserNameLP extends GroupAdminAbstractLP { - private static final long serialVersionUID = 6550449442061090388L; + private class MyUserTableViewer extends UserTableViewer { + private static final long serialVersionUID = 8467999509931900367L; + + public MyUserTableViewer(Composite parent, int style, + UserAdmin userAdmin) { + super(parent, style, userAdmin); + } @Override - public String getText(User user) { - return user.getName(); + protected List listFilteredElements(String filter) { + Role[] roles; + try { + roles = userAdmin.getRoles(filter); + } catch (InvalidSyntaxException e) { + throw new ArgeoException("Unable to get roles with filter: " + + filter, e); + } + List users = new ArrayList(); + for (Role role : roles) + if (role.getType() == Role.GROUP) + users.add((User) role); + return users; } } - private class CommonNameLP extends GroupAdminAbstractLP { - private static final long serialVersionUID = 5256703081044911941L; + // Override generic view methods + @Override + public void dispose() { + super.dispose(); + } - @Override - public String getText(User user) { - Object obj = user.getProperties().get(UserAdminConstants.KEY_CN); - if (obj != null) - return (String) obj; - else - return ""; - } + @Override + public void setFocus() { + userTableViewerCmp.setFocus(); } + /* DEPENDENCY INJECTION */ + public void setUserAdmin(UserAdmin userAdmin) { + this.userAdmin = userAdmin; + } } \ No newline at end of file diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/views/UsersView.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/views/UsersView.java index 73f6a19d6..31586085b 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/views/UsersView.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/views/UsersView.java @@ -20,30 +20,17 @@ import java.util.List; import org.argeo.ArgeoException; import org.argeo.eclipse.ui.EclipseUiUtils; -import org.argeo.eclipse.ui.utils.ViewerUtils; import org.argeo.jcr.ArgeoNames; import org.argeo.security.ui.admin.SecurityAdminPlugin; -import org.argeo.security.ui.admin.editors.UserEditor; -import org.argeo.security.ui.admin.editors.UserEditorInput; -import org.eclipse.jface.layout.TableColumnLayout; -import org.eclipse.jface.viewers.ColumnLabelProvider; -import org.eclipse.jface.viewers.ColumnWeightData; -import org.eclipse.jface.viewers.DoubleClickEvent; -import org.eclipse.jface.viewers.IDoubleClickListener; -import org.eclipse.jface.viewers.IStructuredContentProvider; -import org.eclipse.jface.viewers.IStructuredSelection; +import org.argeo.security.ui.admin.internal.ColumnDefinition; +import org.argeo.security.ui.admin.internal.CommonNameLP; +import org.argeo.security.ui.admin.internal.MailLP; +import org.argeo.security.ui.admin.internal.UserNameLP; +import org.argeo.security.ui.admin.internal.UserTableDefaultDClickListener; +import org.argeo.security.ui.admin.internal.UserTableViewer; import org.eclipse.jface.viewers.TableViewer; -import org.eclipse.jface.viewers.TableViewerColumn; -import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Font; -import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Table; -import org.eclipse.swt.widgets.Text; -import org.eclipse.ui.IWorkbenchPage; -import org.eclipse.ui.IWorkbenchWindow; -import org.eclipse.ui.PartInitException; import org.eclipse.ui.part.ViewPart; import org.osgi.framework.InvalidSyntaxException; import org.osgi.service.useradmin.Role; @@ -59,267 +46,71 @@ public class UsersView extends ViewPart implements ArgeoNames { private UserAdmin userAdmin; // UI Objects - private TableViewer usersViewer; - private Text filterTxt; - private Font italic; - private Font bold; + private UserTableViewer userTableViewerCmp; + private TableViewer userViewer; + private List columnDefs = new ArrayList(); - // The displayed columns - /** Overwrite to display other columns */ - public List getColumnsDef() { - List columnDefs = new ArrayList(); - - // User ID + @Override + public void createPartControl(Composite parent) { + parent.setLayout(EclipseUiUtils.noSpaceGridLayout()); + // Define the displayed columns columnDefs.add(new ColumnDefinition(new UserNameLP(), "Distinguished Name", 200)); - // Displayed name columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Common Name", 150)); - // E-mail columnDefs.add(new ColumnDefinition(new MailLP(), "E-mail", 150)); - return columnDefs; - } - @Override - public void setFocus() { - // TODO Auto-generated method stub - } + // Create and configure the table + userTableViewerCmp = new MyUserTableViewer(parent, SWT.MULTI + | SWT.H_SCROLL | SWT.V_SCROLL, userAdmin); + userTableViewerCmp.setLayoutData(EclipseUiUtils.fillAll()); - protected Viewer getViewer() { - return usersViewer; - } + userTableViewerCmp.setColumnDefinitions(columnDefs); + userTableViewerCmp.populate(true, false); - @Override - public void createPartControl(Composite parent) { - // cache UI Objects - italic = EclipseUiUtils.getItalicFont(parent); - bold = EclipseUiUtils.getBoldFont(parent); - - // Main Layout - GridLayout layout = EclipseUiUtils.noSpaceGridLayout(); - layout.verticalSpacing = 5; - parent.setLayout(layout); - - usersViewer = createTableViewer(parent); - usersViewer.setContentProvider(new UsersContentProvider()); + // Links + userViewer = userTableViewerCmp.getTableViewer(); + userViewer.addDoubleClickListener(new UserTableDefaultDClickListener()); + getViewSite().setSelectionProvider(userViewer); // Really? - refreshFilteredList(null); - - // Configure - usersViewer.addDoubleClickListener(new ViewDoubleClickListener()); - getViewSite().setSelectionProvider(usersViewer); + userTableViewerCmp.refresh(); } - public void refresh() { - this.getSite().getShell().getDisplay().asyncExec(new Runnable() { - @Override - public void run() { - refreshFilteredList(null); - } - }); - } + private class MyUserTableViewer extends UserTableViewer { + private static final long serialVersionUID = 8467999509931900367L; - class ViewDoubleClickListener implements IDoubleClickListener { - public void doubleClick(DoubleClickEvent evt) { - if (evt.getSelection().isEmpty()) - return; - Object obj = ((IStructuredSelection) evt.getSelection()) - .getFirstElement(); - User user = (User) obj; - IWorkbenchWindow iww = UsersView.this.getSite() - .getWorkbenchWindow(); - IWorkbenchPage iwp = iww.getActivePage(); - UserEditorInput uei = new UserEditorInput(user.getName()); + public MyUserTableViewer(Composite parent, int style, + UserAdmin userAdmin) { + super(parent, style, userAdmin); + } + @Override + protected List listFilteredElements(String filter) { + Role[] roles; try { - // IEditorPart editor = - iwp.openEditor(uei, UserEditor.ID); - } catch (PartInitException pie) { - throw new ArgeoException("Unable to open UserEditor for " - + user, pie); + roles = userAdmin.getRoles(filter); + } catch (InvalidSyntaxException e) { + throw new ArgeoException("Unable to get roles with filter: " + + filter, e); } - } - } - - private TableViewer createTableViewer(final Composite parent) { - int style = SWT.H_SCROLL | SWT.V_SCROLL; - - Composite tableCmp = new Composite(parent, SWT.NO_FOCUS); - tableCmp.setLayoutData(EclipseUiUtils.fillAll()); - - Table table = new Table(tableCmp, style); - TableViewer viewer = new TableViewer(table); - table.setLinesVisible(true); - table.setHeaderVisible(true); - - TableColumnLayout tableColumnLayout = new TableColumnLayout(); - TableViewerColumn column; - - // Create other columns - List colDefs = getColumnsDef(); - for (ColumnDefinition colDef : colDefs) { - column = ViewerUtils.createTableViewerColumn(viewer, colDef.label, - SWT.NONE, colDef.weight); - column.setLabelProvider(colDef.provider); - tableColumnLayout.setColumnData(column.getColumn(), - new ColumnWeightData(colDef.weight, colDef.minWidth, true)); - } - - tableCmp.setLayout(tableColumnLayout); - return viewer; - } - - @Override - public void dispose() { - super.dispose(); - } - - private class UsersContentProvider implements IStructuredContentProvider { - private static final long serialVersionUID = 1L; - - public Object[] getElements(Object inputElement) { - return (Object[]) inputElement; - } - - public void dispose() { - } - - public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { - } - } - - // /* MANAGE FILTER */ - // private void createFilterPart(Composite parent) { - // // Text Area for the filter - // filterTxt = new Text(parent, SWT.BORDER | SWT.SEARCH | SWT.ICON_SEARCH - // | SWT.ICON_CANCEL); - // filterTxt.setMessage(filterHelpMsg); - // filterTxt.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL - // | GridData.HORIZONTAL_ALIGN_FILL)); - // filterTxt.addModifyListener(new ModifyListener() { - // private static final long serialVersionUID = 1L; - // - // public void modifyText(ModifyEvent event) { - // refreshFilteredList(); - // } - // }); - // } - - /** - * Refresh the user list: caller might overwrite in order to display a - * subset of all users, typically to remove current user from the list - */ - protected void refreshFilteredList(String filter) { - try { - Role[] roles = userAdmin.getRoles(filter); List users = new ArrayList(); for (Role role : roles) if (role.getType() == Role.USER && role.getType() != Role.GROUP) users.add((User) role); - usersViewer.setInput(users.toArray()); - } catch (InvalidSyntaxException e) { - throw new ArgeoException("Unable to get roles with filter: " - + filter, e); - } - } - - // Local helpers - - private abstract class UseradminAbstractLP extends ColumnLabelProvider { - private static final long serialVersionUID = 137336765024922368L; - - @Override - public Font getFont(Object element) { - // TODO manage fonts - // // self - // String username = getProperty(elem, ARGEO_USER_ID); - // if (username.equals(session.getUserID())) - // return bold; - // // disabled - // try { - // Node userProfile = (Node) elem; - // if (!userProfile.getProperty(ARGEO_ENABLED).getBoolean()) - // return italic; - // else - // return null; - // } catch (RepositoryException e) { - // throw new ArgeoException("Cannot get font for " + username, e); - // } - // } - - return super.getFont(element); - } - - @Override - public String getText(Object element) { - User user = (User) element; - return getText(user); - } - - public abstract String getText(User user); - } - - private class UserNameLP extends UseradminAbstractLP { - private static final long serialVersionUID = 6550449442061090388L; - - @Override - public String getText(User user) { - return user.getName(); - } - } - - private class CommonNameLP extends UseradminAbstractLP { - private static final long serialVersionUID = 5256703081044911941L; - - @Override - public String getText(User user) { - Object obj = user.getProperties().get("cn"); - if (obj != null) - return (String) obj; - else - return ""; + return users; } } - private class MailLP extends UseradminAbstractLP { - private static final long serialVersionUID = 8329764452141982707L; - - @Override - public String getText(User user) { - Object obj = user.getProperties().get("mail"); - if (obj != null) - return (String) obj; - else - return ""; - } - } - - protected class ColumnDefinition { - protected ColumnLabelProvider provider; - protected String label; - protected int weight; - protected int minWidth; - - // public ColumnDefinition(ColumnLabelProvider provider, String label, - // int weight, int minimumWidth) { - // this.provider = provider; - // this.label = label; - // this.weight = weight; - // this.minWidth = minimumWidth; - // } - - public ColumnDefinition(ColumnLabelProvider provider, String label, - int weight) { - this.provider = provider; - this.label = label; - this.weight = weight; - this.minWidth = weight; - } + // Override generic view methods + @Override + public void dispose() { + super.dispose(); } - protected UserAdmin userAdmin() { - return userAdmin; + @Override + public void setFocus() { + userTableViewerCmp.setFocus(); } /* DEPENDENCY INJECTION */ -- 2.39.2