/*
* Carrot2 project.
*
* Copyright (C) 2002-2016, Dawid Weiss, Stanisław Osiński.
* All rights reserved.
*
* Refer to the full license file "carrot2.LICENSE"
* in the root folder of the repository checkout or at:
* http://www.carrot2.org/carrot2.LICENSE
*/
package org.carrot2.workbench.editors.impl;
import java.util.ArrayList;
import java.util.Map;
import org.apache.commons.lang.ObjectUtils;
import org.carrot2.util.attribute.Required;
import org.carrot2.util.attribute.constraint.*;
import org.carrot2.workbench.editors.AttributeEditorInfo;
/**
* Editor for mapped values (enumerated types and unrestricted strings with enum hints).
*/
public final class EnumEditor extends MappedValueComboEditor
{
/*
*
*/
@SuppressWarnings("unchecked")
@Override
public AttributeEditorInfo init(Map<String,Object> defaultValues)
{
Class<? extends Enum<?>> clazz = (Class<? extends Enum<?>>) descriptor.type;
if (clazz.isEnum())
{
valueRequired = (descriptor.getAnnotation(Required.class) != null);
anyValueAllowed = false;
super.setMappedValues(ValueHintMappingUtils.getValueToFriendlyName(clazz),
new ArrayList<Object>(ValueHintMappingUtils.getValidValuesMap(clazz)
.keySet()));
}
else if (String.class.equals(clazz))
{
final ValueHintEnum hint = descriptor.getAnnotation(ValueHintEnum.class);
if (hint == null)
{
throw new IllegalArgumentException("Editor applicable to Strings with "
+ ValueHintEnum.class.getName() + " annotation: "
+ descriptor);
}
clazz = hint.values();
valueRequired = (descriptor.getAnnotation(Required.class) != null);
anyValueAllowed = true;
super.setMappedValues(ValueHintMappingUtils.getValueToFriendlyName(clazz),
new ArrayList<Object>(ValueHintMappingUtils.getValidValuesMap(clazz)
.keySet()));
}
else
{
throw new IllegalArgumentException("Attribute type not supported: "
+ descriptor);
}
return new AttributeEditorInfo(1, false);
}
/*
*
*/
@Override
public void setValue(Object newValue)
{
if (ObjectUtils.equals(newValue, getValue()))
{
return;
}
final String asString;
if (newValue == null)
{
asString = null;
}
else if (newValue instanceof IValueHintMapping)
{
asString = ((IValueHintMapping) newValue).getAttributeValue();
}
else if (Enum.class.isInstance(newValue))
{
asString = ((Enum<?>) newValue).name();
}
else
{
asString = newValue.toString();
}
super.setValue(asString);
}
}