/******************************************************************************* * Copyright (c) 2008-2011 Chair for Applied Software Engineering, * Technische Universitaet Muenchen. * 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 * * Contributors: * Zardosht Hodaie - initial API and implementation ******************************************************************************/ package org.eclipse.emf.emfstore.internal.client.ui.dialogs.admin; import java.util.Collection; import org.apache.commons.lang.StringUtils; import org.eclipse.emf.common.util.BasicEList; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.emfstore.internal.client.model.AdminBroker; import org.eclipse.emf.emfstore.internal.client.ui.dialogs.EMFStoreMessageDialog; import org.eclipse.emf.emfstore.internal.server.exceptions.AccessControlException; import org.eclipse.emf.emfstore.internal.server.model.accesscontrol.ACGroup; import org.eclipse.emf.emfstore.internal.server.model.accesscontrol.ACOrgUnit; import org.eclipse.emf.emfstore.server.exceptions.ESException; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.util.LocalSelectionTransfer; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.DropTargetAdapter; import org.eclipse.swt.dnd.DropTargetEvent; import org.eclipse.swt.dnd.DropTargetListener; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.forms.widgets.Form; /** * This shows attributes of a ACGroup (name, description) and show a list of its * member OrgUnits. You can use drag and drop to drop a group or a user on * members list, and it will be added to members. * * @author Hodaie */ public class GroupComposite extends PropertiesComposite { private ACGroup group; private final OrgUnitManagementGUI orgUnitMgmtGUI; /** * Constructor. * * @param parent * parent * @param style * style * @param adminBroker * used to communicate with the server * @param orgUnitMgmtGUI * used to find out what which tab is active, so that if needed * update its list viewer */ public GroupComposite(Composite parent, int style, AdminBroker adminBroker, OrgUnitManagementGUI orgUnitMgmtGUI) { super(parent, style, adminBroker); this.orgUnitMgmtGUI = orgUnitMgmtGUI; createControls(); } /** * {@inheritDoc} */ @Override protected void removeOrgUnit(ACOrgUnit orgUnit) { try { getAdminBroker().removeMember(group.getId(), orgUnit.getId()); } catch (final AccessControlException ex) { MessageDialog.openWarning(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), Messages.GroupComposite_Insufficient_Access_Rights, Messages.GroupComposite_Not_Allowed_To_Remove_Member_From_Selected_Group); } catch (final ESException ex) { EMFStoreMessageDialog.showExceptionDialog(ex); } getTableViewer().refresh(); } /** * {@inheritDoc} */ @Override protected void addExistingOrgUnit(ACOrgUnit orgUnit) { if (orgUnit != null && !orgUnit.equals(group)) { try { getAdminBroker().addMember(group.getId(), orgUnit.getId()); } catch (final AccessControlException e) { MessageDialog.openWarning(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), Messages.GroupComposite_Insufficient_Access_Rights, Messages.GroupComposite_Not_Allowed_To_Add_Member_To_Selected_Group); } catch (final ESException ex) { EMFStoreMessageDialog.showExceptionDialog(ex); } } getTableViewer().refresh(); } /** * {@inheritDoc} */ @Override protected void addNewOrgUnit() { for (final ACOrgUnit newMember : getNewMembers()) { try { getAdminBroker().addMember(group.getId(), newMember.getId()); } catch (final AccessControlException e) { MessageDialog.openWarning(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), Messages.GroupComposite_Insufficient_Access_Rights, Messages.GroupComposite_Not_Allowed_To_Add_Member_To_Selected_Group); } catch (final ESException ex) { EMFStoreMessageDialog.showExceptionDialog(ex); } } getTableViewer().refresh(); } /** * This will be used when adding a new member using add button. It shows a * list of ACOrgUnits on the server. * * @return selected elements */ private EList<ACOrgUnit> getNewMembers() { // 1. show a list of all AcOrgUnits that are not member of this group // (get list of all AcOrgUnits, remove those who take part in this // 2. return the selected ACOrgunits final Collection<ACOrgUnit> allOrgUnits = new BasicEList<ACOrgUnit>(); final EList<ACOrgUnit> members = new BasicEList<ACOrgUnit>(); try { allOrgUnits.addAll(getAdminBroker().getOrgUnits()); allOrgUnits.removeAll(getAdminBroker().getMembers(group.getId())); if (allOrgUnits.contains(group)) { allOrgUnits.remove(group); } final Object[] result = showDialog(allOrgUnits, Messages.GroupComposite_Select_Member); for (int i = 0; i < result.length; i++) { if (result[i] instanceof ACOrgUnit) { members.add((ACOrgUnit) result[i]); } } } catch (final ESException e) { // ZH Auto-generated catch block e.printStackTrace(); } return members; } /** * {@inheritDoc} * * @see org.eclipse.emf.emfstore.internal.client.ui.dialogs.admin.PropertiesComposite#getTabTitle() */ @Override protected String getTabTitle() { return Messages.GroupComposite_Members; } /** * {@inheritDoc} */ @Override public void updateControls(EObject input) { if (input instanceof ACGroup) { group = (ACGroup) input; getTxtName().setText( group.getName()); getTxtDescription().setText( group.getDescription() == null ? StringUtils.EMPTY : group.getDescription()); getTableViewer().setInput(group); } } /** * {@inheritDoc} */ @Override protected void saveOrgUnitAttributes() { if (getTxtName() == null || getTxtDescription() == null) { return; } if (group == null) { return; } if (!(group.getName().equals(getTxtName().getText()) && group.getDescription().equals( getTxtDescription().getText()))) { try { getAdminBroker().changeOrgUnit(group.getId(), getTxtName().getText(), getTxtDescription().getText()); ((Form) getParent().getParent()).setText(Messages.GroupComposite_Group + getTxtName().getText()); orgUnitMgmtGUI.getActiveTabContent().getTableViewer().refresh(); } catch (final ESException e) { EMFStoreMessageDialog.showExceptionDialog(e); } } } /** * {@inheritDoc} */ @Override protected void addDragNDropSupport() { // add drag support super.addDragNDropSupport(); // add drop support final int ops = DND.DROP_COPY; final Transfer[] transfers = new Transfer[] { LocalSelectionTransfer.getTransfer() }; final DropTargetListener dropListener = new DropTargetAdapter() { @Override public void dragEnter(DropTargetEvent event) { if (PropertiesForm.getDragSource().equals(Messages.GroupComposite_Projects)) { event.detail = DND.DROP_NONE; } else { event.detail = DND.DROP_COPY; } } @Override public void drop(DropTargetEvent event) { if (PropertiesForm.getDragNDropObject() != null) { if (PropertiesForm.getDragNDropObject() instanceof ACOrgUnit) { final ACOrgUnit orgUnit = (ACOrgUnit) PropertiesForm.getDragNDropObject(); addExistingOrgUnit(orgUnit); PropertiesForm.setDragNDropObject(null); getTableViewer().refresh(); } } } }; getTableViewer().addDropSupport(ops, transfers, dropListener); } } // GroupComposite