/** * <copyright> Copyright (c) 2008-2009 Jonas Helming, Maximilian Koegel. All rights reserved. This program and the * accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html </copyright> */ package org.eclipse.emf.emfstore.client.ui.views.users; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecp.common.util.OverlayImageDescriptor; import org.eclipse.emf.ecp.editor.mecontrols.melinkcontrol.MEMultiLinkControl; import org.eclipse.emf.edit.provider.ComposedAdapterFactory; import org.eclipse.emf.edit.provider.IItemPropertyDescriptor; import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider; import org.eclipse.emf.emfstore.server.model.ModelFactory; import org.eclipse.emf.emfstore.server.model.ProjectId; import org.eclipse.emf.emfstore.server.model.accesscontrol.ACOrgUnit; import org.eclipse.emf.emfstore.server.model.accesscontrol.AccesscontrolFactory; import org.eclipse.emf.emfstore.server.model.accesscontrol.RoleAssignment; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.ToolBarManager; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.graphics.Cursor; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.ui.dialogs.CheckedTreeSelectionDialog; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.Section; /** * @author boehlke * */ public class EcpRoleAssignmentWidget extends MEMultiLinkControl { private UserUiController controller; public EcpRoleAssignmentWidget() { this.controller = UserUiController.getInstance(); } /** * {@inheritDoc} * * @see org.eclipse.emf.ecp.editor.mecontrols.AbstractMEControl#canRender(org.eclipse.emf.edit.provider.IItemPropertyDescriptor, * org.eclipse.emf.ecore.EObject) */ @Override public int canRender(IItemPropertyDescriptor itemPropertyDescriptor, EObject modelElement) { if (modelElement instanceof ACOrgUnit) { return 100; } return DO_NOT_RENDER; } @Override protected void createSectionToolbar(final Section section, FormToolkit toolkit) { ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT); ToolBar toolbar = toolBarManager.createControl(section); final Cursor handCursor = new Cursor(Display.getCurrent(), SWT.CURSOR_HAND); toolbar.setCursor(handCursor); // Cursor needs to be explicitly disposed toolbar.addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent e) { if (!handCursor.isDisposed()) { handCursor.dispose(); } } }); Image image = new AdapterFactoryLabelProvider(new ComposedAdapterFactory( ComposedAdapterFactory.Descriptor.Registry.INSTANCE)).getImage(getModelElement()); String overlayString = "icons/link_overlay.png"; if (eReference.isContainment()) { overlayString = "icons/containment_overlay.png"; } ImageDescriptor addOverlay = org.eclipse.emf.ecp.common.Activator.getImageDescriptor(overlayString); final OverlayImageDescriptor imageDescriptor = new OverlayImageDescriptor(image, addOverlay, OverlayImageDescriptor.LOWER_RIGHT); toolBarManager.add(new Action() { @Override public void run() { CheckedTreeSelectionDialog checkedTreeSelectionDialog = new CheckedTreeRoleSelectionDialog(section .getShell(), controller); ACOrgUnit acOrgUnit = (ACOrgUnit) getModelElement(); EList<RoleAssignment> roles = acOrgUnit.getRoles(); checkedTreeSelectionDialog.setInput(roles); checkedTreeSelectionDialog.open(); Object[] result = checkedTreeSelectionDialog.getResult(); if (result == null) { return; } List<RoleAssignment> added = new ArrayList<RoleAssignment>(); Set<RoleAssignment> removed = new HashSet<RoleAssignment>(); removed.addAll(roles); RESULT: for (Object object : result) { RoleSelection sel = (RoleSelection) object; if (sel.getRole() == null) { continue; } ProjectId projectId = null; if (sel.getProject() != null) { projectId = sel.getProject().getProjectId(); } for (RoleAssignment assignmentData : roles) { ProjectId projectId2 = assignmentData.getProjectId(); if ((projectId2 == null && projectId == null) || (projectId2 != null && projectId2.equals(projectId)) && assignmentData.getRole().getIdentifier().equals(sel.getRole().getIdentifier())) { removed.remove(assignmentData); continue RESULT; } } // TODO: send to server RoleAssignment newAssignment = AccesscontrolFactory.eINSTANCE.createRoleAssignment(); if (projectId != null) { ProjectId id = ModelFactory.eINSTANCE.createProjectId(); id.setId(projectId.getId()); newAssignment.setProjectId(id); } newAssignment.setRole(sel.getRole()); added.add(newAssignment); } for (RoleAssignment roleAssignment : added) { acOrgUnit.getRoles().add(roleAssignment); } for (RoleAssignment roleAssignment : removed) { acOrgUnit.getRoles().remove(roleAssignment); } // List<RoleAssignment> assignments = new ArrayList<RoleAssignment>(); // for (Object object : result) { // RoleSelection sel = (RoleSelection) object; // if (sel.getRole() == null) { // continue; // } // RoleAssignment assignment = AccesscontrolFactory.eINSTANCE.createRoleAssignment(); // assignment.setRole(sel.getRole()); // if (sel.getProject() != null) { // assignment.setProjectId(sel.getProject().getProjectId()); // } // assignments.add(assignment); // } // return new BasicEList<Object>(assignments); } @Override public ImageDescriptor getImageDescriptor() { return imageDescriptor; } }); toolBarManager.update(true); section.setTextClient(toolbar); } }