/*
 * HortFrEnd - Tim Tyler 2000.
 * 
 * A front end for the Fast Walsh Transform in Java.
 * This code has been placed in the public domain.
 * You can do what you like with it.
 * Note that this code comes with no warranty.
 *
 */

/*
 * ToDo:
 *
 * Abort button.
 *
 */

   import java.awt.*;
   import java.applet.*;
   import java.awt.event.*;

   public class HortFrEnd extends java.applet.Applet implements ActionListener, ItemListener {
      static Panel input, output, input1, input2, input3, output1, output2;
      static TextArea input_area, output_area;
   
      static int data[] = new int[256];
      static int data1[];
      static int data2[];
   
      static int i=0, j=0, k=0, n=0;
   
      static String text_area_contents;
      static int leng;
      static int size;
      static int non_linearity;
      static int total;
      static int total_number;
      static int reversiblity = 0;
      static int aborted = 0;
   
      Button FWT_button, clear_button, abort_button;
      Checkbox reversible_checkbox;
      static TextField input_number;
      final static String FWTSTRING = "Report";
      final static String CLEARSTRING = "Clear";
      final static String ABORTSTRING = "Abort";
      final static String REVERSIBLESTRING = "Reversible?";
      Executor executor;
   
   // constructor
      public HortFrEnd() {
         setLayout(new BorderLayout());
      
         output = new Panel();
      
         output.setLayout(new BorderLayout());
      
         output1=new Panel();
         output1.setLayout(new GridLayout(1,5,4,4));
      	// output1.setLayout(new FlowLayout());
         output1.add(new Label("Automaton size:",Label.CENTER));
      
         input_number = new TextField("XXXXXX");
      
         output1.add("Center",input_number);
      
         FWT_button = new Button(FWTSTRING);
         output1.add(FWT_button);
         FWT_button.addActionListener(this);
      
         clear_button = new Button(CLEARSTRING);
         clear_button.addActionListener(this);
         output1.add(clear_button);
      
         // abort_button = new Button(ABORTSTRING);
         // abort_button.addActionListener(this);
         // output1.add(abort_button);
      
         reversible_checkbox = new Checkbox(REVERSIBLESTRING);
         reversible_checkbox.addItemListener(this);
         output1.add(reversible_checkbox);
      
         output.add("North",output1);
      
         output2=new Panel();
         output2.setLayout(new BorderLayout());
      
         output_area = new TextArea();
         output_area.setEditable(false);
      
         output2.add("Center",output_area);
      
         add("North",output);
         add("Center",output2);
      
         input_number.setText("");
      }
   
   
      public void itemStateChanged(ItemEvent e) {
         if ((String)(e.getItem()) == REVERSIBLESTRING) {
            reversiblity ^= 1;
         }
      }
   
   
      public void actionPerformed(ActionEvent ev) {
         String label = ev.getActionCommand();
      
         n=0;
      
         if (label.equals(CLEARSTRING)) {
            input_number.setText("");
            output_area.setText("");
         }
         else
         {
            if (label.equals(FWTSTRING)) {
               if (!input_number.getText().equals("")) {
                  output_area.setText("");
               
                  text_area_contents = input_number.getText();
               
                  total_number = Integer.parseInt(text_area_contents);
               
                  size = total_number + 2;
               
                  output_area.append("Size: " + total_number + ".  Max period: " + ((1L << total_number) - 1) + ".\n\n");
               
                  executor = 
                        new Executor() {
                           public void execute() {
                              HortFrEnd.output_area.append(Hortensius.output_string);
                           }
                        };
               
                  Hortensius.executor = executor;
               
                  if (reversiblity == 0) {
                     Hortensius.test(total_number + 2);
                  }
                  else
                  {
                     Hortensius.testReversibility(total_number + 2);
                  }
               }
               else
               {
                  output_area.setText("Error: no size specified.\n");
               }
            }
         }
      }
   
   }

