package kr.kdev.dg1s.biowiki.ui;
import android.content.Context;
import android.database.Cursor;
import android.support.v4.widget.CursorAdapter;
import android.util.AttributeSet;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.ListAdapter;
import java.util.ArrayList;
import kr.kdev.dg1s.biowiki.R;
import kr.kdev.dg1s.biowiki.ui.media.MediaGridAdapter;
/**
* A GridView implementation that aims to do multiselect on GridViews since
* multi-select isn't supported pre-API 11.
*/
public class MultiSelectGridView extends GridView implements AdapterView.OnItemLongClickListener, AdapterView.OnItemClickListener {
private OnItemClickListener mOnItemClickListener;
private MultiSelectListener mMultiSelectListener;
private MediaGridAdapter mAdapter;
private boolean mIsInMultiSelectMode;
private boolean mIsMultiSelectModeEnabled;
private boolean mIsHighlightSelectModeEnabled;
public MultiSelectGridView(Context context) {
super(context);
init();
}
public MultiSelectGridView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public MultiSelectGridView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
private void init() {
super.setOnItemClickListener(this);
super.setOnItemLongClickListener(this);
mIsMultiSelectModeEnabled = true;
mIsHighlightSelectModeEnabled = false;
}
public void setMultiSelectModeActive(boolean active) {
mIsInMultiSelectMode = active;
}
public boolean isInMultiSelectMode() {
return mIsInMultiSelectMode;
}
public boolean isMultiSelectModeEnabled() {
return mIsMultiSelectModeEnabled;
}
public void setMultiSelectModeEnabled(boolean enabled) {
mIsMultiSelectModeEnabled = enabled;
}
public boolean isHighlightSelectModeEnabled() {
return mIsHighlightSelectModeEnabled;
}
public void setHighlightSelectModeEnabled(boolean enabled) {
mIsHighlightSelectModeEnabled = enabled;
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
CheckableFrameLayout frameLayout = ((CheckableFrameLayout) view.findViewById(R.id.media_grid_frame_layout));
Cursor cursor = ((CursorAdapter) parent.getAdapter()).getCursor();
int mediaIdCol = cursor.getColumnIndex("mediaId");
if (mediaIdCol == -1)
return;
String mediaId = cursor.getString(mediaIdCol);
// run the default behavior if not in multiselect mode
if (!isInMultiSelectMode()) {
getSelectedItems().clear();
getSelectedItems().add(mediaId);
frameLayout.setChecked(true);
if (mOnItemClickListener != null)
mOnItemClickListener.onItemClick(parent, view, position, id);
mAdapter.notifyDataSetChanged();
if (isHighlightSelectModeEnabled())
notifyMultiSelectCountChanged();
return;
}
if (getSelectedItems().contains(mediaId)) {
// unselect item
frameLayout.setChecked(false);
} else {
// select item
frameLayout.setChecked(true);
}
notifyMultiSelectCountChanged();
}
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
// do not allow item long clicks if multi-select is disabled
if (!mIsMultiSelectModeEnabled)
return true;
mIsInMultiSelectMode = true;
Cursor cursor = ((CursorAdapter) parent.getAdapter()).getCursor();
String mediaId = cursor.getString(cursor.getColumnIndex("mediaId"));
if (!getSelectedItems().contains(mediaId))
getSelectedItems().add(mediaId);
notifyMultiSelectCountChanged();
((CheckableFrameLayout) view.findViewById(R.id.media_grid_frame_layout)).setChecked(true);
return true;
}
private void notifyMultiSelectCountChanged() {
if (mMultiSelectListener != null) {
int size = getSelectedItems().size();
if (size == 0) {
mIsInMultiSelectMode = false;
}
mMultiSelectListener.onMultiSelectChange(size);
}
}
@Override
public void setOnItemClickListener(OnItemClickListener listener) {
mOnItemClickListener = listener;
}
@Override
public void setOnItemLongClickListener(OnItemLongClickListener listener) {
// not implemented
}
public void setMultiSelectListener(MultiSelectListener listener) {
mMultiSelectListener = listener;
}
public void cancelSelection() {
getSelectedItems().clear();
mAdapter.notifyDataSetChanged();
notifyMultiSelectCountChanged();
}
@Override
public void setAdapter(ListAdapter adapter) {
super.setAdapter(adapter);
mAdapter = (MediaGridAdapter) adapter;
}
private ArrayList<String> getSelectedItems() {
return mAdapter.getCheckedItems();
}
public interface MultiSelectListener {
public void onMultiSelectChange(int count);
}
}