package org.eclipse.emf.emfstore.client.ui.views.users;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.emfstore.client.model.util.EmfStoreInterface;
import org.eclipse.emf.emfstore.server.model.ModelFactory;
import org.eclipse.emf.emfstore.server.model.ProjectId;
import org.eclipse.emf.emfstore.server.model.ProjectInfo;
import org.eclipse.emf.emfstore.server.model.accesscontrol.ACUser;
import org.eclipse.emf.emfstore.server.model.accesscontrol.AccesscontrolFactory;
import org.eclipse.emf.emfstore.server.model.accesscontrol.PermissionSet;
import org.eclipse.emf.emfstore.server.model.accesscontrol.Role;
import org.eclipse.emf.emfstore.server.model.accesscontrol.RoleAssignment;
import org.eclipse.jface.viewers.ColumnLabelProvider;
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.jface.viewers.ViewerComparator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.dialogs.CheckedTreeSelectionDialog;
import org.eclipse.ui.model.WorkbenchLabelProvider;
public class UserRoleEditComposite extends Composite {
private ACUser userData;
private Table table;
private TableViewer tableViewer;
private Map<String, Role> roleMap = new HashMap<String, Role>();
private Map<String, ProjectInfo> projectInfoMap = new HashMap<String, ProjectInfo>();
private MyViewerComparator comparator;
private Composite rolesComposite;
private EmfStoreInterface adminBroker;
private PermissionSet permissionSet;
public class MyViewerComparator extends ViewerComparator {
private int propertyIndex;
private static final int DESCENDING = 1;
private int direction = DESCENDING;
public MyViewerComparator() {
this.propertyIndex = 0;
direction = DESCENDING;
}
public int getDirection() {
return direction == 1 ? SWT.DOWN : SWT.UP;
}
public void setColumn(int column) {
if (column == this.propertyIndex) {
// Same column as last sort; toggle the direction
direction = 1 - direction;
} else {
// New column; do an ascending sort
this.propertyIndex = column;
direction = DESCENDING;
}
}
@Override
public int compare(Viewer viewer, Object e1, Object e2) {
RoleAssignment RoleAssignment1 = (RoleAssignment) e1;
RoleAssignment RoleAssignment2 = (RoleAssignment) e2;
int rc = 0;
Role role1 = RoleAssignment1.getRole();
Role role2 = RoleAssignment2.getRole();
ProjectInfo info1 = projectInfoMap.get(RoleAssignment1.getProjectId());
ProjectInfo info2 = projectInfoMap.get(RoleAssignment2.getProjectId());
switch (propertyIndex) {
case 0:
rc = role1.getName().compareTo(role2.getName());
break;
case 1:
rc = 0;
break;
case 2:
String name1 = info1 == null ? "" : info1.getName();
String name2 = info2 == null ? "" : info2.getName();
rc = name1.compareTo(name2);
break;
default:
rc = 0;
}
// If descending order, flip the direction
if (direction == DESCENDING) {
rc = -rc;
}
return rc;
}
}
/**
* Create the composite.
*
* @param parent
* @param style
* @param dummyAdminBroker
* @param projectInfoMap2
* @param roleMap2
*/
public UserRoleEditComposite(final Composite parent, int style, ACUser user, final PermissionSet permissionSet,
final Map<String, ProjectInfo> projectInfoMap, final EmfStoreInterface adminBroker) {
super(parent, style);
this.userData = user;
this.adminBroker = adminBroker;
this.permissionSet = permissionSet;
this.projectInfoMap = projectInfoMap;
for (Role role : permissionSet.getRoles()) {
roleMap.put(role.getIdentifier(), role);
}
setLayout(new FillLayout(SWT.HORIZONTAL));
Composite rolesComposite = new Composite(parent, SWT.NONE);
// Registry registry = ComposedAdapterFactory.Descriptor.Registry.INSTANCE;
rolesComposite.setLayout(new GridLayout(1, false));
Button addRoleButton = new Button(rolesComposite, SWT.NONE);
addRoleButton.setText("Rollen zuordnen");
addRoleButton.addMouseListener(new MouseListener() {
public void mouseUp(MouseEvent e) {
}
public void mouseDown(MouseEvent e) {
CheckedTreeSelectionDialog checkedTreeSelectionDialog = new CheckedTreeRoleSelectionDialog(getShell(),
UserUiController.getInstance());
checkedTreeSelectionDialog.setInput(userData.getRoles());
checkedTreeSelectionDialog.open();
Object[] result = checkedTreeSelectionDialog.getResult();
if (result == null) {
return;
}
List<RoleAssignment> added = new ArrayList<RoleAssignment>();
Set<RoleAssignment> removed = new HashSet<RoleAssignment>();
removed.addAll(userData.getRoles());
RESULT: for (Object object : result) {
RoleSelection sel = (RoleSelection) object;
if (sel.getRole() == null) {
continue;
}
String projectId = null;
if (sel.getProject() != null) {
projectId = sel.getProject().getProjectId().getId();
}
for (RoleAssignment assignmentData : userData.getRoles()) {
ProjectId projectId2 = assignmentData.getProjectId();
if (projectId2 != null && projectId2.equals(projectId)
&& assignmentData.getRole().equals(sel.getRole())) {
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);
newAssignment.setProjectId(id);
}
newAssignment.setRole(sel.getRole());
added.add(newAssignment);
}
for (RoleAssignment RoleAssignment : added) {
userData.getRoles().add(RoleAssignment);
}
for (RoleAssignment roleAssignment : removed) {
userData.getRoles().remove(roleAssignment);
}
tableViewer.refresh();
}
public void mouseDoubleClick(MouseEvent e) {
}
});
this.rolesComposite = rolesComposite;
Composite tabComposite = new Composite(rolesComposite, SWT.NONE);
GridData gd_tabComposite = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
gd_tabComposite.heightHint = 300;
gd_tabComposite.minimumHeight = 200;
tabComposite.setLayoutData(gd_tabComposite);
tabComposite.setLayout(new FillLayout(SWT.VERTICAL));
tableViewer = new TableViewer(tabComposite, SWT.BORDER | SWT.FULL_SELECTION);
table = tableViewer.getTable();
table.setHeaderVisible(true);
table.setLinesVisible(true);
this.comparator = new MyViewerComparator();
tableViewer.setLabelProvider(new WorkbenchLabelProvider());
tableViewer.setContentProvider(new IStructuredContentProvider() {
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
viewer.refresh();
}
public void dispose() {
}
public Object[] getElements(Object inputElement) {
EList<RoleAssignment> roles = (EList<RoleAssignment>) inputElement;
return roles.toArray();
}
});
createColumns(tabComposite, tableViewer);
// table.getColumn(3).pack();
tableViewer.setInput(userData.getRoles());
tableViewer.setComparator(comparator);
}
private Role getRole(String roleId) {
return roleMap.get(roleId);
}
private String getRoleName(String roleId) {
Role role = getRole(roleId);
return role.getName();
}
private void createColumns(final Composite parent, final TableViewer viewer) {
String[] titles = { "Rolle", "Rollentyp", "Projekt" };
int[] bounds = { 200, 200, 250 };
TableViewerColumn nameColumn = createTableViewerColumn(titles[0], bounds[0], 0, viewer, true);
nameColumn.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
RoleAssignment assignment = (RoleAssignment) element;
return getRoleName(assignment.getRole().getIdentifier());
}
});
TableViewerColumn typeColumn = createTableViewerColumn(titles[1], bounds[1], 1, viewer, true);
typeColumn.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
RoleAssignment assignment = (RoleAssignment) element;
String type = assignment.getRole().isSystemRole() ? "Systemrolle" : "Projektrolle";
return type;
}
});
TableViewerColumn detailsColumn = createTableViewerColumn(titles[2], bounds[2], 2, viewer, true);
detailsColumn.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
RoleAssignment assignment = (RoleAssignment) element;
String projectId = assignment.getProjectId().getId();
if (!projectId.equals("")) {
ProjectInfo info = projectInfoMap.get(projectId);
return info.getName();
}
return "";
}
});
}
private SelectionAdapter getSelectionAdapter(final TableColumn column, final int index) {
SelectionAdapter selectionAdapter = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
comparator.setColumn(index);
int dir = comparator.getDirection();
tableViewer.getTable().setSortDirection(dir);
tableViewer.refresh();
}
};
return selectionAdapter;
}
protected String paramNameToString(String key) {
if (key.equals("projectId")) {
return "Projekt";
}
return "";
}
private static String join(Iterable<? extends Object> pColl, String separator) {
Iterator<? extends Object> oIter;
if (pColl == null || (!(oIter = pColl.iterator()).hasNext()))
return "";
StringBuilder oBuilder = new StringBuilder(String.valueOf(oIter.next()));
while (oIter.hasNext())
oBuilder.append(separator).append(oIter.next());
return oBuilder.toString();
}
private TableViewerColumn createTableViewerColumn(String title, int bound, final int colNumber,
final TableViewer viewer, boolean sortable) {
final TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.NONE);
final TableColumn column = viewerColumn.getColumn();
column.setText(title);
column.setWidth(bound);
column.setResizable(true);
column.setMoveable(true);
if (sortable) {
column.addSelectionListener(getSelectionAdapter(column, colNumber));
}
return viewerColumn;
}
@Override
protected void checkSubclass() {
// Disable the check that prevents subclassing of SWT components
}
public void setUser(ACUser user) {
this.userData = user;
tableViewer.setInput(user.getRoles());
}
}