package com.zzk;

import java.awt.Button;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Label;
import java.awt.Panel;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.HashMap;

import javax.swing.JComboBox;

import com.zzk.grammar.RandomKVGrammar;
import com.zzk.grammar.SingleKVGrammar;
import com.zzk.interpreter.GrammarInterpreterAB;
import com.zzk.interpreter.GrammarInterpreterF;
import com.zzk.util.DrawUtil;

/**
 * �ͻ��ˣ����Ʒ����
 * @author zzk
 */
public class Client extends Frame {
	/**
	 * ��к�
	 */
	private static final int FRAME_WIDTH = 1000;// ���ڿ��
	private static final int FRAME_HEIGHT = 1000;// ���ڸ߶�
	private static final long serialVersionUID = -1503870997066468394L;
	private String grammarString;// �ķ��ַ���
	private AbstractGrammar grammar;// �﷨����
	private Point startPoint = new Point(500, 900);// ��ʼλ��
	private double startAngle = 90;// ��ʼ�Ƕ�
	private double rotateAngle = 30;// �ת��
	private int length = 5;// �߶γ���
	private int n = 5;// �������
	private AbstractGrammarInterpreter interpreter = null;// �����
	{
		interpreter = new GrammarInterpreterF(length, grammarString, startPoint, startAngle, rotateAngle);
	}
	/**
	 * �����AB
	 */
	public void initTreeAB() {
		char start = 'B';
		char[] notEnd = { 'A', 'B' };
		char[] end = { '(', ')', '[', ']' };
		String[] productA = { "AA" };
		String[] productB = { "A[B]AA(B)" };
		HashMap<String, String[]> map = new HashMap<>();
		map.put("A", productA);
		map.put("B", productB);
		grammar = new SingleKVGrammar(start, end, notEnd, map);//ʹ��SingleKV�﷨���
		grammarString = grammar.product(n);
	}

	/**
	 * �������
	 */
	public void initRandomTree() {
		char start = 'F';
		char[] notEnd = { 'F' };
		char[] end = { '+', '-', '[', ']' };
		String[] product = { "F-F++F-F", "F[+F]F[-F[+F]]", "FF+[+F+F]-[+F]", "F[+F][-F]", "F" };// �

		HashMap<String, String[]> map = new HashMap<>();
		map.put("F", product);
		grammar = new RandomKVGrammar(start, end, notEnd, map);
		grammarString = grammar.product(n);
	}

	/**
	 * �������״
	 */
	public void initPine() {
		char start = 'F';
		char[] notEnd = { 'F' };
		char[] end = { '+', '-', '[', ']' };
		String[] product = { "F[+F]F[-F[+F]]" };// �൹���
		HashMap<String, String[]> map = new HashMap<>();
		map.put("F", product);
		grammar = new RandomKVGrammar(start, end, notEnd, map);
		grammarString = grammar.product(n);
	}

	/**
	 * ѩ����״
	 */
	public void initSnowflake() {
		char start = 'F';
		char[] notEnd = { 'F' };
		char[] end = { '+', '-', '[', ']' };
		String[] product = { "F-F++F-F" };// ѩ��
		HashMap<String, String[]> map = new HashMap<>();
		map.put("F", product);
		grammar = new RandomKVGrammar(start, end, notEnd, map);
		grammarString = grammar.product(n);
	}

	/**
	 * ���ƶԳƷ������ʹ��ʱ����lengthΪ100���Զ�����length�Լ�����
	 */
	public void initSymmetricalTree() {
		char start = 'F';
		char[] notEnd = { 'F' };
		char[] end = { '+', '-', '[', ']' };
		String[] product = { "F[+F][-F]" };// �ԳƷ������ʹ��ʱ����lengthΪ100
		HashMap<String, String[]> map = new HashMap<>();
		map.put("F", product);
		grammar = new RandomKVGrammar(start, end, notEnd, map);
		grammarString = grammar.product(n);
	}

	public void loadFrame() {
		initRandomTree();
		this.setTitle("����");
		this.setSize(FRAME_WIDTH, FRAME_HEIGHT);
		this.setBackground(Color.WHITE);
		this.setLocationRelativeTo(null);// ����
		this.setResizable(false);
		this.setFont(new Font("��Բ", Font.BOLD, 20));
		this.addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		this.setLayout(null);
		this.initComponent();// ��ʼ����
		this.setVisible(true);
	}

	// ��ʼ����
	public void initComponent() {
		Panel pNorth = new Panel(new FlowLayout());// ��ť������
		pNorth.setBounds(100, 50, 800, 50);
		Button btnRandomTree = new Button("�������");
		btnRandomTree.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				initRandomTree();
				length = 5;
				startAngle = 90;
				rotateAngle = 25;
				startPoint.x = 500;
				startPoint.y = 900;
				interpreter = new GrammarInterpreterF(length, grammarString, startPoint, startAngle, rotateAngle);
				repaint();
			}
		});
		Button btnSymmetricalTree = new Button("�ԳƷ����");
		btnSymmetricalTree.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				initSymmetricalTree();
				length = 100;
				startAngle = 90;
				rotateAngle = 25;
				startPoint.x = 500;
				startPoint.y = 900;
				interpreter = new GrammarInterpreterF(length, grammarString, startPoint, startAngle, rotateAngle);
				repaint();
			}
		});
		Button btnSnowflake = new Button("ѩ��");
		btnSnowflake.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				initSnowflake();
				length = 100 / n;
				startAngle = 30;
				rotateAngle = 60;
				startPoint.x = 1000;
				startPoint.y = 500;
				interpreter = new GrammarInterpreterF(length, grammarString, startPoint, startAngle, rotateAngle);
				repaint();
			}
		});
		Button btnSpecialTree = new Button("AB�");
		btnSpecialTree.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				initTreeAB();
				length = 100/(n*n);
				startAngle = 90;
				rotateAngle = 45;
				startPoint.x = 500;
				startPoint.y = 900;
				interpreter = new GrammarInterpreterAB(length, grammarString, startPoint, startAngle, rotateAngle);
				repaint();
			}
		});
		Label label = new Label("�������");
		Integer[] ints = { 1, 2, 3, 4, 5, 6, 7, 8 };
		JComboBox<Integer> box = new JComboBox<>(ints);
		box.setSelectedItem(n);
		box.addItemListener(new ItemListener() {

			@Override
			public void itemStateChanged(ItemEvent e) {
				if (e.getStateChange() == ItemEvent.SELECTED) {
					n = (int) e.getItem();
				}
			}
		});
		pNorth.add(label);
		pNorth.add(box);
		pNorth.add(btnRandomTree);
		pNorth.add(btnSnowflake);
		pNorth.add(btnSymmetricalTree);
		pNorth.add(btnSpecialTree);
		this.add(pNorth);
		//��ɫ��
		Panel pMiddle = new Panel();
		Label labelColor = new Label("�����ɫ");
		pMiddle.setBounds(100, 100, 800, 50);
		Button btnRed = new Button("  ");
		Button btnGreen = new Button("  ");
		Button btnBlue = new Button("  ");
		Button btnBlack = new Button("  ");
		
		btnRed.setBackground(Color.RED);
		btnGreen.setBackground(Color.GREEN);
		btnBlue.setBackground(Color.BLUE);
		btnBlack.setBackground(Color.BLACK);
		
		MyListener listener = new MyListener();
		
		btnRed.addActionListener(listener);
		btnGreen.addActionListener(listener);
		btnBlue.addActionListener(listener);
		btnBlack.addActionListener(listener);

		pMiddle.add(labelColor);
		pMiddle.add(btnRed);
		pMiddle.add(btnGreen);
		pMiddle.add(btnBlue);
		pMiddle.add(btnBlack);
		this.add(pMiddle);
	}

	@Override
	public void paint(Graphics g) {
		interpreter.interpret(g);
	}
	public static void main(String[] args) {
		new Client().loadFrame();
	}
}
class MyListener implements ActionListener{

	@Override
	public void actionPerformed(ActionEvent e) {
		Button btn =null;
		if(e.getSource() instanceof Button){
			btn=(Button) e.getSource();
		}
		DrawUtil.color=btn.getBackground();
	}
	
}