package edu.umd.cs.piccolo.examples;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Stroke;
import java.util.Iterator;
import java.util.Random;

import edu.umd.cs.piccolo.PCanvas;
import edu.umd.cs.piccolo.PLayer;
import edu.umd.cs.piccolo.PNode;
import edu.umd.cs.piccolo.PRoot;
import edu.umd.cs.piccolo.activities.PActivity;
import edu.umd.cs.piccolo.nodes.PPath;
import edu.umd.cs.piccolox.PFrame;
import edu.umd.cs.piccolox.util.PFixedWidthStroke;

/**
 * 1000 nodes rotated continuously. Note that if you zoom to a portion of the screen where
 * you can't see any nodes the CPU usage goes down to 1%, even though all the objects are
 * still getting rotated continuously (every 20 milliseconds). This shows that the cost
 * of repainting and bounds caches is very cheap compared to the cost of drawing.
 */
public class DynamicExample extends PFrame {

	public DynamicExample() {
		this(null);
	}
	
	public DynamicExample(PCanvas aCanvas) {
		super("DynamicExample", false, aCanvas);
	}
	
	public void initialize() {
		final PLayer layer = getCanvas().getLayer();
		PRoot root = getCanvas().getRoot();
		Random r = new Random();
		for (int i = 0; i < 1000; i++) {
			final PNode n = PPath.createRectangle(0, 0, 100, 80);	
			n.translate(10000 * r.nextFloat(), 10000 * r.nextFloat());
			n.setPaint(new Color(r.nextFloat(), r.nextFloat(),r.nextFloat()));
			layer.addChild(n);
		}
		getCanvas().getCamera().animateViewToCenterBounds(layer.getGlobalFullBounds(), true, 0);
		PActivity a = new PActivity(-1, 20) {
			public void activityStep(long currentTime) {
				super.activityStep(currentTime);
				rotateNodes();
			}
		};
		root.addActivity(a);
		
		PPath p = new PPath();
		p.moveTo(0, 0);
		p.lineTo(0, 1000);
		PFixedWidthStroke stroke = new PFixedWidthStroke(2, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 10, new float[] {5, 2}, 0);
		p.setStroke(stroke);
		layer.addChild(p);
	}

	public void rotateNodes() {
		Iterator i = getCanvas().getLayer().getChildrenReference().iterator();
		while (i.hasNext()) {
			PNode each = (PNode) i.next();
			each.rotate(Math.toRadians(2));
		}
	}

	public static void main(String[] args) {
		new DynamicExample();
	}
}
