package org.itsnat.droid.impl.xmlinflater.drawable.classtree;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.DrawableContainer;
import android.graphics.drawable.StateListDrawable;
import org.itsnat.droid.impl.dom.drawable.DOMElemDrawable;
import org.itsnat.droid.impl.xmlinflated.drawable.ElementDrawableChildBase;
import org.itsnat.droid.impl.xmlinflated.drawable.ElementDrawableChildRoot;
import org.itsnat.droid.impl.xmlinflated.drawable.StateListDrawableChildItem;
import org.itsnat.droid.impl.xmlinflater.MethodContainer;
import org.itsnat.droid.impl.xmlinflater.drawable.AttrDrawableContext;
import org.itsnat.droid.impl.xmlinflater.drawable.ClassDescDrawableMgr;
import org.itsnat.droid.impl.xmlinflater.drawable.XMLInflaterDrawable;
import java.util.ArrayList;
import java.util.Map;
/**
* Created by jmarranz on 10/11/14.
*/
public class ClassDescStateListDrawable extends ClassDescElementDrawableContainerBased<StateListDrawable>
{
protected MethodContainer<DrawableContainer.DrawableContainerState> methodGetStateListState;
protected MethodContainer<Void> methodGetStateListStateIsConstantSize;
public ClassDescStateListDrawable(ClassDescDrawableMgr classMgr, ClassDescElementDrawableContainer parent)
{
super(classMgr, "selector", parent);
this.methodGetStateListState = new MethodContainer<DrawableContainer.DrawableContainerState>(StateListDrawable.class,"getStateListState");
this.methodGetStateListStateIsConstantSize =
new MethodContainer<Void>(DrawableContainer.class.getName() + "$DrawableContainerState","setConstantSize",boolean.class);
}
@Override
public ElementDrawableChildRoot createElementDrawableChildRoot(DOMElemDrawable rootElem, AttrDrawableContext attrCtx)
{
ElementDrawableChildRoot elementDrawableRoot = new ElementDrawableChildRoot();
XMLInflaterDrawable xmlInflaterDrawable = attrCtx.getXMLInflaterDrawable();
xmlInflaterDrawable.processChildElements(rootElem,elementDrawableRoot,attrCtx);
ArrayList<ElementDrawableChildBase> itemList = elementDrawableRoot.getElementDrawableChildList();
StateListDrawable drawable = new StateListDrawable();
for(int i = 0; i < itemList.size(); i++)
{
StateListDrawableChildItem item = (StateListDrawableChildItem)itemList.get(i);
Boolean constantSize = item.getConstantSize();
Boolean variablePadding = item.getVariablePadding();
Boolean visible = item.getVisible();
if (constantSize != null || variablePadding != null || visible != null)
{
Object stateListState = methodGetStateListState.invoke(drawable,(Object[]) null);
if (constantSize != null)
methodGetStateListStateIsConstantSize.invoke(stateListState,constantSize);
if (variablePadding != null)
methodGetStateListStateIsConstantSize.invoke(stateListState,variablePadding);
if (visible != null)
methodGetStateListStateIsConstantSize.invoke(stateListState,visible);
}
Drawable drawableItem = item.getDrawable();
Map<Integer,Boolean> stateMap = item.getStateMap();
int definedStateCount = stateMap.size();
int[] definedStates = new int[definedStateCount];
int j = 0;
for(Map.Entry<Integer,Boolean> stateEntry : stateMap.entrySet())
{
int currentState = stateEntry.getKey(); // Ej android.R.attr.state_pressed
Boolean state = stateEntry.getValue(); // No puede ser null
definedStates[j] = state.booleanValue() ? currentState : -currentState;
j++;
}
drawable.addState(definedStates,drawableItem);
setCallback(drawableItem,drawable); // Al final si se sigue hasta addChild(Drawable dr) lo encontramos
}
elementDrawableRoot.setDrawable(drawable);
return elementDrawableRoot;
}
@Override
public Class<StateListDrawable> getDrawableOrElementDrawableClass()
{
return StateListDrawable.class;
}
protected void init()
{
super.init();
}
}