import java.awt.*;
import java.applet.*;

public class Mandelbrot extends Applet {

    // Applet constants
    private final int APPSIZE = 500;
    private final int PIXELS = 400;  // PIXEL X PIXEL region to display Mandelbrot set
    private final int XOFFSET = (APPSIZE - PIXELS)/2;  // x coordinate of upper left pixel of display
    private final int YOFFSET = 50; // y coordinate of upper left pixel of display

    // Instance variables
    private Pnt lowerLeft;
    private Pnt upperRight;

    private int limit;              // iteration limit >= 1
    private int resolution;         // 1 <= resolution <= PIXELS

    private MandelbrotSet s;        // Mandelbrot set

    // Utility variables
    private Label limitLabel;
    private Label resolutionLabel;

    private TextField limitText;        // Iteration limit
    private TextField resolutionText;   // Resolution

    private boolean firstClick = true;
    Pnt tmpLowerLeft = new Pnt();
    Pnt tmpUpperRight = new Pnt();

    public void init() {
        limitLabel = new Label("Iteration limit     ");
        resolutionLabel = new Label("     Resolution");

        limitText = new TextField("16",4);
        resolutionText = new TextField("100",3);

        add(limitText);
        add(limitLabel);
        add(resolutionLabel);
        add(resolutionText);

        lowerLeft  = new Pnt(-2.0, -1.25);
        upperRight = new Pnt(+0.5, +1.25);
        limit = Integer.parseInt(limitText.getText());
        resolution = Integer.parseInt(resolutionText.getText());
        s = new MandelbrotSet();
    }

    public void paint(Graphics g) {
        s.displayMandelbrotSet(g, limit, resolution, PIXELS, XOFFSET, YOFFSET);
    }

    public boolean action(Event event, Object o) {

        if (event.target == limitText || event.target == resolutionText) {
            limit = Integer.parseInt(limitText.getText());
            resolution = Integer.parseInt(resolutionText.getText());
            repaint();
        }
        return true;
    }

    public boolean mouseDown(Event event, int x, int y) {
        double size = upperRight.getX() - lowerLeft.getX();
        int deltaX = x - XOFFSET;
        int deltaY = y - YOFFSET;

        if (firstClick) {
            tmpLowerLeft.setX( lowerLeft.getX() + size * (double) deltaX / PIXELS);
            tmpLowerLeft.setY( lowerLeft.getY() + size * (double) deltaY / PIXELS);
        }
        else {
            upperRight.setX( lowerLeft.getX() + size * (double) deltaX / PIXELS);
            upperRight.setY( lowerLeft.getY() + size * (double) deltaY / PIXELS);
            lowerLeft.setX( tmpLowerLeft.getX() );
            lowerLeft.setY( tmpLowerLeft.getY() );
            s.setLowerLeft(lowerLeft);
            s.setUpperRight(upperRight);
            showStatus( "Left = " + lowerLeft.getX() +
                        ", Right = " + upperRight.getX() +
                        ", Lower = " + lowerLeft.getY() +
                        ", Upper = " + upperRight.getY() );
            repaint();
        }
        firstClick ^= true;
        return true;
    }
}