package ru.khasang.cachoeira.view.mainwindow.diagram.ganttplan.objectslayer.taskbar; import javafx.animation.Timeline; import javafx.beans.InvalidationListener; import javafx.beans.WeakInvalidationListener; import javafx.beans.value.ChangeListener; import javafx.beans.value.WeakChangeListener; import javafx.collections.ListChangeListener; import javafx.collections.WeakListChangeListener; import javafx.scene.paint.Color; import javafx.scene.shape.Rectangle; import ru.khasang.cachoeira.model.IResource; import ru.khasang.cachoeira.model.ITask; import ru.khasang.cachoeira.viewcontroller.MainWindowController; import java.time.LocalDate; public class ResourceGanttPlanTaskBar extends TaskBar { @SuppressWarnings("FieldCanBeLocal") private ListChangeListener<IResource> resourceListChangeListener; @SuppressWarnings("FieldCanBeLocal") private ChangeListener<LocalDate> startDateChangeListener; @SuppressWarnings("FieldCanBeLocal") private ChangeListener<LocalDate> finishDateChangeListener; @SuppressWarnings("FieldCanBeLocal") private InvalidationListener hoverListener; @SuppressWarnings("FieldCanBeLocal") private InvalidationListener zoomListener; public ResourceGanttPlanTaskBar(MainWindowController controller) { this.controller = controller; } @Override public void initTaskRectangle(ITask task, IResource resource) { super.initTaskRectangle(task, resource); setLabel(task, backgroundRectangle); } @Override protected void setParameters(ITask task, IResource resource, Rectangle backgroundRectangle) { backgroundRectangle.setWidth(taskWidth( task.getStartDate(), task.getFinishDate(), controller.getZoomMultiplier())); backgroundRectangle.setLayoutY(6); this.setLayoutX(taskX( task.getStartDate(), controller.getProject().getStartDate(), controller.getZoomMultiplier())); this.setLayoutY(taskY(controller.getProject().getResourceList().indexOf(resource))); } @Override protected double taskY(int rowIndex) { return (rowIndex * ROW_HEIGHT); } @Override protected void setListeners(ITask task, IResource resource, Rectangle backgroundRectangle, Rectangle donePercentRectangle) { resourceListChangeListener = change -> { while (change.next()) { if (change.wasRemoved() || change.wasAdded()) { // Анимация при удалении и добавления элемента на диаграмме Timeline timeline = createTimelineAnimation( this.layoutYProperty(), taskY(controller.getProject().getResourceList().indexOf(resource)), (controller.getProject().getResourceList().indexOf(resource) + 1) * 150); timeline.play(); } } }; startDateChangeListener = (observable1, oldValue1, newValue1) -> { // ... если эти изменения произошли не спомощью мышки, то... if (!wasMovedByMouse) { // ... меняем положение метки на диаграмме... // Animation Timeline timeline = createTimelineAnimation( this.layoutXProperty(), taskX( task.getStartDate(), controller.getProject().getStartDate(), controller.getZoomMultiplier() ), 400 ); Timeline timeline1 = createTimelineAnimation( backgroundRectangle.widthProperty(), taskWidth( task.getStartDate(), task.getFinishDate(), controller.getZoomMultiplier() ), 400 ); timeline.play(); timeline1.play(); } }; finishDateChangeListener = (observable, oldValue, newValue) -> { if (!wasMovedByMouse) { // Animation Timeline timeline = createTimelineAnimation( backgroundRectangle.widthProperty(), taskWidth( task.getStartDate(), task.getFinishDate(), controller.getZoomMultiplier() ), 400); timeline.play(); } }; hoverListener = observable -> { if (this.isHover()) { backgroundRectangle.setFill(Color.valueOf("03bdf4")); backgroundRectangle.setStroke(Color.valueOf("#03d1f4")); donePercentRectangle.setFill(Color.valueOf("#0395f4")); } else { backgroundRectangle.setFill(Color.valueOf("#03A9F4")); //цвет прямоугольника backgroundRectangle.setStroke(Color.valueOf("#03bdf4")); donePercentRectangle.setFill(Color.valueOf("#0381f4")); } }; zoomListener = observable -> { this.setLayoutX(taskX(task.getStartDate(), controller.getProject().getStartDate(), controller.getZoomMultiplier())); backgroundRectangle.setWidth(taskWidth(task.getStartDate(), task.getFinishDate(), controller.getZoomMultiplier())); }; /* Следим за изменениями в списке задач, если произошло добавление или удаление элемента в списке, то пересчитываем индексы у элементов на диаграмме */ controller.getProject().getResourceList().addListener(new WeakListChangeListener<>(resourceListChangeListener)); // Если начальная дата изменилась, то... task.startDateProperty().addListener(new WeakChangeListener<>(startDateChangeListener)); // Если конечная дата изменилась, то... task.finishDateProperty().addListener(new WeakChangeListener<>(finishDateChangeListener)); // подсветка при наведении // TODO: 15.01.2016 Сделать анимацию this.hoverProperty().addListener(new WeakInvalidationListener(hoverListener)); controller.zoomMultiplierProperty().addListener(new WeakInvalidationListener(zoomListener)); } }