package gueei.binding.viewAttributes.textView;
import gueei.binding.Binder;
import gueei.binding.BindingType;
import gueei.binding.ViewAttribute;
import gueei.binding.listeners.TextWatcherMulticast;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
import android.widget.TextView;
/**
* (displayed) Text in Text View
* Note that you should supply IObservable<CharSequence> to it in order to allow two-way binding
* Although it accepts String or other object type, it will simply evaluated as Object.toString()
* but changes in the Text View will not reflect in VM unless IObservable<CharSequence> is supplied
*
* @name text
* @widget TextView
* @type CharSequence
*
* @accepts CharSequence
* @accepts Object
* @category simple
* @related http://developer.android.com/reference/android/widget/TextView.html
*
* @author andy
*/
public class TextViewAttribute extends ViewAttribute<TextView, CharSequence> implements TextWatcher {
private CharSequence mValue = null;
public TextViewAttribute(TextView view, String attributeName) {
super(CharSequence.class, view, attributeName);
if (view instanceof EditText) {
Binder.getMulticastListenerForView(view, TextWatcherMulticast.class).registerWithHighPriority(this);
}
}
@Override
public CharSequence get() {
if(getView()==null) return null;
return cloneCharSequence(getView().getText());
}
private CharSequence cloneCharSequence(CharSequence o) {
return o.subSequence(0, o.length());
}
private boolean compareCharSequence(CharSequence a, CharSequence b) {
boolean result = false;
if (a != null) {
if (b!=null)
result = a.toString().equals(b.toString());
}else{
if (b==null) result = true;
}
return result;
}
@Override
protected void doSetAttributeValue(Object newValue) {
if(getView()==null) return;
synchronized (this) {
CharSequence nVal = "";
if (null != newValue) {
if (newValue instanceof CharSequence) {
nVal = (CharSequence) newValue;
} else {
nVal = newValue.toString();
}
}
if (!compareCharSequence(nVal, mValue)) {
mValue = cloneCharSequence(nVal);
getView().setTextKeepState(cloneCharSequence(nVal));
}
}
}
public void afterTextChanged(Editable arg0) {
}
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
}
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
synchronized (this) {
if (compareCharSequence(mValue, arg0))
return;
mValue = cloneCharSequence(arg0);
this.notifyChanged();
}
}
@Override
protected BindingType AcceptThisTypeAs(Class<?> type) {
if (CharSequence.class.isAssignableFrom(type))
return BindingType.TwoWay;
if (type.isAssignableFrom(CharSequence.class))
return BindingType.TwoWay;
return BindingType.OneWay;
}
}