package org.eclipse.gmf.tooling.runtime.parsers; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.emf.common.notify.AdapterFactory; import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.gmf.tooling.runtime.GMFToolingRuntimePlugin; import org.eclipse.gmf.tooling.runtime.ocl.tracker.HasOclTracker; import org.eclipse.gmf.tooling.runtime.ocl.tracker.OclTracker; import org.eclipse.gmf.tooling.runtime.ocl.tracker.OclTrackerFactory; public class OclTrackerChoiceParser extends OclChoiceParser implements HasOclTracker { private final OclTrackerWrapper myLabelDelegate; public OclTrackerChoiceParser(EStructuralFeature feature, String itemsExpression, String showExpression, AdapterFactory adapterFactory) { this(feature, itemsExpression, showExpression, adapterFactory, GMFToolingRuntimePlugin.getInstance().getOclTrackerFactory()); } public OclTrackerChoiceParser(EStructuralFeature feature, String itemsExpression, String showExpression, AdapterFactory adapterFactory, OclTrackerFactory.Type factoryType) { this(feature, itemsExpression, showExpression, adapterFactory, GMFToolingRuntimePlugin.getInstance().getOclTrackerFactory(factoryType)); } public OclTrackerChoiceParser(EStructuralFeature feature, String itemsExpression, String showExpression, AdapterFactory itemProvidersAdapterFactory, OclTrackerFactory oclTrackerFactory) { super(feature, itemsExpression, showExpression, itemProvidersAdapterFactory); EClassifier featureType = feature.getEType(); String typeName = (feature instanceof EReference) ? featureType.getName() : featureType.getInstanceClass().getSimpleName(); final String labelOclExpressionText = "let _item : " + typeName + " = self." + feature.getName() + " in " + showExpression; myLabelDelegate = new OclTrackerWrapper(oclTrackerFactory) { @Override protected String getExpressionBody() { return labelOclExpressionText; } }; } @Override public String getEditString(IAdaptable adapter, int flags) { EObject element = (EObject) adapter.getAdapter(EObject.class); if (element != null && !getFeature().getEContainingClass().isInstance(element)) { return ""; // occurs on node deletion } myLabelDelegate.getUpdatedString(adapter, flags); return super.getEditString(adapter, flags); } public OclTracker getOclTracker() { return myLabelDelegate.getOclTracker(); } @Override public boolean isAffectingEvent(Object event, int flags) { return myLabelDelegate.isAffectingEvent(event, flags) || super.isAffectingEvent(event, flags); } }