/*
 * Created on Apr 28, 2003
 *
 * To change this generated comment go to 
 * Window>Preferences>Java>Code Generation>Code Template
 */
package jdraw.figures;

import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.util.List;
import java.util.Set;
import java.util.HashSet;
import java.util.ArrayList;
import java.util.Iterator;

import jdraw.framework.*;

/**
 * @author Christoph Denzler
 */
public class GroupFigure extends AbstractFigure {
	private static final int NW = 0;
	private static final int SW = 1;
	private static final int SE = 2;
	private static final int NE = 3;

	private Set figures;
	
	public GroupFigure(Set elements) {
		if (elements == null) elements = new HashSet();
		figures = elements;
	}

	public void setBounds(Point origin, Point corner) {
	}

	public void draw(Graphics g) {
		Iterator it = figures.iterator();
		while(it.hasNext()) {
			((Figure)it.next()).draw(g);
		}
		notifyListeners(new FigureEvent(this));
	}

	public void move(int dx, int dy) {
		Iterator it = figures.iterator();
		while(it.hasNext()) {
			((Figure)it.next()).move(dx, dy);
		}
	}

	public boolean contains(int x, int y) {
		boolean contains = false;
		Iterator it = figures.iterator();
		while(it.hasNext()) {
			contains |= ((Figure)it.next()).contains(x, y);
		}
		return contains;
	}

	public Rectangle getBounds() {
		Rectangle r = null;
		Iterator it = figures.iterator();
		if (it.hasNext()) r = ((Figure)it.next()).getBounds();
		while(it.hasNext()) {
			r.add(((Figure)it.next()).getBounds());
		}
		return r;
	}

	public List getHandles() {
		List handles = new ArrayList(4);
		handles.add(new StdMoveHandle(NW, this));
		handles.add(new StdMoveHandle(SW, this));
		handles.add(new StdMoveHandle(SE, this));
		handles.add(new StdMoveHandle(NE, this));
		return handles;
	}

	public Set unGroup() {
		Set s = figures;
		figures = null;
		return s;
	}

	/**
	 * Copies the internals of Rectangle.
	 * 
	 * @see java.lang.Object#clone()
	 */
	public Object clone() {
		GroupFigure copy = (GroupFigure)super.clone();
		if (copy != null) {
			copy.figures = new HashSet();
			for (Iterator it = figures.iterator(); it.hasNext();) {
				copy.figures.add(((Figure)it.next()).clone());
			}
		}
		return copy;
	}

}
