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;

    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;
		    parent.updatemenu("selected");
                    //displayURL(dataset.setURL);
		    dataURL = dataset.setURL;
                    if (DEBUG) {
		    	System.err.println("Must be a leaf node");
		    	System.err.println("dataset.setURL: "+dataset.setURL);
                    }
                } 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(100); //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(300, 300));

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

    private class DatasetInfo {
        public String setName;
        public String setURL;

        public DatasetInfo(String dataset, String filename) {
            setName = dataset;
            setURL = getURL(filename);
        }

        public String toString() {
            return setName;
        }
    }

    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 void viewData() {
	if (DEBUG) {
	    System.err.println("viewData");
	}

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

    //private void initHelp() {
        //String s = null;
        //try {
            //s = "TreeDemoHelp.html";
            //helpURL = getURL(s);
            //if (DEBUG) {
                //System.out.println("Help URL is " + helpURL);
            //}
            //helpURL = new URL(s);
            //displayURL(helpURL);
        //} catch (Exception e) {
            //System.err.println("Couldn't create help URL: " + s);
        //}
    //}

    //private void displayURL(URL url) {
	//System.err.println("display the url");
	//htmlPane.removeAll();
        //try {
            //htmlPane.setPage(url);
        //} catch (IOException e) {
            //System.err.println("Attempted to read a bad URL: " + url);
        //}
    //}

    private void createNodes(DefaultMutableTreeNode top) {
        DefaultMutableTreeNode category = null;
        DefaultMutableTreeNode dataset = null;

        category = new DefaultMutableTreeNode("Beeler model run ver 1");
        top.add(category);

        dataset = new DefaultMutableTreeNode(new DatasetInfo
            ("Lou Rudy Transmembrane Potential", "beeler_1.dat"));
        category.add(dataset);

        dataset = new DefaultMutableTreeNode(new DatasetInfo
            ("Lou Rudy Ex-cell Na+ Concentration", "beeler_2.dat"));
        category.add(dataset);

        dataset = new DefaultMutableTreeNode(new DatasetInfo
            ("Lou Rudy In-cell Na+ Concentration", "beeler_3.dat"));
        category.add(dataset);

        dataset = new DefaultMutableTreeNode(new DatasetInfo
            ("Lou Rudy Ex-cell Na+ Concentration", "beeler_4.dat"));
        category.add(dataset);

        dataset = new DefaultMutableTreeNode(new DatasetInfo
            ("Lou Rudy Transmembrane Potential", "beeler_5.dat"));
        category.add(dataset);

        category = new DefaultMutableTreeNode("Beeler model run ver 2");
        top.add(category);

        dataset = new DefaultMutableTreeNode(new DatasetInfo
            ("Lou Rudy Transmembrane Potential", "beeler_1.dat"));
        category.add(dataset);

        dataset = new DefaultMutableTreeNode(new DatasetInfo
            ("Lou Rudy Ex-cell Na+ Concentration", "beeler_2.dat"));
        category.add(dataset);

        dataset = new DefaultMutableTreeNode(new DatasetInfo
            ("Lou Rudy In-cell Na+ Concentration", "beeler_3.dat"));
        category.add(dataset);

        dataset = new DefaultMutableTreeNode(new DatasetInfo
            ("Lou Rudy Ex-cell Na+ Concentration", "beeler_4.dat"));
        category.add(dataset);

        dataset = new DefaultMutableTreeNode(new DatasetInfo
            ("Lou Rudy Transmembrane Potential", "beeler_5.dat"));
        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());
            String title = nodeInfo.setName;
            if (title.indexOf("Tutorial") >= 0) {
                return true;
            } 

            return false;
        }
    }
}

