status_t
EnumerationValueHandler::CreateTableCellValueRenderer(IntegerValue* _value,
	IntegerValueFormatter::Config* config,
	TableCellValueRenderer*& _renderer)
{
	EnumerationValue* value = dynamic_cast<EnumerationValue*>(_value);
	if (value != NULL
		&& value->GetType()->ValueFor(value->GetValue()) != NULL) {
		ValueFormatter* formatter = NULL;
		status_t error = GetValueFormatter(value, formatter);
		if (error != B_OK)
			return error;
		BReference<ValueFormatter> formatterReference(formatter,
			true);

		TableCellValueRenderer* renderer
			= new(std::nothrow) TableCellFormattedValueRenderer(formatter);
		if (renderer == NULL)
			return B_NO_MEMORY;

		_renderer = renderer;
		return B_OK;
	}

	return IntegerValueHandler::CreateTableCellValueRenderer(_value, config,
		_renderer);
}
integer_format
EnumerationValueHandler::DefaultIntegerFormat(IntegerValue* _value)
{
	EnumerationValue* value = dynamic_cast<EnumerationValue*>(_value);
	if (value != NULL && value->GetType()->ValueFor(value->GetValue()) != NULL)
		return INTEGER_FORMAT_DEFAULT;

	return IntegerValueHandler::DefaultIntegerFormat(_value);
}
status_t
EnumerationValueHandler::AddIntegerFormatSettingOptions(IntegerValue* _value,
	OptionsSettingImpl* setting)
{
	EnumerationValue* value = dynamic_cast<EnumerationValue*>(_value);
	if (value != NULL
		&& value->GetType()->ValueFor(value->GetValue()) != NULL) {
		status_t error = AddIntegerFormatOption(setting, "name", "Enum Name",
			INTEGER_FORMAT_DEFAULT);
		if (error != B_OK)
			return error;
	}

	return IntegerValueHandler::AddIntegerFormatSettingOptions(_value, setting);
}
float
TableCellEnumerationRenderer::PreferredValueWidth(Value* _value,
	BView* targetView)
{
	Config* config = GetConfig();
	if (config != NULL && config->IntegerFormat() == INTEGER_FORMAT_DEFAULT) {
		EnumerationValue* value = dynamic_cast<EnumerationValue*>(_value);
		if (value == NULL)
			return 0;

		if (EnumeratorValue* enumValue
				= value->GetType()->ValueFor(value->GetValue())) {
			return TableCellValueRendererUtils::PreferredStringWidth(targetView,
				enumValue->Name());
		}
	}

	return TableCellIntegerRenderer::PreferredValueWidth(_value, targetView);
}
void
TableCellEnumerationRenderer::RenderValue(Value* _value, BRect rect,
	BView* targetView)
{
	Config* config = GetConfig();
	if (config != NULL && config->IntegerFormat() == INTEGER_FORMAT_DEFAULT) {
		EnumerationValue* value = dynamic_cast<EnumerationValue*>(_value);
		if (value == NULL)
			return;

		if (EnumeratorValue* enumValue
				= value->GetType()->ValueFor(value->GetValue())) {
			TableCellValueRendererUtils::DrawString(targetView, rect,
				enumValue->Name(), B_ALIGN_RIGHT, true);
			return;
		}
	}

	TableCellIntegerRenderer::RenderValue(_value, rect, targetView);
}
status_t
TableCellEnumerationEditor::ConfigureOptions()
{
    EnumerationValue* initialValue = dynamic_cast<EnumerationValue*>(
                                         InitialValue());
    if (initialValue == NULL)
        return B_BAD_VALUE;

    EnumerationType* type = initialValue->GetType();
    for (int32 i = 0; i < type->CountValues(); i++) {
        EnumeratorValue* value = type->ValueAt(i);
        BString output;

        status_t error = AddOption(value->Name(), value->Value().ToInt32());
        if (error != B_OK)
            return error;
    }

    BVariant integerValue;
    if (!initialValue->ToVariant(integerValue))
        return B_NO_MEMORY;

    return SelectOptionFor(integerValue.ToInt32());
}