package org.itsnat.droid.impl.xmlinflater.layout.classtree;
import android.content.Context;
import android.util.AttributeSet;
import android.view.ContextThemeWrapper;
import android.view.View;
import android.widget.Spinner;
import org.itsnat.droid.ItsNatDroidException;
import org.itsnat.droid.impl.dom.DOMAttr;
import org.itsnat.droid.impl.dom.DOMAttributeMap;
import org.itsnat.droid.impl.util.NamespaceUtil;
import org.itsnat.droid.impl.xmlinflater.layout.ClassDescViewMgr;
import org.itsnat.droid.impl.xmlinflater.layout.PendingPostInsertChildrenTasks;
import org.itsnat.droid.impl.xmlinflater.layout.attr.widget.AttrDescView_widget_Spinner_dropDownHorizontalOffset;
import org.itsnat.droid.impl.xmlinflater.layout.attr.widget.AttrDescView_widget_Spinner_dropDownVerticalOffset;
import org.itsnat.droid.impl.xmlinflater.layout.attr.widget.AttrDescView_widget_Spinner_popupBackground;
import org.itsnat.droid.impl.xmlinflater.shared.GravityUtil;
import org.itsnat.droid.impl.xmlinflater.shared.attr.AttrDescReflecFieldSetDimensionWithNameIntRound;
import org.itsnat.droid.impl.xmlinflater.shared.attr.AttrDescReflecMethodCharSequence;
import org.itsnat.droid.impl.xmlinflater.shared.attr.AttrDescReflecMethodNameMultiple;
/**
* Created by jmarranz on 30/04/14.
*/
public class ClassDescView_widget_Spinner extends ClassDescViewBased
{
public ClassDescView_widget_Spinner(ClassDescViewMgr classMgr,ClassDescView_widget_AbsSpinner parentClass)
{
super(classMgr,"android.widget.Spinner",parentClass);
}
@Override
protected boolean isAttributeIgnored(String namespaceURI,String name)
{
if (super.isAttributeIgnored(namespaceURI,name))
return true;
return isSpinnerModeAttribute(namespaceURI,name); // Se trata de forma especial en otro lugar
}
private static boolean isSpinnerModeAttribute(String namespaceURI,String name)
{
return NamespaceUtil.XMLNS_ANDROID.equals(namespaceURI) && name.equals("spinnerMode");
}
private static String findSpinnerModeAttribute(DOMAttributeMap attributeMap)
{
DOMAttr attr = findAttribute(NamespaceUtil.XMLNS_ANDROID, "spinnerMode", attributeMap);
if (attr == null)
return null;
return attr.getValue();
}
@Override
public View createViewObject(DOMAttributeMap attributeMap, int idStyle, PendingPostInsertChildrenTasks pendingPostInsertChildrenTasks, Context ctx)
{
String spinnerMode = findSpinnerModeAttribute(attributeMap);
return createSpinnerObject(idStyle, spinnerMode, ctx);
}
private View createSpinnerObject(int idStyle, String spinnerMode, Context ctx)
{
int mode;
if (spinnerMode != null)
{
if ("dialog".equals(spinnerMode)) mode = Spinner.MODE_DIALOG;
else if ("dropdown".equals(spinnerMode)) mode = Spinner.MODE_DROPDOWN;
else throw new ItsNatDroidException("Unrecognized value name " + spinnerMode + " for attribute");
}
else mode = -1; // MODE_THEME = -1 es decir se delega en el atributo spinnerMode y si no está definido (que es el caso de layouts dinámico) en lo que diga el theme que suele ser dropdown
View view;
if (idStyle != 0)
{
// Pasamos new ContextThemeWrapper(ctxToOpenInternFiles,idStyle) porque como parámetro el idStyle es ignorado
// La aplicación de un style de todas formas hace alguna cosa rara, si se puede, evitar usar style en un Spinner
if (mode != -1)
view = new Spinner(new ContextThemeWrapper(ctx,idStyle),(AttributeSet)null,0 /*idStyle */,mode);
else
view = new Spinner(new ContextThemeWrapper(ctx,idStyle),(AttributeSet)null,0 /*idStyle */);
}
else
{
// Es importante llamar a estos constructores y no pasar un idStyle con 0 pues Spinner define un style por defecto en el constructor que es "mandatory" si no especificamos uno explícitamente
if (mode != -1)
view = new Spinner(ctx, mode);
else
view = new Spinner(ctx,(AttributeSet)null); // El constructor de un sólo param también vale
}
return view;
}
@SuppressWarnings("unchecked")
protected void init()
{
super.init();
addAttrDescAN(new AttrDescView_widget_Spinner_dropDownHorizontalOffset(this));
// Es de traca pero android:dropDownSelector NO tiene implementación alguna en el código fuente
addAttrDescAN(new AttrDescView_widget_Spinner_dropDownVerticalOffset(this));
addAttrDescAN(new AttrDescReflecFieldSetDimensionWithNameIntRound(this, "dropDownWidth", "mDropDownWidth", "wrap_content"));
addAttrDescAN(new AttrDescReflecMethodNameMultiple(this, "gravity", GravityUtil.nameValueMap, "center"));
addAttrDescAN(new AttrDescView_widget_Spinner_popupBackground(this));
addAttrDescAN(new AttrDescReflecMethodCharSequence(this, "prompt", "")); // En un layout compilado no se admiten literales, aquí sí, no es importante y es más flexible aún
// android:spinnerMode no es un atributo normal, se pasa por el constructor del objeto Spinner
}
}