package org.eclipse.gmf.tooling.runtime.parsers; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.gmf.runtime.common.core.command.ICommand; import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus; import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus; import org.eclipse.gmf.tooling.runtime.GMFToolingRuntimePlugin; import org.eclipse.gmf.tooling.runtime.directedit.ComboDirectEditManager; public abstract class ChoiceParserBase extends AbstractFeatureParser implements ComboDirectEditManager.IChoiceParser { private static final int SINGLE_FEATURE_INDEX = 0; public ChoiceParserBase(EStructuralFeature feature) { super(new EStructuralFeature[] { feature }); } protected final EStructuralFeature getFeature() { return getEditableFeatures()[SINGLE_FEATURE_INDEX]; } public String getEditString(IAdaptable adapter, int flags) { EObject element = (EObject) adapter.getAdapter(EObject.class); return getEditChoice(element, getEditableValues(element)[SINGLE_FEATURE_INDEX]); } public IParserEditStatus isValidEditString(IAdaptable adapter, String editString) { if (getEditChoices(adapter).contains(editString)) { return ParserEditStatus.EDITABLE_STATUS; } return new ParserEditStatus(GMFToolingRuntimePlugin.ID, IParserEditStatus.UNEDITABLE, editString); } public ICommand getParseCommand(IAdaptable adapter, String newString, int flags) { EObject element = (EObject) adapter.getAdapter(EObject.class); return getParseCommand(adapter, new Object[] { findItem(element, newString) }, flags); } public String getPrintString(IAdaptable adapter, int flags) { return getEditString(adapter, flags); } public List<String> getEditChoices(IAdaptable adapter) { EObject element = (EObject) adapter.getAdapter(EObject.class); List<String> result = new ArrayList<String>(); for (Object item : getItems(element)) { result.add(getEditChoice(element, item)); } return result; } private Object findItem(EObject element, String editChoice) { for (Object item : getItems(element)) { if (editChoice.equals(getEditChoice(element, item))) { return item; } } return null; } protected abstract Collection<Object> getItems(EObject element); protected abstract String getEditChoice(EObject element, Object item); }