/**
* <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.List;
import org.eclipse.core.runtime.IAdapterFactory;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
import org.eclipse.emf.edit.provider.IItemPropertySource;
import org.eclipse.emf.edit.provider.ItemPropertyDescriptor.PropertyValueWrapper;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
import org.eclipse.emf.edit.ui.provider.PropertyDescriptor;
import org.eclipse.emf.edit.ui.provider.PropertySource;
import org.eclipse.emf.emfstore.server.model.accesscontrol.ACOrgUnit;
import org.eclipse.emf.emfstore.server.model.accesscontrol.AccesscontrolPackage;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.DialogCellEditor;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.views.properties.IPropertyDescriptor;
import org.eclipse.ui.views.properties.IPropertySource;
/**
* @author boehlke
*
*/
public class PropertySourceAdapterFactory implements IAdapterFactory {
private class CustomPropertyDescriptor extends PropertyDescriptor {
private UserUiController controller;
public CustomPropertyDescriptor(ACOrgUnit object, IItemPropertyDescriptor itemPropertyDescriptor) {
super(object, itemPropertyDescriptor);
this.controller = UserUiController.getInstance();
}
@Override
public CellEditor createPropertyEditor(Composite composite) {
return new DialogCellEditor(composite) {
@Override
protected Object openDialogBox(Control cellEditorWindow) {
return null;
}
};
}
}
private class CustomPropertySource extends PropertySource {
public CustomPropertySource(Object object, IItemPropertySource itemPropertySource) {
super(object, itemPropertySource);
}
@Override
protected IPropertyDescriptor createPropertyDescriptor(IItemPropertyDescriptor itemPropertyDescriptor) {
Object object = getEditableValue();
if (itemPropertyDescriptor.getFeature(object) == AccesscontrolPackage.eINSTANCE.getACOrgUnit_Roles()) {
return new CustomPropertyDescriptor((ACOrgUnit) object, itemPropertyDescriptor);
}
return super.createPropertyDescriptor(itemPropertyDescriptor);
}
}
private class CustomAdapterFactoryContentProvider extends AdapterFactoryContentProvider {
public CustomAdapterFactoryContentProvider(AdapterFactory adapterFactory) {
super(adapterFactory);
}
@Override
protected IPropertySource createPropertySource(Object object, IItemPropertySource itemPropertySource) {
if (object instanceof ACOrgUnit) {
return new CustomPropertySource(object, itemPropertySource);
}
return super.createPropertySource(object, itemPropertySource);
}
}
/**
* {@inheritDoc}
*
* @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object, java.lang.Class)
*/
public Object getAdapter(Object adaptableObject, Class adapterType) {
if (adaptableObject instanceof EObject && adapterType == IPropertySource.class) {
EObject eObject = (EObject) adaptableObject;
AdapterFactory adapterFactory = new ComposedAdapterFactory(
ComposedAdapterFactory.Descriptor.Registry.INSTANCE);
final AdapterFactoryContentProvider contentProvider = new CustomAdapterFactoryContentProvider(
adapterFactory);
return new UnwrappingPropertySource(contentProvider.getPropertySource(adaptableObject));
}
return null;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()
*/
public Class[] getAdapterList() {
return new Class[] { IPropertySource.class };
}
/**
* A property source which unwraps values that are wrapped in an EMF {@link PropertyValueWrapper}
*
* @author vainolo
*
*/
public class UnwrappingPropertySource implements IPropertySource {
private IPropertySource source;
public UnwrappingPropertySource(final IPropertySource source) {
this.source = source;
}
public Object getEditableValue() {
Object value = source.getEditableValue();
if (value instanceof PropertyValueWrapper) {
PropertyValueWrapper wrapper = (PropertyValueWrapper) value;
return wrapper.getEditableValue(null);
} else {
return source.getEditableValue();
}
}
public IPropertyDescriptor[] getPropertyDescriptors() {
List<IPropertyDescriptor> descriptors = new ArrayList<IPropertyDescriptor>();
for (IPropertyDescriptor iPropertyDescriptor : source.getPropertyDescriptors()) {
descriptors.add(new PropertyDescriptorWrapper(iPropertyDescriptor, source.getEditableValue()));
}
return descriptors.toArray(new IPropertyDescriptor[0]);
}
public Object getPropertyValue(Object id) {
Object value = source.getPropertyValue(id);
if (value instanceof PropertyValueWrapper) {
PropertyValueWrapper wrapper = (PropertyValueWrapper) value;
return wrapper.getEditableValue(null);
} else {
return source.getPropertyValue(id);
}
}
public boolean isPropertySet(Object id) {
return source.isPropertySet(id);
}
public void resetPropertyValue(Object id) {
source.resetPropertyValue(id);
}
public void setPropertyValue(Object id, Object value) {
source.setPropertyValue(id, value);
}
}
/**
* if the property is not editable by the user, returns no property editor
*
* @author boehlke
*
*/
private static class PropertyDescriptorWrapper implements IPropertyDescriptor {
private IPropertyDescriptor descriptor;
private UserUiController controller;
private Object object;
public PropertyDescriptorWrapper(IPropertyDescriptor iPropertyDescriptor, Object object) {
this.descriptor = iPropertyDescriptor;
this.controller = UserUiController.getInstance();
this.object = object;
}
public CellEditor createPropertyEditor(Composite parent) {
if (controller.canChangeOrgUnit((ACOrgUnit) this.object)) {
return descriptor.createPropertyEditor(parent);
}
return null;
}
public String getCategory() {
return descriptor.getCategory();
}
public String getDescription() {
return descriptor.getDescription();
}
public String getDisplayName() {
return descriptor.getDisplayName();
}
public String[] getFilterFlags() {
return descriptor.getFilterFlags();
}
public Object getHelpContextIds() {
return descriptor.getHelpContextIds();
}
public Object getId() {
return descriptor.getId();
}
public ILabelProvider getLabelProvider() {
return descriptor.getLabelProvider();
}
public boolean isCompatibleWith(IPropertyDescriptor anotherProperty) {
return descriptor.isCompatibleWith(anotherProperty);
}
}
}