package com.pan.materialdrawer.model;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.pan.materialdrawer.Drawer;
import com.pan.materialdrawer.model.interfaces.IDrawerItem;
import com.pan.materialdrawer.model.interfaces.OnPostBindViewListener;
import com.pan.materialdrawer.model.interfaces.Selectable;
import com.pan.materialdrawer.model.interfaces.Tagable;
import com.pan.materialdrawer.model.utils.ViewHolderFactory;
/**
* Created by mikepenz on 14.07.15.
*/
public abstract class AbstractDrawerItem<T> implements IDrawerItem<T>, Selectable<T>, Tagable<T> {
protected int mIdentifier = -1;
public T withIdentifier(int identifier) {
this.mIdentifier = identifier;
return (T) this;
}
@Override
public int getIdentifier() {
return mIdentifier;
}
protected Object mTag;
public T withTag(Object object) {
this.mTag = object;
return (T) this;
}
@Override
public Object getTag() {
return mTag;
}
protected boolean mEnabled = true;
public T withEnabled(boolean enabled) {
this.mEnabled = enabled;
return (T) this;
}
@Override
public boolean isEnabled() {
return mEnabled;
}
protected boolean mSelected = false;
@Override
public T withSetSelected(boolean selected) {
this.mSelected = selected;
return (T) this;
}
@Override
public boolean isSelected() {
return mSelected;
}
protected boolean mSelectable = true;
@Override
public T withSelectable(boolean selectable) {
this.mSelectable = selectable;
return (T) this;
}
@Override
public boolean isSelectable() {
return mSelectable;
}
public Drawer.OnDrawerItemClickListener mOnDrawerItemClickListener = null;
public Drawer.OnDrawerItemClickListener getOnDrawerItemClickListener() {
return mOnDrawerItemClickListener;
}
/**
* this listener is called when an item is clicked in the drawer.
* WARNING: don't overwrite this in the Switch / Toggle drawerItems if you want the toggle / switch to be selected
* if the item is clicked and the item is not selectable.
*
* @param onDrawerItemClickListener
* @return
*/
public T withOnDrawerItemClickListener(Drawer.OnDrawerItemClickListener onDrawerItemClickListener) {
this.mOnDrawerItemClickListener = onDrawerItemClickListener;
return (T) this;
}
protected OnPostBindViewListener mOnPostBindViewListener = null;
public OnPostBindViewListener getOnPostBindViewListener() {
return mOnPostBindViewListener;
}
/**
* add this listener and hook in if you want to modify a drawerItems view without creating a custom drawer item
*
* @param onPostBindViewListener
* @return
*/
public T withPostOnBindViewListener(OnPostBindViewListener onPostBindViewListener) {
this.mOnPostBindViewListener = onPostBindViewListener;
return (T) this;
}
/**
* is called after bindView to allow some post creation setps
*
* @param drawerItem the drawerItem which is bound to the view
* @param view the currently view which will be bound
*/
public void onPostBindView(IDrawerItem drawerItem, View view) {
if (mOnPostBindViewListener != null) {
mOnPostBindViewListener.onBindView(drawerItem, view);
}
}
public abstract ViewHolderFactory getFactory();
@Override
public View generateView(Context ctx) {
RecyclerView.ViewHolder viewHolder = getFactory().factory(LayoutInflater.from(ctx).inflate(getLayoutRes(), null, false));
bindView(viewHolder);
return viewHolder.itemView;
}
@Override
public View generateView(Context ctx, ViewGroup parent) {
RecyclerView.ViewHolder viewHolder = getFactory().factory(LayoutInflater.from(ctx).inflate(getLayoutRes(), parent, false));
bindView(viewHolder);
return viewHolder.itemView;
}
@Override
public RecyclerView.ViewHolder getViewHolder(ViewGroup parent) {
return getFactory().factory(LayoutInflater.from(parent.getContext()).inflate(getLayoutRes(), parent, false));
}
public boolean equals(Integer id) {
return id != null && id == mIdentifier;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
AbstractDrawerItem<?> that = (AbstractDrawerItem<?>) o;
return mIdentifier == that.mIdentifier;
}
@Override
public int hashCode() {
return mIdentifier;
}
}