/* * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * * * * * * * * * * * * * * * * * * * * */ package javafx.scene.control.cell; 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; /* * Package-protected class used by cell implementations to handle graphics changes * to TreeItem. */ class DefaultTreeCell extends TreeCell { private HBox hbox; private WeakReference> treeItemRef; private InvalidationListener treeItemGraphicListener = observable -> { updateDisplay(getItem(), isEmpty()); }; private InvalidationListener treeItemListener = new InvalidationListener() { @Override public void invalidated(Observable observable) { TreeItem oldTreeItem = treeItemRef == null ? null : treeItemRef.get(); if (oldTreeItem != null) { oldTreeItem.graphicProperty().removeListener(weakTreeItemGraphicListener); } TreeItem newTreeItem = getTreeItem(); if (newTreeItem != null) { newTreeItem.graphicProperty().addListener(weakTreeItemGraphicListener); treeItemRef = new WeakReference>(newTreeItem); } } }; private WeakInvalidationListener weakTreeItemGraphicListener = new WeakInvalidationListener(treeItemGraphicListener); private WeakInvalidationListener weakTreeItemListener = new WeakInvalidationListener(treeItemListener); public DefaultTreeCell() { treeItemProperty().addListener(weakTreeItemListener); if (getTreeItem() != null) { getTreeItem().graphicProperty().addListener(weakTreeItemGraphicListener); } } void updateDisplay(T 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 treeItem = getTreeItem(); if (treeItem != null && treeItem.getGraphic() != null) { if (item instanceof Node) { setText(null); // the item is a Node, and the graphic exists, so // we must insert both into an HBox and present that // to the user (see RT-15910) if (hbox == null) { hbox = new HBox(3); } hbox.getChildren().setAll(treeItem.getGraphic(), (Node)item); setGraphic(hbox); } else { hbox = null; setText(item.toString()); setGraphic(treeItem.getGraphic()); } } else { hbox = null; if (item instanceof Node) { setText(null); setGraphic((Node)item); } else { setText(item.toString()); setGraphic(null); } } } } @Override public void updateItem(T item, boolean empty) { super.updateItem(item, empty); updateDisplay(item, empty); } }