package com.ibm.wala.viz.viewer;

import java.awt.Component;

import javax.swing.ImageIcon;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeCellRenderer;

import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
import com.ibm.wala.ipa.callgraph.propagation.PointerKey;

/**
 * Renderer for the heap tree. Gives non default icons for pointer keys and instance keys.
 * @author yinnonh
 *
 */
class DualTreeCellRenderer implements TreeCellRenderer {

  private final DefaultTreeCellRenderer defaultTreeCellRenderer;
  private final DefaultTreeCellRenderer ikTreeCellRenderer;
  private final DefaultTreeCellRenderer pkTreeCellRenderer;

  public DualTreeCellRenderer() {
    defaultTreeCellRenderer = new DefaultTreeCellRenderer();
    
    
    ikTreeCellRenderer = new DefaultTreeCellRenderer();
    ikTreeCellRenderer.setOpenIcon(createImageIcon("images/ik_open.png"));
    ikTreeCellRenderer.setClosedIcon(createImageIcon("images/ik_closed.png"));
    ikTreeCellRenderer.setLeafIcon(createImageIcon("images/ik_leaf.png"));

    pkTreeCellRenderer = new DefaultTreeCellRenderer();
    pkTreeCellRenderer.setOpenIcon(createImageIcon("images/pk_open.png"));
    pkTreeCellRenderer.setClosedIcon(createImageIcon("images/pk_closed.png"));
    pkTreeCellRenderer.setLeafIcon(createImageIcon("images/pk_leaf.png"));
  }
  
  public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf,
      int row, boolean hasFocus) {
    TreeCellRenderer delegate = getTreeCellRenderer(value);
    return delegate.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
  }

  private TreeCellRenderer getTreeCellRenderer(Object value) {
    if (value instanceof DefaultMutableTreeNode){
      value = ((DefaultMutableTreeNode) value).getUserObject();
    }
    if (value instanceof PointerKey){
      return pkTreeCellRenderer;
    } else if (value instanceof InstanceKey){
      return ikTreeCellRenderer;
    } else {
      return defaultTreeCellRenderer;
    }
  }

  /** Returns an ImageIcon, or null if the path was invalid. */
  protected ImageIcon createImageIcon(String path) {
      java.net.URL imgURL = DualTreeCellRenderer.class.getResource(path);
      if (imgURL != null) {
          return new ImageIcon(imgURL);
      } else {
          System.err.println("Couldn't find file: " + path);
          return null;
      }
  }

}
