/*******************************************************************************
 * Copyright (c) 2000, 2010 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.gef.requests;

import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;

import org.eclipse.gef.RequestConstants;

/**
 * A Request to create a new object.
 */
public class CreateRequest extends org.eclipse.gef.Request implements
		DropRequest {

	private Object newObject;

	private Dimension size;
	private Point location;
	private int flags = 0;
	private static final int SNAP_TO = 1;

	private CreationFactory creationFactory;

	/**
	 * Creates a CreateRequest with the default type.
	 */
	public CreateRequest() {
		setType(RequestConstants.REQ_CREATE);
	}

	/**
	 * Creates a CreateRequest with the given type.
	 * 
	 * @param type
	 *            The type of request.
	 */
	public CreateRequest(Object type) {
		setType(type);
	}

	/**
	 * Returns the CreationFactory for this request.
	 * 
	 * @return the CreationFactory
	 */
	protected CreationFactory getFactory() {
		return creationFactory;
	}

	/**
	 * Returns the location of the object to be created.
	 * 
	 * @return the location
	 */
	public Point getLocation() {
		return location;
	}

	/**
	 * Gets the new object from the factory and returns that object.
	 * 
	 * @return the new object
	 */
	public Object getNewObject() {
		if (newObject == null) {
			if (getFactory() == null) {
				throw new IllegalArgumentException(
						"CreateRequest has unspecified CreationFactory"); //$NON-NLS-1$
			}
			newObject = getFactory().getNewObject();
		}
		return newObject;
	}

	/**
	 * Returns the type of the new object.
	 * 
	 * @return the type of the new object
	 */
	public Object getNewObjectType() {
		if (getFactory() == null) {
			throw new IllegalArgumentException(
					"CreateRequest has unspecified CreationFactory"); //$NON-NLS-1$
		}
		return getFactory().getObjectType();
	}

	/**
	 * Returns the size of the object to be created.
	 * 
	 * @return the size
	 */
	public Dimension getSize() {
		return size;
	}

	/**
	 * Returns <code>true</code> if snap-to is enabled
	 * 
	 * @since 3.7
	 * @return <code>true</code> if the request is for a creation with snap-to
	 *         enabled
	 */
	public boolean isSnapToEnabled() {
		return (flags & SNAP_TO) != 0;
	}

	/**
	 * Sets the factory to be used when creating the new object.
	 * 
	 * @param factory
	 *            the factory
	 */
	public void setFactory(CreationFactory factory) {
		creationFactory = factory;
	}

	/**
	 * Sets the location where the new object will be placed.
	 * 
	 * @param location
	 *            the location
	 */
	public void setLocation(Point location) {
		this.location = location;
	}

	/**
	 * Sets the size of the new object.
	 * 
	 * @param size
	 *            the size
	 */
	public void setSize(Dimension size) {
		this.size = size;
	}

	/**
	 * Used to set whether snap-to is being performed.
	 * 
	 * @since 3.7
	 * @param value
	 *            <code>true</code> if the request is for a creation with
	 *            snap-to enabled
	 */
	public void setSnapToEnabled(boolean value) {
		flags = value ? (flags | SNAP_TO) : (flags & ~SNAP_TO);
	}
}
