All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.pcsoft.framework.jfex.controls.util.FXTreeUtils Maven / Gradle / Ivy

The newest version!
package org.pcsoft.framework.jfex.controls.util;

import javafx.scene.control.*;

import java.util.HashMap;
import java.util.Map;


public final class FXTreeUtils extends FXSelectionModelUtils {

    public static final class TreeStateInfo {
        private final Map expendedMap = new HashMap<>();
        private Integer selected;

        private TreeStateInfo() {
        }
    }

    //region Get Tree State
    public static TreeStateInfo getTreeState(final TreeTableView tree) {
        if (tree.getRoot() == null)
            return new TreeStateInfo();

        final TreeStateInfo treeState = getTreeState(tree.getRoot());
        treeState.selected = tree.getSelectionModel().getSelectedItem() == null ? null : tree.getSelectionModel().getSelectedItem().hashCode();

        return treeState;
    }

    public static TreeStateInfo getTreeState(final TreeView tree) {
        if (tree.getRoot() == null)
            return new TreeStateInfo();

        final TreeStateInfo treeState = getTreeState(tree.getRoot());
        treeState.selected = tree.getSelectionModel().getSelectedItem() == null ? null : tree.getSelectionModel().getSelectedItem().hashCode();

        return treeState;
    }

    private static TreeStateInfo getTreeState(final TreeItem rootItem) {
        final TreeStateInfo treeStateInfo = new TreeStateInfo();
        updateTreeState(treeStateInfo, rootItem);

        return treeStateInfo;
    }

    private static void updateTreeState(final TreeStateInfo treeStateInfo, final TreeItem rootItem) {
        treeStateInfo.expendedMap.put(rootItem.hashCode(), rootItem.isExpanded());
        for (final TreeItem childItem : rootItem.getChildren()) {
            updateTreeState(treeStateInfo, childItem);
        }
    }
    //endregion

    //region Set Tree State
    public static void setTreeState(final TreeTableView tree, final TreeStateInfo treeState) {
        if (tree.getRoot() == null)
            return;

        final Map treeItemMap = buildTreeItemMap(tree.getRoot());
        setTreeState(treeItemMap, treeState);
        if (treeState.selected != null) {
            if (treeItemMap.containsKey(treeState.selected)) {
                tree.getSelectionModel().select(
                        tree.getRow(treeItemMap.get(treeState.selected))
                );
            }
        }
    }

    public static void setTreeState(final TreeView tree, final TreeStateInfo treeState) {
        if (tree.getRoot() == null)
            return;

        final Map treeItemMap = buildTreeItemMap(tree.getRoot());
        setTreeState(treeItemMap, treeState);
        if (treeState.selected != null) {
            if (treeItemMap.containsKey(treeState.selected)) {
                tree.getSelectionModel().select(
                        tree.getRow(treeItemMap.get(treeState.selected))
                );
            }
        }
    }

    private static void setTreeState(final Map treeItemMap, final TreeStateInfo treeState) {
        treeItemMap.keySet().stream()
                .filter(treeState.expendedMap::containsKey)
                .forEach(key -> treeItemMap.get(key).setExpanded(treeState.expendedMap.get(key)));
    }

    private static Map buildTreeItemMap(final TreeItem rootItem) {
        final Map map = new HashMap<>();
        updateTreeItemMap(map, rootItem);

        return map;
    }

    private static void updateTreeItemMap(final Map map, final TreeItem rootItem) {
        map.put(rootItem.hashCode(), rootItem);
        for (final TreeItem childItem : rootItem.getChildren()) {
            updateTreeItemMap(map, childItem);
        }
    }
    //endregion

    //region Select Tree Item by value
    public static boolean selectTreeItem(final TreeTableView tree, T value) {
        if (value == null)
            return false;
        if (tree.getRoot() == null)
            return false;

        return searchAndSelectTreeItem(tree.getSelectionModel(), tree.getRoot(), value);
    }

    public static boolean selectTreeItem(final TreeView tree, T value) {
        if (value == null)
            return false;
        if (tree.getRoot() == null)
            return false;

        return searchAndSelectTreeItem(tree.getSelectionModel(), tree.getRoot(), value);
    }

    private static boolean searchAndSelectTreeItem(final SelectionModel> selectionModel, final TreeItem rootItem, T value) {
        if (value.equals(rootItem.getValue())) {
            TreeItem currentItem = rootItem.getParent();
            while (currentItem != null) {
                currentItem.setExpanded(true);
                currentItem = currentItem.getParent();
            }

            selectionModel.select(rootItem);
            return true;
        }

        for (final TreeItem childItem : rootItem.getChildren()) {
            if (searchAndSelectTreeItem(selectionModel, childItem, value))
                return true;
        }

        return false;
    }
    //endregion

    public static  void reselect(TreeView treeView) {
        reselect(treeView.getSelectionModel());
    }

    public static  void reselect(TreeTableView treeTableView) {
        reselect(treeTableView.getSelectionModel());
    }

    public static  void moveBottom(TreeView treeView, TreeItem treeItem) {
        moveDown(treeView.getSelectionModel(), treeItem, -1);
    }

    public static  void moveBottom(TreeTableView treeTableView, TreeItem treeItem) {
        moveDown(treeTableView.getSelectionModel(), treeItem, -1);
    }

    public static  void moveDown(TreeView treeView, TreeItem treeItem) {
        moveDown(treeView.getSelectionModel(), treeItem, 1);
    }

    public static  void moveDown(TreeTableView treeTableView, TreeItem treeItem) {
        moveDown(treeTableView.getSelectionModel(), treeItem, 1);
    }

    public static  void moveDown(TreeView treeView, TreeItem treeItem, int shiftCount) {
        moveDown(treeView.getSelectionModel(), treeItem, shiftCount);
    }

    public static  void moveDown(TreeTableView treeTableView, TreeItem treeItem, int shiftCount) {
        moveDown(treeTableView.getSelectionModel(), treeItem, shiftCount);
    }

    public static  void moveTop(TreeView treeView, TreeItem treeItem) {
        moveUp(treeView.getSelectionModel(), treeItem, -1);
    }

    public static  void moveTop(TreeTableView treeTableView, TreeItem treeItem) {
        moveUp(treeTableView.getSelectionModel(), treeItem, -1);
    }

    public static  void moveUp(TreeView treeView, TreeItem treeItem) {
        moveUp(treeView.getSelectionModel(), treeItem, 1);
    }

    public static  void moveUp(TreeTableView treeTableView, TreeItem treeItem) {
        moveUp(treeTableView.getSelectionModel(), treeItem, 1);
    }

    public static  void moveUp(TreeView treeView, TreeItem treeItem, int shiftCount) {
        moveUp(treeView.getSelectionModel(), treeItem, shiftCount);
    }

    public static  void moveUp(TreeTableView treeTableView, TreeItem treeItem, int shiftCount) {
        moveUp(treeTableView.getSelectionModel(), treeItem, shiftCount);
    }

    private static  void moveUp(final SelectionModel> selectionModel, final TreeItem treeItem, final int shiftCount) {
        if (treeItem.getParent() == null)
            return;

        final int index = treeItem.getParent().getChildren().indexOf(treeItem);

        treeItem.getChildren().remove(treeItem);

        if (shiftCount < 0) {
            treeItem.getChildren().add(0, treeItem);
            selectionModel.select(treeItem);
        } else {
            treeItem.getChildren().add(index - shiftCount, treeItem);
            selectionModel.select(treeItem);
        }
    }

    private static  void moveDown(final SelectionModel> selectionModel, final TreeItem treeItem, final int shiftCount) {
        if (treeItem.getParent() == null)
            return;

        final int index = treeItem.getParent().getChildren().indexOf(treeItem);

        treeItem.getChildren().remove(treeItem);

        if (shiftCount < 0) {
            treeItem.getChildren().add(treeItem);
            selectionModel.select(treeItem);
        } else {
            treeItem.getChildren().add(index + shiftCount, treeItem);
            selectionModel.select(treeItem);
        }
    }

    private FXTreeUtils() {
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy