root/src/kits/debugger/settings/generic/Setting.cpp
/*
 * Copyright 2013-2016, Rene Gollent, rene@gollent.com.
 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
 * Distributed under the terms of the MIT License.
 */


#include "Setting.h"

#include <new>


// #pragma mark - Setting


Setting::~Setting()
{
}


// #pragma mark - BoolSetting


setting_type
BoolSetting::Type() const
{
        return SETTING_TYPE_BOOL;
}


BVariant
BoolSetting::DefaultValue() const
{
        return DefaultBoolValue();
}


// #pragma mark - FloatSetting


setting_type
FloatSetting::Type() const
{
        return SETTING_TYPE_FLOAT;
}


BVariant
FloatSetting::DefaultValue() const
{
        return DefaultFloatValue();
}


// #pragma mark - SettingsOption


SettingsOption::~SettingsOption()
{
}


// #pragma mark - OptionsSetting


setting_type
OptionsSetting::Type() const
{
        return SETTING_TYPE_OPTIONS;
}


BVariant
OptionsSetting::DefaultValue() const
{
        SettingsOption* option = DefaultOption();
        return option != NULL
                ? BVariant(option->ID(), B_VARIANT_DONT_COPY_DATA) : BVariant();
}


// #pragma mark - BoundedSetting


setting_type
BoundedSetting::Type() const
{
        return SETTING_TYPE_BOUNDED;
}


// #pragma mark - RangeSetting


setting_type
RangeSetting::Type() const
{
        return SETTING_TYPE_RANGE;
}


// #pragma mark - RectSetting

setting_type
RectSetting::Type() const
{
        return SETTING_TYPE_RECT;
}


BVariant
RectSetting::DefaultValue() const
{
        return DefaultRectValue();
}


// #pragma mark - StringSetting


setting_type
StringSetting::Type() const
{
        return SETTING_TYPE_STRING;
}


BVariant
StringSetting::DefaultValue() const
{
        return DefaultStringValue().String();
}


// #pragma mark - AbstractSetting


AbstractSetting::AbstractSetting(const BString& id, const BString& name)
        :
        fID(id),
        fName(name)
{
}


const char*
AbstractSetting::ID() const
{
        return fID;
}


const char*
AbstractSetting::Name() const
{
        return fName;
}


// #pragma mark - BoolSettingImpl


BoolSettingImpl::BoolSettingImpl(const BString& id, const BString& name,
        bool defaultValue)
        :
        AbstractSetting(id, name),
        fDefaultValue(defaultValue)
{
}


bool
BoolSettingImpl::DefaultBoolValue() const
{
        return fDefaultValue;
}


// #pragma mark - FloatSettingImpl


FloatSettingImpl::FloatSettingImpl(const BString& id, const BString& name,
        float defaultValue)
        :
        AbstractSetting(id, name),
        fDefaultValue(defaultValue)
{
}


float
FloatSettingImpl::DefaultFloatValue() const
{
        return fDefaultValue;
}


// #pragma mark - OptionsSettingImpl


class OptionsSettingImpl::Option : public SettingsOption {
public:
        Option(const BString& id, const BString& name)
        {
        }

        virtual const char* ID() const
        {
                return fID;
        }

        virtual const char* Name() const
        {
                return fName;
        }

private:
        BString fID;
        BString fName;
};


OptionsSettingImpl::OptionsSettingImpl(const BString& id, const BString& name)
        :
        AbstractSetting(id, name),
        fDefaultOption(NULL)
{
}


OptionsSettingImpl::~OptionsSettingImpl()
{
        SetDefaultOption(NULL);

        for (int32 i = 0; SettingsOption* option = fOptions.ItemAt(i); i++)
                option->ReleaseReference();
}


SettingsOption*
OptionsSettingImpl::DefaultOption() const
{
        return fDefaultOption != NULL ? fDefaultOption : fOptions.ItemAt(0);
}


int32
OptionsSettingImpl::CountOptions() const
{
        return fOptions.CountItems();
}


SettingsOption*
OptionsSettingImpl::OptionAt(int32 index) const
{
        return fOptions.ItemAt(index);
}


SettingsOption*
OptionsSettingImpl::OptionByID(const char* id) const
{
        for (int32 i = 0; SettingsOption* option = fOptions.ItemAt(i); i++) {
                if (strcmp(option->ID(), id) == 0)
                        return option;
        }

        return NULL;
}


bool
OptionsSettingImpl::AddOption(SettingsOption* option)
{
        if (!fOptions.AddItem(option))
                return false;

        option->AcquireReference();
        return true;
}


bool
OptionsSettingImpl::AddOption(const BString& id, const BString& name)
{
        Option* option = new(std::nothrow) Option(id, name);
        if (option == NULL)
                return false;
        BReference<Option> optionReference(option, true);

        return AddOption(option);
}


void
OptionsSettingImpl::SetDefaultOption(SettingsOption* option)
{
        if (option == fDefaultOption)
                return;

        if (fDefaultOption != NULL)
                fDefaultOption->ReleaseReference();

        fDefaultOption = option;

        if (fDefaultOption != NULL)
                fDefaultOption->AcquireReference();
}


// #pragma mark - RangeSettingImpl


BoundedSettingImpl::BoundedSettingImpl(const BString& id, const BString& name,
        const BVariant& lowerBound, const BVariant& upperBound,
        const BVariant& defaultValue)
        :
        AbstractSetting(id, name),
        fLowerBound(lowerBound),
        fUpperBound(upperBound),
        fDefaultValue(defaultValue)
{
}


BVariant
BoundedSettingImpl::DefaultValue() const
{
        return fDefaultValue;
}


BVariant
BoundedSettingImpl::LowerBound() const
{
        return fLowerBound;
}


BVariant
BoundedSettingImpl::UpperBound() const
{
        return fUpperBound;
}


// #pragma mark - RangeSettingImpl


RangeSettingImpl::RangeSettingImpl(const BString& id, const BString& name,
        const BVariant& lowerBound, const BVariant& upperBound,
        const BVariant& lowerValue, const BVariant& upperValue)
        :
        AbstractSetting(id, name),
        fLowerBound(lowerBound),
        fUpperBound(upperBound),
        fLowerValue(lowerValue),
        fUpperValue(upperValue)
{
}


BVariant
RangeSettingImpl::DefaultValue() const
{
        // this one doesn't really make sense for RangeSetting since it
        // describes a pair of values, which BVariant can't readily
        // represent.
        return BVariant();
}


BVariant
RangeSettingImpl::LowerBound() const
{
        return fLowerBound;
}


BVariant
RangeSettingImpl::UpperBound() const
{
        return fUpperBound;
}


BVariant
RangeSettingImpl::LowerValue() const
{
        return fLowerValue;
}


BVariant
RangeSettingImpl::UpperValue() const
{
        return fUpperValue;
}


// #pragma mark - RectSettingImpl


RectSettingImpl::RectSettingImpl(const BString& id, const BString& name,
        const BRect& defaultValue)
        :
        AbstractSetting(id, name),
        fDefaultValue(defaultValue)
{
}


BRect
RectSettingImpl::DefaultRectValue() const
{
        return fDefaultValue;
}


// #pragma mark - StringSettingImpl


StringSettingImpl::StringSettingImpl(const BString& id, const BString& name,
        const BString& defaultValue)
        :
        AbstractSetting(id, name),
        fDefaultValue(defaultValue)
{
}


const BString&
StringSettingImpl::DefaultStringValue() const
{
        return fDefaultValue;
}