package mb;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;

public class Mandelbrot extends JFrame {
	
	public static void main(String[] args){
		Mandelbrot frame = new Mandelbrot("Mandelbrot");
		frame.show();
	}
	
	private MandelbrotCanvas canvas;

	private xMenu exampleMenu = new xMenu("Examples") {
		java.util.Vector rememberedExamples = new java.util.Vector();
		public void create() {
			addSubmenu("Built-In Examples", new String[] { 
					"Example 1", "Example 2", "Example 3", "Example 4",
					"Example 5", "Example 6", "Example 7", "Example 8",
					"Example 9", "Example 10", "Example 11", "Example 12",
					"Example 13", "Example 14", "Example 15", "Example 16",
					"Example 17", "Example 18", "Example 19", "Example 20"
				});
			addSeparator();
			add("Remember Current Example");
		}
		public void doCommand(int commandNum) {
			if (commandNum == 3) {
				Example example = new Example(canvas);
				rememberedExamples.addElement(example);
				add("Remembered Example " + rememberedExamples.size());
			}
			else if (commandNum > 3)
				canvas.install((Example)rememberedExamples.elementAt(commandNum-4));
		}
		public void doSubmenuCommand(int menu, int command) {
			switch (command) {
			case 1:
				canvas.install(new Example(-1.2623031086727636, -1.2623031083919118, 0.38359354964064757, 0.3835935498512864, 2, 2, 6, 0, true));
				break;
			case 2:
				canvas.install(new Example(-1.6744096756044493,-1.6744096717769306,4.716419197284976E-5,4.7167062611931696E-5,1,1,9,1,false));
				break;
			case 3:
				canvas.install(new Example(-0.7515104166666667, -0.7384895833333335, -0.1179174885797342, -0.1081518635797342, 8, 1, 6, 0, false));
				break;
			case 4:
				canvas.install(new Example(-0.7499091084798178, -0.7498073832194011, -0.01512001519187344, -0.01504372124656094, 1, 1, 6, 0, false));
				break;
			case 5:
				canvas.install(new Example(0.2860151227315265, 0.2860183016459146, 0.01153630275662951, 0.01153868694242053, 1, 1, 6, 0, false));
				break;
			case 6:
				canvas.install(new Example(0.28601560167064516, 0.2860156017191516, 0.01153748597592363, 0.01153748601230342, 1, 1, 6, 0, false));
				break;
			case 7:
				canvas.install(new Example(-1.3947314267481365, -1.394731382851799, 0.004504196998884557, 0.004504229921137647, 3, 1, 4, 0, false));
				break;
			case 8:
				canvas.install(new Example(-1.9409828792443582,-1.9409828789406118,6.481238065002669E-4,6.481240343100379E-4,1,1,9,144,false));
				break;
			case 9:
				canvas.install(new Example(-1.6730348358495644, -1.6730348356555387, 0.00611388336272725, 0.006113883508246402, 1, 1, 3, 0, false));
				break;
			case 10:
				canvas.install(new Example(0.32642717997233067, 0.3265289052327473, -0.05451000956418885, -0.05443371561887635, 2, 3, 7, 0, true));
				break;
			case 11:
				canvas.install(new Example(-1.4021907088881804, -1.4021907086941547, 7.378685846386933E-4, 7.378687301578456E-4, 1, 1, 5, 0, false));
				break;
			case 12:
				canvas.install(new Example(-1.0416723413703342, -1.0416723165350656, 0.3366316369357815, 0.336631655562233, 1, 1, 3, 248, true));
				break;
			case 13:
				canvas.install(new Example(-1.041672334826009, -1.0416723348229773, 0.33663164211039953, 0.33663164211267327, 1, 1, 10, 0, true));
				break;
			case 14:
				canvas.install(new Example(-1.263043835957845, -1.263018404642741, 0.04471644908688135, 0.04473552257320947, 1, 1, 2, 0, true));
				break;
			case 15:
				canvas.install(new Example(-1.2572854146671792, -1.2572854084583622, 0.038280500524232035, 0.03828050518084491, 1, 1, 9, 147, true));
				break;
			case 16: 
				canvas.install( new Example(0.25989953896993, 0.25989963831106766, 0.001612579325834812, 0.0016126583831640782, 1, 1, 4, 50, false) );
				break;
			case 17: 
				canvas.install( new Example(-0.3731076707689312,-0.37310663057550525,0.6481845448352237,0.6481853249802931,1,1,6,136,true) );
				break;
			case 18: 
				canvas.install( new Example(-1.275545173217428,-1.2755451670625497,0.18858615131552137,0.18858615593168024,1,1,4,1,false) );
				break;
			case 19: 
				canvas.install( new Example(-1.3937272129058824,-1.3937272129019853,0.10998468217258962,0.10998468217551245,1,1,6,1,false) );
				break;
			case 20: 
				canvas.install( new Example(0.3547193109712576,0.35474099268422055,0.09540200249324848,0.09541826377797069,1,1,7,1,true) );
				break;
			}
		}
	};
	
	public Mandelbrot(String title) {
		this(title,false,false);
	}
	
	public Mandelbrot(String title, boolean fromApplet) {
		this(title,fromApplet,false);
	}
	
	public Mandelbrot(String title, final boolean fromApplet, final boolean addCloseCommand) {
		super(title);
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		addWindowListener(new WindowAdapter() {
			public void windowClosed(WindowEvent evt) {
				canvas.stopDrawing();
				if (!fromApplet)
					System.exit(0);
			}
		});
		Dimension screensize = Toolkit.getDefaultToolkit().getScreenSize();
		if (screensize == null || (screensize.width > 900 && screensize.height > 700))
			canvas = new MandelbrotCanvas();
		else if (screensize.width > 700 && screensize.width > 600)
			canvas = new MandelbrotCanvas(640,480);
		else
			canvas = new MandelbrotCanvas(512,384);
		JMenuBar mBar = canvas.createMenus(!fromApplet,addCloseCommand);
		mBar.add(exampleMenu);
		setJMenuBar(mBar);
		setContentPane(canvas.getScrollPane());
		pack();
		setLocation(50,50);
		show();
	}
	
}
