package org.heaven7.scrap.databinding;
import android.content.Context;
import android.text.TextUtils;
import android.view.View;
import com.heaven7.xml.ObjectMap;
import org.heaven7.scrap.annotation.NonNull;
import org.heaven7.scrap.databinding.xml.AbsElement;
import org.heaven7.scrap.databinding.xml.XmlElementNames;
import org.heaven7.scrap.databinding.xml.elements.BindElement;
import org.heaven7.scrap.databinding.xml.elements.DataBindingElement;
import org.heaven7.scrap.databinding.xml.elements.ImportElement;
import org.heaven7.scrap.databinding.xml.elements.PropertyElement;
import org.heaven7.scrap.databinding.xml.elements.VariableElement;
import org.heaven7.scrap.util.ResourceUtil;
import java.util.List;
/**
* Created by heaven7 on 2015/8/11.
*/
public class DataBindParser {
private final View root;
private final ObjectMap<String,String> mImportMap ;
private final ObjectMap<String,String> mVariableBeanMap ;
private final ObjectMap<String,String> mVariableCallbakMap;
private ObjectMap<String,String> mVariableBeansMap;
private final InternalElementParserListener mParserListenerImpl;
public DataBindParser(@NonNull View root) {
if(root == null)
throw new NullPointerException();
this.root = root;
mParserListenerImpl = new InternalElementParserListener();
mImportMap = new ObjectMap<>(8);
mVariableBeanMap = new ObjectMap<>(8);
mVariableCallbakMap = new ObjectMap<>(8);
}
public Context getContext(){
return root.getContext();
}
public DataBindingElement.IElementParseListener getElementParserListener(){
return mParserListenerImpl;
}
private void doWithImportElement(ImportElement ie) {
String alias = ie.getAlias();
String classname = ie.getClassname();//full class name
if(!classname.contains(".")) throw new RuntimeException("class name must be full name.");
if(TextUtils.isEmpty(alias)){
alias = classname.substring(classname.lastIndexOf(".")+1);
}
mImportMap.put(alias,classname);
}
private void doWithBindElement(BindElement be) {
int id = ResourceUtil.getResId(getContext(), be.getId(), ResourceUtil.ResourceType.Id);
//TODO
List<PropertyElement> propEles = be.getPropertyElements();
if(propEles!=null && propEles.size()>0){
PropertyBindInfo info ;
for(int i =0,size = propEles.size() ; i <size ;i++){
PropertyElement e = propEles.get(i);
info = new PropertyBindInfo();
}
}
}
private void doWithVariableElement(VariableElement ve) {
switch (ve.getType()){
case VariableType.BEAN:
mVariableBeanMap.put(ve.getName(),ve.getClassname());
break;
case VariableType.BEANS: //means list
if(mVariableBeansMap==null)
mVariableBeansMap = new ObjectMap<>(3);
mVariableBeansMap.put(ve.getName(),ve.getClassname());
break;
case VariableType.CALLBACK://event
mVariableCallbakMap.put(ve.getName(),ve.getClassname());
break;
}
}
private class InternalElementParserListener implements DataBindingElement.IElementParseListener{
@Override
public void onParsed(AbsElement e) {
switch (e.getElementName()){
case XmlElementNames.IMPORT:
ImportElement ie = (ImportElement) e;
doWithImportElement(ie);
break;
case XmlElementNames.VARIABLE:
VariableElement ve = (VariableElement) e;
doWithVariableElement(ve);
break;
case XmlElementNames.BIND:
BindElement be = (BindElement) e;
doWithBindElement(be);
break;
}
}
}
public class PropertyBindInfo{
public String applyViewPropertyName;
public String [] referVariables;
public String [] referImports;
public String expressionValueType;
public String expression;
public int applyViewId;
}
}