/* * 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.adapter; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.Spinner; import android.widget.TextView; import org.catrobat.catroid.R; import org.catrobat.catroid.formulaeditor.UserList; import org.catrobat.catroid.formulaeditor.UserVariable; import java.util.ArrayList; import java.util.List; import java.util.SortedSet; import java.util.TreeSet; public class DataAdapter extends BaseAdapter implements ActionModeActivityAdapterInterface { private Context context; private List<UserList> spriteLists; private List<UserList> projectLists; private List<UserVariable> userBrickVariables; private List<UserVariable> spriteVariables; private List<UserVariable> projectVariables; private int selectMode; private SortedSet<Integer> checkedItems = new TreeSet<>(); private OnCheckedChangeListener onCheckedChangeListener = null; private OnListItemClickListener onListItemClickListener = null; private int itemLayout; private int checkboxId; private int textViewId; private int textViewId2; private int linearLayoutLocalId; private int linearLayoutGlobalId; private int linearLayoutUserListId; private int linearLayoutUserListAboveItemId; private int linearLayoutUserVariablesId; private int spinnerUserListValuesId; private int linearLayoutUserBrickId; private static class ViewHolder { private CheckBox checkbox; private TextView text1; private TextView text2; private LinearLayout localHeadline; private LinearLayout globalHeadline; private LinearLayout userListsHeadline; private LinearLayout userListsHeadlineAboveItem; private LinearLayout userVariablesHeadline; private Spinner userListValuesSpinner; private LinearLayout userbrickHeadline; } public DataAdapter(Context context, List<UserList> spriteLists, List<UserList> projectLists, List<UserVariable> spriteVariables, List<UserVariable> projectVariables, List<UserVariable> userBrickVariables) { this.spriteLists = spriteLists; this.projectLists = projectLists; this.projectVariables = projectVariables; this.spriteVariables = spriteVariables; this.userBrickVariables = userBrickVariables; this.context = context; this.selectMode = ListView.CHOICE_MODE_NONE; this.itemLayout = R.layout.fragment_formula_editor_data_list_item; this.checkboxId = R.id.fragment_formula_editor_datalist_item_checkbox; this.textViewId = R.id.fragment_formula_editor_datalist_item_name_text_view; this.textViewId2 = R.id.fragment_formula_editor_data_list_item_value_text_view; this.linearLayoutGlobalId = R.id.data_global_headline; this.linearLayoutLocalId = R.id.data_local_headline; this.linearLayoutUserListId = R.id.data_user_lists_headline; this.linearLayoutUserVariablesId = R.id.data_user_variables_headline; this.linearLayoutUserListAboveItemId = R.id.data_user_lists_headline_above_item; this.spinnerUserListValuesId = R.id.fragment_formula_editor_data_list_item_spinner; this.linearLayoutUserBrickId = R.id.variablelist_userbrick_headline; } public void setItemLayout(int itemLayout, int textViewId) { this.itemLayout = itemLayout; this.textViewId = textViewId; } @Override public int getCount() { int count = getProjectListsLastIndex(); if (count == 0) { count = 1; } return count; } public int getUserListCount() { return spriteLists.size() + projectLists.size(); } public int getUserVariablesCount() { return getProjectVariablesLastIndex(); } @Override public Object getItem(int position) { if (position < getUserBrickVariablesLastIndex()) { return userBrickVariables.get(position); } else if (position < getSpriteVariablesLastIndex()) { return spriteVariables.get(position - getUserBrickVariablesLastIndex()); } else if (position < getProjectVariablesLastIndex()) { return projectVariables.get(position - getSpriteVariablesLastIndex()); } else if (position < getSpriteListsLastIndex()) { return spriteLists.get(position - getProjectVariablesLastIndex()); } else if (position < getProjectListsLastIndex()) { return projectLists.get(position - getSpriteListsLastIndex()); } return null; } public UserList getUserListItem(int position) { if (position < spriteLists.size()) { return spriteLists.get(position); } else if (position < spriteLists.size() + projectLists.size()) { return projectLists.get(position - spriteLists.size()); } return null; } public UserVariable getUserVariableItem(int position) { if (position < getUserBrickVariablesLastIndex()) { return userBrickVariables.get(position); } else if (position < getSpriteVariablesLastIndex()) { position -= userBrickVariables.size(); return spriteVariables.get(position); } else if (position < getProjectVariablesLastIndex()) { position = position - userBrickVariables.size() - spriteVariables.size(); return projectVariables.get(position); } return null; } @Override public long getItemId(int position) { return position; } public void setOnCheckedChangeListener(OnCheckedChangeListener onCheckedChangeListener) { this.onCheckedChangeListener = onCheckedChangeListener; } public void setOnListItemClickListener(OnListItemClickListener onListItemClickListener) { this.onListItemClickListener = onListItemClickListener; } public View getViewForUserListItem(final int position, View convertView, ViewGroup parent) { return getView(position + spriteVariables.size() + projectVariables.size(), convertView, parent); } @Override public View getView(final int position, View convertView, ViewGroup parent) { View view = convertView; ViewHolder holder; if (spriteLists.isEmpty() && projectLists.isEmpty() && spriteVariables.isEmpty() && projectVariables.isEmpty() && userBrickVariables.isEmpty()) { view = View.inflate(context, itemLayout, null); holder = new ViewHolder(); holder.userListsHeadline = (LinearLayout) view.findViewById(linearLayoutUserListId); holder.userVariablesHeadline = (LinearLayout) view.findViewById(linearLayoutUserVariablesId); holder.userVariablesHeadline.setVisibility(View.VISIBLE); holder.userListsHeadline.setVisibility(View.VISIBLE); LinearLayout linearLayout = (LinearLayout) view.findViewById(R.id.fragment_formula_editor_data_list_item_layout); linearLayout.setVisibility(View.GONE); return view; } String nameOfCurrentDataItem = ""; Object currentDataItem = getItem(position); if (currentDataItem instanceof UserVariable) { nameOfCurrentDataItem = ((UserVariable) currentDataItem).getName(); } else { nameOfCurrentDataItem = ((UserList) currentDataItem).getName(); } if (view == null || !(view.getTag() instanceof ViewHolder)) { view = View.inflate(context, itemLayout, null); holder = new ViewHolder(); holder.checkbox = (CheckBox) view.findViewById(checkboxId); holder.text1 = (TextView) view.findViewById(textViewId); holder.text2 = (TextView) view.findViewById(textViewId2); holder.localHeadline = (LinearLayout) view.findViewById(linearLayoutLocalId); holder.globalHeadline = (LinearLayout) view.findViewById(linearLayoutGlobalId); holder.userListsHeadline = (LinearLayout) view.findViewById(linearLayoutUserListId); holder.userListsHeadlineAboveItem = (LinearLayout) view.findViewById(linearLayoutUserListAboveItemId); holder.userVariablesHeadline = (LinearLayout) view.findViewById(linearLayoutUserVariablesId); holder.userListValuesSpinner = (Spinner) view.findViewById(spinnerUserListValuesId); holder.userbrickHeadline = (LinearLayout) view.findViewById(linearLayoutUserBrickId); view.setTag(holder); } else { holder = (ViewHolder) view.getTag(); } if (holder.text1 != null) { holder.text1.setText(nameOfCurrentDataItem); } if (holder.text2 != null) { if (currentDataItem instanceof UserVariable) { holder.text2.setVisibility(View.VISIBLE); holder.text2.setText(String.valueOf(((UserVariable) currentDataItem).getValue())); } else { holder.text2.setVisibility(View.GONE); } } if (holder.localHeadline != null && holder.globalHeadline != null && holder.userListsHeadline != null && holder.userVariablesHeadline != null) { holder.localHeadline.setVisibility(View.GONE); holder.globalHeadline.setVisibility(View.GONE); holder.userListsHeadline.setVisibility(View.GONE); holder.userVariablesHeadline.setVisibility(View.GONE); holder.userListsHeadlineAboveItem.setVisibility(View.GONE); holder.userbrickHeadline.setVisibility(View.GONE); if (position == 0) { holder.userVariablesHeadline.setVisibility(View.VISIBLE); } int sizeOfVariables = spriteVariables.size() + projectVariables.size() + userBrickVariables.size(); if (sizeOfVariables == 0 && position == 0) { holder.userListsHeadlineAboveItem.setVisibility(View.VISIBLE); } else if (sizeOfVariables != 0 && position == sizeOfVariables - 1) { holder.userListsHeadline.setVisibility(View.VISIBLE); } if (userBrickVariables.size() != 0 && position == 0) { holder.userbrickHeadline.setVisibility(View.VISIBLE); } else if (spriteVariables.size() != 0 && position == getUserBrickVariablesLastIndex()) { holder.localHeadline.setVisibility(View.VISIBLE); } else if (projectVariables.size() != 0 && position == getSpriteVariablesLastIndex()) { holder.globalHeadline.setVisibility(View.VISIBLE); } else if (spriteLists.size() != 0 && position == getProjectVariablesLastIndex()) { holder.localHeadline.setVisibility(View.VISIBLE); } else if (projectLists.size() != 0 && position == getSpriteListsLastIndex()) { holder.globalHeadline.setVisibility(View.VISIBLE); } } if (holder.userListValuesSpinner != null) { if (currentDataItem instanceof UserList) { UserList userList = (UserList) currentDataItem; holder.userListValuesSpinner.setVisibility(view.VISIBLE); List<String> userListEntries = new ArrayList<String>(); for (Object userListItem : userList.getList()) { userListEntries.add(userListItem.toString()); } UserListValuesAdapter userListValuesAdapter = new UserListValuesAdapter(view.getContext(), userListEntries); holder.userListValuesSpinner.setAdapter(userListValuesAdapter); } else { holder.userListValuesSpinner.setVisibility(view.GONE); } } if (onListItemClickListener != null) { view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { onListItemClickListener.onListItemClick(position); } }); } if (holder.checkbox == null) { return view; } view.setClickable(true); view.setFocusable(true); if (selectMode != ListView.CHOICE_MODE_NONE) { holder.checkbox.setVisibility(View.VISIBLE); } else { holder.checkbox.setVisibility(View.GONE); holder.checkbox.setChecked(false); clearCheckedItems(); } holder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { if (selectMode == ListView.CHOICE_MODE_SINGLE) { clearCheckedItems(); } checkedItems.add(position); } else { checkedItems.remove(position); } if (onCheckedChangeListener != null) { onCheckedChangeListener.onCheckedChange(); } notifyDataSetChanged(); } }); if (checkedItems.contains(position)) { holder.checkbox.setChecked(true); } else { holder.checkbox.setChecked(false); } return view; } public View getDropDownViewForUserListItem(final int position, View convertView, ViewGroup parent) { return getDropDownView(position + spriteVariables.size() + projectVariables.size(), convertView, parent); } @Override public View getDropDownView(final int position, View convertView, ViewGroup parent) { String nameOfCurrentDataItem = ""; Object currentDataItem = getItem(position); if (currentDataItem instanceof UserVariable) { nameOfCurrentDataItem = ((UserVariable) currentDataItem).getName(); } else { nameOfCurrentDataItem = ((UserList) currentDataItem).getName(); } View view = convertView; ViewHolder holder; if (view == null) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = inflater.inflate(android.R.layout.simple_spinner_dropdown_item, parent, false); holder = new ViewHolder(); holder.text1 = (TextView) view.findViewById(android.R.id.text1); view.setTag(holder); } else if (view.getTag() instanceof ViewHolder) { holder = (ViewHolder) view.getTag(); } else { holder = new ViewHolder(); holder.text1 = (TextView) view.findViewById(android.R.id.text1); view.setTag(holder); } holder.text1.setText(nameOfCurrentDataItem); return view; } @Override public void setSelectMode(int selectMode) { this.selectMode = selectMode; } @Override public int getSelectMode() { return selectMode; } @Override public void setShowDetails(boolean showDetails) { } @Override public boolean getShowDetails() { return false; } @Override public int getAmountOfCheckedItems() { return checkedItems.size(); } @Override public SortedSet<Integer> getCheckedItems() { return checkedItems; } public List<UserList> getCheckedUserLists() { List<UserList> userLists = new ArrayList<>(); for (int pos : getCheckedItems()) { Object checkedItem = getItem(pos); if (checkedItem instanceof UserList) { userLists.add((UserList) checkedItem); } } return userLists; } public List<UserVariable> getCheckedUserVariables() { List<UserVariable> userVariables = new ArrayList<>(); if (getCheckedItems().size() == 0) { return userVariables; } for (int pos : getCheckedItems()) { Object checkedItem = getItem(pos); if (checkedItem instanceof UserVariable) { userVariables.add((UserVariable) checkedItem); } } return userVariables; } public int getPositionOfUserListItem(UserList userList) { for (int index = 0; index < getUserListCount(); index++) { if (((UserList) getItem(spriteVariables.size() + projectVariables.size() + index)).getName().equals(userList.getName())) { return index; } } return -1; } public int getPositionOfUserVariableItem(UserVariable userVariable) { if (userVariable == null) { return -1; } for (int index = 0; index < getUserVariablesCount(); index++) { if (((UserVariable) getItem(index)).getName().equals(userVariable.getName())) { return index; } } return -1; } public void addCheckedItem(int position) { checkedItems.add(position); } @Override public void clearCheckedItems() { checkedItems.clear(); } public int getUserBrickVariablesLastIndex() { return userBrickVariables.size(); } public int getSpriteVariablesLastIndex() { return getUserBrickVariablesLastIndex() + spriteVariables.size(); } public int getProjectVariablesLastIndex() { return getSpriteVariablesLastIndex() + projectVariables.size(); } public int getSpriteListsLastIndex() { return getProjectVariablesLastIndex() + spriteLists.size(); } public int getProjectListsLastIndex() { return getSpriteListsLastIndex() + projectLists.size(); } public interface OnCheckedChangeListener { void onCheckedChange(); } public interface OnListItemClickListener { void onListItemClick(int position); } }