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

public class MandelApplet extends Applet implements ActionListener, ItemListener {
	
	MouseMandelRenderArea mra, map;
	TextField crt, cit, wt, mt, aatt, aart;
	Checkbox aacb;
	Label aatl, aarl;
	Panel ctrlp, cp, wp, aap, btnp;
	Button stbtn;
	
	public void init() {
		GridBagConstraints gbc;
		setLayout(new GridBagLayout());
		mra = new MouseMandelRenderArea(this, 400, 400, 1, false);
		gbc = new GridBagConstraints();
		gbc.gridx = 0;
		gbc.gridy = 0;
		gbc.insets = new Insets(5, 5, 5, 5);
		gbc.gridwidth = 2;
		add(mra, gbc);
		map = new MouseMandelRenderArea(this, 100, 100, 1, true);
		map.setAntiAlias(true);
		map.setAAParams(10, 3);
		gbc = new GridBagConstraints();
		gbc.gridx = 0;
		gbc.gridy = 1;
		gbc.insets = new Insets(5, 5, 5, 5);
		add(map, gbc);
		ctrlp = new Panel();
		ctrlp.setLayout(new GridLayout(4, 1));
		cp = new Panel();
		cp.setLayout(new FlowLayout(FlowLayout.LEFT));
		cp.add(new Label("Center:"));
		crt = new TextField("-.6", 6);
		crt.addActionListener(this);
		cp.add(crt);
		cp.add(new Label(" + i"));
		cit = new TextField("0", 6);
		cit.addActionListener(this);
		cp.add(cit);
		ctrlp.add(cp);
		wp = new Panel();
		wp.setLayout(new FlowLayout(FlowLayout.LEFT));
		wp.add(new Label("Width:"));
		wt = new TextField("3", 6);
		wt.addActionListener(this);
		wp.add(wt);
		wp.add(new Label("   # of iterations:"));
		mt = new TextField("100", 6);
		mt.addActionListener(this);
		wp.add(mt);
		ctrlp.add(wp);
		aap = new Panel();
		aap.setLayout(new FlowLayout(FlowLayout.LEFT));
		aacb = new Checkbox("Antialias");
		aacb.addItemListener(this);
		aap.add(aacb);
		aap.add(aatl = new Label("Threshold:"));
		aatl.enable(false);
		aatt = new TextField("10", 3);
		aatt.enable(false);
		aap.add(aatt);
		aap.add(aarl = new Label("   Resolution:"));
		aarl.enable(false);
		aart = new TextField("3", 3);
		aart.enable(false);
		aap.add(aart);
		ctrlp.add(aap);
		btnp = new Panel();
		btnp.setLayout(new FlowLayout(FlowLayout.RIGHT));
		stbtn = new Button("Draw");
		stbtn.addActionListener(this);
		btnp.add(stbtn);
		ctrlp.add(btnp);
		gbc = new GridBagConstraints();
		gbc.gridx = 1;
		gbc.gridy = 1;
		gbc.insets = new Insets(5, 5, 5, 5);
		add(ctrlp, gbc);
		map.start();
	}
	
	public void destroy() {
		mra.stop();
		map.stop();
	}
	
	public void itemStateChanged(ItemEvent e) {
		if (aacb.getState()) {
			aatl.enable(true);
			aatt.enable(true);
			aarl.enable(true);
			aart.enable(true);
		}
		else {
			aatl.enable(false);
			aatt.enable(false);
			aarl.enable(false);
			aart.enable(false);
		}
	}
	
	public void actionPerformed(ActionEvent e) {
		if (stbtn.getLabel().equals("Stop")) stopDrawing();
		else {
			mra.stop();
			double cr, ci, w;
			int m, aat, aar;
			try {
				try {
					cr = Double.valueOf(crt.getText()).doubleValue();
				}
				catch (NumberFormatException nfe) {
					Toolkit.getDefaultToolkit().beep();
					crt.requestFocus();
					crt.selectAll();
					throw nfe;
				}
				try {
					ci = Double.valueOf(cit.getText()).doubleValue();
				}
				catch (NumberFormatException nfe) {
					Toolkit.getDefaultToolkit().beep();
					cit.requestFocus();
					cit.selectAll();
					throw nfe;
				}
				try {
					w = Double.valueOf(wt.getText()).doubleValue();
				}
				catch (NumberFormatException nfe) {
					Toolkit.getDefaultToolkit().beep();
					wt.requestFocus();
					wt.selectAll();
					throw nfe;
				}
				try {
					m = Integer.parseInt(mt.getText());
				}
				catch (NumberFormatException nfe) {
					Toolkit.getDefaultToolkit().beep();
					mt.requestFocus();
					mt.selectAll();
					throw nfe;
				}
				mra.setParams(cr, ci, w, m);
				map.setArea(cr, ci, w, w);
				if (aacb.getState()) {
					try {
						aat = Integer.parseInt(aatt.getText());
					}
					catch (NumberFormatException nfe) {
						Toolkit.getDefaultToolkit().beep();
						aatt.requestFocus();
						aatt.selectAll();
						throw nfe;
					}
					try {
						aar = Integer.parseInt(aart.getText());
					}
					catch (NumberFormatException nfe) {
						Toolkit.getDefaultToolkit().beep();
						aart.requestFocus();
						aart.selectAll();
						throw nfe;
					}
					mra.setAAParams(aat, aar);
				}
				mra.setAntiAlias(aacb.getState());
				startDrawing();
			}
			catch (NumberFormatException nfe) {
			}
		}
	}
	
	public void setParams(double x, double y, double w) {
		stopDrawing();
		map.setArea(x, y, w, w);
		mra.setArea(x, y, w, w);
		mra.setParams(x, y, w);
		crt.setText(Double.toString(x));
		cit.setText(Double.toString(y));
		wt.setText(Double.toString(w));
	}
	
	public void startDrawing() {
		mra.stop();
		stbtn.setLabel("Stop");
		mra.start();
	}
	
	public void stopDrawing() {
		mra.stop();
		stbtn.setLabel("Draw");
	}
	
	public void stopped(MouseMandelRenderArea a) {
		if (a == mra) stbtn.setLabel("Draw");
	}
	
}