root/src/apps/debugger/user_interface/gui/value/TableCellEnumerationEditor.cpp
/*
 * Copyright 2015, Rene Gollent, rene@gollent.com.
 * Distributed under the terms of the MIT License.
 */

#include "TableCellEnumerationEditor.h"

#include "EnumerationValue.h"
#include "Type.h"


TableCellEnumerationEditor::TableCellEnumerationEditor(::Value* initialValue,
        ValueFormatter* formatter)
        :
        TableCellOptionPopUpEditor(initialValue, formatter)
{
}


TableCellEnumerationEditor::~TableCellEnumerationEditor()
{
}


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;

        SelectOptionFor(integerValue.ToInt32());

        return B_OK;
}


status_t
TableCellEnumerationEditor::GetSelectedValue(::Value*& _value) const
{
        EnumerationValue* initialValue = dynamic_cast<EnumerationValue*>(
                InitialValue());
        EnumerationType* type = initialValue->GetType();
        const char* name = NULL;
        int32 selectedValue = 0;
        SelectedOption(&name, &selectedValue);

        EnumerationValue* value = new(std::nothrow) EnumerationValue(type,
                BVariant(selectedValue));
        if (value == NULL)
                return B_NO_MEMORY;

        _value = value;
        return B_OK;
}