package com.cedarsoft.spring.rcp.tree;
import org.jetbrains.annotations.NotNull;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeCellRenderer;
import java.awt.Component;
import java.util.HashMap;
import java.util.Map;
/**
* A delegating tree cell renderer.
*/
public class DelegatingTreeCellRenderer implements TreeCellRenderer {
@NotNull
private final Map<Class<?>, TreeCellRenderer> delegates = new HashMap<Class<?>, TreeCellRenderer>();
/**
* Creates a new delegating tree cell renderer. Delegates must be added using {@link #addDelegate(Class, TreeCellRenderer)}
*/
public DelegatingTreeCellRenderer() {
}
/**
* Creates a new delegateing tree cell renderer
*
* @param delegates the delegates
*/
public DelegatingTreeCellRenderer( @NotNull Map<Class<?>, TreeCellRenderer> delegates ) {
this.delegates.putAll( delegates );
}
/**
* Adds an delegate for the given type
*
* @param type the type
* @param delegate the delgate
*/
public void addDelegate( @NotNull Class<?> type, @NotNull TreeCellRenderer delegate ) {
this.delegates.put( type, delegate );
}
@Override
@NotNull
public Component getTreeCellRendererComponent( JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus ) {
if ( value instanceof DefaultMutableTreeNode ) {
//noinspection AssignmentToMethodParameter
value = ( ( DefaultMutableTreeNode ) value ).getUserObject();
}
TreeCellRenderer renderer = delegates.get( value.getClass() );
if ( renderer == null ) {
throw new IllegalArgumentException( "No renderer found for " + value.getClass().getName() );
}
return renderer.getTreeCellRendererComponent( tree, value, selected, expanded, leaf, row, hasFocus );
}
}