package framework.RWT;

import java.awt.AWTEvent;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.GraphicsConfiguration;
import java.awt.event.MouseEvent;
import java.util.ArrayList;

import javax.swing.event.MouseInputListener;


import framework.model3D.Universe;


/**
 * GUI部品（RWTWidget）を配置可能なコンテナ、GUI部品のアクティベーションも管理できる
 * 
 * @author 新田直也
 * 
 */
@SuppressWarnings("serial")
public abstract class RWTContainer extends Container {
	private ArrayList<RWTCanvas3D> canvases = null;

	private ArrayList<RWTWidget> widgetList = new ArrayList<RWTWidget>();
	private RWTSelectionManager active = new RWTSelectionManager();

	public abstract void build(GraphicsConfiguration gc);

	public abstract void keyPressed(RWTVirtualKey key);

	public abstract void keyReleased(RWTVirtualKey key);

	public abstract void keyTyped(RWTVirtualKey key);

	public RWTContainer() {
		setLayout(null);
		setFocusable(false);
		widgetList.add(active.getSelector());
		enableEvents(AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK);
	}

	public void addCanvas(RWTCanvas3D cavas) {
		if (canvases == null) canvases = new ArrayList<RWTCanvas3D>();
		canvases.add(cavas);
		cavas.adjust(this);
		add(cavas.getDisplayCanvas());
	}

	public void paint(Graphics g) {
		super.paint(g);

		if (canvases != null) {
			for (int i = 0; i < canvases.size(); i++) {
				canvases.get(i).adjust(this);
				canvases.get(i).getDisplayCanvas().paint(g);
			}
		}

		for (int i = 0; i < widgetList.size(); i++) {
			RWTWidget widget = widgetList.get(i);
			if (widget.isVisible()) {
				widget.adjust(this);
				widget.paint(g);
			}
		}
	}

	public RWTCanvas3D getPrimaryRWTCanvas3D() {
		if (canvases == null) return null;
		return canvases.get(0);
	}
	
	public int getNumberOfRWTCanvas3D() {
		if (canvases == null) return 0;
		return canvases.size();
	}
	
	public RWTCanvas3D getRWTCanvas3D(int index) {
		return canvases.get(index);
	}

	/**
	 * カーソルで選べないWidgetを加えます。
	 * 
	 * @param widget
	 */
	public void addWidget(RWTWidget widget) {
		widgetList.add(widget);
	}
	
	/**
	 * カーソルで選べないWidgetを加えます。
	 * 
	 * @param widget
	 */
	public void addWidgetOnBack(RWTWidget widget) {
		widgetList.add(0, widget);
	}

	/**
	 * 　アクティベーションを操作するマネージャーを設定する。
	 * 
	 * @param manager
	 */
	public void setActiveManager(RWTSelectionManager manager) {
		active = manager;
	}

	/**
	 * カーソルで選べるWidgetを加えます。
	 * 
	 * @param w
	 * @param n
	 * @param m
	 */
	public void addSelectableWidget(RWTSelectableWidget r, int n, int m) {
		active.add(r, n, m);
		widgetList.add(0, (RWTWidget) r);
	}

	/**
	 * カーソルで選べるWidgetを前面に加えます。
	 * 
	 * @param w
	 * @param n
	 * @param m
	 */
	public void addSelectableWidgetOnFront(RWTSelectableWidget r, int n, int m) {
		active.add(r, n, m);
		widgetList.add((RWTWidget) r);
	}

	/**
	 * カーソルをひとつ上に動かします。
	 */
	public void cursorMoveUp() {
		active.up();
		repaint();
	}

	/**
	 * カーソルをひとつ下に動かします。
	 */
	public void cursorMoveDown() {
		active.down();
		repaint();
	}

	/**
	 * カーソルをひとつ左に動かします。
	 */
	public void cursorMoveLeft() {
		active.left();
		repaint();
	}

	/**
	 * カーソルをひとつ右に動かします。
	 */
	public void cursorMoveRight() {
		active.right();
		repaint();
	}

	public RWTWidget getSelectedWidget() {
		return active.getSelectedWidget();
	}
	
	public void processEvent(AWTEvent e) {
		// イベントを RWTFrame3D に返す
		Container c = this.getParent();
		while (c != null && !(c instanceof RWTFrame3D)) {
			c = c.getParent();
		}
		if (c != null) ((RWTFrame3D)c).processEvent(e);
		super.processEvent(e);
	}
}
