// -*- mode: java; c-basic-offset: 2; -*- // Copyright 2009-2011 Google, All Rights reserved // Copyright 2011-2012 MIT, All rights reserved // Released under the Apache License, Version 2.0 // http://www.apache.org/licenses/LICENSE-2.0 package com.google.appinventor.client.explorer.commands; import com.google.appinventor.client.Ode; import com.google.appinventor.client.OdeAsyncCallback; import com.google.appinventor.client.explorer.project.Project; import static com.google.appinventor.client.Ode.MESSAGES; import com.google.appinventor.shared.rpc.project.ProjectNode; import com.google.appinventor.shared.rpc.project.youngandroid.YoungAndroidBlocksNode; import com.google.appinventor.shared.rpc.project.youngandroid.YoungAndroidFormNode; import com.google.appinventor.shared.rpc.project.youngandroid.YoungAndroidSourceNode; import com.google.appinventor.shared.rpc.project.youngandroid.YoungAndroidYailNode; import com.google.gwt.user.client.Window; /** * Command for deleting files. * */ public class DeleteFileCommand extends ChainableCommand { /** * Creates a new command for deleting a file. */ public DeleteFileCommand() { super(null); // no next command } @Override public boolean willCallExecuteNextCommand() { return true; } @Override public void execute(final ProjectNode node) { if (deleteConfirmation()) { final Ode ode = Ode.getInstance(); if (node instanceof YoungAndroidSourceNode) { // node could be either a YoungAndroidFormNode or a YoungAndroidBlocksNode. // Before we delete the form, we need to close both the form editor and the blocks editor // (in the browser). final String qualifiedFormName = ((YoungAndroidSourceNode) node).getQualifiedName(); final String formFileId = YoungAndroidFormNode.getFormFileId(qualifiedFormName); final String blocksFileId = YoungAndroidBlocksNode.getBlocklyFileId(qualifiedFormName); final String yailFileId = YoungAndroidYailNode.getYailFileId(qualifiedFormName); final long projectId = node.getProjectId(); String fileIds[] = new String[2]; fileIds[0] = formFileId; fileIds[1] = blocksFileId; ode.getEditorManager().closeFileEditors(projectId, fileIds); // When we tell the project service to delete either the form (.scm) file or the blocks // (.bky) file, it will delete both of them, and also the yail (.yail) file. ode.getProjectService().deleteFile(ode.getSessionId(), projectId, node.getFileId(), new OdeAsyncCallback<Long>( // message on failure MESSAGES.deleteFileError()) { @Override public void onSuccess(Long date) { // Remove all related nodes (form, blocks, yail) from the project. Project project = getProject(node); for (ProjectNode sourceNode : node.getProjectRoot().getAllSourceNodes()) { if (sourceNode.getFileId().equals(formFileId) || sourceNode.getFileId().equals(blocksFileId) || sourceNode.getFileId().equals(yailFileId)) { project.deleteNode(sourceNode); } } ode.getDesignToolbar().removeScreen(project.getProjectId(), ((YoungAndroidSourceNode) node).getFormName()); ode.updateModificationDate(projectId, date); executeNextCommand(node); } @Override public void onFailure(Throwable caught) { super.onFailure(caught); executionFailedOrCanceled(); } }); } else { // asset file ode.getProjectService().deleteFile(ode.getSessionId(), node.getProjectId(), node.getFileId(), new OdeAsyncCallback<Long>( // message on failure MESSAGES.deleteFileError()) { @Override public void onSuccess(Long date) { getProject(node).deleteNode(node); ode.updateModificationDate(node.getProjectId(), date); executeNextCommand(node); } @Override public void onFailure(Throwable caught) { super.onFailure(caught); executionFailedOrCanceled(); } }); } } else { executionFailedOrCanceled(); } } /** * Shows a confirmation dialog. * * @return {@code true} if the delete file command should be executed or * {@code false} if it should be canceled */ protected boolean deleteConfirmation() { return Window.confirm(MESSAGES.reallyDeleteFile()); } }