package de.javasoft.synthetica.democenter.examples.jycheckboxtree;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;

import de.javasoft.swing.JYCheckBoxTree;

/**
 * Simple JYCheckBoxTree demo.  
 */
@SuppressWarnings("serial")
public class SimpleJYCheckBoxTree extends JFrame
{
  private JYCheckBoxTree tree;  
  
  public SimpleJYCheckBoxTree()
  {
    super("Simple JYCheckBoxTree Demo");
    
//@highlight
    tree = new JYCheckBoxTree(createTreeNode());
    tree.setShowsRootHandles(true);
    //disable check box selection on node click
    tree.setCheckBoxSelectableByNodeClick(false);
    //enable tree expansion by double click on node
    tree.setToggleClickCount(2);    
    //expand tree
    for (int i = 0; i < tree.getRowCount(); i++)
      tree.expandRow(i);
    //select checkbox
    tree.getCheckBoxSelectionModel().addSelectionPath(tree.getPathForRow(5));
    //select item
    tree.getSelectionModel().addSelectionPath(tree.getPathForRow(5));
//@/highlight

    add(new JScrollPane(tree));        
    add(createOutputPanel(), BorderLayout.SOUTH);
    ((JComponent)getContentPane()).setBorder(new EmptyBorder(10,10,10,10));

    //setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);      
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    pack();
    setLocationRelativeTo(null);        //center
    setVisible(true);
  }

  private JPanel createOutputPanel()
  {
    JPanel p = new JPanel();
    p.setLayout(new BoxLayout(p, BoxLayout.PAGE_AXIS));

    p.add(Box.createVerticalStrut(10));
    
    JButton button = new JButton("Show selected paths");
    button.setAlignmentX(Component.LEFT_ALIGNMENT);
    p.add(button);

    p.add(Box.createVerticalStrut(10));
    
    final JTextArea ta = new JTextArea(5, 50);
    ta.setEditable(false);
    ta.setFocusable(false);
    JScrollPane scroller = new JScrollPane(ta); 
    scroller.setAlignmentX(Component.LEFT_ALIGNMENT);      
    p.add(scroller);
    
    button.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent evt)
      {
//@highlight
        StringBuilder sb = new StringBuilder();
        for (TreePath p : tree.getCheckBoxSelectionModel().getSelectionPaths())
          sb.append(p.toString()+"\n");
        ta.setText(sb.toString());
//@/highlight
      }
    });
    return p;
  }
  
  private TreeNode createTreeNode()
  {
    DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("Node 1");
    DefaultMutableTreeNode node11 = new DefaultMutableTreeNode("Node 1.1");
    DefaultMutableTreeNode node12 = new DefaultMutableTreeNode("Node 1.2");

    DefaultMutableTreeNode node111 = new DefaultMutableTreeNode("Node 1.1.1");
    DefaultMutableTreeNode node112 = new DefaultMutableTreeNode("Node 1.1.2");
    DefaultMutableTreeNode node113 = new DefaultMutableTreeNode("Node 1.1.3");
    DefaultMutableTreeNode node114 = new DefaultMutableTreeNode("Node 1.1.4");
    DefaultMutableTreeNode node115 = new DefaultMutableTreeNode("Node 1.1.5");

    DefaultMutableTreeNode node121 = new DefaultMutableTreeNode("Node 1.2.1");
    DefaultMutableTreeNode node122 = new DefaultMutableTreeNode("Node 1.2.2");
    DefaultMutableTreeNode node123 = new DefaultMutableTreeNode("Node 1.2.3");
    DefaultMutableTreeNode node124 = new DefaultMutableTreeNode("Node 1.2.4");

    DefaultMutableTreeNode node1221 = new DefaultMutableTreeNode("Node 1.2.2.1");
    DefaultMutableTreeNode node1222 = new DefaultMutableTreeNode("Node 1.2.2.2");

    node122.add(node1221);
    node122.add(node1222);
    
    node11.add(node111);
    node11.add(node112);
    node11.add(node113);
    node11.add(node114);
    node11.add(node115);

    node12.add(node121);
    node12.add(node122);
    node12.add(node123);
    node12.add(node124);

    node1.add(node11);
    node1.add(node12);
    
    return node1;
  }
  
  /**
   * Static main method for application startup. 
   */
  public static void main(String[] args)
  {
    EventQueue.invokeLater(new Runnable()
    {
      public void run()
      {
        try
        {
          UIManager.setLookAndFeel("de.javasoft.plaf.synthetica.SyntheticaStandardLookAndFeel");
          new SimpleJYCheckBoxTree();
        }
        catch (Exception e)
        {
          e.printStackTrace();
        }
      }
    });
  }  
}
