import java.awt.BorderLayout;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import java.util.HashMap;
import java.util.Map;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.ArrayList;
import java.util.Arrays;
import static java.util.Arrays.asList;

public class CourseTreeA extends JFrame {
    private JTree tree;
    private JLabel selectedLabel;

    public CourseTreeA()
    {
        final Map<String,String> tab2URL = new HashMap<String,String>();
        tab2URL.put("List Iterators", "http://arch.umsl.edu/~siegel/CS4010/Lists/ListIterators.html");
        tab2URL.put("Some Classes", "http://arch.umsl.edu/~siegel/CS4010/Lists/commonstuff.html");
        tab2URL.put("Mixed Lists", "http://arch.umsl.edu/~siegel/CS4010/Lists/MixedLists.html");
        tab2URL.put("HTTP", "http://arch.umsl.edu/~siegel/CS4010/Servlets/http.html");
        /////////////////////////////////////////////
        //Build the JTree starting at the root =level_0, just a Node
        DefaultMutableTreeNode level_0=new DefaultMutableTreeNode("CS 4010");
        /////////////////////////////////////////////
        // At level_1 we just have a list of Strings.
        List<String>    level_1_Strings=new ArrayList<String>( Arrays.asList("Lists","Servlets"));
        List<DefaultMutableTreeNode> level_1=new ArrayList<DefaultMutableTreeNode>();
        for (int i=0;i<level_1_Strings.size();i++) {
            level_1.add(new DefaultMutableTreeNode(level_1_Strings.get(i)));
            level_0.add(level_1.get(i));    
        }
        ///////////////////////////////////////////////////////////
        //level_2 and beyond the Strings are a List of Lists of Strings
        List<List<String>> level_2_Strings=new ArrayList<List<String>>();
        level_2_Strings.add(new ArrayList<String>( Arrays.asList("List Iterators","Some Classes","Mixed Lists")));
        level_2_Strings.add(new ArrayList<String>( Arrays.asList("HTTP","student.java","New test2","The Get Client","The Post Client")));
        List<DefaultMutableTreeNode> level_2=new ArrayList<DefaultMutableTreeNode>();
        level_2=buildParentChild(level_2_Strings,level_1);
        //////////////////////////////////////////////////////////////////////////////
        //Finally the JTree
        tree = new JTree(level_0);

        ImageIcon imageIcon1 = new ImageIcon(CourseTree.class.getResource("./duke1.jpg"));
        ImageIcon imageIcon2 = new ImageIcon(CourseTree.class.getResource("./duke2.jpg"));
        DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer();       
        renderer.setLeafIcon(imageIcon2);
        renderer.setOpenIcon(imageIcon1);
        tree.setCellRenderer(renderer);
        tree.setShowsRootHandles(true);
        tree.setRootVisible(true);
        add(new JScrollPane(tree));    
        tree.getSelectionModel().addTreeSelectionListener(new TreeSelectionListener() {
                                                              @Override
                                                              public void valueChanged(TreeSelectionEvent e) {
                                                                  DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
                                                                  String thisURL=tab2URL.get(selectedNode.getUserObject().toString());
                                                                  System.out.println(thisURL);
                                                                  if (thisURL!=null) {
                                                                      new Thread(new MyBrowser(2,thisURL)).start();
                                                                  }


                                                              }
                                                          });        
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setTitle("Course 4010");       
        this.setSize(300, 400);
        this.setVisible(true);
    }

    public static void main(String[] args)
    {    
        new CourseTreeA();
    } 
    ////////////The Induction Method////////////////////////////
    public List<DefaultMutableTreeNode> buildParentChild(List<List<String>> this_level_Strings,List<DefaultMutableTreeNode> previous_level_Nodes ){
        DefaultMutableTreeNode temp=null;
        List<DefaultMutableTreeNode> this_level_Nodes=new ArrayList<DefaultMutableTreeNode>();
        for (int i=0;i<this_level_Strings.size();i++) {
            for (int j=0;j<this_level_Strings.get(i).size();j++) {
                this_level_Nodes.add(temp=new DefaultMutableTreeNode(this_level_Strings.get(i).get(j)));
                previous_level_Nodes.get(i).add(temp);
            }
        } 
        return this_level_Nodes;
    }
}