/* * 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.content.bricks; import android.widget.Spinner; import com.thoughtworks.xstream.annotations.XStreamOmitField; import org.catrobat.catroid.ProjectManager; import org.catrobat.catroid.R; import org.catrobat.catroid.content.Scene; import org.catrobat.catroid.content.Sprite; import org.catrobat.catroid.formulaeditor.DataContainer; import org.catrobat.catroid.formulaeditor.UserList; import org.catrobat.catroid.ui.adapter.UserListAdapterWrapper; import org.catrobat.catroid.ui.dialogs.NewDataDialog; public abstract class UserListBrick extends FormulaBrick implements NewDataDialog.NewUserListDialogListener { protected UserList userList; @XStreamOmitField protected BackPackedListData backPackedData; private void updateUserListIfDeleted(UserListAdapterWrapper userListAdapterWrapper) { if (userList != null && (userListAdapterWrapper.getPositionOfItem(userList) == 0)) { userList = null; } } protected void setSpinnerSelection(Spinner userListSpinner, UserList newUserList) { UserListAdapterWrapper userListAdapterWrapper = (UserListAdapterWrapper) userListSpinner.getAdapter(); updateUserListIfDeleted(userListAdapterWrapper); if (userList != null) { userListSpinner.setSelection(userListAdapterWrapper.getPositionOfItem(userList), true); } else if (newUserList != null) { userListSpinner.setSelection(userListAdapterWrapper.getPositionOfItem(newUserList), true); userList = newUserList; } else { userListSpinner.setSelection(userListAdapterWrapper.getCount() - 1, true); userList = userListAdapterWrapper.getItem(userListAdapterWrapper.getCount() - 1); } } @Override public void onFinishNewUserListDialog(Spinner spinnerToUpdate, UserList newUserList) { UserListAdapterWrapper userListAdapterWrapper = ((UserListAdapterWrapper) spinnerToUpdate.getAdapter()); userListAdapterWrapper.notifyDataSetChanged(); setSpinnerSelection(spinnerToUpdate, newUserList); for (Brick brick : ProjectManager.getInstance().getCurrentSprite().getAllBricks()) { if (brick instanceof UserListBrick && ((UserListBrick) brick).getUserList() == null) { if (brick instanceof AddItemToUserListBrick) { Spinner spinner = (Spinner) ((AddItemToUserListBrick) brick).view.findViewById(R.id .add_item_to_userlist_spinner); setSpinnerSelection(spinner, newUserList); } else if (brick instanceof ReplaceItemInUserListBrick) { Spinner spinner = (Spinner) ((ReplaceItemInUserListBrick) brick).view.findViewById(R.id .replace_item_in_userlist_spinner); setSpinnerSelection(spinner, newUserList); } else if (brick instanceof InsertItemIntoUserListBrick) { Spinner spinner = (Spinner) ((InsertItemIntoUserListBrick) brick).view.findViewById(R.id .insert_item_into_userlist_spinner); setSpinnerSelection(spinner, newUserList); } else if (brick instanceof DeleteItemOfUserListBrick) { Spinner spinner = (Spinner) ((DeleteItemOfUserListBrick) brick).view.findViewById(R.id .delete_item_of_userlist_spinner); setSpinnerSelection(spinner, newUserList); } } } } @Override public int getRequiredResources() { return NO_RESOURCES; } public UserList getUserList() { return userList; } public void setUserList(UserList userList) { this.userList = userList; } public BackPackedListData getBackPackedData() { return backPackedData; } public void setBackPackedData(BackPackedListData backPackedData) { this.backPackedData = backPackedData; } void updateUserListReference(Scene into, Scene from) { UserList list; if (from.existProjectList(userList)) { list = into.getProjectListWithName(userList.getName()); if (list == null) { list = into.getDataContainer().addProjectUserList(userList.getName()); } } else { Sprite sprite = from.getSpriteByUserList(userList); if (sprite == null || !from.existSpriteList(userList, sprite)) { return; } list = into.getDataContainer().addSpriteListIfDoesNotExist(userList.getName(), into.getSpriteBySpriteName(sprite.getName())); } if (list != null) { userList = list; } } @Override public boolean isEqualBrick(Brick brick, Scene mergeResult, Scene current) { if (!super.isEqualBrick(brick, mergeResult, current)) { return false; } UserList first = this.getUserList(); UserList second = ((UserListBrick) brick).getUserList(); if (!first.getName().equals(second.getName())) { return false; } boolean firstIsProjectVariable = mergeResult.getDataContainer().existProjectList(first); boolean secondIsProjectVariable = current.getDataContainer().existProjectList(second); if ((firstIsProjectVariable && secondIsProjectVariable) || (!firstIsProjectVariable && !secondIsProjectVariable)) { return true; } return false; } @Override public void storeDataForBackPack(Sprite sprite) { Scene currentScene = ProjectManager.getInstance().getCurrentScene(); Integer type = DataContainer.USER_DATA_EMPTY; if (userList != null) { type = currentScene.getDataContainer() .getTypeOfUserList(getUserList().getName(), ProjectManager .getInstance().getCurrentSprite()); } if (backPackedData == null) { backPackedData = new BackPackedListData(); } backPackedData.userList = userList; backPackedData.userListType = type; } }