// TreeUsage.java - RJM Programming - October, 2014
// Based on http://www.codejava.net/java-se/swing/jtree-basic-tutorial-and-examples ... thanks

import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javax.swing.tree.DefaultMutableTreeNode;
import java.util.*;
 
public class TreeUsage extends JFrame
{
    private JTree tree;
    public TreeUsage()
    {
        DefaultMutableTreeNode root = null;
        DefaultMutableTreeNode parent1Node = null, parent2Node = null;
        DefaultMutableTreeNode grandparent1Node = null, grandparent2Node = null, grandparent3Node = null, grandparent4Node = null;
        DefaultMutableTreeNode greatgrandparent1Node = null, greatgrandparent2Node = null, greatgrandparent3Node = null, greatgrandparent4Node = null;
        DefaultMutableTreeNode greatgrandparent5Node = null, greatgrandparent6Node = null, greatgrandparent7Node = null, greatgrandparent8Node = null;


        DefaultMutableTreeNode greatgreatgrandparent1Node = null, greatgreatgrandparent2Node = null, greatgreatgrandparent3Node = null, greatgreatgrandparent4Node = null;
        DefaultMutableTreeNode greatgreatgrandparent5Node = null, greatgreatgrandparent6Node = null, greatgreatgrandparent7Node = null, greatgreatgrandparent8Node = null;
        DefaultMutableTreeNode greatgreatgrandparent9Node = null, greatgreatgrandparent10Node = null, greatgreatgrandparent11Node = null, greatgreatgrandparent12Node = null;
        DefaultMutableTreeNode greatgreatgrandparent13Node = null, greatgreatgrandparent14Node = null, greatgreatgrandparent15Node = null, greatgreatgrandparent16Node = null;



        String mode = "Enter Your Name: ";
        String yourName = "Root", lineageName = "";
        int i = 1;
        while (yourName.trim().length() > 0) { 
          yourName = JOptionPane.showInputDialog(mode);
          if (yourName.trim().length() > 0) {
           if (i == 1) {
            //create the root node
            root = new DefaultMutableTreeNode(yourName);   //"Root");
            lineageName = yourName;
            i *= 2;
            mode = "Enter " + yourName + " Parent Names (up to " + i + ") comma separated ... <cr> exits: ";
           } else if (i == 2) {
            String[] parentNames = yourName.split(",");
            parent1Node = new DefaultMutableTreeNode(parentNames[0]);
            parent2Node = new DefaultMutableTreeNode(parentNames[1]);
            i *= 2;
            mode = "Enter " + yourName + " Parent Names (up to " + i + ") comma separated ... <cr> exits: ";
           } else if (i == 4) {
            String[] grandparentNames = yourName.split(",");
            grandparent1Node = new DefaultMutableTreeNode(grandparentNames[0]);
            grandparent2Node = new DefaultMutableTreeNode(grandparentNames[1]);
            grandparent3Node = new DefaultMutableTreeNode(grandparentNames[2]);
            grandparent4Node = new DefaultMutableTreeNode(grandparentNames[3]);
            i *= 2;
            mode = "Enter " + yourName + " Parent Names (up to " + i + ") comma separated ... <cr> exits: ";
           } else if (i == 8) {
            String[] greatgrandparentNames = yourName.split(",");
            greatgrandparent1Node = new DefaultMutableTreeNode(greatgrandparentNames[0]);
            greatgrandparent2Node = new DefaultMutableTreeNode(greatgrandparentNames[1]);
            greatgrandparent3Node = new DefaultMutableTreeNode(greatgrandparentNames[2]);
            greatgrandparent4Node = new DefaultMutableTreeNode(greatgrandparentNames[3]);
            greatgrandparent5Node = new DefaultMutableTreeNode(greatgrandparentNames[4]);
            greatgrandparent6Node = new DefaultMutableTreeNode(greatgrandparentNames[5]);
            greatgrandparent7Node = new DefaultMutableTreeNode(greatgrandparentNames[6]);
            greatgrandparent8Node = new DefaultMutableTreeNode(greatgrandparentNames[7]);
            i *= 2;
            mode = "Enter " + yourName + " Parent Names (up to " + i + ") comma separated ... <cr> exits: ";
           } else if (i == 16) {
            String[] greatgreatgrandparentNames = yourName.split(",");
            greatgreatgrandparent1Node = new DefaultMutableTreeNode(greatgreatgrandparentNames[0]);
            greatgreatgrandparent2Node = new DefaultMutableTreeNode(greatgreatgrandparentNames[1]);
            greatgreatgrandparent3Node = new DefaultMutableTreeNode(greatgreatgrandparentNames[2]);
            greatgreatgrandparent4Node = new DefaultMutableTreeNode(greatgreatgrandparentNames[3]);
            greatgreatgrandparent5Node = new DefaultMutableTreeNode(greatgreatgrandparentNames[4]);
            greatgreatgrandparent6Node = new DefaultMutableTreeNode(greatgreatgrandparentNames[5]);
            greatgreatgrandparent7Node = new DefaultMutableTreeNode(greatgreatgrandparentNames[6]);
            greatgreatgrandparent8Node = new DefaultMutableTreeNode(greatgreatgrandparentNames[7]);
            greatgreatgrandparent9Node = new DefaultMutableTreeNode(greatgreatgrandparentNames[8]);
            greatgreatgrandparent10Node = new DefaultMutableTreeNode(greatgreatgrandparentNames[9]);
            greatgreatgrandparent11Node = new DefaultMutableTreeNode(greatgreatgrandparentNames[10]);
            greatgreatgrandparent12Node = new DefaultMutableTreeNode(greatgreatgrandparentNames[11]);
            greatgreatgrandparent13Node = new DefaultMutableTreeNode(greatgreatgrandparentNames[12]);
            greatgreatgrandparent14Node = new DefaultMutableTreeNode(greatgreatgrandparentNames[13]);
            greatgreatgrandparent15Node = new DefaultMutableTreeNode(greatgreatgrandparentNames[14]);
            greatgreatgrandparent16Node = new DefaultMutableTreeNode(greatgreatgrandparentNames[15]);
            i *= 2;
            mode = "Enter " + yourName + " Parent Names (up to " + i + ") comma separated ... <cr> exits: ";
            yourName = ""; // okay ... that's it
           } 
          } 
        }
        
        // Add the child nodes
        i /= 2;
        while (i > 1) {
          if (i == 16) {
            greatgrandparent1Node.add(greatgreatgrandparent1Node);
            greatgrandparent1Node.add(greatgreatgrandparent2Node);
            greatgrandparent2Node.add(greatgreatgrandparent3Node);
            greatgrandparent2Node.add(greatgreatgrandparent4Node);
            greatgrandparent3Node.add(greatgreatgrandparent5Node);
            greatgrandparent3Node.add(greatgreatgrandparent6Node);
            greatgrandparent4Node.add(greatgreatgrandparent7Node);
            greatgrandparent4Node.add(greatgreatgrandparent8Node);
            greatgrandparent5Node.add(greatgreatgrandparent9Node);
            greatgrandparent5Node.add(greatgreatgrandparent10Node);
            greatgrandparent6Node.add(greatgreatgrandparent11Node);
            greatgrandparent6Node.add(greatgreatgrandparent12Node);
            greatgrandparent7Node.add(greatgreatgrandparent13Node);
            greatgrandparent7Node.add(greatgreatgrandparent14Node);
            greatgrandparent8Node.add(greatgreatgrandparent15Node);
            greatgrandparent8Node.add(greatgreatgrandparent16Node);
          } else if (i == 8) {
            grandparent1Node.add(greatgrandparent1Node);
            grandparent1Node.add(greatgrandparent2Node);
            grandparent2Node.add(greatgrandparent3Node);
            grandparent2Node.add(greatgrandparent4Node);
            grandparent3Node.add(greatgrandparent5Node);
            grandparent3Node.add(greatgrandparent6Node);
            grandparent4Node.add(greatgrandparent7Node);
            grandparent4Node.add(greatgrandparent8Node);
          } if (i == 4) {
            parent1Node.add(grandparent1Node);
            parent1Node.add(grandparent2Node);
            parent2Node.add(grandparent3Node);
            parent2Node.add(grandparent4Node);
          } else if (i == 2) {
            root.add(parent1Node);
            root.add(parent2Node);
          }
          i /= 2;
        }
        
         
        //create the tree by passing in the root node
        tree = new JTree(root);
        add(tree);
         
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setTitle("Lineage of " + lineageName);       
        this.pack();
        this.setVisible(true);
    }
     
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new TreeUsage();
            }
        });
    }       
}
