package com.xtremelabs.robolectric.shadows;

import com.xtremelabs.robolectric.internal.Implementation;
import com.xtremelabs.robolectric.internal.Implements;

import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AutoCompleteTextView;
import android.widget.Filterable;
import android.widget.ListAdapter;

/**
 * A shadow for AutoCompleteTextView
 */
@Implements(AutoCompleteTextView.class)
public class ShadowAutoCompleteTextView extends ShadowEditText {

    private ListAdapter adapter;
    private int threshold = 2;
    private OnItemClickListener onItemClickListener;

    @Implementation
    public ListAdapter getAdapter() {
        return adapter;
    }

    @Implementation
    public <T extends ListAdapter & Filterable> void setAdapter(T adapter) {
        this.adapter = adapter;
    }

    @Implementation
    public int getThreshold() {
        return threshold;
    }

    @Implementation
    public void setThreshold(int threshold) {
        if (threshold <= 0) {
            threshold = 1;
        }
        this.threshold = threshold;
    }

    @Implementation
    public AdapterView.OnItemClickListener getOnItemClickListener() {
        return onItemClickListener;
    }

    @Implementation
    public void setOnItemClickListener(AdapterView.OnItemClickListener onItemClickListener) {
        this.onItemClickListener = onItemClickListener;
    }

    @Implementation
    public void replaceText(CharSequence text) {
        setText(text);
        setSelection(getText().length());
    }
}
