package cis600.client;

import java.awt.*;
import java.awt.event.*;
import org.omg.CosNaming.*;

public class ClientApplet extends java.applet.Applet 
        implements ActionListener {

  private TextField _rangeField, _higherRangeField, _numberField;
  private TextArea messageArea;
  private Button lowerRange, higherRange, _numberGenerated, timer;
  private cis600.util.RandomGen _randomGen;

  private int _lowRange=100;
  private int _highRange=1000;

  public void init() {
    Panel p;
    Font               lbl;
    GridBagLayout      g;
    GridBagConstraints c;
    lbl = new Font("Helvetica", Font.BOLD, 14);
    g   = new GridBagLayout();
    c   = new GridBagConstraints();

    c.fill      = GridBagConstraints.NONE;
    c.weightx   = 1.0;
    c.gridwidth = GridBagConstraints.REMAINDER;
    /* This GUI uses a 3 by 2 grid of widgets. */
    setLayout(g);
    
    /* Add the Six widgets. */
    p = new Panel();
    g.setConstraints(p, c);
    add(p);
    p.add(lowerRange  = new Button("Lower Range"));
    lowerRange.setActionCommand("Lower");
    lowerRange.addActionListener(this);
    p.add(_rangeField = new TextField(6));
    _rangeField.setText("0");
    p.add(higherRange=new Button("Higher Range"));
    higherRange.setActionCommand("Higher");
    higherRange.addActionListener(this);
    p.add(_higherRangeField = new TextField(6));
    _higherRangeField.setText("1000");

    p = new Panel();
    g.setConstraints(p, c);
    add(p);
    p.add(messageArea = new TextArea(5,30));
    
    p = new Panel();
    g.setConstraints(p, c);
    add(p);
    p.add(_numberGenerated = new Button("Generate Number"));
    _numberGenerated.setActionCommand("Generate");
    _numberGenerated.addActionListener(this);
    p.add(_numberField = new TextField(8));
    p.add(timer= new Button("Timer"));
    timer.setActionCommand("Timer");
    timer.addActionListener(this);
    /* make the number text field non-editable.*/
    _numberField.setEditable(false);
    getRandomizerHandle();    
  }

  private void getRandomizerHandle() {
   try {
     /* Initialize the ORB.*/
     org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(this, null);
     
     /* Get a reference to the Naming Service */
     org.omg.CORBA.Object nameServiceObj = 
       orb.resolve_initial_references("NameService");
     /* Check to see if the operation involving getting a reference to the NameService was successful */
     if (nameServiceObj == null) {
       System.out.println("Name Service Object = null");
       return;
     }
     
     org.omg.CosNaming.NamingContext nameService =
       org.omg.CosNaming.NamingContextHelper.narrow(nameServiceObj);
     
     if (nameService == null) {
       System.out.println("nameService = null");
       return;
     }
     
     NameComponent[] collabName = 
     { new NameComponent("Utilities", "Randomizer")};     
     _randomGen= 
       cis600.util.RandomGenHelper.narrow(nameService.resolve(collabName));
     System.out.println("Received Generator Handle");
   } catch(Exception e) {
     System.out.println("Exception: " + e);
   }
  }

  public void actionPerformed(ActionEvent event) {
    String command = event.getActionCommand();
    if (command.equals("Lower")) {
      try {
	_lowRange = Integer.parseInt(_rangeField.getText());
      } catch (java.lang.NumberFormatException e) {
	_lowRange=0;
	_rangeField.setText("0");
      }
    }
    
    if (command.equals("Higher")) {
      try {
	_highRange=Integer.parseInt(_higherRangeField.getText());
      } catch (java.lang.NumberFormatException e) {
	_highRange=1000;
	_higherRangeField.setText("1000");
      }
    }
    
    if(command.equals("Generate")) {
      System.out.println("Accessing Remote Object");
      if (_lowRange >1) {
	try {
	  _numberField.setText("Gen " 
                  +_randomGen.nextIntInRange(_lowRange,_highRange));
	} catch (cis600.util.InvalidOperationException e) {
	  messageArea.insert(e.toString()+ "\n", 
				 messageArea.getText().length());
	}
      }
      else
	_numberField.setText("Gen" +_randomGen.nextInt(_highRange));
    }

    if(command.equals("Timer")) {
      messageArea.insert("Invocation 1000 times"+ "\n", 
			 messageArea.getText().length());
      long startTime = System.currentTimeMillis();
      if (_lowRange >1) {
	try {
	  for (int i=0 ; i <1000 ; i++)
	    _numberField.setText("Gen " 
                   +_randomGen.nextIntInRange(_lowRange,_highRange));
	} catch (cis600.util.InvalidOperationException e) {
	  messageArea.insert(e.toString()+ "\n", 
			     messageArea.getText().length());
	}
      }
      else
	for (int i=0 ; i <1000 ; i++)
	  _numberField.setText("Gen" +_randomGen.nextInt(_highRange));
      long stopTime = System.currentTimeMillis();
      messageArea.insert("Avg Invocation Ping= "+ 
			 ((stopTime - startTime)/1000f) + " msecs" + "\n",
			 messageArea.getText().length());
    }
  }

	 
}