/*
* 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.controller;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.res.Resources;
import org.catrobat.catroid.ProjectManager;
import org.catrobat.catroid.R;
import org.catrobat.catroid.common.LookData;
import org.catrobat.catroid.common.SoundInfo;
import org.catrobat.catroid.content.Script;
import org.catrobat.catroid.content.Sprite;
import org.catrobat.catroid.content.bricks.Brick;
import org.catrobat.catroid.content.bricks.PlaySoundBrick;
import org.catrobat.catroid.content.bricks.SetLookBrick;
import org.catrobat.catroid.ui.dialogs.CustomAlertDialogBuilder;
import org.catrobat.catroid.utils.Utils;
import java.util.List;
public final class BackPackSpriteController {
private static final BackPackSpriteController INSTANCE = new BackPackSpriteController();
private OnBackpackSpriteCompleteListener onBackpackSpriteCompleteListener;
private BackPackSpriteController() {
}
public static BackPackSpriteController getInstance() {
return INSTANCE;
}
public boolean checkSpriteReplaceInBackpack(List<Sprite> currentSpriteList) {
for (Sprite sprite : currentSpriteList) {
if (checkSpriteReplaceInBackpack(sprite)) {
return true;
}
}
return false;
}
private boolean checkSpriteReplaceInBackpack(Sprite currentSprite) {
return BackPackListManager.getInstance().backPackedSpritesContains(currentSprite, true);
}
public void showBackPackReplaceDialog(final List<Sprite> currentSpriteList, final Context context) {
Resources resources = context.getResources();
String replaceLookMessage = resources.getString(R.string.backpack_replace_object_multiple);
AlertDialog dialog = new CustomAlertDialogBuilder(context)
.setTitle(R.string.backpack)
.setMessage(replaceLookMessage)
.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
for (Sprite currentSprite : currentSpriteList) {
backpackVisibleSprite(currentSprite);
}
onBackpackSpriteCompleteListener.onBackpackSpriteComplete(true);
dialog.dismiss();
}
}).setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
onBackpackSpriteCompleteListener.onBackpackSpriteComplete(false);
dialog.dismiss();
}
}).create();
dialog.setCanceledOnTouchOutside(true);
dialog.show();
}
public void showBackPackReplaceDialog(final Sprite currentSprite, final Context context) {
Resources resources = context.getResources();
String replaceLookMessage = resources.getString(R.string.backpack_replace_object, currentSprite.getName());
AlertDialog dialog = new CustomAlertDialogBuilder(context)
.setTitle(R.string.backpack)
.setMessage(replaceLookMessage)
.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
backpackVisibleSprite(currentSprite);
onBackpackSpriteCompleteListener.onBackpackSpriteComplete(true);
dialog.dismiss();
}
}).setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
}).create();
dialog.setCanceledOnTouchOutside(true);
dialog.show();
}
public void backpackVisibleSprite(Sprite spriteToEdit) {
String spriteName = spriteToEdit.getName();
BackPackListManager.getInstance().removeItemFromSpriteBackPackByName(spriteName);
Sprite backPackSprite = backpack(spriteToEdit);
BackPackListManager.getInstance().addSpriteToBackPack(backPackSprite);
}
public Sprite backpackHiddenSprite(Sprite spriteToEdit) {
if (BackPackListManager.getInstance().backPackedSpritesContains(spriteToEdit, false)) {
return spriteToEdit;
}
Sprite backPackSprite = backpack(spriteToEdit);
BackPackListManager.getInstance().addSpriteToHiddenBackpack(backPackSprite);
return backPackSprite;
}
public Sprite backpack(Sprite spriteToEdit) {
ProjectManager.getInstance().setCurrentSprite(spriteToEdit);
Sprite backPackSprite = spriteToEdit.cloneForBackPack();
String newSpriteName = Utils.getUniqueSpriteName(spriteToEdit);
backPackSprite.setName(newSpriteName);
backPackSprite.isBackpackObject = true;
for (LookData lookData : spriteToEdit.getLookDataList()) {
if (!lookDataIsUsedInScript(lookData, ProjectManager.getInstance().getCurrentSprite())) {
backPackSprite.getLookDataList().add(LookController.getInstance().backPackHiddenLook(lookData));
}
}
for (SoundInfo soundInfo : spriteToEdit.getSoundList()) {
if (!soundInfoIsUsedInScript(soundInfo, ProjectManager.getInstance().getCurrentSprite())) {
backPackSprite.getSoundList().add(SoundController.getInstance().backPackHiddenSound(soundInfo));
}
}
List<Script> backPackedScripts = BackPackScriptController.getInstance().backpack(backPackSprite.getName(),
spriteToEdit.getListWithAllBricks(), true, spriteToEdit);
if (backPackedScripts != null && !backPackedScripts.isEmpty()) {
backPackSprite.getScriptList().addAll(backPackedScripts);
}
return backPackSprite;
}
public Sprite unpack(Sprite selectedSprite, boolean delete, boolean keepCurrentSprite, boolean
fromHiddenBackPack, boolean asBackground) {
if (fromHiddenBackPack && ProjectManager.getInstance().getCurrentScene().containsSprite(selectedSprite)) {
return selectedSprite;
}
Sprite unpackedSprite = selectedSprite.cloneForBackPack();
String newSpriteName = Utils.getUniqueSpriteName(selectedSprite);
unpackedSprite.setName(newSpriteName);
Sprite currentSprite = ProjectManager.getInstance().getCurrentSprite();
ProjectManager.getInstance().setCurrentSprite(unpackedSprite);
for (LookData lookData : selectedSprite.getLookDataList()) {
if (!lookDataIsUsedInScript(lookData, selectedSprite)) {
LookController.getInstance().unpack(lookData, delete, true);
}
}
for (SoundInfo soundInfo : selectedSprite.getSoundList()) {
if (!soundInfoIsUsedInScript(soundInfo, selectedSprite)) {
SoundController.getInstance().unpack(soundInfo, delete, true);
}
}
BackPackScriptController.getInstance().unpack(selectedSprite.getName(), delete, false, null, true);
selectedSprite.setUserAndVariableBrickReferences(unpackedSprite, unpackedSprite.getUserBrickList());
if (asBackground) {
ProjectManager.getInstance().getCurrentScene().replaceBackgroundSprite(unpackedSprite);
} else {
ProjectManager.getInstance().addSprite(unpackedSprite);
}
if (keepCurrentSprite) {
ProjectManager.getInstance().setCurrentSprite(currentSprite);
} else {
ProjectManager.getInstance().setCurrentSprite(unpackedSprite);
}
if (delete) {
if (fromHiddenBackPack) {
BackPackListManager.getInstance().removeItemFromSpriteHiddenBackpack(selectedSprite);
} else {
BackPackListManager.getInstance().removeItemFromSpriteBackPack(selectedSprite);
}
}
return unpackedSprite;
}
private boolean lookDataIsUsedInScript(LookData lookData, Sprite sprite) {
for (Brick brick : sprite.getListWithAllBricks()) {
if (brick instanceof SetLookBrick && ((SetLookBrick) brick).getLook().equals(lookData)) {
return true;
}
}
return false;
}
private boolean soundInfoIsUsedInScript(SoundInfo soundInfo, Sprite sprite) {
for (Brick brick : sprite.getListWithAllBricks()) {
if (brick instanceof PlaySoundBrick && ((PlaySoundBrick) brick).getSound().equals(soundInfo)) {
return true;
}
}
return false;
}
public void setOnBackpackSpriteCompleteListener(OnBackpackSpriteCompleteListener listener) {
onBackpackSpriteCompleteListener = listener;
}
public interface OnBackpackSpriteCompleteListener {
void onBackpackSpriteComplete(boolean startBackpackActivity);
}
}