
import java.awt.*;
import java.awt.event.*;
import COM.furryandfrisky.landscape.Landscape;

/**
 * Simple demo which exercises landscape manipulations.
 */
public class LandscapeDemo extends java.applet.Applet
  implements ActionListener, ItemListener
{
  private Landscape landscape = new Landscape();
  private TextField scale = new TextField(1);
  private Button drawNew = new Button("New");
  private Checkbox flat = new Checkbox("Flatten Sea");
  private Button up = new Button("^");
  private Button down = new Button("v");
  private Button left = new Button("<");
  private Button right = new Button(">");
  private ScrollPane scroller = new ScrollPane();

  /**
   * Arranges components.
   */
  public void init() 
  {
    flat.setState(landscape.isSeaFlat());
    scale.setText(String.valueOf(landscape.getScale()));
    
    drawNew.addActionListener(this);
    flat.addItemListener(this);
    up.addActionListener(this);
    down.addActionListener(this);
    left.addActionListener(this);
    right.addActionListener(this);
    scale.addActionListener(this);
    
    setLayout(new BorderLayout());

    Panel navigator = new Panel(new BorderLayout());
    navigator.add(up, BorderLayout.NORTH);
    navigator.add(down, BorderLayout.SOUTH);
    navigator.add(left, BorderLayout.WEST);
    navigator.add(right, BorderLayout.EAST);
    
    Panel controls = new Panel();
    controls.add(new Label("Scale:"));
    controls.add(scale);
    controls.add(drawNew);
    controls.add(navigator);
    controls.add(flat);

    add(controls, BorderLayout.SOUTH);
    scroller.add(landscape);
    add(scroller, BorderLayout.CENTER);
  }

  /**
   * Reponds to buttons and the text field.
   */
  public void actionPerformed(ActionEvent evt) 
  {
    adjustScale();
    
    if (evt.getSource() == up)
      landscape.setTopView(true);
    else if (evt.getSource() == down)
      landscape.setTopView(false);
    else if (evt.getSource() == left)
      landscape.rotateLeft();
    else if (evt.getSource() == right)
      landscape.rotateRight();
    else if (evt.getSource() == drawNew)
      landscape.randomLandscape();
  }

  /**
   * Responds to the checkbox.
   */
  public void itemStateChanged(ItemEvent evt)
  {
    adjustScale();
    landscape.setSeaFlat(flat.getState());
  }

  /**
   * Sets the landscape scale and redraws it.
   */
  private void adjustScale() 
  {
    scroller.setScrollPosition(0, 0);
    try {
      landscape.setScale(Integer.parseInt(scale.getText()));
      landscape.invalidate();
      validate();
    }
    catch(NumberFormatException e) {
      scale.setText(String.valueOf(landscape.getScale()));
    }
  }
}
