/*
* Catroid: An on-device visual programming system for Android devices
* Copyright (C) 2010-2016 The Catrobat Team
* (<http://developer.catrobat.org/credits>)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* An additional term exception under section 7 of the GNU Affero
* General Public License, version 3, is available at
* http://developer.catrobat.org/license_additional_term
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.catrobat.catroid.ui.fragment;
import android.app.AlertDialog;
import android.app.ListFragment;
import android.content.DialogInterface;
import android.os.Bundle;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.ForegroundColorSpan;
import android.view.ActionMode;
import android.view.Menu;
import android.view.View;
import android.widget.ListAdapter;
import android.widget.ListView;
import org.catrobat.catroid.R;
import org.catrobat.catroid.ui.BottomBar;
import org.catrobat.catroid.ui.CapitalizedTextView;
import org.catrobat.catroid.ui.adapter.CheckBoxListAdapter;
import org.catrobat.catroid.utils.UtilUi;
public abstract class CheckBoxListFragment extends ListFragment implements CheckBoxListAdapter.ListItemCheckHandler {
public static final String TAG = CheckBoxListFragment.class.getSimpleName();
protected CheckBoxListAdapter adapter;
protected ActionMode actionMode;
protected String actionModeTitle;
protected String singleItemTitle;
protected String multipleItemsTitle;
protected boolean isRenameActionMode = false;
protected CapitalizedTextView selectAllView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@Override
public void onResume() {
super.onResume();
if (isActionModeActive()) {
actionMode.finish();
actionMode = null;
}
}
@Override
public void setListAdapter(ListAdapter adapter) {
super.setListAdapter(adapter);
this.adapter = (CheckBoxListAdapter) adapter;
}
protected boolean isActionModeActive() {
return actionMode != null;
}
public void setSelectMode(int selectMode) {
adapter.setSelectMode(selectMode);
adapter.notifyDataSetChanged();
}
public int getSelectMode() {
return adapter.getSelectMode();
}
public void setShowDetails(boolean showDetails) {
adapter.setShowDetails(showDetails);
}
public boolean getShowDetails() {
return adapter.getShowDetails();
}
public void clearCheckedItems() {
setSelectMode(ListView.CHOICE_MODE_NONE);
adapter.setAllItemsCheckedTo(false);
actionMode = null;
BottomBar.showBottomBar(getActivity());
}
@Override
public void onItemChecked() {
if (isRenameActionMode || actionMode == null) {
return;
}
updateActionModeTitle();
updateSelectAllView();
}
protected void updateActionModeTitle() {
int numberOfSelectedItems = adapter.getCheckedItems().size();
if (numberOfSelectedItems == 0) {
actionMode.setTitle(actionModeTitle);
return;
}
String itemCount = Integer.toString(numberOfSelectedItems);
ForegroundColorSpan colorSpan = new ForegroundColorSpan(getResources().getColor(R.color.actionbar_title_color));
String completeTitle = actionModeTitle + " " + itemCount + " ";
if (numberOfSelectedItems == 1) {
completeTitle += singleItemTitle;
} else {
completeTitle += multipleItemsTitle;
}
Spannable completeSpannedTitle = new SpannableString(completeTitle);
completeSpannedTitle.setSpan(colorSpan, actionModeTitle.length() + 1,
actionModeTitle.length() + (1 + itemCount.length()), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
actionMode.setTitle(completeSpannedTitle);
}
protected void addSelectAllActionModeButton(final ActionMode mode, Menu menu) {
final View selectAllActionModeButton = UtilUi.addSelectAllActionModeButton(getActivity().getLayoutInflater(),
mode, menu);
selectAllView = (CapitalizedTextView) selectAllActionModeButton.findViewById(R.id.select_all);
selectAllActionModeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (areAllItemsChecked()) {
adapter.setAllItemsCheckedTo(false);
} else {
adapter.setAllItemsCheckedTo(true);
}
updateSelectAllView();
}
});
}
protected void updateSelectAllView() {
if (areAllItemsChecked()) {
selectAllView.setText(R.string.deselect_all);
} else {
selectAllView.setText(R.string.select_all);
}
}
private boolean areAllItemsChecked() {
return adapter.getCheckedItems().size() == adapter.getCount();
}
protected void showError(int messageId) {
new AlertDialog.Builder(getActivity())
.setTitle(R.string.error)
.setMessage(messageId)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int id) {
}
})
.setCancelable(false)
.show();
}
}