package com.illumina.basespace.igv.ui.tree;
import java.awt.Color;
import java.awt.Component;
import java.util.List;
import java.util.UUID;
import javax.swing.JLabel;
import javax.swing.JPopupMenu;
import javax.swing.JTree;
import javax.swing.UIManager;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeCellRenderer;
import com.illumina.basespace.igv.BaseSpaceConfiguration;
import com.illumina.basespace.igv.BaseSpaceMain.ClientContext;
import com.illumina.basespace.igv.ui.BaseSpaceHelper;
/**
*
* @author bking
*
* @param <T>
*/
public abstract class BaseSpaceTreeNode<T>extends DefaultMutableTreeNode implements TreeCellRenderer,NodeRenderer<T>
{
private UUID clientId;
private JLabel renderingLabel = new JLabel();
private ClientContext clientContext;
public BaseSpaceTreeNode(T bean,UUID clientId, ClientContext clientContext )
{
super(bean);
this.clientId = clientId;
this.clientContext = clientContext;
}
@SuppressWarnings("unchecked")
@Override
public T getUserObject()
{
return (T)super.getUserObject();
}
public List<? extends BaseSpaceTreeNode<?>> getChildren()
{
return null;
}
public boolean hasChildren()
{
return true;
}
public JPopupMenu getPopupMenu()
{
return null;
}
protected void selected()
{
}
protected void doubleClicked()
{
}
public void loadChildrenAsynch(JTree tree)
{
}
protected void addChildren(JTree tree,BaseSpaceTreeNode<?> selectedNode,List<BaseSpaceTreeNode<?>> children)
{
try
{
selectedNode.removeAllChildren();
DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
if (children != null && children.size() > 0)
{
for (BaseSpaceTreeNode<?> child : children)
{
if (child.hasChildren())
{
BaseSpaceHelper.addStubNode(tree, child);
}
selectedNode.add(child);
}
}
model.nodeStructureChanged(selectedNode);
}
catch(Throwable t)
{
throw new RuntimeException("Error adding node children to tree",t);
}
}
@SuppressWarnings("unchecked")
protected T getBean()
{
return (T)super.getUserObject();
}
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded,
boolean leaf, int row, boolean hasFocus)
{
renderingLabel.setOpaque(true);
renderingLabel.setBackground(selected ? UIManager.getColor("Tree.selectionBackground") : tree.getBackground());
renderingLabel.setForeground(selected ? Color.WHITE : Color.BLACK);
renderNode(tree,renderingLabel,getUserObject(),selected,expanded,leaf,row,hasFocus);
return renderingLabel;
}
public UUID getClientId()
{
return clientId;
}
public BaseSpaceConfiguration getConfig()
{
return this.clientContext.getConfig();
}
protected ClientContext getClientContext()
{
return clientContext;
}
}