blob: 5ee8d10833e978de962894a305cc5d0641f73bb3 [file] [log] [blame]
/*******************************************************************************
* 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:
* Hodaie
******************************************************************************/
package org.eclipse.emf.emfstore.internal.client.ui.dialogs.admin;
import java.util.Collection;
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.ProjectInfo;
import org.eclipse.emf.emfstore.internal.server.model.accesscontrol.ACOrgUnit;
import org.eclipse.emf.emfstore.internal.server.model.accesscontrol.roles.Role;
import org.eclipse.emf.emfstore.internal.server.model.accesscontrol.roles.RolesPackage;
import org.eclipse.emf.emfstore.server.exceptions.ESException;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.layout.PixelConverter;
import org.eclipse.jface.util.LocalSelectionTransfer;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.ComboBoxCellEditor;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.swt.SWT;
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.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;
/**
* This is shows the properties of a project (name, ...) and a list of its participants. The user can change the role of
* a participant in TableViewer using a ComboboxCellEditor.
*
* @author Hodaie
*/
public class ProjectComposite extends PropertiesComposite {
private static final int READER_ROLE = 0;
private static final int WRITER_ROLE = 1;
private static final int PROJECT_ADMIN_ROLE = 2;
private static final int SERVER_ADMIN_ROLE = 3;
// Set column names
private final String[] roleNames = new String[] { Messages.ProjectComposite_Reader,
Messages.ProjectComposite_Writer, Messages.ProjectComposite_ProjectAdmin,
Messages.ProjectComposite_ServerAdmin };
private Label lblVersion;
private Text txtVersion;
private ProjectInfo projectInfo;
/**
* Constructor.
*
* @param parent parent
* @param style style
* @param adminBroker used to communicate with server.
*/
public ProjectComposite(Composite parent, int style, AdminBroker adminBroker) {
super(parent, style, adminBroker);
createControls();
}
/**
* {@inheritDoc}
*/
@Override
protected void removeOrgUnit(ACOrgUnit orgUnit) {
try {
getAdminBroker().removeParticipant(projectInfo.getProjectId(), orgUnit.getId());
} catch (final AccessControlException ex) {
MessageDialog.openWarning(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
Messages.ProjectComposite_Insufficient_Access_Rights,
Messages.ProjectComposite_Not_Allowed_To_Remove_Participant_From_Project);
} catch (final ESException ex) {
EMFStoreMessageDialog.showExceptionDialog(ex);
}
getTableViewer().refresh();
}
/**
* {@inheritDoc}
*/
@Override
protected void addExistingOrgUnit(ACOrgUnit participant) {
try {
if (participant != null) {
getAdminBroker().addParticipant(projectInfo.getProjectId(),
participant.getId(),
RolesPackage.eINSTANCE.getReaderRole());
}
} catch (final AccessControlException ex) {
MessageDialog.openWarning(
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
Messages.ProjectComposite_Insufficient_Access_Rights,
Messages.ProjectComposite_Not_Allowed_To_Add_Participant_To_Project);
} catch (final ESException ex) {
EMFStoreMessageDialog.showExceptionDialog(ex);
}
getTableViewer().refresh();
}
/**
* {@inheritDoc}
*/
@Override
protected void addNewOrgUnit() {
try {
final EList<ACOrgUnit> participants = getParticipants();
for (final ACOrgUnit orgUnit : participants) {
getAdminBroker().addParticipant(projectInfo.getProjectId(), orgUnit.getId(),
RolesPackage.eINSTANCE.getReaderRole());
}
} catch (final AccessControlException ex) {
MessageDialog.openWarning(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
Messages.ProjectComposite_Insufficient_Access_Rights,
Messages.ProjectComposite_Not_Allowed_To_Add_Participant_To_Project);
} catch (final ESException ex) {
EMFStoreMessageDialog.showExceptionDialog(ex);
}
getTableViewer().refresh();
}
/**
* This will be used when adding a new participant using add button. 1. show a list of all AcOrgUnits that do not
* participate in this project (get list of all AcOrgUnits, remove those who take part in this Project) 2. return
* the selected participant
*
* @return
*/
private EList<ACOrgUnit> getParticipants() {
final Collection<ACOrgUnit> allOrgUnits = new BasicEList<ACOrgUnit>();
final EList<ACOrgUnit> participants = new BasicEList<ACOrgUnit>();
try {
allOrgUnits.addAll(getAdminBroker().getOrgUnits());
} catch (final AccessControlException ex) {
MessageDialog.openWarning(getShell(),
Messages.ProjectComposite_Insufficient_Access_Rights,
Messages.ProjectComposite_Not_Allowed_To_List_OrgUnits);
} catch (final ESException ex) {
EMFStoreMessageDialog.showExceptionDialog(ex);
}
try {
if (projectInfo != null) {
allOrgUnits.removeAll(getAdminBroker().getParticipants(projectInfo.getProjectId()));
}
final Object[] result = showDialog(allOrgUnits, Messages.ProjectComposite_Select_Participant);
for (int i = 0; i < result.length; i++) {
if (result[i] instanceof ACOrgUnit) {
participants.add((ACOrgUnit) result[i]);
}
}
} catch (final AccessControlException e) {
MessageDialog.openWarning(getShell(),
Messages.ProjectComposite_Insufficient_Access_Rights,
Messages.ProjectComposite_Not_Allowed_To_List_Participants);
} catch (final ESException ex) {
EMFStoreMessageDialog.showExceptionDialog(ex);
}
return participants;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.emfstore.internal.client.ui.dialogs.admin.PropertiesComposite#getTabTitle()
*/
@Override
protected String getTabTitle() {
return Messages.ProjectComposite_Participants;
}
/**
* This adds role column to table viewer. Using role column user can see and change role of a participant.
*
* @param parent parent
*/
@Override
protected void createTableViewer(Composite parent) {
super.createTableViewer(parent);
final PixelConverter pixelConverter = new PixelConverter(this);
final TableViewerColumn roleColumnViewer = new TableViewerColumn(getTableViewer(), SWT.NONE);
roleColumnViewer.getColumn().setText(Messages.ProjectComposite_Role);
roleColumnViewer.getColumn().setWidth(pixelConverter.convertHorizontalDLUsToPixels(120));
roleColumnViewer.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
final ACOrgUnit orgUnit = (ACOrgUnit) element;
final int roleIndex = getCurrentRoleIndex(orgUnit);
return roleNames[roleIndex];
}
});
roleColumnViewer.setEditingSupport(new RoleEditingSupport(getTableViewer()));
}
/**
* {@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.ProjectComposite_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);
}
/**
* This changes the role of an OrgUnit for current project. This will be called form RoleEditinSupport.setValue().
*
* @param orgUnit orgUnit
* @param role new role
*/
public void changeRole(ACOrgUnit orgUnit, int role) {
try {
switch (role) {
case READER_ROLE:
getAdminBroker().changeRole(projectInfo.getProjectId(), orgUnit.getId(),
RolesPackage.eINSTANCE.getReaderRole());
break;
case WRITER_ROLE:
getAdminBroker().changeRole(projectInfo.getProjectId(), orgUnit.getId(),
RolesPackage.eINSTANCE.getWriterRole());
break;
case PROJECT_ADMIN_ROLE:
getAdminBroker().changeRole(projectInfo.getProjectId(), orgUnit.getId(),
RolesPackage.eINSTANCE.getProjectAdminRole());
break;
case SERVER_ADMIN_ROLE:
getAdminBroker().changeRole(projectInfo.getProjectId(), orgUnit.getId(),
RolesPackage.eINSTANCE.getServerAdmin());
break;
default:
break;
}
} catch (final AccessControlException ex) {
MessageDialog.openWarning(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
Messages.ProjectComposite_Insufficient_Access_Rights,
Messages.ProjectComposite_Not_Allowed_To_Change_Role_Of_OrgUnit);
} catch (final ESException ex) {
EMFStoreMessageDialog.showExceptionDialog(ex);
}
getTableViewer().refresh();
}
/**
* {@inheritDoc}
*/
@Override
protected void createSimpleAttributes() {
super.createSimpleAttributes();
getTxtName().setEnabled(false);
getTxtDescription().setEnabled(false);
lblVersion = new Label(getAttributesGroup(), SWT.NONE);
lblVersion.setText(Messages.ProjectComposite_Version);
txtVersion = new Text(getAttributesGroup(), SWT.BORDER);
txtVersion.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
txtVersion.setEnabled(false);
}
/**
* {@inheritDoc}
*
* @param input
* must be a {@link ProjectInfo} instance
*/
@Override
public void updateControls(EObject input) {
if (input instanceof ProjectInfo) {
projectInfo = (ProjectInfo) input;
getTxtName().setText(projectInfo.getName());
getTxtDescription().setText(projectInfo.getDescription());
txtVersion.setText(String.valueOf(projectInfo.getVersion().getIdentifier()));
getTableViewer().setInput(projectInfo);
}
}
/**
* This returns an integer representing the actual role of an OrgUnit.
*
* @param orgUnit orgUnit
* @return integer
*/
public int getCurrentRoleIndex(ACOrgUnit orgUnit) {
int result = 0;
Role role;
try {
role = getAdminBroker().getRole(projectInfo.getProjectId(), orgUnit.getId());
if (role.eClass().equals(RolesPackage.eINSTANCE.getReaderRole())) {
result = READER_ROLE;
} else if (role.eClass().equals(RolesPackage.eINSTANCE.getWriterRole())) {
result = WRITER_ROLE;
} else if (role.eClass().equals(RolesPackage.eINSTANCE.getProjectAdminRole())) {
result = PROJECT_ADMIN_ROLE;
} else if (role.eClass().equals(RolesPackage.eINSTANCE.getServerAdmin())) {
result = SERVER_ADMIN_ROLE;
}
} catch (final AccessControlException ex) {
MessageDialog.openWarning(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
Messages.ProjectComposite_Insufficient_Access_Rights,
Messages.ProjectComposite_Not_Allowed_To_Get_Role_Of_OrgUnit);
} catch (final ESException ex) {
EMFStoreMessageDialog.showExceptionDialog(ex);
}
return result;
}
/**
* This class provides editing support for Role column in TableViewer. It uses a ComboBoxCellEditor.
*
* @author Hodaie
*/
private class RoleEditingSupport extends EditingSupport {
private final ComboBoxCellEditor cellEditor;
public RoleEditingSupport(ColumnViewer viewer) {
super(viewer);
cellEditor = new ComboBoxCellEditor(getTableViewer().getTable(), roleNames, SWT.READ_ONLY);
}
@Override
protected boolean canEdit(Object element) {
return true;
}
@Override
protected CellEditor getCellEditor(Object element) {
return cellEditor;
}
@Override
protected Object getValue(Object element) {
return getCurrentRoleIndex((ACOrgUnit) element);
}
@Override
protected void setValue(Object element, Object value) {
changeRole((ACOrgUnit) element, ((Integer) value).intValue());
}
}
}// ProjectComposite