import java.awt.*;
import java.awt.event.*;
import java.beans.*;
import javax.swing.*;

/**
 * An example that uses PiCalculator (which is a the SwingWorker)
 *
 * @author  Prof. David Bernstein, James Madison University
 * @version 1.0
 */
public class PiDriver implements ActionListener, PropertyChangeListener
{
    private int            digits;
    private JButton        cancelButton, startButton;
    private JTextField     digitsField, resultArea;    
    private PiCalculator   task;
    

    /**
     * The entry point
     */
    public static void main(String[] args)
    {
       new PiDriver();
    }

    /**
     * Default Constructor
     */
    public PiDriver()
    {
       Container   contentPane;       
       JFrame      frame;
       JPanel      north;
       

       frame = new JFrame();
       frame.setTitle("Calculate pi");
       contentPane = frame.getContentPane();
       contentPane.setLayout(new BorderLayout());
       
       resultArea = new JTextField();
       contentPane.add(resultArea, BorderLayout.SOUTH);
       
       north = new JPanel();
       north.add(new JLabel("Digits:"));
       digitsField = new JTextField(10);
       north.add(digitsField);
       
       startButton = new JButton("Start");       
       startButton.addActionListener(this);       
       startButton.setEnabled(true);       
       north.add(startButton);
       cancelButton = new JButton("Cancel");
       cancelButton.addActionListener(this);       
       cancelButton.setEnabled(false);       
       north.add(cancelButton);

       contentPane.add(north, BorderLayout.NORTH);
       
       frame.setSize(400,100);
       frame.setVisible(true);

       task = null;
       
    }

    /**
     * Handle actionPerformed() messages (required by
     * ActionListener)
     *
     * @param evt  The ActionEvent that generated the message
     */
    public void actionPerformed(ActionEvent evt)
    {
       String       ac;
       
       ac = evt.getActionCommand();
       if (ac.equals("Start") && (task == null))
       {
          try
          {
             resultArea.setText("");             
             digits = Integer.parseInt(digitsField.getText());
             task = new PiCalculator(digits);
             task.addPropertyChangeListener(this);             
             startButton.setEnabled(false);
             cancelButton.setEnabled(true);
             task.execute();
          }
          catch (NumberFormatException nfe)
          {
             nfe.printStackTrace();
             
          }
       }
       else if (ac.equals("Cancel"))
       {
          if (task != null) 
          {
             startButton.setEnabled(true);
             cancelButton.setEnabled(false);
             task.cancel(true);
             task = null;
          }
       }
    }
             
    /**
     * Handle propertyChange() messages (required by
     * PropertyChangeListener)
     *
     * @param evt  The PropertyChangeEvent that generated the message
     */
    public  void propertyChange(PropertyChangeEvent evt) 
    {
       String    format;

       if (evt.getPropertyName().equals("progress")) 
       {
          // Could do something like:
          // progressBar.setValue((Integer)evt.getNewValue());
       }
       else if (evt.getPropertyName().equals("state")) 
       {
          if (evt.getNewValue().equals(SwingWorker.StateValue.DONE)) 
          {
             startButton.setEnabled(true);
             cancelButton.setEnabled(false);
       
             format = "%"+(digits+1)+"."+digits+"f\n";
       
             try
             {
                resultArea.setText(String.format(format, task.get()));
             }
             catch (Exception e)
             {
             }

             task = null;
          }
       }
    }
}
