import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.net.URL;
import java.io.StreamTokenizer;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Date;
import java.text.SimpleDateFormat;

/*
 * This applet implements the graphical user interface of
 * the StockPlotter application.
 */

public class StockPlotterInterface extends Applet implements ItemListener, KeyListener{

  // Local variables
  Vector company_tickers;

  // Widgets
  Choice     choice;
  Checkbox   cb0;
  Checkbox   cb1;
  Checkbox   cb2;
  TextField  tf_ticker;
  TextField  tf_start;
  TextField  tf_stop;
  TextArea   textarea;
  Button     config;

  TextField tf_block_size;
  TextField tf_average_length;
  TextField tf_knot_dist;


  public void init(){
    // Build the user interface.
    Label l;

    setBackground(Color.lightGray);
    setForeground(Color.black);

    GridBagLayout gbl = new GridBagLayout();
    setLayout(gbl);

    GridBagConstraints gbc = new GridBagConstraints();
    gbc.anchor = GridBagConstraints.WEST;

    //Checkboxes...
    gbc.gridx = 4;
    gbc.gridy = 3;
    gbc.gridwidth = 1;
    gbc.weighty = 2.0;
    gbc.insets.top = 20;
    l = new Label("Filters:");
    gbl.setConstraints(l, gbc);
    add(l);

    gbc.insets.top = 0;
    gbc.gridy = 4;
    cb0 = new Checkbox("Trendline", false);
    cb0.setForeground(Color.blue);
    gbl.setConstraints(cb0, gbc);
    add(cb0);

    gbc.gridy = 5;
    cb1 = new Checkbox("Gliding average", false);
    cb1.setForeground(Color.red);
    gbl.setConstraints(cb1, gbc);
    add(cb1);

    gbc.gridy = 6;
    cb2 = new Checkbox("Spline approx.", false);
    cb2.setForeground(Color.yellow);
    gbl.setConstraints(cb2, gbc);
    add(cb2);

    gbc.insets.bottom = 20;
    gbc.gridy = 7;
    config = new Button("Configure filters");
    gbl.setConstraints(config, gbc);
    add(config);

    cb0.addItemListener(this);
    cb1.addItemListener(this);
    cb2.addItemListener(this);

    //Ticker list...
    gbc.insets.bottom = 0;
    gbc.weighty = 1.0;
    gbc.gridx = 0;
    gbc.gridy = 0;
    gbc.gridwidth = 1;
    gbc.insets.left = 30;

    l = new Label("Company:");
    gbl.setConstraints(l, gbc);
    add(l);

    gbc.insets.left = 0;
    gbc.gridx = 1;
    gbc.gridwidth = 3;
    choice = new Choice();
    choice.addItemListener(this);
    choice.add("Pick company");
    gbl.setConstraints(choice, gbc);
    add(choice);

    //Start and Stop...
    gbc.insets.left = 30;
    gbc.gridy = 1;
    gbc.gridx = 0;
    gbc.gridwidth = 1;
    l = new Label("Start:");
    gbl.setConstraints(l, gbc);
    add(l);

    gbc.insets.left = 0;
    gbc.gridx = 1;
    tf_start = new TextField(8);
    tf_start.setText("01.01.97");
    tf_start.addKeyListener(this);
    gbl.setConstraints(tf_start, gbc);
    add(tf_start);

    gbc.gridx = 2;
    gbc.insets.left = 20;
    l = new Label("Stop:");
    gbl.setConstraints(l, gbc);
    add(l);

    gbc.insets.left = 0;
    gbc.gridx = 3;
    tf_stop = new TextField(8);
    Date now = new Date();
    SimpleDateFormat df = new SimpleDateFormat("dd.MM.yy");
    tf_stop.setText(df.format(now));
    tf_stop.addKeyListener(this);
    gbl.setConstraints(tf_stop, gbc);
    add(tf_stop);

    //TextArea
    gbc.gridx = 0;
    gbc.gridy = 9;
    gbc.gridwidth = 5;
    gbc.fill = GridBagConstraints.HORIZONTAL;
    textarea = new TextArea("", 4, 60, TextArea.SCROLLBARS_VERTICAL_ONLY);
    textarea.setEditable(false);
    textarea.setBackground(Color.gray);
    gbl.setConstraints(textarea, gbc);
    add(textarea);

    //PlotArea
    gbc.gridx = 0;
    gbc.gridy = 2;
    gbc.gridwidth = 4;
    gbc.gridheight = 7;
    gbc.weighty = 6.0;
    gbc.weightx = 2.0;
    l = new Label("This should have been the plot window.");
    gbl.setConstraints(l, gbc);
    add(l);

    // Read company info (dummy version)
    readCompanyInfo();
  }

  /*
   * Catches events from choice menu and Checkboxes
   */

  public void itemStateChanged(ItemEvent e){
    ItemSelectable curr = e.getItemSelectable();

    if(curr == choice && choice.getSelectedIndex() != 0)
      textarea.append("You selected: " + company_tickers.elementAt(choice.getSelectedIndex() - 1) + ".\n");
    else{
      if(curr == cb0){
	if(e.getStateChange() == ItemEvent.SELECTED)
	  textarea.append("Trendline turned on.\n");
	else
	  textarea.append("Trendline turned off.\n");
      }else if(curr == cb1){
	if(e.getStateChange() == ItemEvent.SELECTED)
	  textarea.append("Gliding average turned on.\n");
	else
	  textarea.append("Gliding average turned off.\n");
      }else if(curr == cb2){
	if(e.getStateChange() == ItemEvent.SELECTED)
	  textarea.append("Spline approx. turned on.\n");
	else
	  textarea.append("Spline approx. turned off.\n");
      }
    }
  }

  public void keyPressed(KeyEvent event) {}
  public void keyTyped(KeyEvent event) {}

  /*
   * Catches key presses (the ticker)
   */
  public void keyReleased(KeyEvent event){
    if(event.getKeyCode() == KeyEvent.VK_ENTER){
      if((event.getComponent() == tf_start) || (event.getComponent() == tf_stop))
	textarea.append("New date range selected.\n");
    }
  }

  void readCompanyInfo(){
    company_tickers = new Vector();

    // Fill with dummy information, and add to choice menu.

    company_tickers.addElement("TOTX");
    company_tickers.addElement("NHY");
    company_tickers.addElement("SAG");

    choice.add("Totalindeksen");
    choice.add("Norsk Hydro");
    choice.add("Saga Petroleum A");
  }

  /*
   * Empty paint method, since all components used can redraw themself.
   */

  public void paint(Graphics g){}

}// class StockPlotterInterface
