/** * Copyright (C) 2013 Romain Guefveneu. * * This file is part of naonedbus. * * Naonedbus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Naonedbus is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package net.naonedbus.fragment.impl; import net.naonedbus.R; import net.naonedbus.bean.Groupe; import net.naonedbus.fragment.CustomCursorFragment; import net.naonedbus.manager.impl.GroupeManager; import net.naonedbus.provider.impl.GroupeProvider; import net.naonedbus.provider.table.GroupeTable; import android.app.AlertDialog; import android.content.ContentResolver; import android.content.Context; import android.content.DialogInterface; import android.database.Cursor; import android.database.CursorWrapper; import android.os.Bundle; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.support.v4.widget.CursorAdapter; import android.util.SparseBooleanArray; import android.view.LayoutInflater; import android.view.View; import android.view.WindowManager; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.EditText; import android.widget.ListView; import com.actionbarsherlock.view.ActionMode; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuInflater; import com.actionbarsherlock.view.MenuItem; import com.mobeta.android.dslv.DragSortListView; import com.mobeta.android.dslv.SimpleDragSortCursorAdapter; public class GroupesFragment extends CustomCursorFragment implements ActionMode.Callback, OnItemClickListener, OnItemLongClickListener { private final GroupeManager mGroupeManager; private ActionMode mActionMode; private DragSortListView mListView; private Cursor mCursor; private CursorAdapter mAdapter; public GroupesFragment() { super(R.layout.fragment_listview_drag_drop); mGroupeManager = GroupeManager.getInstance(); } @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); setEmptyMessageValues(R.string.error_title_empty_groupe, R.string.error_summary_empty_groupe, R.drawable.ic_style_empty); } @Override public void onActivityCreated(final Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mListView = (DragSortListView) getListView(); mListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); mListView.setOnItemClickListener(this); mListView.setOnItemLongClickListener(this); } @Override public void onPause() { super.onPause(); saveOrder(); } @Override public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) { inflater.inflate(R.menu.fragment_groupes, menu); super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onOptionsItemSelected(final MenuItem item) { if (item.getItemId() == R.id.menu_add) { menuAdd(); return true; } return super.onOptionsItemSelected(item); } @Override protected CursorAdapter getCursorAdapter(final Context context) { mCursor = mGroupeManager.getCursor(context.getContentResolver()); final String[] from = new String[] { GroupeTable.NOM }; final int[] to = new int[] { android.R.id.text1 }; mAdapter = new SimpleDragSortCursorAdapter(getActivity(), R.layout.list_item_checkable, mCursor, from, to, 0); return mAdapter; } @Override public Loader<Cursor> onCreateLoader(final int arg0, final Bundle arg1) { return new CursorLoader(getActivity(), GroupeProvider.CONTENT_URI, null, null, null, null); } @Override public boolean onCreateActionMode(final ActionMode mode, final Menu menu) { final MenuInflater menuInflater = getSherlockActivity().getSupportMenuInflater(); menuInflater.inflate(R.menu.fragment_groupes_contextual, menu); mActionMode = mode; return true; } @Override public boolean onPrepareActionMode(final ActionMode mode, final Menu menu) { final int checkedItems = getCheckedItemsCount(); final MenuItem menuEdit = menu.findItem(R.id.menu_edit); menuEdit.setVisible(checkedItems == 1); mActionMode.setTitle(getResources().getQuantityString(R.plurals.selected_items, checkedItems, checkedItems)); return true; } @Override public boolean onActionItemClicked(final ActionMode mode, final MenuItem item) { switch (item.getItemId()) { case R.id.menu_delete: deleteCheckedItems(); mActionMode.finish(); return true; case R.id.menu_edit: editCheckedItem(); mActionMode.finish(); return true; default: break; } return false; } @Override public void onDestroyActionMode(final ActionMode mode) { mActionMode = null; mListView.clearChoices(); mListView.invalidateViews(); } private void menuAdd() { final View alertDialogView = LayoutInflater.from(getActivity()).inflate(R.layout.dialog_input, null); final EditText input = (EditText) alertDialogView.findViewById(R.id.text); input.selectAll(); final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setView(alertDialogView); builder.setTitle(R.string.action_groupes_add); builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(final DialogInterface dialog, final int which) { final Groupe groupe = new Groupe(); groupe.setNom(input.getText().toString().trim()); groupe.setOrdre(mCursor.getCount()); mGroupeManager.add(getActivity().getContentResolver(), groupe); } }); builder.setNegativeButton(android.R.string.cancel, null); final AlertDialog alert = builder.create(); alert.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); alert.show(); } private void deleteCheckedItems() { final SparseBooleanArray checked = mListView.getCheckedItemPositions(); for (int i = 0; i < checked.size(); i++) { if (checked.valueAt(i)) { final int position = checked.keyAt(i); final int idGroupe = (int) mListView.getItemIdAtPosition(position); mGroupeManager.delete(getActivity().getContentResolver(), idGroupe); } } } private void editCheckedItem() { final int checkedItem = getFirstSelectedItemPosition(); final CursorWrapper wrapper = (CursorWrapper) mListView.getItemAtPosition(checkedItem); final Groupe groupe = mGroupeManager.getSingleFromCursor(wrapper); final View alertDialogView = LayoutInflater.from(getActivity()).inflate(R.layout.dialog_input, null); final EditText input = (EditText) alertDialogView.findViewById(R.id.text); input.setText(groupe.getNom()); input.selectAll(); final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setView(alertDialogView); builder.setTitle(R.string.action_rename); builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(final DialogInterface dialog, final int which) { final String nom = input.getText().toString().trim(); groupe.setNom((nom.length() == 0) ? null : nom); mGroupeManager.update(getActivity().getContentResolver(), groupe); } }); builder.setNegativeButton(android.R.string.cancel, null); final AlertDialog alert = builder.create(); alert.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); alert.show(); } @Override public void onItemClick(final AdapterView<?> adapter, final View view, final int position, final long id) { onItemChecked(); } @Override public boolean onItemLongClick(final AdapterView<?> adapter, final View view, final int position, final long id) { mListView.setItemChecked(position, true); onItemChecked(); return true; } private void onItemChecked() { if (hasItemChecked()) { if (mActionMode == null) { getSherlockActivity().startActionMode(GroupesFragment.this); } else { mActionMode.invalidate(); } } else { if (mActionMode != null) { mActionMode.finish(); } } } private int getFirstSelectedItemPosition() { final SparseBooleanArray checkedPositions = mListView.getCheckedItemPositions(); for (int i = 0; i < checkedPositions.size(); i++) { if (checkedPositions.valueAt(i)) { return checkedPositions.keyAt(i); } } return -1; } private int getCheckedItemsCount() { final SparseBooleanArray checkedPositions = mListView.getCheckedItemPositions(); int count = 0; for (int i = 0; i < checkedPositions.size(); i++) { if (checkedPositions.valueAt(i)) { count++; } } return count; } private boolean hasItemChecked() { final SparseBooleanArray checked = mListView.getCheckedItemPositions(); for (int i = 0; i < checked.size(); i++) { if (checked.valueAt(i)) return true; } return false; } private void saveOrder() { final ContentResolver contentResolver = getActivity().getContentResolver(); Groupe groupe; for (int i = 0; i < mListView.getCount(); i++) { groupe = mGroupeManager.getSingleFromCursor((CursorWrapper) mListView.getItemAtPosition(i)); if (i != groupe.getOrdre()) { groupe.setOrdre(i); mGroupeManager.update(contentResolver, groupe); } } } }