package ru.khasang.cachoeira.commands.project; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import ru.khasang.cachoeira.commands.Command; import ru.khasang.cachoeira.model.IDependentTask; import ru.khasang.cachoeira.model.IProject; import ru.khasang.cachoeira.model.IResource; import ru.khasang.cachoeira.model.ITask; import java.util.HashMap; public class RemoveTaskFromProjectCommand implements Command { private final IProject project; private final ITask task; private int index; private ObservableList<IDependentTask> oldParentTasks; private ObservableList<IDependentTask> oldChildTasks; private ObservableList<IResource> oldResourceList; private HashMap<ITask, IDependentTask> parentTaskHashMap; private HashMap<ITask, IDependentTask> childTaskHashMap; public RemoveTaskFromProjectCommand(IProject project, ITask task) { this.project = project; this.task = task; } @Override public void execute() { index = project.getTaskList().indexOf(task); oldParentTasks = FXCollections.observableArrayList(task.getParentTasks()); oldChildTasks = FXCollections.observableArrayList(task.getChildTasks()); oldResourceList = FXCollections.observableArrayList(task.getResourceList()); parentTaskHashMap = new HashMap<>(getTaskParentDependencies(project.getTaskList())); childTaskHashMap = new HashMap<>(getTaskChildDependencies(project.getTaskList())); // Удаляем все связи с этой задачей task.getParentTasks().stream() .forEach(parentTask -> parentTask.getTask().getChildTasks() .removeIf(childTask -> childTask.getTask().equals(task))); task.getChildTasks().stream() .forEach(childTask -> childTask.getTask().getParentTasks() .removeIf(parentTask -> parentTask.getTask().equals(task))); // Вычищяем все задачи из списка предшествующих задач task.getParentTasks().clear(); // Вычищаем все задачи из списка последующих задач task.getChildTasks().clear(); // Вычищяем все ресурсы из списка привязанных ресурсов task.getResourceList().clear(); // Удаляем эту задачу project.getTaskList().remove(index); } private HashMap<ITask, IDependentTask> getTaskParentDependencies(ObservableList<ITask> taskObservableList) { HashMap<ITask, IDependentTask> hashMap = new HashMap<>(); for (ITask iTask : taskObservableList) { for (IDependentTask parentTask : iTask.getParentTasks()) { if (parentTask.getTask().equals(task)) { hashMap.put(iTask, parentTask); } } } return hashMap; } private HashMap<ITask, IDependentTask> getTaskChildDependencies(ObservableList<ITask> taskObservableList) { HashMap<ITask, IDependentTask> hashMap = new HashMap<>(); for (ITask iTask : taskObservableList) { for (IDependentTask childTask : iTask.getChildTasks()) { if (childTask.getTask().equals(task)) { hashMap.put(iTask, childTask); } } } return hashMap; } @Override public void undo() { task.getResourceList().addAll(oldResourceList); task.getParentTasks().addAll(oldParentTasks); task.getChildTasks().addAll(oldChildTasks); project.getTaskList().add(index, task); // Восстанавливаем связи for (ITask iTask : parentTaskHashMap.keySet()) { iTask.getParentTasks().add(parentTaskHashMap.get(iTask)); } for (ITask iTask : childTaskHashMap.keySet()) { iTask.getChildTasks().add(childTaskHashMap.get(iTask)); } } }