From: Mathieu Baudier Date: Thu, 19 Apr 2018 17:32:14 +0000 (+0200) Subject: Working users management X-Git-Tag: argeo-commons-2.1.74~54 X-Git-Url: http://git.argeo.org/?a=commitdiff_plain;h=2f4abd50f4056f1df9d9355145f6192b61a233e8;p=lgpl%2Fargeo-commons.git Working users management --- diff --git a/org.argeo.cms.e4/src/org/argeo/cms/e4/CmsE4Utils.java b/org.argeo.cms.e4/src/org/argeo/cms/e4/CmsE4Utils.java new file mode 100644 index 000000000..b8ad37e39 --- /dev/null +++ b/org.argeo.cms.e4/src/org/argeo/cms/e4/CmsE4Utils.java @@ -0,0 +1,28 @@ +package org.argeo.cms.e4; + +import org.argeo.cms.CmsException; +import org.eclipse.e4.ui.model.application.ui.basic.MPart; +import org.eclipse.e4.ui.workbench.modeling.EPartService; +import org.eclipse.e4.ui.workbench.modeling.EPartService.PartState; + +public class CmsE4Utils { + public static void openEditor(EPartService partService, String editorId, String key, String state) { + for (MPart part : partService.getParts()) { + String id = part.getPersistedState().get(key); + if (id != null && state.equals(id)) { + partService.showPart(part, PartState.ACTIVATE); + return; + } + } + + // new part + MPart part = partService.createPart(editorId); + if (part == null) + throw new CmsException("No editor found with id " + editorId); + part.getPersistedState().put(key, state); + partService.showPart(part, PartState.ACTIVATE); + } + + private CmsE4Utils() { + } +} diff --git a/org.argeo.cms.e4/src/org/argeo/cms/e4/users/AbstractRoleEditor.java b/org.argeo.cms.e4/src/org/argeo/cms/e4/users/AbstractRoleEditor.java index 589cca60d..518be8ce5 100644 --- a/org.argeo.cms.e4/src/org/argeo/cms/e4/users/AbstractRoleEditor.java +++ b/org.argeo.cms.e4/src/org/argeo/cms/e4/users/AbstractRoleEditor.java @@ -25,7 +25,6 @@ import javax.inject.Inject; import org.argeo.cms.ui.eclipse.forms.AbstractFormPart; import org.argeo.cms.ui.eclipse.forms.IManagedForm; import org.argeo.cms.ui.eclipse.forms.ManagedForm; -import org.argeo.cms.util.CmsUtils; import org.argeo.cms.util.UserAdminUtils; import org.argeo.eclipse.ui.EclipseUiUtils; import org.argeo.naming.LdapAttrs; @@ -74,7 +73,7 @@ public abstract class AbstractRoleEditor { private NameChangeListener listener; - private IManagedForm managedForm; + private ManagedForm managedForm; // public void init(IEditorSite site, IEditorInput input) throws // PartInitException { @@ -88,11 +87,18 @@ public abstract class AbstractRoleEditor { userAdminWrapper.addListener(listener); updateEditorTitle(null); - managedForm = new ManagedForm(parent); + managedForm = new ManagedForm(parent) { + + @Override + public void staleStateChanged() { + refresh(); + } + }; ScrolledComposite scrolled = managedForm.getForm(); Composite body = new Composite(scrolled, SWT.NONE); scrolled.setContent(body); createUi(body); + managedForm.refresh(); } abstract void createUi(Composite parent); @@ -171,6 +177,7 @@ public abstract class AbstractRoleEditor { @PreDestroy public void dispose() { userAdminWrapper.removeListener(listener); + managedForm.dispose(); } // CONTROLERS FOR THIS EDITOR AND ITS PAGES @@ -248,10 +255,10 @@ public abstract class AbstractRoleEditor { Text createLMT(Composite parent, String label, String value) { Label lbl = new Label(parent, SWT.NONE); lbl.setText(label); - lbl.setLayoutData(new GridData(SWT.RIGHT, SWT.FILL, false, false)); + lbl.setLayoutData(new GridData(SWT.LEAD, SWT.CENTER, false, false)); Text text = new Text(parent, SWT.NONE); text.setText(value); - text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + text.setLayoutData(new GridData(SWT.LEAD, SWT.FILL, true, true)); return text; } @@ -259,10 +266,10 @@ public abstract class AbstractRoleEditor { Text createLP(Composite parent, String label, String value) { Label lbl = new Label(parent, SWT.NONE); lbl.setText(label); - lbl.setLayoutData(new GridData(SWT.LEAD, SWT.FILL, false, false)); - Text text = new Text(parent, SWT.PASSWORD); + lbl.setLayoutData(new GridData(SWT.LEAD, SWT.CENTER, false, false)); + Text text = new Text(parent, SWT.PASSWORD | SWT.BORDER); text.setText(value); - text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + text.setLayoutData(new GridData(SWT.LEAD, SWT.FILL, true, false)); return text; } @@ -270,25 +277,25 @@ public abstract class AbstractRoleEditor { Text createLT(Composite parent, String label, String value) { Label lbl = new Label(parent, SWT.NONE); lbl.setText(label); - lbl.setLayoutData(new GridData(SWT.LEAD, SWT.FILL, false, false)); + lbl.setLayoutData(new GridData(SWT.LEAD, SWT.CENTER, false, false)); lbl.setFont(EclipseUiUtils.getBoldFont(parent)); - Text text = new Text(parent, SWT.NONE); + Text text = new Text(parent, SWT.BORDER); text.setText(value); text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); - CmsUtils.style(text, CmsWorkbenchStyles.WORKBENCH_FORM_TEXT); + // CmsUtils.style(text, CmsWorkbenchStyles.WORKBENCH_FORM_TEXT); return text; } Text createReadOnlyLT(Composite parent, String label, String value) { Label lbl = new Label(parent, SWT.NONE); lbl.setText(label); - lbl.setLayoutData(new GridData(SWT.LEAD, SWT.FILL, false, false)); + lbl.setLayoutData(new GridData(SWT.LEAD, SWT.CENTER, false, false)); lbl.setFont(EclipseUiUtils.getBoldFont(parent)); Text text = new Text(parent, SWT.NONE); text.setText(value); - text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + text.setLayoutData(new GridData(SWT.LEAD, SWT.FILL, true, false)); text.setEditable(false); - CmsUtils.style(text, CmsWorkbenchStyles.WORKBENCH_FORM_TEXT); + // CmsUtils.style(text, CmsWorkbenchStyles.WORKBENCH_FORM_TEXT); return text; } diff --git a/org.argeo.cms.e4/src/org/argeo/cms/e4/users/GroupEditor.java b/org.argeo.cms.e4/src/org/argeo/cms/e4/users/GroupEditor.java index 27af13684..a38879424 100644 --- a/org.argeo.cms.e4/src/org/argeo/cms/e4/users/GroupEditor.java +++ b/org.argeo.cms.e4/src/org/argeo/cms/e4/users/GroupEditor.java @@ -24,6 +24,7 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import javax.annotation.PreDestroy; import javax.inject.Inject; import javax.jcr.Node; import javax.jcr.Repository; @@ -41,6 +42,7 @@ import org.argeo.cms.e4.users.providers.RoleIconLP; import org.argeo.cms.e4.users.providers.UserFilter; import org.argeo.cms.ui.eclipse.forms.AbstractFormPart; import org.argeo.cms.ui.eclipse.forms.IManagedForm; +import org.argeo.cms.util.CmsUtils; import org.argeo.cms.util.UserAdminUtils; import org.argeo.eclipse.ui.ColumnDefinition; import org.argeo.eclipse.ui.EclipseUiUtils; @@ -64,12 +66,9 @@ import org.eclipse.swt.dnd.DropTargetEvent; import org.eclipse.swt.dnd.TextTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.dnd.TransferData; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.graphics.Cursor; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; @@ -150,7 +149,7 @@ public class GroupEditor extends AbstractRoleEditor implements ArgeoNames { appendMembersPart(body, group); } - @Override + @PreDestroy public void dispose() { JcrUtils.logoutQuietly(session); super.dispose(); @@ -158,14 +157,15 @@ public class GroupEditor extends AbstractRoleEditor implements ArgeoNames { /** Creates the general section */ protected void appendOverviewPart(final Composite parent, final Group group) { - Composite body = new Composite(parent, SWT.BORDER); + Composite body = new Composite(parent, SWT.NONE); // GridLayout layout = new GridLayout(5, false); GridLayout layout = new GridLayout(2, false); body.setLayout(layout); + body.setLayoutData(CmsUtils.fillWidth()); String cn = UserAdminUtils.getProperty(group, LdapAttrs.cn.name()); createReadOnlyLT(body, "Name", cn); - // Text dnTxt = createReadOnlyLT(body, "DN", group.getName()); + createReadOnlyLT(body, "DN", group.getName()); createReadOnlyLT(body, "Domain", UserAdminUtils.getDomainName(group)); // Description @@ -263,20 +263,11 @@ public class GroupEditor extends AbstractRoleEditor implements ArgeoNames { // section.setText("Members"); // section.setLayoutData(EclipseUiUtils.fillAll()); - Composite body = new Composite(parent, SWT.NO_FOCUS); - body.setLayout(EclipseUiUtils.noSpaceGridLayout()); + Composite body = new Composite(parent, SWT.BORDER); + body.setLayout(new GridLayout()); // section.setClient(body); body.setLayoutData(EclipseUiUtils.fillAll()); - LdifUsersTable userTableViewerCmp = createMemberPart(body, group); - - AbstractFormPart part = new GroupMembersPart(userTableViewerCmp); - getManagedForm().addPart(part); - addRemoveAbitily(body, userTableViewerCmp.getTableViewer(), group); - } - - private LdifUsersTable createMemberPart(Composite parent, Group group) { - // Define the displayed columns List columnDefs = new ArrayList(); columnDefs.add(new ColumnDefinition(new RoleIconLP(), "", 0, 24)); @@ -286,7 +277,7 @@ public class GroupEditor extends AbstractRoleEditor implements ArgeoNames { // 240)); // Create and configure the table - LdifUsersTable userViewerCmp = new MyUserTableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL, + LdifUsersTable userViewerCmp = new MyUserTableViewer(body, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL, userAdminWrapper.getUserAdmin()); userViewerCmp.setColumnDefinitions(columnDefs); @@ -301,9 +292,57 @@ public class GroupEditor extends AbstractRoleEditor implements ArgeoNames { userViewer.addDropSupport(operations, tt, new GroupDropListener(userAdminWrapper, userViewerCmp, (Group) getDisplayedUser())); - return userViewerCmp; + AbstractFormPart part = new GroupMembersPart(userViewerCmp); + getManagedForm().addPart(part); + + // remove button + // addRemoveAbility(toolBarManager, userViewerCmp.getTableViewer(), group); + Action action = new RemoveMembershipAction(userViewer, group, "Remove selected items from this group", + SecurityAdminImages.ICON_REMOVE_DESC); + + ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT); + ToolBar toolBar = toolBarManager.createControl(body); + toolBar.setLayoutData(CmsUtils.fillWidth()); + + toolBarManager.add(action); + toolBarManager.update(true); + } + // private LdifUsersTable createMemberPart(Composite parent, Group group) { + // + // // Define the displayed columns + // List columnDefs = new ArrayList(); + // columnDefs.add(new ColumnDefinition(new RoleIconLP(), "", 0, 24)); + // columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Name", 150)); + // columnDefs.add(new ColumnDefinition(new MailLP(), "Mail", 150)); + // // columnDefs.add(new ColumnDefinition(new UserNameLP(), "Distinguished + // Name", + // // 240)); + // + // // Create and configure the table + // LdifUsersTable userViewerCmp = new MyUserTableViewer(parent, SWT.MULTI | + // SWT.H_SCROLL | SWT.V_SCROLL, + // userAdminWrapper.getUserAdmin()); + // + // userViewerCmp.setColumnDefinitions(columnDefs); + // userViewerCmp.populate(true, false); + // userViewerCmp.setLayoutData(EclipseUiUtils.fillAll()); + // + // // Controllers + // TableViewer userViewer = userViewerCmp.getTableViewer(); + // userViewer.addDoubleClickListener(new + // UserTableDefaultDClickListener(partService)); + // int operations = DND.DROP_COPY | DND.DROP_MOVE; + // Transfer[] tt = new Transfer[] { TextTransfer.getInstance() }; + // userViewer.addDropSupport(operations, tt, + // new GroupDropListener(userAdminWrapper, userViewerCmp, (Group) + // getDisplayedUser())); + // + // // userViewerCmp.refresh(); + // return userViewerCmp; + // } + // Local viewers private class MyUserTableViewer extends LdifUsersTable { private static final long serialVersionUID = 8467999509931900367L; @@ -332,28 +371,32 @@ public class GroupEditor extends AbstractRoleEditor implements ArgeoNames { } } - private void addRemoveAbitily(Composite parent, TableViewer userViewer, Group group) { - // Section section = sectionPart.getSection(); - ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT); - ToolBar toolbar = toolBarManager.createControl(parent); - final Cursor handCursor = new Cursor(parent.getDisplay(), SWT.CURSOR_HAND); - toolbar.setCursor(handCursor); - toolbar.addDisposeListener(new DisposeListener() { - private static final long serialVersionUID = 3882131405820522925L; - - public void widgetDisposed(DisposeEvent e) { - if ((handCursor != null) && (handCursor.isDisposed() == false)) { - handCursor.dispose(); - } - } - }); - - Action action = new RemoveMembershipAction(userViewer, group, "Remove selected items from this group", - SecurityAdminImages.ICON_REMOVE_DESC); - toolBarManager.add(action); - toolBarManager.update(true); - // section.setTextClient(toolbar); - } + // private void addRemoveAbility(ToolBarManager toolBarManager, TableViewer + // userViewer, Group group) { + // // Section section = sectionPart.getSection(); + // // ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT); + // // ToolBar toolbar = toolBarManager.createControl(parent); + // // ToolBar toolbar = toolBarManager.getControl(); + // // final Cursor handCursor = new Cursor(toolbar.getDisplay(), + // SWT.CURSOR_HAND); + // // toolbar.setCursor(handCursor); + // // toolbar.addDisposeListener(new DisposeListener() { + // // private static final long serialVersionUID = 3882131405820522925L; + // // + // // public void widgetDisposed(DisposeEvent e) { + // // if ((handCursor != null) && (handCursor.isDisposed() == false)) { + // // handCursor.dispose(); + // // } + // // } + // // }); + // + // Action action = new RemoveMembershipAction(userViewer, group, "Remove + // selected items from this group", + // SecurityAdminImages.ICON_REMOVE_DESC); + // toolBarManager.add(action); + // toolBarManager.update(true); + // // section.setTextClient(toolbar); + // } private class RemoveMembershipAction extends Action { private static final long serialVersionUID = -1337713097184522588L; diff --git a/org.argeo.cms.e4/src/org/argeo/cms/e4/users/GroupsView.java b/org.argeo.cms.e4/src/org/argeo/cms/e4/users/GroupsView.java index 2007abf7d..53937c9d7 100644 --- a/org.argeo.cms.e4/src/org/argeo/cms/e4/users/GroupsView.java +++ b/org.argeo.cms.e4/src/org/argeo/cms/e4/users/GroupsView.java @@ -47,6 +47,10 @@ import org.argeo.naming.LdapObjs; import org.argeo.node.NodeConstants; import org.eclipse.e4.ui.di.Focus; import org.eclipse.e4.ui.workbench.modeling.EPartService; +import org.eclipse.e4.ui.workbench.modeling.ESelectionService; +import org.eclipse.jface.viewers.ISelectionChangedListener; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.dnd.DND; @@ -84,7 +88,7 @@ public class GroupsView implements ArgeoNames { private UserAdminListener listener; @PostConstruct - public void createPartControl(Composite parent) { + public void createPartControl(Composite parent, ESelectionService selectionService) { parent.setLayout(EclipseUiUtils.noSpaceGridLayout()); // boolean isAdmin = CurrentUser.isInRole(NodeConstants.ROLE_ADMIN); @@ -113,6 +117,14 @@ public class GroupsView implements ArgeoNames { userViewer = groupTableViewerCmp.getTableViewer(); userViewer.addDoubleClickListener(new UserTableDefaultDClickListener(partService)); // getViewSite().setSelectionProvider(userViewer); + userViewer.addSelectionChangedListener(new ISelectionChangedListener() { + + @Override + public void selectionChanged(SelectionChangedEvent event) { + IStructuredSelection selection = (IStructuredSelection) event.getSelection(); + selectionService.setSelection(selection.toList()); + } + }); // Really? groupTableViewerCmp.refresh(); diff --git a/org.argeo.cms.e4/src/org/argeo/cms/e4/users/UserEditor.java b/org.argeo.cms.e4/src/org/argeo/cms/e4/users/UserEditor.java index c7e5fe40e..4ac96464b 100644 --- a/org.argeo.cms.e4/src/org/argeo/cms/e4/users/UserEditor.java +++ b/org.argeo.cms.e4/src/org/argeo/cms/e4/users/UserEditor.java @@ -61,13 +61,10 @@ import org.eclipse.swt.dnd.DropTargetEvent; import org.eclipse.swt.dnd.TextTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.dnd.TransferData; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; 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.graphics.Cursor; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; @@ -118,12 +115,12 @@ public class UserEditor extends AbstractRoleEditor implements ArgeoNames { @Override protected void createUi(Composite body) { -// Composite body = new Composite(parent, SWT.BORDER); + // Composite body = new Composite(parent, SWT.BORDER); GridLayout mainLayout = new GridLayout(); // mainLayout.marginRight = 10; body.setLayout(mainLayout); -// body.getParent().setLayout(new GridLayout()); -// body.setLayoutData(CmsUtils.fillAll()); + // body.getParent().setLayout(new GridLayout()); + // body.setLayoutData(CmsUtils.fillAll()); User user = getDisplayedUser(); appendOverviewPart(body, user); // Remove to ability to force the password for his own user. The user @@ -139,7 +136,7 @@ public class UserEditor extends AbstractRoleEditor implements ArgeoNames { // GridData gd = EclipseUiUtils.fillWidth(); // // gd.verticalAlignment = PRE_TITLE_INDENT; // section.setLayoutData(gd); - Composite body = new Composite(parent, SWT.BORDER); + Composite body = new Composite(parent, SWT.NONE); body.setLayoutData(EclipseUiUtils.fillWidth()); // section.setClient(body); // body.setLayout(new GridLayout(6, false)); @@ -295,8 +292,8 @@ public class UserEditor extends AbstractRoleEditor implements ArgeoNames { // Section section = addSection(tk, parent, "Roles"); // Composite body = (Composite) section.getClient(); // Composite body= parent; - Composite body = new Composite(parent, SWT.NONE); - body.setLayout(EclipseUiUtils.noSpaceGridLayout()); + Composite body = new Composite(parent, SWT.BORDER); + body.setLayout(new GridLayout()); body.setLayoutData(CmsUtils.fillAll()); // boolean isAdmin = CurrentUser.isInRole(NodeConstants.ROLE_ADMIN); @@ -360,6 +357,14 @@ public class UserEditor extends AbstractRoleEditor implements ArgeoNames { }; getManagedForm().addPart(part); // addRemoveAbitily(body, userViewer, user); + // userViewerCmp.refresh(); + String tooltip = "Remove " + UserAdminUtils.getUserLocalId(user.getName()) + " from the below selected groups"; + Action action = new RemoveMembershipAction(userViewer, user, tooltip, SecurityAdminImages.ICON_REMOVE_DESC); + ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT); + ToolBar toolBar = toolBarManager.createControl(body); + toolBar.setLayoutData(CmsUtils.fillWidth()); + toolBarManager.add(action); + toolBarManager.update(true); return userViewerCmp; } @@ -409,28 +414,31 @@ public class UserEditor extends AbstractRoleEditor implements ArgeoNames { } } - private void addRemoveAbitily(Composite parent, TableViewer userViewer, User user) { - // Section section = sectionPart.getSection(); - ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT); - ToolBar toolbar = toolBarManager.createControl(parent); - final Cursor handCursor = new Cursor(Display.getCurrent(), SWT.CURSOR_HAND); - toolbar.setCursor(handCursor); - toolbar.addDisposeListener(new DisposeListener() { - private static final long serialVersionUID = 3882131405820522925L; - - public void widgetDisposed(DisposeEvent e) { - if ((handCursor != null) && (handCursor.isDisposed() == false)) { - handCursor.dispose(); - } - } - }); - - String tooltip = "Remove " + UserAdminUtils.getUserLocalId(user.getName()) + " from the below selected groups"; - Action action = new RemoveMembershipAction(userViewer, user, tooltip, SecurityAdminImages.ICON_REMOVE_DESC); - toolBarManager.add(action); - toolBarManager.update(true); - // section.setTextClient(toolbar); - } + // private void addRemoveAbility(Composite parent, TableViewer userViewer, User + // user) { + // // Section section = sectionPart.getSection(); + // ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT); + // ToolBar toolbar = toolBarManager.createControl(parent); + // final Cursor handCursor = new Cursor(Display.getCurrent(), SWT.CURSOR_HAND); + // toolbar.setCursor(handCursor); + // toolbar.addDisposeListener(new DisposeListener() { + // private static final long serialVersionUID = 3882131405820522925L; + // + // public void widgetDisposed(DisposeEvent e) { + // if ((handCursor != null) && (handCursor.isDisposed() == false)) { + // handCursor.dispose(); + // } + // } + // }); + // + // String tooltip = "Remove " + UserAdminUtils.getUserLocalId(user.getName()) + + // " from the below selected groups"; + // Action action = new RemoveMembershipAction(userViewer, user, tooltip, + // SecurityAdminImages.ICON_REMOVE_DESC); + // toolBarManager.add(action); + // toolBarManager.update(true); + // // section.setTextClient(toolbar); + // } private class RemoveMembershipAction extends Action { private static final long serialVersionUID = -1337713097184522588L; diff --git a/org.argeo.cms.e4/src/org/argeo/cms/e4/users/UserTableDefaultDClickListener.java b/org.argeo.cms.e4/src/org/argeo/cms/e4/users/UserTableDefaultDClickListener.java index 6acaa0bae..a9a4ede0a 100644 --- a/org.argeo.cms.e4/src/org/argeo/cms/e4/users/UserTableDefaultDClickListener.java +++ b/org.argeo.cms.e4/src/org/argeo/cms/e4/users/UserTableDefaultDClickListener.java @@ -1,10 +1,8 @@ package org.argeo.cms.e4.users; -import org.argeo.cms.CmsException; +import org.argeo.cms.e4.CmsE4Utils; import org.argeo.naming.LdapAttrs; -import org.eclipse.e4.ui.model.application.ui.basic.MPart; import org.eclipse.e4.ui.workbench.modeling.EPartService; -import org.eclipse.e4.ui.workbench.modeling.EPartService.PartState; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.IStructuredSelection; @@ -28,30 +26,8 @@ public class UserTableDefaultDClickListener implements IDoubleClickListener { Object obj = ((IStructuredSelection) evt.getSelection()).getFirstElement(); User user = (User) obj; - String entityEditorId = getEditorId(user); - MPart part = partService.createPart(entityEditorId); - part.setLabel(user.toString()); - part.getPersistedState().put(LdapAttrs.uid.name(), user.getName()); - - // the provided part is be shown - partService.showPart(part, PartState.ACTIVATE); - - // IWorkbenchWindow iww = WorkbenchUiPlugin.getDefault().getWorkbench() - // .getActiveWorkbenchWindow(); - // IWorkbenchPage iwp = iww.getActivePage(); - // UserEditorInput uei = new UserEditorInput(user.getName()); - // FIXME open editor - - try { - // Works around the fact that dynamic setting of the editor icon - // causes NPE after a login/logout on RAP - // if (user instanceof Group) - // iwp.openEditor(uei, UserEditor.GROUP_EDITOR_ID); - // else - // iwp.openEditor(uei, UserEditor.USER_EDITOR_ID); - } catch (Exception pie) { - throw new CmsException("Unable to open UserEditor for " + user, pie); - } + String editorId = getEditorId(user); + CmsE4Utils.openEditor(partService, editorId, LdapAttrs.uid.name(), user.getName()); } protected String getEditorId(User user) { diff --git a/org.argeo.cms.e4/src/org/argeo/cms/e4/users/UsersView.java b/org.argeo.cms.e4/src/org/argeo/cms/e4/users/UsersView.java index 7562421cc..fb57a6201 100644 --- a/org.argeo.cms.e4/src/org/argeo/cms/e4/users/UsersView.java +++ b/org.argeo.cms.e4/src/org/argeo/cms/e4/users/UsersView.java @@ -38,6 +38,10 @@ import org.argeo.naming.LdapObjs; import org.argeo.node.NodeConstants; import org.eclipse.e4.ui.di.Focus; import org.eclipse.e4.ui.workbench.modeling.EPartService; +import org.eclipse.e4.ui.workbench.modeling.ESelectionService; +import org.eclipse.jface.viewers.ISelectionChangedListener; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.dnd.DND; @@ -70,7 +74,7 @@ public class UsersView implements ArgeoNames { private UserAdminListener listener; @PostConstruct - public void createPartControl(Composite parent) { + public void createPartControl(Composite parent, ESelectionService selectionService) { parent.setLayout(EclipseUiUtils.noSpaceGridLayout()); // Define the displayed columns @@ -90,6 +94,14 @@ public class UsersView implements ArgeoNames { // Links userViewer = userTableViewerCmp.getTableViewer(); userViewer.addDoubleClickListener(new UserTableDefaultDClickListener(partService)); + userViewer.addSelectionChangedListener(new ISelectionChangedListener() { + + @Override + public void selectionChanged(SelectionChangedEvent event) { + IStructuredSelection selection = (IStructuredSelection) event.getSelection(); + selectionService.setSelection(selection.toList()); + } + }); // getViewSite().setSelectionProvider(userViewer); // Really? diff --git a/org.argeo.cms.e4/src/org/argeo/cms/e4/users/handlers/DeleteGroups.java b/org.argeo.cms.e4/src/org/argeo/cms/e4/users/handlers/DeleteGroups.java index 95a411635..561468dc6 100644 --- a/org.argeo.cms.e4/src/org/argeo/cms/e4/users/handlers/DeleteGroups.java +++ b/org.argeo.cms.e4/src/org/argeo/cms/e4/users/handlers/DeleteGroups.java @@ -15,19 +15,20 @@ */ package org.argeo.cms.e4.users.handlers; -import java.util.ArrayList; -import java.util.Iterator; import java.util.List; import javax.inject.Inject; +import javax.inject.Named; +import org.argeo.cms.e4.users.GroupsView; import org.argeo.cms.e4.users.UserAdminWrapper; import org.argeo.cms.util.UserAdminUtils; +import org.eclipse.e4.core.di.annotations.CanExecute; import org.eclipse.e4.core.di.annotations.Execute; +import org.eclipse.e4.ui.model.application.ui.basic.MPart; +import org.eclipse.e4.ui.services.IServiceConstants; import org.eclipse.e4.ui.workbench.modeling.ESelectionService; import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.widgets.Display; import org.osgi.service.useradmin.Group; import org.osgi.service.useradmin.UserAdmin; @@ -35,63 +36,75 @@ import org.osgi.service.useradmin.UserAdminEvent; /** Delete the selected groups */ public class DeleteGroups { -// public final static String ID = WorkbenchUiPlugin.PLUGIN_ID + ".deleteGroups"; + // public final static String ID = WorkbenchUiPlugin.PLUGIN_ID + + // ".deleteGroups"; /* DEPENDENCY INJECTION */ @Inject private UserAdminWrapper userAdminWrapper; - + @Inject ESelectionService selectionService; @SuppressWarnings("unchecked") @Execute - public Object execute() { - ISelection selection = null;// HandlerUtil.getCurrentSelection(event); - if (selection.isEmpty()) - return null; + public void execute(@Named(IServiceConstants.ACTIVE_PART) MPart part, ESelectionService selectionService) { + // ISelection selection = null;// HandlerUtil.getCurrentSelection(event); + // if (selection.isEmpty()) + // return null; + // + // List groups = new ArrayList(); + // Iterator it = ((IStructuredSelection) selection).iterator(); + + List selection = (List) selectionService.getSelection(); + if (selection == null) + return; - List groups = new ArrayList(); - Iterator it = ((IStructuredSelection) selection).iterator(); StringBuilder builder = new StringBuilder(); - while (it.hasNext()) { - Group currGroup = it.next(); + for (Group group : selection) { + Group currGroup = group; String groupName = UserAdminUtils.getUserLocalId(currGroup.getName()); // TODO add checks builder.append(groupName).append("; "); - groups.add(currGroup); + // groups.add(currGroup); } if (!MessageDialog.openQuestion(Display.getCurrent().getActiveShell(), "Delete Groups", "Are you sure that you " + "want to delete these groups?\n" + builder.substring(0, builder.length() - 2))) - return null; + return; userAdminWrapper.beginTransactionIfNeeded(); UserAdmin userAdmin = userAdminWrapper.getUserAdmin(); -// IWorkbenchPage iwp = HandlerUtil.getActiveWorkbenchWindow(event).getActivePage(); - for (Group group : groups) { + // IWorkbenchPage iwp = + // HandlerUtil.getActiveWorkbenchWindow(event).getActivePage(); + for (Group group : selection) { String groupName = group.getName(); // TODO find a way to close the editor cleanly if opened. Cannot be // done through the UserAdminListeners, it causes a // java.util.ConcurrentModificationException because disposing the // editor unregisters and disposes the listener -// IEditorPart part = iwp.findEditor(new UserEditorInput(groupName)); -// if (part != null) -// iwp.closeEditor(part, false); + // IEditorPart part = iwp.findEditor(new UserEditorInput(groupName)); + // if (part != null) + // iwp.closeEditor(part, false); userAdmin.removeRole(groupName); } userAdminWrapper.commitOrNotifyTransactionStateChange(); // Update the view - for (Group group : groups) { + for (Group group : selection) { userAdminWrapper.notifyListeners(new UserAdminEvent(null, UserAdminEvent.ROLE_REMOVED, group)); } - return null; + // return null; } - /* DEPENDENCY INJECTION */ - public void setUserAdminWrapper(UserAdminWrapper userAdminWrapper) { - this.userAdminWrapper = userAdminWrapper; + @CanExecute + public boolean canExecute(@Named(IServiceConstants.ACTIVE_PART) MPart part, ESelectionService selectionService) { + return part.getObject() instanceof GroupsView && selectionService.getSelection() != null; } + + /* DEPENDENCY INJECTION */ + // public void setUserAdminWrapper(UserAdminWrapper userAdminWrapper) { + // this.userAdminWrapper = userAdminWrapper; + // } } diff --git a/org.argeo.cms.e4/src/org/argeo/cms/e4/users/handlers/DeleteUsers.java b/org.argeo.cms.e4/src/org/argeo/cms/e4/users/handlers/DeleteUsers.java index 4a9417c9e..b70312bc8 100644 --- a/org.argeo.cms.e4/src/org/argeo/cms/e4/users/handlers/DeleteUsers.java +++ b/org.argeo.cms.e4/src/org/argeo/cms/e4/users/handlers/DeleteUsers.java @@ -15,18 +15,20 @@ */ package org.argeo.cms.e4.users.handlers; -import java.util.ArrayList; -import java.util.Iterator; import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import org.argeo.cms.e4.users.UserAdminWrapper; +import org.argeo.cms.e4.users.UsersView; import org.argeo.cms.util.UserAdminUtils; +import org.eclipse.e4.core.di.annotations.CanExecute; import org.eclipse.e4.core.di.annotations.Execute; +import org.eclipse.e4.ui.model.application.ui.basic.MPart; +import org.eclipse.e4.ui.services.IServiceConstants; +import org.eclipse.e4.ui.workbench.modeling.ESelectionService; import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.widgets.Display; import org.osgi.service.useradmin.User; import org.osgi.service.useradmin.UserAdmin; @@ -42,37 +44,41 @@ public class DeleteUsers { @SuppressWarnings("unchecked") @Execute - public Object execute() { - ISelection selection = null;// HandlerUtil.getCurrentSelection(event); - if (selection.isEmpty()) - return null; + public void execute(@Named(IServiceConstants.ACTIVE_PART) MPart part, ESelectionService selectionService) { + // ISelection selection = null;// HandlerUtil.getCurrentSelection(event); + // if (selection.isEmpty()) + // return null; + List selection = (List) selectionService.getSelection(); + if (selection == null) + return; - Iterator it = ((IStructuredSelection) selection).iterator(); - List users = new ArrayList(); +// Iterator it = ((IStructuredSelection) selection).iterator(); +// List users = new ArrayList(); StringBuilder builder = new StringBuilder(); - while (it.hasNext()) { - User currUser = it.next(); + for(User user:selection) { + User currUser = user; +// User currUser = it.next(); String userName = UserAdminUtils.getUserLocalId(currUser.getName()); if (UserAdminUtils.isCurrentUser(currUser)) { MessageDialog.openError(Display.getCurrent().getActiveShell(), "Deletion forbidden", "You cannot delete your own user this way."); - return null; + return; } builder.append(userName).append("; "); - users.add(currUser); +// users.add(currUser); } if (!MessageDialog.openQuestion(Display.getCurrent().getActiveShell(), "Delete Users", "Are you sure that you want to delete these users?\n" + builder.substring(0, builder.length() - 2))) - return null; + return; userAdminWrapper.beginTransactionIfNeeded(); UserAdmin userAdmin = userAdminWrapper.getUserAdmin(); // IWorkbenchPage iwp = // HandlerUtil.getActiveWorkbenchWindow(event).getActivePage(); - for (User user : users) { + for (User user : selection) { String userName = user.getName(); // TODO find a way to close the editor cleanly if opened. Cannot be // done through the UserAdminListeners, it causes a @@ -85,14 +91,13 @@ public class DeleteUsers { } userAdminWrapper.commitOrNotifyTransactionStateChange(); - for (User user : users) { + for (User user : selection) { userAdminWrapper.notifyListeners(new UserAdminEvent(null, UserAdminEvent.ROLE_REMOVED, user)); } - return null; } - /* DEPENDENCY INJECTION */ - public void setUserAdminWrapper(UserAdminWrapper userAdminWrapper) { - this.userAdminWrapper = userAdminWrapper; + @CanExecute + public boolean canExecute(@Named(IServiceConstants.ACTIVE_PART) MPart part, ESelectionService selectionService) { + return part.getObject() instanceof UsersView && selectionService.getSelection() != null; } } diff --git a/org.argeo.cms.ui.theme/icons/delete.png b/org.argeo.cms.ui.theme/icons/delete.png index 66d1cd761..676a39dcf 100644 Binary files a/org.argeo.cms.ui.theme/icons/delete.png and b/org.argeo.cms.ui.theme/icons/delete.png differ