/*
   EditTextPreference to store/load integer values

   Copyright 2013 Thincast Technologies GmbH, Author: Martin Fleisz

   This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. 
   If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/

package com.freerdp.freerdpcore.utils;

import android.content.Context;
import android.content.res.TypedArray;
import android.preference.EditTextPreference;
import android.util.AttributeSet;

import com.freerdp.freerdpcore.R;

public class IntEditTextPreference extends EditTextPreference {

    private int bounds_min, bounds_max, bounds_default;

    public IntEditTextPreference(Context context) {
        super(context);
        init(context, null);
    }

    public IntEditTextPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs);
    }

    public IntEditTextPreference(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context, attrs);
    }

    private void init(Context context, AttributeSet attrs) {
        if (attrs != null) {
            TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.IntEditTextPreference, 0, 0);
            bounds_min = array.getInt(R.styleable.IntEditTextPreference_bounds_min, Integer.MIN_VALUE);
            bounds_max = array.getInt(R.styleable.IntEditTextPreference_bounds_max, Integer.MAX_VALUE);
            bounds_default = array.getInt(R.styleable.IntEditTextPreference_bounds_default, 0);
            array.recycle();
        } else {
            bounds_min = Integer.MIN_VALUE;
            bounds_max = Integer.MAX_VALUE;
            bounds_default = 0;
        }
    }

    public void setBounds(int min, int max, int defaultValue) {
        bounds_min = min;
        bounds_max = max;
        bounds_default = defaultValue;
    }

    @Override
    protected String getPersistedString(String defaultReturnValue) {
        int value = getPersistedInt(-1);
        if (value > bounds_max || value < bounds_min)
            value = bounds_default;
        return String.valueOf(value);
    }

    @Override
    protected boolean persistString(String value) {
        return persistInt(Integer.valueOf(value));
    }

    @Override
    protected void onDialogClosed(boolean positiveResult) {
        if (positiveResult) {
            // prevent exception when an empty value is persisted
            if (getEditText().getText().length() == 0)
                getEditText().setText("0");

            // check bounds
            int value = Integer.valueOf(getEditText().getText().toString());
            if (value > bounds_max || value < bounds_min)
                value = bounds_default;
            getEditText().setText(String.valueOf(value));
        }

        super.onDialogClosed(positiveResult);
    }
}
