blob: 2b58a96e3f0dad36f6deb3124f4a33f3bdd70356 [file] [log] [blame]
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);
}