package gizmoball.ui.r2;

import gizmoball.game.AbstractGizmo;
import gizmoball.game.AbstractGizmoWithPolygonalGeometry;
import gizmoball.game.BallGizmo;
import gizmoball.game.FlipperGizmo;
import gizmoball.game.SquareBumperGizmo;
import gizmoball.game.TriangleBumperGizmo;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JPanel;

import physics.Angle;
import physics.Vect;

/**
 * A test application for R2GizmoDrawers.  Since the drawers
 * only use information that is universal to all gizmos, they
 * can be tested without implementations of actual gizmos.
 * BallGizmo has been chosen as the stub AbstractGizmo for
 * availability reasons.  The test attempts to draw various
 * gizmos on a test context.<p>
 * 
 * EDIT: Since more gizmos have been completed, the test can
 * now make gizmos and will not have to resort to using a
 * BallGizmo as a stub.  However, existing test cases may be
 * grandfathered in.<p> 
 * 
 * @author Albert Leung
 * @version $Id: R2DrawerTestApp.java,v 1.1 2004/04/28 02:58:07 amthrax Exp $
 * 
 */
public class R2DrawerTestApp {
	
	/*
	 * An internal class to which gizmo-drawer pairs are added.
	 * On paint, the panel iterates through its gizmo-drawer
	 * pairs and uses each drawer to draw the associated gizmo.
	 *
	 */
	private class TestPanel extends JPanel {
		List /*<R2GizmoDrawer>*/ drawers;
		List /*<AbstractGizmo>*/ gizmos;
		
		public TestPanel() {
			this.setPreferredSize(new Dimension(400, 400));
			drawers = new ArrayList();
			gizmos = new ArrayList();
		}
		
		public void addItemToDraw(AbstractGizmo gizmo, R2GizmoDrawer drawer) {
			drawers.add(drawer);
			gizmos.add(gizmo);
		}
		
		public void paint(Graphics g) {
			super.paint(g);
			Graphics2D g2 =(Graphics2D)g;
			R2GameBoardDrawer.getInstance().drawGameBoard(g2, null);
			for (int i = 0; i < drawers.size(); i++) {
				((R2GizmoDrawer)drawers.get(i)).drawGizmo(g2, (AbstractGizmo)gizmos.get(i));
			}
		}
	}
	
	public R2DrawerTestApp() {
		int L = R2GizmoDrawer.L_IN_PIXELS;
		
		//make some gizmos
		AbstractGizmo square = new BallGizmo();
		square.setPosition(new Vect(1, 1));
		AbstractGizmo circle = new BallGizmo();
		circle.setPosition(new Vect(1, 2));
		AbstractGizmo ball = new BallGizmo();
		ball.setPosition(new Vect(2, 10));
		AbstractGizmoWithPolygonalGeometry poly = new SquareBumperGizmo();
		poly.setPosition(new Vect(5,5));
		poly.setOrientation(new Angle(1));
		AbstractGizmoWithPolygonalGeometry poly2 = new TriangleBumperGizmo();
		poly2.setPosition(new Vect(3,4));		
		FlipperGizmo flip = new FlipperGizmo();
		flip.setPosition(new Vect(10,10));
		flip.setOrientation(new Angle(2));
		
		//fill the test panel with gizmo-drawer pairs
		TestPanel testPanel = new TestPanel();
		//testPanel.addItemToDraw(square, R2SquareDrawer.getInstance());
		testPanel.addItemToDraw(circle, R2CircleDrawer.getInstance());
		testPanel.addItemToDraw(ball, R2BallDrawer.getInstance());
		testPanel.addItemToDraw(poly, R2PolygonDrawer.getInstance());
		testPanel.addItemToDraw(poly2, R2PolygonDrawer.getInstance());
		testPanel.addItemToDraw(flip, R2FlipperDrawer.getInstance());
		
		//do it
		JFrame testFrame =new JFrame("R2DrawerTestApp");
		testFrame.getContentPane().add(testPanel);
		testPanel.repaint();
		
		testFrame.pack();
		testFrame.show();
	}
	
	public static void main(String[] args) {
		R2DrawerTestApp test = new R2DrawerTestApp();	
	}
	
}
