package gueei.binding.converters;
import java.util.Collection;
import gueei.binding.Binder;
import gueei.binding.Binder.InflateResult;
import gueei.binding.BindingLog;
import gueei.binding.CollectionChangedEventArg;
import gueei.binding.CollectionObserver;
import gueei.binding.Converter;
import gueei.binding.DynamicObject;
import gueei.binding.IObservable;
import gueei.binding.IObservableCollection;
import gueei.binding.v30.viewAttributes.adapterView.viewPager.PagerAdapterObservable;
import gueei.binding.viewAttributes.templates.Layout;
import android.view.View;
import android.view.ViewGroup;
/**
* PAGERADAPTER accepts unlimited number of DynamicObjects
* It will return a PagerAdapter
*
* @usage params
*
* @arg params DynamicObject
*
* @item template gueei.binding.viewAttributes.templates.Layout
* @item source ObservableCollection
* @item @optional width Float
* @item @optional widthField String When Set, ignore width
* @item @optional title String
* @item @optional titleField String When Set, ignore title
*
* @return PagerAdapterObservable
*
* @author andy
*
*/
public class PAGERADAPTER extends Converter<PagerAdapterObservable> {
public PAGERADAPTER(IObservable<?>[] dependents) {
super(PagerAdapterObservable.class, dependents);
}
@Override
public PagerAdapterObservable calculateValue(Object... args) throws Exception {
return new ObsPagerAdapter((DynamicObject)args[0]);
}
private class ObsPagerAdapter extends PagerAdapterObservable implements CollectionObserver{
@Override
public CharSequence getPageTitle(int position) {
if (dobj.observableExists("titleField")){
String titleField = dobj.tryGetObservableValue("titleField", null);
return Binder.getSyntaxResolver().tryEvaluateValue(getContext(), titleField, col.getItem(position), "");
}else
return dobj.tryGetObservableValue("title", "");
}
@Override
public float getPageWidth(int position) {
if (dobj.observableExists("widthField")){
String widthField = dobj.tryGetObservableValue("widthField", null);
return Binder.getSyntaxResolver().tryEvaluateValue(getContext(), widthField, col.getItem(position), 1.0f);
}else
return dobj.tryGetObservableValue("width", 1.0f);
}
private final DynamicObject dobj;
private final IObservableCollection<?> col;
public ObsPagerAdapter(DynamicObject obj){
dobj = obj;
try {
col = (IObservableCollection<?>)obj.getObservableByName("source").get();
col.subscribe(this);
} catch (Exception e) {
BindingLog.exception("PAGERADAPTER.ObsPagerAdapter.Constructor", e);
throw new RuntimeException();
}
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
try {
Layout layout;
layout = (Layout)dobj.getObservableByName("template").get();
InflateResult result =
Binder.inflateView(container.getContext(), layout.getDefaultLayoutId(), container, false);
View root =
Binder.bindView(container.getContext(), result, col.getItem(position));
container.addView(root);
return root;
} catch (Exception e) {
BindingLog.exception("PAGERADAPTER", e);
return null;
}
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View)object);
}
@Override
public int getCount() {
return col.size();
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0.equals(arg1);
}
@Override
public void onCollectionChanged(IObservableCollection<?> collection,
CollectionChangedEventArg args, Collection<Object> initiators) {
this.notifyDataSetChanged();
}
@Override
public int getItemPosition(Object object) {
// TODO: This is quite inefficient, need to improve this
for(int i=0; i<col.size(); i++){
if (object.equals(col.getItem(i))) return i;
}
return POSITION_NONE;
}
}
}