package org.itsnat.droid.impl.xmlinflater.layout.attr.widget; import android.graphics.drawable.Drawable; import android.view.View; import android.widget.TextView; import org.itsnat.droid.impl.dom.DOMAttr; import org.itsnat.droid.impl.xmlinflater.FieldContainer; import org.itsnat.droid.impl.xmlinflater.MethodContainer; import org.itsnat.droid.impl.xmlinflater.layout.AttrLayoutContext; import org.itsnat.droid.impl.xmlinflater.layout.classtree.ClassDescViewBased; import org.itsnat.droid.impl.xmlinflater.shared.attr.AttrDesc; import java.util.HashMap; import java.util.Map; /** * Created by jmarranz on 30/04/14. */ public class AttrDescView_widget_TextView_drawable_relative_NOFUNCIONA extends AttrDesc<ClassDescViewBased,View,AttrLayoutContext> { /* EL LEVEL 16 DA MUCHOS PROBLEMAS PARA IMPLEMENTAR drawableStart y drawableEnd (visibilidad de métodos etc), to_do apunta a que to_do está en orden level 17 */ private static Map<String,Integer> drawableMap = new HashMap<String,Integer>( 2 ); static { drawableMap.put("drawableStart",0); drawableMap.put("drawableEnd",1); } protected FieldContainer<Object> fieldDrawables; // mDrawables @SuppressWarnings("unchecked") protected FieldContainer<Drawable>[] fieldMemberDrawables = new FieldContainer[2]; protected int fieldMemberDrawablesIndex; protected MethodContainer<Void> methodRelativeDrawablesIfNeeded; @SuppressWarnings("unchecked") public AttrDescView_widget_TextView_drawable_relative_NOFUNCIONA(ClassDescViewBased parent, String name) { super(parent,name); this.fieldDrawables = new FieldContainer<Object>(parent.getDeclaredClass(),"mDrawables"); Class classDrawables = fieldDrawables.getField().getType(); String[] fieldMemberNames = new String[]{"mDrawableStart", "mDrawableEnd"}; this.fieldMemberDrawables = (FieldContainer<Drawable>[])new FieldContainer[fieldMemberNames.length]; for (int i = 0; i < fieldMemberNames.length; i++) { fieldMemberDrawables[i] = new FieldContainer(classDrawables, fieldMemberNames[i]); } methodRelativeDrawablesIfNeeded = new MethodContainer<Void>(classDrawables,"setRelativeDrawablesIfNeeded",new Class[]{Drawable.class,Drawable.class}); } @Override public void setAttribute(final View view, final DOMAttr attr, final AttrLayoutContext attrCtx) { Drawable convValue = getDrawable(attr.getResourceDesc(),attrCtx.getXMLInflaterContext()); Drawable drawableStart = fieldMemberDrawablesIndex == 0 ? convValue : getDrawable(view,0); Drawable drawableEnd = fieldMemberDrawablesIndex == 1 ? convValue : getDrawable(view,1); methodRelativeDrawablesIfNeeded.invoke((TextView)view,drawableStart,drawableEnd); } @Override public void removeAttribute(View view, AttrLayoutContext attrCtx) { setAttributeToRemove(view, "@null", attrCtx); } protected Drawable getDrawable(View view,int index) { Object fieldValue = fieldDrawables.get(view); if (fieldValue == null) return null; // Esto es normal, y es cuando todavía no se ha definido ningún Drawable, setCompoundDrawablesWithIntrinsicBounds lo creará en la primera llamada return fieldMemberDrawables[index].get(fieldValue); } }