package com.zzg.mybatis.generator.view; import com.zzg.mybatis.generator.model.DatabaseConfig; import javafx.beans.InvalidationListener; import javafx.beans.Observable; import javafx.beans.WeakInvalidationListener; import javafx.scene.Node; import javafx.scene.control.TreeCell; import javafx.scene.control.TreeItem; import javafx.scene.layout.HBox; import java.lang.ref.WeakReference; /** * Created by Owen on 6/14/16. */ public class LeftDbTreeCell extends TreeCell<DatabaseConfig> { private HBox hbox; private WeakReference<TreeItem<DatabaseConfig>> treeItemRef; private InvalidationListener treeItemGraphicListener = observable -> { updateDisplay(getItem(), isEmpty()); }; private InvalidationListener treeItemListener = new InvalidationListener() { @Override public void invalidated(Observable observable) { TreeItem<DatabaseConfig> oldTreeItem = treeItemRef == null ? null : treeItemRef.get(); if (oldTreeItem != null) { oldTreeItem.graphicProperty().removeListener(weakTreeItemGraphicListener); } TreeItem<DatabaseConfig> newTreeItem = getTreeItem(); if (newTreeItem != null) { newTreeItem.graphicProperty().addListener(weakTreeItemGraphicListener); treeItemRef = new WeakReference<TreeItem<DatabaseConfig>>(newTreeItem); } } }; private WeakInvalidationListener weakTreeItemGraphicListener = new WeakInvalidationListener(treeItemGraphicListener); private WeakInvalidationListener weakTreeItemListener = new WeakInvalidationListener(treeItemListener); public LeftDbTreeCell() { treeItemProperty().addListener(weakTreeItemListener); if (getTreeItem() != null) { getTreeItem().graphicProperty().addListener(weakTreeItemGraphicListener); } } void updateDisplay(DatabaseConfig item, boolean empty) { if (item == null || empty) { hbox = null; setText(null); setGraphic(null); } else { // update the graphic if one is set in the TreeItem TreeItem<DatabaseConfig> treeItem = getTreeItem(); if (treeItem != null && treeItem.getGraphic() != null) { hbox = null; setText(item.toString()); setGraphic(treeItem.getGraphic()); } else { hbox = null; setText(item.getName()); setGraphic(null); } } } @Override public void updateItem(DatabaseConfig item, boolean empty) { super.updateItem(item, empty); updateDisplay(item, empty); } }