package threads;

import java.applet.Applet;
import java.applet.AppletContext;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Enumeration;
import java.util.EventObject;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class ThreadListerApplet extends JApplet
  implements ActionListener
{
  public ThreadListerApplet()
  {
    m_dumpButton = new JButton("List Thread Groups");
    m_clearButton = new JButton("Clear");
    m_createButton = new JButton("Create ThreadGroups");
  }
  
  public void actionPerformed(ActionEvent e)
  {
    JButton source = (JButton)e.getSource();
    if (source == m_dumpButton)
      dumpData(false);
    else
    {
      if (source == m_clearButton)
        m_textarea.setText("");
      else if (source == m_createButton)
      {
        m_textarea.setText("");
        dumpData(true);
        m_createButton.setEnabled(false);
      }
    }
  }
  
  private void dumpData(boolean createGroups)
  {
    StringWriter sout = new StringWriter();
    PrintWriter out = new PrintWriter(sout);
    String s = "";
    if (createGroups)
      try
      {
        TestThreadGroup.createThreadGroups();
      }
      catch(Exception e)
      {
        out.println("***Caught exception: " + e + "\nUnable to create thread groups.");
      }
    try
    {
      s = TestThreadGroup.dumpThreadGroupTree();
    }
    catch(Exception e)
    {
      s = "***Caught exception: " + e + "\nUnable to dump thread group tree.";
    }
    out.print(s);
    out.println();
    out.println("Applets:");
    AppletContext appContext = getAppletContext();
    int count = 0;
    Applet app;
    for(Enumeration e = appContext.getApplets(); e.hasMoreElements(); out.println("  " + app.getClass().getName()))
    {
      app = (Applet)e.nextElement();
      count++;
    }
    
    out.println("Applet count = " + count);
    out.flush();
    m_textarea.setText(sout.toString());
  }
  
  public void init()
  {
    setContentPane( createLayout() );
  }
  
  public JPanel createLayout()
  {
    JPanel contentPane = new JPanel();
    contentPane.setLayout( new BorderLayout() );
    m_textarea = new JTextArea();
    contentPane.add(new JScrollPane(m_textarea), BorderLayout.CENTER);
    
    JPanel buttonPanel = new JPanel();
    buttonPanel.setLayout( new FlowLayout() );
    contentPane.add(buttonPanel, BorderLayout.NORTH);
    
    m_dumpButton.addActionListener(this);
    buttonPanel.add(m_dumpButton);
    m_clearButton.addActionListener(this);
    buttonPanel.add(m_clearButton);
    m_createButton.addActionListener(this);
    buttonPanel.add(m_createButton);
    
    return contentPane;
  }
  
  public void start()
  {
    dumpData(false);
  }
  
  private JTextArea m_textarea;
  private JButton m_dumpButton;
  private JButton m_clearButton;
  private JButton m_createButton;
}