All Downloads are FREE. Search and download functionalities are using the official Maven repository.

fr.nelaupe.spreadsheetlib.SpreadSheetAdaptor Maven / Gradle / Ivy

The newest version!
/**
 * Copyright
 */
package fr.nelaupe.spreadsheetlib;

import android.annotation.TargetApi;
import android.os.Build;
import android.view.View;

import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import fr.nelaupe.spreadsheetlib.view.ArrowButton;

/**
 * Created with IntelliJ
 * Created by lucas
 * Date 26/03/15
 */
@SuppressWarnings({"unused", "unchecked"})
public abstract class SpreadSheetAdaptor {

    private final Set mFixedViewData;
    private final List mDisplayOnly;
    private List mData;
    private Configuration mConfiguration;
    private FieldBinder mBindableClass;
    private Class mCurrentClass;
    private boolean mAutoSorting;

    private OnItemClickListener mItemClickListener;
    private OnSortingListener mSortingListener;

    public SpreadSheetAdaptor() {
        mConfiguration = new Configuration();
        mData = new ArrayList<>();
        mFixedViewData = new HashSet<>();
        mDisplayOnly = new ArrayList<>();
        mAutoSorting = true;
    }

    public void displayColumn(ArrayList columnNumber) {
        mDisplayOnly.clear();
        mDisplayOnly.addAll(columnNumber);
    }

    public void displayColumn(Integer... columnNumber) {
        mDisplayOnly.clear();
        mDisplayOnly.addAll(Arrays.asList(columnNumber));
    }

    public void add(TSelf data) {
        mData.add(data);
    }

    public void addAll(List data) {
        mData.addAll(data);
    }

    public List getData() {
        return mData;
    }

    public TSelf get(int position) {
        return mData.get(position);
    }

    public void clearData() {
        mData = new ArrayList<>();
    }

    public void setOnSortingListener(OnSortingListener mSortingListener) {
        this.mSortingListener = mSortingListener;
    }

    boolean onSort(AnnotationFields annotationFields, int columnPosition) {
        if (mAutoSorting) {
            if (annotationFields.isComparable()) {
                doSorting(columnPosition, sortBy(annotationFields));
                return true;
            }
        } else if (mSortingListener != null) {
            getBinder().setIsDESC(getBinder().getSortingColumnSelected() != columnPosition || !getBinder().isSortingDESC());
            mSortingListener.onSort(annotationFields, getBinder().isSortingDESC());
            return true;
        }
        return false;
    }

    private void invert() {
        Collections.reverse(getData());
    }

    private  void doSorting(int columnId, Comparator comparator) {
        if (getBinder().getSortingColumnSelected() == columnId) {
            invert();
            getBinder().invertSorting();
        } else {
            Collections.sort(getData(), (Comparator) comparator);
            getBinder().setIsDESC(false);
            getBinder().setColumnSortSelected(columnId);
        }
    }

    public void setArrow(int column, boolean isDESC) {
        getBinder().setIsDESC(isDESC);
        getBinder().setColumnSortSelected(column);
    }

    public void setOnItemClickListener(OnItemClickListener listener) {
        mItemClickListener = listener;
    }

    OnItemClickListener getOnItemClickListener() {
        return mItemClickListener;
    }

    public Set getFixedViews() {
        return mFixedViewData;
    }

    public void addFixed(String name) {
        mFixedViewData.add(name);
    }

    public Configuration getConfiguration() {
        return mConfiguration;
    }

    public void setConfiguration(Configuration configuration) {
        mConfiguration = configuration;
    }

    public abstract View getCellView(AnnotationFields cell, Object object);

    public abstract ArrowButton getHeaderCellView(AnnotationFields cell);

    public abstract View getFixedHeaderView(String name);

    public abstract View getFixedCellView(String name, int position);

    @TargetApi(Build.VERSION_CODES.KITKAT)
    private void inspectFields() {

        if (mCurrentClass == null) {
            if (mData.size() > 0) {
                mCurrentClass = (Class) mData.get(0).getClass();
            } else {
                return;
            }
        }

        try {
            Class persistentClass = (Class) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
            mBindableClass = (FieldBinder) Class.forName("fr.nelaupe.spreadsheetlib."+persistentClass.getSimpleName() + "Binding").newInstance();
        } catch (ClassNotFoundException e) {
            throw new RuntimeException("Missing binding class", e);
        } catch (InstantiationException | IllegalAccessException e) {
            e.printStackTrace();
        }
    }

    List getFields() {
        if (mBindableClass == null || mBindableClass.fields().size() == 0) {
            inspectFields();
        }

        if (mBindableClass == null) {
            return Collections.emptyList();
        }

        if (mDisplayOnly.isEmpty()) {
            return Collections.unmodifiableList(mBindableClass.fields());
        } else {
            List returned = new ArrayList<>();
            for (AnnotationFields field : mBindableClass.fields()) {
                if (mDisplayOnly.contains(field.getPosition())) {
                    returned.add(field);
                }
            }

            return Collections.unmodifiableList(returned);
        }

    }

    FieldBinder getBinder() {
        return mBindableClass;
    }

    final Comparator sortBy(final AnnotationFields field) {

        return new Comparator() {
            @Override
            public int compare(TSelf lhs, TSelf rhs) {

                Comparable lComparable = (Comparable) mBindableClass.getValueAt(field.getFieldName(), lhs);
                Comparable rComparable = (Comparable) mBindableClass.getValueAt(field.getFieldName(), rhs);

                return lComparable.compareTo(rComparable);

            }
        };
    }

    public SpreadSheetAdaptor with(Class cls) {
        mCurrentClass = cls;
        inspectFields();
        return this;
    }

    public void setAutoSorting(boolean isAutoSort) {
        mAutoSorting = isAutoSort;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy