package ru.khasang.cachoeira.viewcontroller.contextmenus;
import javafx.collections.ObservableList;
import javafx.scene.control.CheckMenuItem;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuItem;
import ru.khasang.cachoeira.commands.project.RemoveResourceFromProjectCommand;
import ru.khasang.cachoeira.commands.task.AddResourceToTaskCommand;
import ru.khasang.cachoeira.commands.task.RemoveResourceFromTaskCommand;
import ru.khasang.cachoeira.model.IProject;
import ru.khasang.cachoeira.model.IResource;
import ru.khasang.cachoeira.model.ITask;
import ru.khasang.cachoeira.viewcontroller.MainWindowController;
/**
* Класс описывает контекстное меню всплывающее при нажатии правой кнопкой на ресурсе.
*/
public class ResourceContextMenu extends ContextMenu {
private final IProject project;
private final IResource resource;
private final MainWindowController controller;
public ResourceContextMenu(IProject project, IResource resource, MainWindowController controller) {
this.project = project;
this.resource = resource;
this.controller = controller;
}
public void initMenus() {
this.getItems().clear();
Menu assignTaskMenu = new Menu("Assign Task");
MenuItem removeResourceMenuItem = new MenuItem("Remove Resource");
removeResourceMenuItem.setOnAction(event -> controller.getCommandExecutor().execute(
new RemoveResourceFromProjectCommand(project, resource)));
this.getItems().addAll(assignTaskMenu, removeResourceMenuItem); //заполняем меню
this.setOnShowing(event -> refreshTaskMenu(assignTaskMenu.getItems(), resource, project.getTaskList()));
}
private void refreshTaskMenu(ObservableList<MenuItem> menuItemList,
IResource currentRowResource,
ObservableList<ITask> taskList) {
menuItemList.clear();
for (ITask task : taskList) {
CheckMenuItem checkMenuItem = new CheckMenuItem(task.getName());
task.getResourceList()
.stream()
.filter(resource -> resource.equals(currentRowResource) && !checkMenuItem.isSelected())
.forEach(resource -> checkMenuItem.setSelected(true));
checkMenuItem.setOnAction(event -> {
if (checkMenuItem.isSelected()) {
controller.getCommandExecutor().execute(new AddResourceToTaskCommand(task, currentRowResource));
} else {
controller.getCommandExecutor().execute(new RemoveResourceFromTaskCommand(task, currentRowResource));
}
});
menuItemList.add(checkMenuItem);
}
}
}