import java.awt.*;
import java.awt.BorderLayout;
import java.awt.event.*;
import java.awt.event.ActionListener;

import javax.swing.*;
import javax.swing.tree.*;


/**
 * @author Remi Forax
 *
 */
public class ThreadTreeExample {

  private static ThreadGroup getRoot(Thread thread) {
    ThreadGroup group=thread.getThreadGroup();
    for(;group.getParent()!=null;group=group.getParent());
    return group;
  }

  private static DefaultMutableTreeNode createTreeNode(ThreadGroup root) {
    DefaultMutableTreeNode node=new DefaultMutableTreeNode(root);
    
    ThreadGroup[] groups=new ThreadGroup[root.activeGroupCount()];
    int groupCount=root.enumerate(groups,false);
    for(int i=0;i<groupCount;i++) {
      node.add(createTreeNode(groups[i])); 
    }
    Thread[] threads=new Thread[root.activeCount()];
    int threadCount=root.enumerate(threads,false);
    for(int i=0;i<threadCount;i++) {
      node.add(new DefaultMutableTreeNode(threads[i]));
    }
    
    return node;
  }
  
  static TreeNode createRootNode() {
    return createTreeNode(getRoot(Thread.currentThread()));
  }

  public static void main(String[] args) {
    final DefaultTreeModel model=new DefaultTreeModel(createRootNode());
    
    JButton button=new JButton("Refresh");
    button.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        model.setRoot(createRootNode());
      }
    });
    
    JTree tree=new JTree(model);
    tree.setCellRenderer(new DefaultTreeCellRenderer() {
      public Component getTreeCellRendererComponent(
        JTree tree,Object value,boolean selected,boolean expanded,
        boolean leaf,int row,boolean hasFocus) {
          
        if (leaf) {
          DefaultMutableTreeNode node=(DefaultMutableTreeNode)value;
          Thread thread=(Thread)node.getUserObject();  
          
          if (thread.isDaemon())
            setLeafIcon(stopIcon);
          else
            setLeafIcon(okIcon);
        }
        
        super.getTreeCellRendererComponent(tree,value,
          selected,expanded,leaf,row,hasFocus);
          
        return this;
      }
      
      private final Icon stopIcon=new ImageIcon("Stop24.gif");
      private final Icon okIcon=new ImageIcon("TipOfTheDay24.gif");
    });
    
    JFrame frame=new JFrame("ThreadTreeExample");
    frame.getContentPane().add(button,BorderLayout.SOUTH);
    frame.getContentPane().add(new JScrollPane(tree));
    frame.pack();
    frame.show();
  }
}
