⛏️ index : haiku.git

/*
 * Copyright 2015, Rene Gollent, rene@gollent.com.
 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
 * Distributed under the terms of the MIT License.
 */


#include "EnumerationValueHandler.h"

#include <new>

#include "EnumerationValue.h"
#include "EnumerationValueFormatter.h"
#include "TableCellEnumerationEditor.h"
#include "TableCellFormattedValueRenderer.h"
#include "Type.h"


EnumerationValueHandler::EnumerationValueHandler()
{
}


EnumerationValueHandler::~EnumerationValueHandler()
{
}


status_t
EnumerationValueHandler::Init()
{
	return B_OK;
}


float
EnumerationValueHandler::SupportsValue(Value* value)
{
	return dynamic_cast<EnumerationValue*>(value) != NULL ? 0.7f : 0;
}


status_t
EnumerationValueHandler::GetValueFormatter(Value* _value,
	ValueFormatter*& _formatter)
{
	EnumerationValue* value = dynamic_cast<EnumerationValue*>(_value);
	if (value == NULL)
		return B_BAD_VALUE;

	IntegerValueFormatter::Config* config = NULL;
	status_t error = CreateIntegerFormatterConfig(value, config);
	if (error != B_OK)
		return error;
	BReference<IntegerValueFormatter::Config> configReference(config, true);

	ValueFormatter* formatter = NULL;
	error = CreateValueFormatter(config, formatter);
	if (error != B_OK)
		return error;

	_formatter = formatter;

	return B_OK;
}


status_t
EnumerationValueHandler::GetTableCellValueEditor(Value* _value,
	Settings* settings, TableCellValueEditor*& _editor)
{
	EnumerationValue* value = dynamic_cast<EnumerationValue*>(_value);
	if (value == NULL)
		return B_BAD_VALUE;

	IntegerValueFormatter::Config* config = NULL;
	status_t error = CreateIntegerFormatterConfig(value, config);
	if (error != B_OK)
		return error;
	BReference<IntegerValueFormatter::Config> configReference(config, true);

	ValueFormatter* formatter;
	error = CreateValueFormatter(config, formatter);
	if (error != B_OK)
		return error;
	BReference<ValueFormatter> formatterReference(formatter, true);

	TableCellEnumerationEditor* editor = new(std::nothrow)
		TableCellEnumerationEditor(value, formatter);
	if (editor == NULL)
		return B_NO_MEMORY;

	BReference<TableCellEnumerationEditor> editorReference(editor, true);
	error = editor->Init();
	if (error != B_OK)
		return error;

	editorReference.Detach();
	_editor = editor;
	return B_OK;
}


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::CreateValueFormatter(
	IntegerValueFormatter::Config* config, ValueFormatter*& _formatter)
{
	ValueFormatter* formatter = new(std::nothrow) EnumerationValueFormatter(
		config);
	if (formatter == NULL)
		return B_NO_MEMORY;

	_formatter = formatter;
	return B_OK;
}


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);
}


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);
}