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