Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Trash refactor #3342

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -1820,13 +1820,20 @@ public interface OdeMessages extends Messages, ComponentTranslations {
@Description("Confirmation message for selecting multiple projects and clicking delete")
String confirmDeleteManyProjects(String projectNames);

@DefaultMessage("Are you sure you want to move these projects to trash: {0}?")
@DefaultMessage("Are you sure you want to move these items to trash? {0}")
@Description("Confirmation message for selecting multiple projects and clicking trash")
String confirmMoveToTrash(String projectNames);
@DefaultMessage("Are you sure you want to delete these items permanently? {0}")
@Description("Confirmation message for selecting multiple projects in trash and clicking delete")
String confirmDeleteForever(String projectNames);

@DefaultMessage("Are you sure you want to move {0} projects to trash?")
@Description("Confirmation message deleting large number of selected projects")
String confirmMoveToTrashCount(String projectNames);
@DefaultMessage("Projects: {0}")
@Description("Information on selected projects for delete/trash confirmation")
String confirmTrashDeleteProjects(String projectNames);

@DefaultMessage("Folders: {0}")
@Description("Information on selected folders for delete/trash confirmation")
String confirmTrashDeleteFolders(String folderNames);

@DefaultMessage("Server error: could not delete project. Please try again later!")
@Description("Error message reported when deleting a project failed on the server.")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,33 +25,32 @@ public void execute() {
@Override
public void execute() {
if (Ode.getInstance().getCurrentView() == Ode.PROJECTS) {
List<Project> selectedProjects =
ProjectListBox.getProjectListBox().getProjectList().getSelectedProjects();
List<Project> selectedProjects = ProjectListBox.getProjectListBox().getProjectList()
.getSelectedProjects();
List<ProjectFolder> selectedFolders = ProjectListBox.getProjectListBox().getProjectList().getSelectedFolders();
if (selectedProjects.size() > 0 || selectedFolders.size() > 0) {
List<Project> projectsToDelete = selectedProjects;
if (!selectedProjects.isEmpty() || !selectedFolders.isEmpty()) {
List<Project> projectsToDelete = new ArrayList<>(selectedProjects);
List<ProjectFolder> foldersToDelete = new ArrayList<>(selectedFolders);
for (ProjectFolder f : selectedFolders) {
projectsToDelete.addAll(f.getNestedProjects());
foldersToDelete.addAll(f.getNestedFolders());
}
// Show one confirmation window for selected projects.
if (deleteConfirmation(projectsToDelete)) {
for (Project project : projectsToDelete) {
project.moveToTrash();
}
for (ProjectFolder f : selectedFolders) {
f.getParentFolder().removeChildFolder(f);
}
if (deleteConfirmation(true, projectsToDelete, foldersToDelete)) {
Ode.getInstance().getFolderManager().moveItemsToFolder(selectedProjects, selectedFolders,
Ode.getInstance().getFolderManager().getTrashFolder());
Ode.getInstance().getFolderManager().saveAllFolders();
}
} else {
// The user can select a project to resolve the
// error.
ErrorReporter.reportInfo(MESSAGES.noProjectSelectedForDelete());
}
} else { //We are deleting a project in the designer view
List<Project> selectedProjects = new ArrayList<Project>();
List<Project> selectedProjects = new ArrayList<>();
Project currentProject = Ode.getInstance().getProjectManager().getProject(Ode.getInstance().getCurrentYoungAndroidProjectId());
selectedProjects.add(currentProject);
if (deleteConfirmation(selectedProjects)) {
if (deleteConfirmation(true, selectedProjects, new ArrayList<>())) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It might be better to use Collections.emptyList() if GWT supports it in order to not have to result a new list every time this gets called.

currentProject.moveToTrash();
//Add the command to stop this current project from saving
}
Expand All @@ -62,21 +61,46 @@ public void execute() {
}


private boolean deleteConfirmation(List<Project> projects) {
String message;
if (projects.size() == 1) {
public static boolean deleteConfirmation(boolean toTrash, List<Project> projects, List<ProjectFolder> folders) {
String message = "";
if (toTrash && projects.size() == 1 && folders.isEmpty()) {
message = MESSAGES.confirmMoveToTrashSingleProject(projects.get(0).getProjectName());
} else if (projects.size() < 10) {
StringBuilder sb = new StringBuilder();
String separator = "";
for (Project project : projects) {
sb.append(separator).append(project.getProjectName());
separator = ", ";
}
String projectNames = sb.toString();
message = MESSAGES.confirmMoveToTrash(projectNames);
} else {
message = MESSAGES.confirmMoveToTrashCount(Integer.toString(projects.size()));
String projMsg = "";
String folderMsg = "";
if (projects.isEmpty()) {
projMsg = "";
} else if (projects.size() < 10) {
StringBuilder sb = new StringBuilder();
String separator = "";
for (Project project : projects) {
sb.append(separator).append(project.getProjectName());
separator = ", ";
}
String projectNames = sb.toString();
projMsg = "\n " +MESSAGES.confirmTrashDeleteProjects(projectNames);
} else {
projMsg = "\n " +MESSAGES.confirmTrashDeleteFolders(Integer.toString(projects.size()));
}
if (folders.isEmpty()) {
folderMsg = "";
} else if (folders.size() < 10) {
StringBuilder sb = new StringBuilder();
String separator = "";
for (ProjectFolder folder : folders) {
sb.append(separator).append(folder.getName());
separator = ", ";
}
String folderNames = sb.toString();
folderMsg = "\n " + MESSAGES.confirmTrashDeleteFolders(folderNames);
} else {
folderMsg = "\n " + MESSAGES.confirmTrashDeleteFolders(Integer.toString(folders.size()));
}
if (toTrash) {
message = MESSAGES.confirmMoveToTrash(projMsg + folderMsg);
} else {
message = MESSAGES.confirmDeleteForever(projMsg + folderMsg);
}
}
return Window.confirm(message);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,12 @@
import com.google.appinventor.client.ErrorReporter;
import com.google.appinventor.client.Ode;
import com.google.appinventor.client.boxes.ProjectListBox;
import com.google.appinventor.client.explorer.folder.ProjectFolder;
import com.google.appinventor.client.explorer.project.Project;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.Window;

import java.util.ArrayList;
import java.util.List;

public class DeleteForeverProjectAction implements Command {
Expand All @@ -23,15 +26,27 @@ public void execute() {
@Override
public void execute() {
if (Ode.getInstance().getCurrentView() == Ode.TRASHCAN) {
List<Project> deletedProjects = ProjectListBox.getProjectListBox().getProjectList()
List<Project> selectedProjects = ProjectListBox.getProjectListBox().getProjectList()
.getSelectedProjects();
if (deletedProjects.size() > 0) {
List<ProjectFolder> selectedFolders = ProjectListBox.getProjectListBox().getProjectList()
.getSelectedFolders();
if (!selectedProjects.isEmpty() || !selectedFolders.isEmpty()) {
List<Project> projectsToDelete = new ArrayList<>(selectedProjects);
List<ProjectFolder> foldersToDelete = new ArrayList<>(selectedFolders);
for (ProjectFolder f : selectedFolders) {
projectsToDelete.addAll(f.getNestedProjects());
foldersToDelete.addAll(f.getNestedFolders());
}
// Show one confirmation window for selected projects.
if (deleteConfirmation(deletedProjects)) {
for (Project project : deletedProjects) {
if (DeleteAction.deleteConfirmation(false, projectsToDelete, foldersToDelete)) {
for (Project project : selectedProjects) {
project.deleteFromTrash();
}
for (ProjectFolder folder : selectedFolders) {
folder.deleteFromTrash();
}
}
Ode.getInstance().getFolderManager().saveAllFolders();
Ode.getInstance().switchToTrash();
} else {
// The user can select a project to resolve the
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import com.google.appinventor.client.ErrorReporter;
import com.google.appinventor.client.Ode;
import com.google.appinventor.client.boxes.ProjectListBox;
import com.google.appinventor.client.explorer.folder.ProjectFolder;
import com.google.appinventor.client.explorer.project.Project;
import com.google.gwt.user.client.Command;

Expand All @@ -22,10 +23,11 @@ public void execute() {
if (Ode.getInstance().getCurrentView() == Ode.TRASHCAN) {
List<Project> selectedProjects = ProjectListBox.getProjectListBox().getProjectList()
.getSelectedProjects();
if (selectedProjects.size() > 0) {
for (Project project : selectedProjects) {
project.restoreFromTrash();
}
List<ProjectFolder> selectedFolders = ProjectListBox.getProjectListBox().getProjectList()
.getSelectedFolders();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Indentation should just be +4 here.

if (!selectedProjects.isEmpty() || !selectedFolders.isEmpty()) {
Ode.getInstance().getFolderManager().moveItemsToFolder(selectedProjects, selectedFolders,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You could cache the call to Ode.getInstance() and reuse it.

Ode.getInstance().getFolderManager().getGlobalFolder());
Ode.getInstance().switchToTrash();
} else {
// The user can select a project to resolve the
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -282,7 +282,7 @@ public List<Project> getVisibleProjects(boolean onlySelected) {
}

public boolean containsAnyProjects() {
if (projectListItems.size() > 0) {
if (!projectListItems.isEmpty()) {
return true;
} else if (hasChildFolders()) {
for (ProjectFolder f : folders.values()) {
Expand All @@ -294,6 +294,26 @@ public boolean containsAnyProjects() {
return false;
}

public boolean isInTrash() {
if (parent == null || parent == Ode.getInstance().getFolderManager().getGlobalFolder()) {
return false;
} else if (parent == Ode.getInstance().getFolderManager().getTrashFolder()) {
return true;
} else {
return parent.isInTrash();
}
}

public void deleteFromTrash() {
for (Project project : projects) {
project.deleteFromTrash();
}
for (ProjectFolder folder : getChildFolders()) {
folder.deleteFromTrash();
}
parent.removeChildFolder(this);
}

public List<ProjectFolder> getSelectedFolders() {
return getSelectableFolders(true);
}
Expand Down Expand Up @@ -356,6 +376,15 @@ public List<ProjectFolder> getChildFolders() {
return Arrays.asList(folders.values().toArray(new ProjectFolder[0]));
}

public List<ProjectFolder> getNestedFolders() {
List<ProjectFolder> flist = new ArrayList<>();
flist.addAll(getChildFolders());
for (ProjectFolder child : getChildFolders()) {
flist.addAll(child.getNestedFolders());
}
return flist;
}

public boolean hasChildFolders() {
return !folders.isEmpty();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -242,29 +242,11 @@ public void moveToTrash() {
public void onSuccess(UserProject project) {
if (project.getProjectId() == projectInfo.getProjectId()) {
projectInfo.moveToTrash();
Ode.getInstance().getProjectManager().trashProject(getProjectId());
}
}
});
}

public void restoreFromTrash() {
Tracking.trackEvent(Tracking.PROJECT_EVENT,
Tracking.PROJECT_ACTION_RESTORE_PROJECT_YA, getProjectName());
Ode.getInstance().getProjectService().restoreProject(getProjectId(),
new OdeAsyncCallback<UserProject>(
// failure message
MESSAGES.restoreProjectError()) {
@Override
public void onSuccess(UserProject project) {
if (project.getProjectId() == projectInfo.getProjectId()) {
projectInfo.restoreFromTrash();
Ode.getInstance().getProjectManager().restoreTrashProject(getProjectId());
}
}
});
}

public void deleteFromTrash() {
Tracking.trackEvent(Tracking.PROJECT_EVENT,
Tracking.PROJECT_ACTION_DELETE_PROJECT_YA, getProjectName());
Expand All @@ -278,7 +260,12 @@ public void onSuccess(Void result) {
}

public boolean isInTrash() {
return projectInfo.isInTrash();
if (homeFolder == null || homeFolder == Ode.getInstance().getFolderManager().getGlobalFolder()) {
return false;
} else if (homeFolder == Ode.getInstance().getFolderManager().getTrashFolder()) {
return true;
}
return homeFolder.isInTrash();
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -164,24 +164,7 @@ public Project addProject(UserProject projectInfo) {
*/

public void removeDeletedProject(long projectId) {
Project project = projectsMap.remove(projectId);
fireProjectDeleted(project);
}

/**
* Restores the project from trash back to my projects.
*
* @param projectId project ID
*/

public void restoreTrashProject(long projectId) {
Project project = projectsMap.get(projectId);
fireTrashProjectRestored(project);
}

public void trashProject(long projectId) {
Project project = projectsMap.get(projectId);
fireProjectTrashed(project);
projectsMap.remove(projectId);
}

/**
Expand Down Expand Up @@ -219,27 +202,6 @@ private void fireProjectAdded(Project project) {
}
}

/*
* Triggers a 'project removed' event to be sent to the listener on the listener list.
*/
private void fireTrashProjectRestored(Project project) {
for (ProjectManagerEventListener listener : copyProjectManagerEventListeners()) {
listener.onTrashProjectRestored(project);
}
}

private void fireProjectTrashed(Project project) {
for (ProjectManagerEventListener listener : copyProjectManagerEventListeners()) {
listener.onProjectTrashed(project);
}
}

private void fireProjectDeleted(Project project) {
for (ProjectManagerEventListener listener : copyProjectManagerEventListeners()) {
listener.onProjectDeleted(project);
}
}

public boolean isProjectInTrash(long projectId) {
Project project = projectsMap.get(projectId);
return project != null && project.isInTrash();
Expand Down
Loading