package gueei.binding.converters;
import gueei.binding.Converter;
import gueei.binding.IObservable;
import gueei.binding.v30.viewAttributes.adapterView.viewPager.PagerAdapterObservable;
import gueei.binding.v30.viewAttributes.adapterView.viewPager.PagerDataSetObserver;
import java.util.ArrayList;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
/**
* STITCH multiple pager adapters to one adapter for used in View pagers. <br/>
*
* @usage PagerAdapter pagerAdapter ...
* @arg pagerAdapter android.support.v4.view.PagerAdapter
*
* @return android.widget.Adapter
*/
public class PAGERSTITCH extends Converter<PagerAdapterObservable>{
public PAGERSTITCH(IObservable<?>[] dependents) {
super(PagerAdapterObservable.class, dependents);
}
@Override
public PagerAdapterObservable calculateValue(Object... args) throws Exception {
CombinedPagerAdapter combine = new CombinedPagerAdapter();
int length = args.length;
ArrayList<PagerAdapter> adapters = new ArrayList<PagerAdapter>();
for (int i=0; i<length; i++){
if (args[i] instanceof PagerAdapter){
adapters.add((PagerAdapter)args[i]);
}
}
combine.addAdapter(adapters.toArray(new PagerAdapter[0]));
return combine;
}
private static class CombinedPagerAdapter extends PagerAdapterObservable{
private ArrayList<TranslatedAdapter> mTranslated = new ArrayList<TranslatedAdapter>();
private class TranslatedAdapter{
public int offset;
public final PagerAdapter adapter;
public TranslatedAdapter(PagerAdapter adapter){
this.adapter =adapter;
}
}
@Override
public CharSequence getPageTitle(int position) {
TranslatedAdapter ta = getAdapterAt(position);
return ta.adapter.getPageTitle(position - ta.offset);
}
@Override
public float getPageWidth(int position) {
TranslatedAdapter ta = getAdapterAt(position);
return ta.adapter.getPageWidth(position - ta.offset);
}
@Override
public void setPrimaryItem(ViewGroup container, int position,
Object object) {
TranslatedAdapter ta = getAdapterAt(position);
ta.adapter.setPrimaryItem(container, position - ta.offset, object);
}
@Override
public void startUpdate(ViewGroup container) {
for(int i=0; i<mTranslated.size(); i++){
mTranslated.get(i).adapter.startUpdate(container);
}
}
private TranslatedAdapter getAdapterAt(int position){
int length = mTranslated.size();
TranslatedAdapter adapter;
for (int i=0; i<length; i++){
adapter = mTranslated.get(i);
if(position >= adapter.offset + adapter.adapter.getCount())
continue;
else
return adapter;
}
return null;
}
private int mItemCount;
private PagerDataSetObserver observer = new PagerDataSetObserver(){
@Override
public void onDataSetChanged() {
calculateTranslation();
notifyDataSetChanged();
}
};
public void addAdapter(PagerAdapter[] adapters){
for(int i=0; i<adapters.length; i++){
mTranslated.add(new TranslatedAdapter(adapters[i]));
if (adapters[i] instanceof PagerAdapterObservable){
((PagerAdapterObservable)adapters[i]).setPagerDataSetObserver(observer);
}
}
calculateTranslation();
notifyDataSetChanged();
}
public void addAdapter(PagerAdapter adapter){
mTranslated.add(new TranslatedAdapter(adapter));
// No idea why set data set observer is internal
// hope API is going to update this..
if (adapter instanceof PagerAdapterObservable){
((PagerAdapterObservable)adapter).setPagerDataSetObserver(observer);
}
calculateTranslation();
notifyDataSetChanged();
}
public void remvoeAdapter(PagerAdapter adapter){
for(int i=0; i<mTranslated.size(); i++){
if (mTranslated.get(i).adapter.equals(adapter)){
mTranslated.remove(i);
if (adapter instanceof PagerAdapterObservable){
((PagerAdapterObservable)adapter).setPagerDataSetObserver(null);
}
break;
}
}
calculateTranslation();
notifyDataSetChanged();
}
private void calculateTranslation(){
int pos = 0;
mItemCount = 0;
for(TranslatedAdapter p: mTranslated){
p.offset = pos;
pos += p.adapter.getCount();
}
mItemCount = pos;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
TranslatedAdapter ta = getAdapterAt(position);
ta.adapter.destroyItem(container, position - ta.offset, object);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
TranslatedAdapter ta = getAdapterAt(position);
return ta.adapter.instantiateItem(container, position - ta.offset);
}
@Override
public int getCount() {
return mItemCount;
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0.equals(arg1);
}
}
}