package com.revolsys.swing.tree; import java.awt.Component; import java.awt.Dimension; import java.awt.image.ImageObserver; import javax.swing.BorderFactory; import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JTree; import javax.swing.tree.DefaultTreeCellRenderer; import com.revolsys.awt.WebColors; import com.revolsys.swing.Icons; import com.revolsys.swing.tree.node.file.PathTreeNode; import com.revolsys.util.ToolTipProxy; public class BaseTreeCellRenderer extends DefaultTreeCellRenderer implements ImageObserver { private static final Icon ICON_MISSING = Icons.getIcon("error"); private static final long serialVersionUID = 1L; private final JLabel hiddenRenderer = new JLabel(); private final Icon loadingIcon = BaseTreeNodeLoadingIcon.getIcon(); public BaseTreeCellRenderer() { setOpenIcon(PathTreeNode.ICON_FOLDER); setClosedIcon(PathTreeNode.ICON_FOLDER); setBorder(BorderFactory.createEmptyBorder(1, 0, 0, 0)); final Dimension zeroSize = new Dimension(0, 0); this.hiddenRenderer.setMinimumSize(zeroSize); this.hiddenRenderer.setMaximumSize(zeroSize); this.hiddenRenderer.setPreferredSize(zeroSize); this.hiddenRenderer.setSize(zeroSize); } @Override public Component getTreeCellRendererComponent(final JTree tree, final Object value, final boolean selected, final boolean expanded, final boolean leaf, final int row, final boolean hasFocus) { final Component renderer = super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); if (value instanceof BaseTreeNode) { final BaseTreeNode node = (BaseTreeNode)value; BaseTreeNodeLoadingIcon.removeNode(node); if (node.isVisible()) { if (node.isUserObjectInitialized()) { if (node.isExists()) { return node.getTreeCellRendererComponent(renderer, tree, value, selected, expanded, leaf, row, hasFocus); } else { Icon disabledIcon = node.getDisabledIcon(); if (disabledIcon == null) { disabledIcon = ICON_MISSING; } setIcon(disabledIcon); setForeground(WebColors.Red); final Object userData = node.getUserData(); final JComponent component = (JComponent)renderer; if (userData instanceof ToolTipProxy) { final ToolTipProxy toolTipProxy = (ToolTipProxy)userData; final String toolTip = toolTipProxy.getToolTip(); component.setToolTipText(toolTip); } else { component.setToolTipText(null); } } } else { setIcon(this.loadingIcon); setForeground(WebColors.Gray); BaseTreeNodeLoadingIcon.addNode(node); } } else { return this.hiddenRenderer; } } return renderer; } }