import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.event.TreeSelectionListener;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.tree.TreeSelectionModel;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.ImageIcon;
import javax.swing.ToolTipManager;
import java.net.URL;
import java.io.IOException;
import javax.swing.JEditorPane;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JPanel;
import javax.swing.JApplet;
import java.awt.*;
import java.awt.event.*;

public class TreePanel extends JPanel {
    //private JEditorPane htmlPane;
    private dJEditor htmlPane;
    private static boolean DEBUG = true;
    //private URL helpURL, dataURL;
    private String helpURL, dataURL;
    private ImageIcon dataIcon;
    private Test parent;
    private String cgiurl, path, dataset;
    private DataStructVec datastructVec;
    private DataStruct datastruct, current_datastruct;

    public TreePanel(JApplet japplet, ImageIcon icon) {
	dataIcon = icon;
	parent = (Test) japplet;

        //Create the nodes.
        DefaultMutableTreeNode top = new DefaultMutableTreeNode("The Bionome Model Manager");
        createNodes(top);

        //Create a tree that allows one selection at a time.
        final JTree tree = new JTree(top);
        tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);

        //Enable tool tips.
        ToolTipManager.sharedInstance().registerComponent(tree);

        /*
         * Set the icon for leaf nodes.
         * Note: In the Swing 1.0.x release, we used
         * swing.plaf.basic.BasicTreeCellRenderer.
         */
        //tree.setCellRenderer(new MyRenderer());
        tree.setCellRenderer(new MyRenderer(dataIcon));

        //Listen for when the selection changes.
        tree.addTreeSelectionListener(new TreeSelectionListener() {
            public void valueChanged(TreeSelectionEvent e) {
                DefaultMutableTreeNode node = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();

                if (node == null) return;

                Object nodeInfo = node.getUserObject();
                if (node.isLeaf()) {
                    //DatasetInfo dataset = (DatasetInfo)nodeInfo;
                    //DataStruct datastruct = (DataStruct)nodeInfo;
                    current_datastruct = (DataStruct)nodeInfo;
		    parent.updatemenu("selected");
                    //displayURL(dataset.setURL);
		    //dataURL = dataset.setURL;
		    //dataURL = getURL(datastruct.filename);
                    if (DEBUG) {
		    	System.err.println("Must be a leaf node");
		    	System.err.println("datastruct.filename: "+getURL(current_datastruct.filename));
                    }
                } else {
		    parent.updatemenu("deselected");
                    if (DEBUG) {
			System.err.println("Must be a non-leaf node");
                    }
                    //displayURL(helpURL); 
                }
                if (DEBUG) {
                    System.out.println("nodeInfo.toString(): "+nodeInfo.toString());
                }
            }
        });

        //Create the scroll pane and add the tree to it. 
        JScrollPane treeView = new JScrollPane(tree);

        //Create the HTML viewing pane.
        //htmlPane = new JEditorPane();
        htmlPane = new dJEditor();
        htmlPane.setEditable(false);
        //initHelp();
        JScrollPane htmlView = new JScrollPane(htmlPane);

        //Add the scroll panes to a split pane.
        JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
        splitPane.setTopComponent(treeView);
        splitPane.setBottomComponent(htmlView);
        Dimension minimumSize = new Dimension(100, 50);
        htmlView.setMinimumSize(minimumSize);
        treeView.setMinimumSize(minimumSize);
        splitPane.setDividerLocation(200); //XXX: ignored in some releases
                                           //of Swing. bug 4101306
        //workaround for bug 4101306:
        //treeView.setPreferredSize(new Dimension(100, 100)); 

        //splitPane.setPreferredSize(new Dimension(500, 300));
        splitPane.setPreferredSize(new Dimension(250, 400));

        //Add the split pane to this frame.
        add(splitPane, BorderLayout.CENTER);
    }

    protected String getURL(String filename) {
        String cgiurl = "http://www.sdsc.edu/~damartin/cgi-bin/";
        String path = "../bionome/modman/";
        String dataset = filename;
	String url = cgiurl+"model_data.cgi?model="+path+dataset;
	if (DEBUG) {
	    System.err.println("getURL - URL="+url);
	}
        return url;
    }

    public DataStruct getStruct() {
	if (DEBUG) System.err.println("TreePanel - current_datastruct.filename="+current_datastruct.filename);
	return(current_datastruct);
    }

    public void viewData() {
	if (DEBUG) {
	    System.err.println("viewData");
	}

        //htmlPane.setPage(cgiurl+"model_data.cgi?model="+path+dataset);
        htmlPane.setPage(dataURL);
 
    }

    private void createNodes(DefaultMutableTreeNode top) {
        DefaultMutableTreeNode category = null;
        DefaultMutableTreeNode dataset = null;
	
	String lookupfile = "Lookup.dat";
	String url = getURL(lookupfile);
	datastructVec = new DataStructVec(url);

        category = new DefaultMutableTreeNode("Beeler model run ver 1");
        top.add(category);
	for (int i=0; i<datastructVec.size(); i++) {
	    datastruct = (DataStruct) datastructVec.elementAt(i);
	    dataset = new DefaultMutableTreeNode(datastruct);
            category.add(dataset);
	}
    }

    private class MyRenderer extends DefaultTreeCellRenderer {
        ImageIcon tutorialIcon;

        public MyRenderer(ImageIcon icon) {
            //tutorialIcon = new ImageIcon("images/middle.gif");
            tutorialIcon = icon;
        }

        public Component getTreeCellRendererComponent(
	    JTree tree,
	    Object value,
	    boolean sel,
	    boolean expanded,
	    boolean leaf,
	    int row,
	    boolean hasFocus) {

            super.getTreeCellRendererComponent(
		tree, value, sel,
		expanded, leaf, row,
		hasFocus);
                setToolTipText("This is a Dataset.");
            return this;
        }

        protected boolean isTutorialBook(Object value) {
            DefaultMutableTreeNode node =
                    (DefaultMutableTreeNode)value;
            //DatasetInfo nodeInfo = 
                    //(DatasetInfo)(node.getUserObject());
            DataStruct nodeInfo = 
                    (DataStruct)(node.getUserObject());
            //String title = nodeInfo.setName;
            String title = nodeInfo.title;
            if (title.indexOf("Tutorial") >= 0) {
                return true;
            } 

            return false;
        }
    }
}

