package jadex.base.gui.componenttree;
import jadex.commons.gui.CombiIcon;
import java.awt.Component;
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.List;
import javax.swing.Icon;
import javax.swing.JComponent;
import javax.swing.JTree;
import javax.swing.tree.DefaultTreeCellRenderer;
/**
* Renderer for component tree cells.
*/
public class ComponentTreeCellRenderer extends DefaultTreeCellRenderer
{
// -------- constructors --------
/**
* Create a new component tree cell renderer.
*/
public ComponentTreeCellRenderer()
{
}
// -------- TreeCellRenderer interface --------
/**
* Get the cell renderer for a node.
*/
public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean selected, boolean expanded, boolean leaf, int row,
boolean hasFocus)
{
// Change icons depending on node type.
IComponentTreeNode node = (IComponentTreeNode)value;
Icon icon = node.getIcon();
// Add overlays to icon (if any).
if(tree.getModel() instanceof ComponentTreeModel)
{
List icons = null;
INodeHandler[] handlers = ((ComponentTreeModel)tree.getModel())
.getNodeHandlers();
for(int i = 0; handlers != null && i < handlers.length; i++)
{
Icon overlay = handlers[i].getOverlay(node);
if(overlay != null)
{
if(icons == null)
{
icons = new ArrayList();
if(icon != null)
{
// Base icon.
icons.add(icon);
}
}
icons.add(overlay);
}
}
if(icons != null)
{
icon = new CombiIcon((Icon[])icons.toArray(new Icon[icons
.size()]));
}
}
if(icon != null)
{
setOpenIcon(icon);
setClosedIcon(icon);
setLeafIcon(icon);
}
else
{
setOpenIcon(getDefaultOpenIcon());
setClosedIcon(getDefaultClosedIcon());
setLeafIcon(getDefaultLeafIcon());
}
JComponent comp = (JComponent)super.getTreeCellRendererComponent(tree,
value, selected, expanded, leaf, row, hasFocus);
return comp;
}
/**
* Overwritten to clear background behind icon too.
* Required for semi-transparent icons.
*/
public void paint(Graphics g)
{
if(getBackground()!=null)
{
g.setColor(getBackground());
g.fillRect(0, 0, getWidth(), getHeight());
}
super.paint(g);
}
}