package de.hub.emffrag.model.emffrag.provider;
import java.util.Collection;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.common.util.ResourceLocator;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.edit.command.CommandParameter;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.edit.provider.AttributeValueWrapperItemProvider;
import org.eclipse.emf.edit.provider.DelegatingWrapperItemProvider;
import org.eclipse.emf.edit.provider.IItemColorProvider;
import org.eclipse.emf.edit.provider.ItemProviderAdapter;
import org.eclipse.swt.SWT;
import org.eclipse.ui.PlatformUI;
import de.hub.emffrag.fragmentation.FObjectImpl;
import de.hub.emffrag.model.emffrag.Extension;
import de.hub.emffrag.util.Extensions;
public class EmfFragItemProviderAdapter extends ItemProviderAdapter implements IItemColorProvider {
public EmfFragItemProviderAdapter(AdapterFactory adapterFactory) {
super(adapterFactory);
}
@Override
public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object) {
if (childrenFeatures == null) {
super.getChildrenFeatures(object);
if (object instanceof EObject) {
for (EStructuralFeature feature: ((EObject) object).eClass().getEAllStructuralFeatures()) {
if (feature instanceof EAttribute) {
childrenFeatures.add(feature);
}
}
for (EStructuralFeature feature: ((EObject) object).eClass().getEAllStructuralFeatures()) {
if (feature instanceof EReference) {
EReference reference = (EReference) feature;
if (!(reference.isContainment() || reference.isContainer())) {
childrenFeatures.add(feature);
}
}
}
}
}
return childrenFeatures;
}
@Override
public Object getBackground(Object object) {
if (object instanceof FObjectImpl && ((FObjectImpl)object).fInternalObject().isFragmentRoot()) {
return PlatformUI.getWorkbench().getDisplay().getSystemColor(SWT.COLOR_WIDGET_LIGHT_SHADOW);
} else {
return null;
}
}
@Override
protected boolean isWrappingNeeded(Object object) {
if (object instanceof EObject) {
for (EStructuralFeature feature: ((EObject) object).eClass().getEAllStructuralFeatures()) {
if (feature instanceof EReference) {
EReference reference = (EReference) feature;
if (!(reference.isContainment() || reference.isContainer())) {
return true;
}
} else if (feature instanceof EAttribute) {
return true;
}
}
}
return super.isWrappingNeeded(object);
}
@Override
protected Object createWrapper(EObject object, final EStructuralFeature feature, Object value, int index) {
if (!isWrappingNeeded(object))
return value;
if (feature instanceof EReference && !((EReference) feature).isContainment()) {
return new DelegatingWrapperItemProvider(value, object, feature, index, adapterFactory) {
@Override
public String getText(Object object) {
return feature.getName() + ":" + super.getText(object);
}
@Override
public Object getForeground(Object object) {
return PlatformUI.getWorkbench().getDisplay().getSystemColor(SWT.COLOR_DARK_BLUE);
}
};
} else if (feature instanceof EAttribute) {
return new MyAttributeValueWrapperItemProvider(value, object, (EAttribute)feature, index, adapterFactory, getResourceLocator());
} else {
return super.createWrapper(object, feature, value, index);
}
}
private static class MyAttributeValueWrapperItemProvider extends AttributeValueWrapperItemProvider implements
IItemColorProvider {
public MyAttributeValueWrapperItemProvider(Object value, EObject owner, EAttribute attribute, int index,
AdapterFactory adapterFactory, ResourceLocator resourceLocator) {
super(value, owner, attribute, index, adapterFactory, resourceLocator);
}
@Override
public String getText(Object object) {
return feature.getName() + ":" + super.getText(object);
}
@Override
public Object getForeground(Object object) {
return PlatformUI.getWorkbench().getDisplay().getSystemColor(SWT.COLOR_DARK_GREEN);
}
}
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
public Collection<?> getChildren(Object object) {
Collection result = super.getChildren(object);
if (!(object instanceof Extension) && (object instanceof FObjectImpl)) {
for (EObject extension: Extensions.getAll((EObject)object)) {
result.add(extension);
}
}
return result;
}
@Override
protected Command factorRemoveCommand(EditingDomain domain, CommandParameter commandParameter) {
// TODO Auto-generated method stub [task27]
return super.factorRemoveCommand(domain, commandParameter);
}
}