/*
 * File: RandomShapes.java
 * -----------------------
 * This file creates ten boxes, ovals, and stars at random locations
 * on the screen, pausing for a suitable interval between each one.
 */

import acm.graphics.*;
import acm.program.*;
import acm.util.*;

public class RandomShapes extends GraphicsProgram {

/** Runs the program */
	public void run() {
		while (true) {
			for (int i = 0; i < NOBJECTS; i++) {
				addOneRandomShape();
				pause(PAUSE_TIME);
			}
			waitForClick();
			removeAll();
		}
	}

/* Adds a random shape to the canvas */
	private void addOneRandomShape() {
		GObject gobj = createRandomShape();
		gobj.setColor(rgen.nextColor());
		if (gobj instanceof GFillable) ((GFillable) gobj).setFilled(true);
		double x = rgen.nextDouble(0, getWidth() - gobj.getWidth())
		             - gobj.getBounds().getX();
		double y = rgen.nextDouble(0, getHeight() - gobj.getHeight())
		             - gobj.getBounds().getY();
		add(gobj, x, y);
	}

/* Generates a random shape whose reference point is the origin */
	private GObject createRandomShape() {
		double width = rgen.nextDouble(MIN_SIZE, MAX_SIZE);
		double height = rgen.nextDouble(MIN_SIZE, MAX_SIZE);
		switch (rgen.nextInt(3)) {
		  case 0: return new GRect(width, height);
		  case 1: return new GOval(width, height);
		  case 2: return new GStar(width);
		  default: throw new ErrorException("Illegal shape index");
		}
	}

/* Private constants */
	private static final int NOBJECTS = 10;
	private static final int PAUSE_TIME = 1000;
	private static final double MIN_SIZE = 25;
	private static final double MAX_SIZE = 150;

/* Private instance variables */
	private RandomGenerator rgen = RandomGenerator.getInstance();

/* Standard Java entry point */
/* This method can be eliminated in most Java environments */
	public static void main(String[] args) {
		new RandomShapes().start(args);
	}
}
