blob: 93110f40775625083d74c038bfdfdf4c4f1442d3 [file] [log] [blame]
/*
* Copyright (c) 2013, 2015 Eike Stepper (Berlin, Germany) and others.
* 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:
* Christian W. Damus (CEA LIST) - initial API and implementation
*/
package org.eclipse.emf.cdo.security.internal.ui.editor;
import static org.eclipse.emf.cdo.security.internal.ui.util.SecurityUIUtil.getTypeFilter;
import static org.eclipse.emf.cdo.security.internal.ui.util.SecurityUIUtil.getViewerFilter;
import org.eclipse.emf.cdo.eresource.CDOResourceNode;
import org.eclipse.emf.cdo.eresource.EresourcePackage;
import org.eclipse.emf.cdo.security.Access;
import org.eclipse.emf.cdo.security.FilterPermission;
import org.eclipse.emf.cdo.security.PatternStyle;
import org.eclipse.emf.cdo.security.ResourceFilter;
import org.eclipse.emf.cdo.security.Role;
import org.eclipse.emf.cdo.security.SecurityFactory;
import org.eclipse.emf.cdo.security.SecurityPackage;
import org.eclipse.emf.cdo.security.internal.ui.dialogs.FilterTreeSelectionDialog;
import org.eclipse.emf.cdo.security.internal.ui.messages.Messages;
import org.eclipse.emf.cdo.security.internal.ui.util.EditableDialogCellEditor;
import org.eclipse.emf.cdo.security.internal.ui.util.INewObjectConfigurator;
import org.eclipse.emf.cdo.security.internal.ui.util.OneToManyTableBlock;
import org.eclipse.emf.cdo.security.provider.SecurityEditPlugin;
import org.eclipse.emf.cdo.ui.CDOItemProvider;
import org.eclipse.emf.cdo.view.CDOView;
import org.eclipse.net4j.util.ObjectUtil;
import org.eclipse.net4j.util.container.IContainer;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.edit.command.CommandParameter;
import org.eclipse.emf.edit.command.CreateChildCommand;
import org.eclipse.emf.edit.command.SetCommand;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ComboBoxViewerCellEditor;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.forms.widgets.FormToolkit;
import java.util.Collections;
/**
* The details page for {@link Role} master selections. Includes a table
* that provides in-line editing of resource-based permissions.
*
* @author Christian W. Damus (CEA LIST)
*/
public class RoleDetailsPage extends AbstractDetailsPage<Role>
{
public RoleDetailsPage(EditingDomain domain, AdapterFactory adapterFactory)
{
super(Role.class, SecurityPackage.Literals.ROLE, domain, adapterFactory);
}
@Override
protected void createContents(Composite parent, FormToolkit toolkit)
{
super.createContents(parent, toolkit);
text(parent, toolkit, Messages.RoleDetailsPage_0, SecurityPackage.Literals.ROLE__ID);
space(parent, toolkit);
OneToManyTableBlock perms = table(parent, toolkit, Messages.RoleDetailsPage_1, createTableConfiguration());
perms.setNewObjectConfigurator(createNewPermissionConfigurator());
space(parent, toolkit);
oneToMany(parent, toolkit, Messages.RoleDetailsPage_2, SecurityPackage.Literals.ROLE__ASSIGNEES,
SecurityPackage.Literals.GROUP);
oneToMany(parent, toolkit, Messages.RoleDetailsPage_3, SecurityPackage.Literals.ROLE__ASSIGNEES,
SecurityPackage.Literals.USER);
}
protected INewObjectConfigurator createNewPermissionConfigurator()
{
return new INewObjectConfigurator()
{
public Command createConfigureCommand(Object newObject)
{
ResourceFilter filter = SecurityFactory.eINSTANCE.createResourceFilter("/home/${user}", PatternStyle.TREE); //$NON-NLS-1$
Command result = CreateChildCommand.create(getEditingDomain(), newObject,
new CommandParameter(newObject, SecurityPackage.Literals.FILTER_PERMISSION__FILTERS, filter),
Collections.singleton(newObject));
result = result.chain(SetCommand.create(getEditingDomain(), newObject,
SecurityPackage.Literals.PERMISSION__ACCESS, Access.WRITE));
return result;
}
};
}
protected OneToManyTableBlock.ITableConfiguration createTableConfiguration()
{
return new OneToManyTableBlock.TableConfiguration(getManagedForm(), SecurityPackage.Literals.ROLE__PERMISSIONS,
SecurityPackage.Literals.FILTER_PERMISSION)
{
private static final int COL_ACCESS = 0;
private static final int COL_PATTERN_STYLE = 1;
private static final int COL_PATH = 2;
private final String[] columnTitles = { Messages.RoleDetailsPage_5, Messages.RoleDetailsPage_6,
Messages.RoleDetailsPage_7 };
private final CellEditor[] cellEditors = new CellEditor[3];
public String[] getColumnTitles()
{
return columnTitles;
}
public int getColumnWeight(int index)
{
switch (index)
{
case COL_ACCESS:
return 15;
case COL_PATTERN_STYLE:
return 15;
case COL_PATH:
return 70;
default:
throw new IllegalArgumentException("index"); //$NON-NLS-1$
}
}
public int getColumnMinimumSize(int index)
{
switch (index)
{
case COL_ACCESS:
return 30;
case COL_PATTERN_STYLE:
return 30;
case COL_PATH:
return 120;
default:
throw new IllegalArgumentException("index"); //$NON-NLS-1$
}
}
public boolean isColumnResizable(int index)
{
switch (index)
{
case COL_ACCESS:
return false;
case COL_PATTERN_STYLE:
return false;
case COL_PATH:
return true;
default:
throw new IllegalArgumentException("index"); //$NON-NLS-1$
}
}
public CellLabelProvider getLabelProvider(TableViewer viewer, final int columnIndex)
{
return new ColumnLabelProvider()
{
@Override
public String getText(Object element)
{
final FilterPermission perm = (FilterPermission)element;
final ResourceFilter filter = perm.getFilters().isEmpty() ? null : (ResourceFilter)perm.getFilters().get(0);
switch (columnIndex)
{
case COL_ACCESS:
return SecurityEditPlugin.INSTANCE.getString(String.format("_UI_Access_%s_literal", perm.getAccess())); //$NON-NLS-1$
case COL_PATTERN_STYLE:
{
String result = "=="; //$NON-NLS-1$
if (filter != null && filter.getPatternStyle() != null)
{
switch (filter.getPatternStyle())
{
case EXACT:
break;
case TREE:
result = ">="; //$NON-NLS-1$
break;
default:
result = "~="; //$NON-NLS-1$
break;
}
}
return result;
}
case COL_PATH:
return filter == null ? "" : filter.getPath(); //$NON-NLS-1$
default:
throw new IllegalArgumentException("columnIndex"); //$NON-NLS-1$
}
}
};
}
public boolean canEdit(TableViewer viewer, Object element, int columnIndex)
{
return true;
}
public void setValue(TableViewer viewer, Object element, int columnIndex, Object value)
{
final FilterPermission perm = (FilterPermission)element;
final ResourceFilter filter = (ResourceFilter)perm.getFilters().get(0);
switch (columnIndex)
{
case COL_ACCESS:
if (perm.getAccess() != value)
{
execute(SetCommand.create(getEditingDomain(), perm, SecurityPackage.Literals.PERMISSION__ACCESS, value));
viewer.refresh(element);
}
break;
case COL_PATTERN_STYLE:
if (filter.getPatternStyle() != value)
{
execute(SetCommand.create(getEditingDomain(), filter,
SecurityPackage.Literals.RESOURCE_FILTER__PATTERN_STYLE, value));
viewer.refresh(element);
}
break;
case COL_PATH:
if (!ObjectUtil.equals(filter.getPath(), value))
{
execute(
SetCommand.create(getEditingDomain(), filter, SecurityPackage.Literals.RESOURCE_FILTER__PATH, value));
viewer.refresh(element);
}
break;
default:
throw new IllegalArgumentException("columnIndex"); //$NON-NLS-1$
}
}
public Object getValue(TableViewer viewer, Object element, int columnIndex)
{
final FilterPermission perm = (FilterPermission)element;
final ResourceFilter filter = (ResourceFilter)perm.getFilters().get(0);
switch (columnIndex)
{
case COL_ACCESS:
return perm.getAccess();
case COL_PATTERN_STYLE:
return filter.getPatternStyle();
case COL_PATH:
return filter.getPath();
default:
throw new IllegalArgumentException("columnIndex"); //$NON-NLS-1$
}
}
public CellEditor getCellEditor(final TableViewer viewer, int columnIndex)
{
CellEditor result = cellEditors[columnIndex];
if (result == null)
{
result = createCellEditor(viewer, columnIndex);
cellEditors[columnIndex] = result;
}
return result;
}
protected CellEditor createCellEditor(TableViewer viewer, int columnIndex)
{
Composite parent = (Composite)viewer.getControl();
switch (columnIndex)
{
case COL_ACCESS:
{
ComboBoxViewerCellEditor result = new ComboBoxViewerCellEditor(parent, SWT.DROP_DOWN | SWT.READ_ONLY);
result.setLabelProvider(new AdapterFactoryLabelProvider(getAdapterFactory()));
result.setContentProvider(new ArrayContentProvider());
result.setInput(Access.VALUES);
return result;
}
case COL_PATTERN_STYLE:
{
ComboBoxViewerCellEditor result = new ComboBoxViewerCellEditor(parent, SWT.DROP_DOWN | SWT.READ_ONLY);
result.setLabelProvider(new AdapterFactoryLabelProvider(getAdapterFactory()));
result.setContentProvider(new ArrayContentProvider());
result.setInput(PatternStyle.VALUES);
return result;
}
case COL_PATH:
return new EditableDialogCellEditor(parent)
{
@Override
protected Object openDialogBox(Control cellEditorWindow)
{
final CDOView view = getInput().cdoView();
@SuppressWarnings({ "rawtypes", "unchecked" })
CDOItemProvider provider = new CDOItemProvider(null)
{
private boolean connected;
{
// Connect the input now, because the dialog will try to access the content provider before it has
// been set into the tree viewer
connectInput((IContainer)view);
}
@Override
protected void connectInput(IContainer<Object> input)
{
if (!connected)
{
super.connectInput(input);
connected = true;
}
}
@Override
protected void disconnectInput(IContainer<Object> input)
{
if (connected)
{
connected = false;
super.disconnectInput(input);
}
}
};
FilterTreeSelectionDialog dlg = new FilterTreeSelectionDialog(cellEditorWindow.getShell(), provider,
provider);
dlg.setAllowMultiple(false);
dlg.setMessage(Messages.RoleDetailsPage_4);
dlg.setTitle(Messages.RoleDetailsPage_8);
dlg.setDoubleClickSelects(true);
dlg.addFilter(getViewerFilter(getTypeFilter(EresourcePackage.Literals.CDO_RESOURCE_NODE)));
dlg.setBlockOnOpen(true);
String current = (String)getValue();
dlg.setInput(view);
if (current != null && view.hasResource(current))
{
dlg.setInitialSelection(view.getResourceNode(current));
}
String result = null;
if (dlg.open() == Window.OK)
{
CDOResourceNode node = (CDOResourceNode)dlg.getFirstResult();
if (node != null)
{
result = node.getPath();
}
}
return result;
}
};
default:
throw new IllegalArgumentException("columnIndex"); //$NON-NLS-1$
}
}
};
}
}