package com.mxgraph.view;

import java.util.Hashtable;

import com.mxgraph.model.mxCell;
import com.mxgraph.util.mxRectangle;

public class mxTemporaryCellStates
{
	/**
	 * 
	 */
	protected mxGraphView view;

	/**
	 * 
	 */
	protected Hashtable<Object, mxCellState> oldStates;

	/**
	 * 
	 */
	protected mxRectangle oldBounds;

	/**
	 * 
	 */
	protected double oldScale;

	/**
	 * Constructs a new temporary cell states instance.
	 */
	public mxTemporaryCellStates(mxGraphView view)
	{
		this(view, 1, null);
	}

	/**
	 * Constructs a new temporary cell states instance.
	 */
	public mxTemporaryCellStates(mxGraphView view, double scale)
	{
		this(view, scale, null);
	}

	/**
	 * Constructs a new temporary cell states instance.
	 */
	public mxTemporaryCellStates(mxGraphView view, double scale, Object[] cells)
	{
		this.view = view;

		// Stores the previous state
		oldBounds = view.getGraphBounds();
		oldStates = view.getStates();
		oldScale = view.getScale();

		// Creates space for the new states
		view.setStates(new Hashtable<Object, mxCellState>());
		view.setScale(scale);

		if (cells != null)
		{
			// Creates virtual parent state for validation
			mxCellState state = view.createState(new mxCell());

			// Validates the vertices and edges without adding them to
			// the model so that the original cells are not modified
			for (int i = 0; i < cells.length; i++)
			{
				view.validateBounds(state, cells[i]);
			}
			
			mxRectangle bbox = null;
			
			for (int i = 0; i < cells.length; i++)
			{
				mxRectangle bounds = view.validatePoints(state, cells[i]);
				
				if (bounds != null)
				{
					if (bbox == null)
					{
						bbox = bounds;
					}
					else
					{
						bbox.add(bounds);
					}
				}
			}
			
			if (bbox == null)
			{
				bbox = new mxRectangle();
			}

			view.setGraphBounds(bbox);
		}
	}

	/**
	 * Destroys the cell states and restores the state of the graph view.
	 */
	public void destroy()
	{
		view.setScale(oldScale);
		view.setStates(oldStates);
		view.setGraphBounds(oldBounds);
	}

}
