/*
 * StreamerInfoBrowser.java
 *
 * Created on June 2, 2001, 4:53 PM
 */
package hep.io.root.util;

import hep.io.root.RootObject;
import hep.io.root.interfaces.TKey;
import hep.io.root.interfaces.TNamed;

import java.awt.BorderLayout;
import java.awt.Cursor;
import java.util.List;

import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTree;
import javax.swing.ToolTipManager;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;


/**
 * A panel for browsing Streamer Info from a Root file.
 * @author tonyj
 * @version $Id: StreamerInfoBrowser.java,v 1.4 2004/06/28 15:21:27 tonyj Exp $
 */
class StreamerInfoBrowser extends JPanel implements TreeSelectionListener
{
   private final static TreeModel emptyTree = null;
   private JTree objTree;
   private JTree tree;

   /** Creates new StreamerInfoBrowser */
   public StreamerInfoBrowser(List streamerInfo)
   {
      super(new BorderLayout());
      tree = new JTree(new StreamerInfoTreeModel(streamerInfo));
      tree.setCellRenderer(new StreamerInfoTreeCellRenderer());
      tree.addTreeSelectionListener(this);
      tree.setRootVisible(false);
      tree.setShowsRootHandles(true);

      objTree = new JTree(emptyTree);
      objTree.setCellRenderer(new RootObjectTreeCellRenderer());
      ToolTipManager.sharedInstance().registerComponent(objTree);

      JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, new JScrollPane(tree), new JScrollPane(objTree));
      add(split, BorderLayout.CENTER);

      setPreferredSize(new java.awt.Dimension(500, 300));
      split.setDividerLocation(245);

      ToolTipManager.sharedInstance().setEnabled(true);
   }

   public void valueChanged(TreeSelectionEvent event)
   {
      Cursor old = getCursor();
      setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
      try
      {
         TreePath path = tree.getSelectionPath();
         if (path == null)
            objTree.setModel(emptyTree);
         else
         {
            Object node = path.getLastPathComponent();

            //if (node instanceof BranchEntry) node = ((BranchEntry) node).getValue();
            if (node instanceof TKey)
            {
               TKey key = (TKey) node;
               objTree.setModel(new RootObjectTreeModel(key.getObject(), key.getName()));
            }
            else if (node instanceof TNamed)
               objTree.setModel(new RootObjectTreeModel(node, ((TNamed) node).getName()));
            else if (node instanceof RootObject)
               objTree.setModel(new RootObjectTreeModel(node, ""));
            else if (node.getClass().isArray())
               objTree.setModel(new RootObjectTreeModel(node, ""));
            else if (node instanceof java.util.List)
               objTree.setModel(new RootObjectTreeModel(node, ""));
            else
               objTree.setModel(emptyTree);
         }
      }
      catch (Throwable x)
      {
         objTree.setModel(emptyTree);
         x.printStackTrace();
         error(x);
      }
      finally
      {
         setCursor(old);
      }
   }

   private void error(Throwable x)
   {
      JOptionPane.showMessageDialog(this, x.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
   }
}
