package ru.khasang.cachoeira.viewcontroller.mainwindowcontrollers.propertiesmodules; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.scene.control.cell.ComboBoxTableCell; import ru.khasang.cachoeira.model.ITask; import ru.khasang.cachoeira.model.TaskDependencyType; import ru.khasang.cachoeira.viewcontroller.MainWindowController; import ru.khasang.cachoeira.viewcontroller.contextmenus.ParentTaskContextMenu; import ru.khasang.cachoeira.view.mainwindow.properties.modules.IModule; import ru.khasang.cachoeira.view.mainwindow.properties.modules.TaskDependencies; public class TaskDependenciesModuleController implements ModuleController { private final TaskDependencies module; private final MainWindowController controller; @SuppressWarnings("FieldCanBeLocal") private ChangeListener<ITask> taskChangeListener; public TaskDependenciesModuleController(IModule module, MainWindowController controller) { this.module = (TaskDependencies) module; this.controller = controller; } @Override public void initModule() { module.disableProperty().bind(controller.selectedTaskProperty().isNull()); taskChangeListener = this::selectedTaskObserver; // without WeakChangeListener wrapper it can cause a memory leak, but with wrapper it doesn't work properly // .addListener(new WeakChangeListener<>(taskChangeListener)) controller.selectedTaskProperty().addListener(taskChangeListener); } private void selectedTaskObserver(ObservableValue<? extends ITask> observableValue, ITask oldTask, ITask newTask) { if (newTask != null) { module.setItems(newTask.getParentTasks()); module.getParentTaskNameColumn().setCellValueFactory(cellData -> cellData.getValue().getTask().nameProperty()); module.getParentTaskDependencyTypeColumn().setCellValueFactory(cellData -> cellData.getValue().dependenceTypeProperty()); // Добавляем возможность изменять тип связи в таблице module.setEditable(true); // TODO: 18.04.2016 Сделать изменение строки через команды module.getParentTaskDependencyTypeColumn().setCellFactory(ComboBoxTableCell.forTableColumn(TaskDependencyType.values())); // Контекстное меню ParentTaskContextMenu parentTaskContextMenu = new ParentTaskContextMenu(); parentTaskContextMenu.initMenus(controller.getProject(), newTask); module.setContextMenu(parentTaskContextMenu); } } }