package gve.calc.logic;

import awt.*;
import java.awt.*;
import awt.Button;
import java.awt.event.*;
import gve.calc.formula.*;

public class TableauPartView extends Container implements View,KeydnListener,HasCursorPos,CreatesPopup,ActionListener {
	private TableauPart model;

	public TableauPartView(TableauPart model,FormulaView view) {
		this.model = model;
		add(view.getView(model.top));
		add(view.getView(model.left));
		if (model.right != null) add(view.getView(model.right));
		setLayout(new TableauPartLayout());
		MVC.registerView(model,this);
	}

	public Object getModel() { return model; }

	public void updateView(Object with) {
		removeAll();
		FormulaView view = FormulaView.get(this);
		add(view.getView(model.top));
		add(view.getView(model.left));
		if (model.right != null) add(view.getView(model.right));
		validate();
	}

	public void setCursorPos(int pos) {
		FormulaView view = FormulaView.get(this);
		switch (pos) {
		case Somewhere_TOP: view.setCursorPart(model.top); break;
		case Somewhere_BOTTOM: view.setCursorPart(model.left); break;
		default: break;
		}
	}

	public int getCursorPos() { return 0; }

	public void activate() {}

	public void deactivate() {}

	public void paint(Graphics g) {
		super.paint(g);
		Dimension siz = getSize();
		Dimension tsiz = getComponent(0).getSize();
		int y = tsiz.height;
System.out.println("TableauPart "+siz+" top "+tsiz);
		if (getComponentCount() == 2) {
			g.drawLine(siz.width/2,y,siz.width/2,y+10);
		} else {
			Dimension lsiz = getComponent(1).getSize();
			Dimension rsiz = getComponent(2).getSize();
			g.drawLine(siz.width/2,y,siz.width/2,y+5);
			g.drawLine(lsiz.width/2,y+5,siz.width-rsiz.width/2,y+5);
			g.drawLine(lsiz.width/2,y+5,lsiz.width/2,y+10);
			g.drawLine(siz.width-rsiz.width/2,y+5,siz.width-rsiz.width/2,y+10);
		}
	}

	public boolean keydn(int key) {
		FormulaView fview = FormulaView.get(this);
		switch (key) {
		case Key_DOWN:
			if (Part.isDescendantOr(fview.getCursorPart(),model.top)) {
				fview.setCursorPart(model.left,Somewhere_TOP);
				return true;
			}
			break;
		case Key_UP:
			if (Part.isDescendantOr(fview.getCursorPart(),model.left)) {
				fview.setCursorPart(model.top,Somewhere_BOTTOM);
				return true;
			} else if (model.right!=null && Part.isDescendantOr(fview.getCursorPart(),model.right)) {
				fview.setCursorPart(model.top,Somewhere_BOTTOM);
				return true;
			}
			break;
		case Key_BS:
			if (fview.getCursorPart()==model.left && Part.isEmpty(model.left)) {
				// delete left branch
				Formula f = fview.getFormula();
				Identifier dummy = new Identifier();
				f.replace(model,dummy);
				if (model.right == null) {
					f.replace(dummy,model.top);
				} else {
					f.replace(dummy,new TableauPart(model.top,model.right));
				}
				fview.setCursorPart(model.top);
				return true;
			}
			break;
		}
		return false;
	}

	public Component createPopup(int x,int y) {
		Button b;
		{	String name = null;
			if (model.right == null) name = "Make double branch";
			else if (Part.isEmpty(model.left) || Part.isEmpty(model.right)) name = "Make single branch";
			if (name != null) {
				b = new Button(name);
				b.addActionListener(this);
				return b;
			}
		}
		return null;
	}

	public void actionPerformed(ActionEvent evt) {
		String cmd = evt.getActionCommand();
		FormulaView view = FormulaView.get(this);
		Formula formula = view.getFormula();
		if (cmd.equals("Make double branch")) {
			model.right = new Identifier("");
			model.right.setParent(model);
			MVC.changed(model);
			view.setCursorPart(model.right);
		} else if (cmd.equals("Make single branch")) {
			if (Part.isEmpty(model.left)) {
				// Remove left branch
				if (model.right != null) {
					if (Part.isDescendantOr(view.getCursorPart(),model.left))
						view.setCursorPart(model.right);
					model.left = model.right;
					model.right = null;
					MVC.changed(model);
				} else {
					if (Part.isDescendantOr(view.getCursorPart(),model.left))
						view.setCursorPart(model.top);
					formula.replace(model.left,new Identifier(""));
				}
			} else if (Part.isEmpty(model.right)) {
				// Remove right branch
				if (Part.isDescendantOr(view.getCursorPart(),model.right))
					view.setCursorPart(model.top);
				model.right = null;
				MVC.changed(model);
			}
		}
	}
}