package ru.khasang.cachoeira.view.mainwindow.diagram.tables;
import com.sun.javafx.scene.control.skin.TreeTableViewSkin;
import com.sun.javafx.scene.control.skin.VirtualScrollBar;
import javafx.application.Platform;
import javafx.beans.property.DoubleProperty;
import javafx.geometry.Orientation;
import javafx.scene.control.Skin;
import javafx.scene.control.TreeTableView;
public abstract class AbstractTableView<S> extends TreeTableView<S> {
protected DoubleProperty horizontalScrollValue;
protected DoubleProperty verticalScrollValue;
private VirtualScrollBar verticalScrollBar;
private VirtualScrollBar horizontalScrollBar;
public abstract void createTable();
/**
* Метод для связывания горизонтального и вертикального скролла с переменными контроллера.
*/
public void bindScrollsToController() {
Platform.runLater(() -> {
if (verticalScrollBar != null) {
// Синхронизируем вертикальный скролл таблицы и диаграммы
verticalScrollBar.valueProperty().bindBidirectional(verticalScrollValue);
// verticalScrollBar.visibleProperty().addListener(observable -> {
// verticalScrollBar.setVisible(false);
// });
}
if (horizontalScrollBar != null) {
horizontalScrollBar.valueProperty().bindBidirectional(horizontalScrollValue);
horizontalScrollBar.setVisible(false);
horizontalScrollBar.visibleProperty().addListener(observable -> {
horizontalScrollBar.setVisible(false);
});
}
});
}
@Override
protected Skin<?> createDefaultSkin() {
return new AbstractTableViewSkin<>(this);
}
private class AbstractTableViewSkin<T> extends TreeTableViewSkin<T> {
public AbstractTableViewSkin(TreeTableView<T> tableView) {
super(tableView);
// Выцепляем скроллы
flow.getChildrenUnmodifiable()
.stream()
.filter(child -> child instanceof VirtualScrollBar)
.forEach(child -> {
if (((VirtualScrollBar) child).getOrientation() == Orientation.VERTICAL) {
verticalScrollBar = (VirtualScrollBar) child;
}
if (((VirtualScrollBar) child).getOrientation() == Orientation.HORIZONTAL) {
horizontalScrollBar = (VirtualScrollBar) child;
}
});
}
}
}