package ru.khasang.cachoeira.view.mainwindow.diagram.ganttplan.labelslayer.label; import javafx.collections.ListChangeListener; import javafx.collections.WeakListChangeListener; import javafx.scene.control.Label; import javafx.scene.layout.HBox; import ru.khasang.cachoeira.model.IResource; import ru.khasang.cachoeira.view.mainwindow.diagram.ganttplan.objectslayer.taskbar.TaskBar; public abstract class TaskBarLabel extends HBox { private TaskBar taskBar; @SuppressWarnings("FieldCanBeLocal") private ListChangeListener<IResource> resourceListChangeListener; public TaskBarLabel(TaskBar taskBar) { this.taskBar = taskBar; this.layoutXProperty().bind(taskBar.layoutXProperty().add(taskBar.widthProperty().add(12))); this.layoutYProperty().bind(taskBar.layoutYProperty().add(6)); this.setHeight(taskBar.getHeight()); setListeners(); } public void addResourceLabel(IResource resource) { Label resourceLabel = new Label(resource.getName() + "\t"); this.getChildren().add(resourceLabel); } public void removeResourceLabel(IResource resource) { this.getChildren().removeIf(node -> { Label resourceLabel = (Label) node; return resourceLabel.getText().equals(resource.getName()); }); } public void refreshResourceLabels() { this.getChildren().clear(); taskBar.getTask().getResourceList().forEach(this::addResourceLabel); } public void setListeners() { resourceListChangeListener = change -> { while (change.next()) { if (change.wasAdded()) { change.getAddedSubList().forEach(this::addResourceLabel); } if (change.wasRemoved()) { change.getRemoved().forEach(this::removeResourceLabel); } } }; taskBar.getTask().getResourceList().addListener(new WeakListChangeListener<>(resourceListChangeListener)); } public TaskBar getTaskBar() { return taskBar; } }