/******************************************************************************
 * Copyright (c) 2005, 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.gmf.runtime.diagram.ui.render.editparts;

import java.util.List;
import java.util.ListIterator;

import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Layer;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gmf.runtime.common.ui.util.DisplayUtils;
import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramRootEditPart;
import org.eclipse.gmf.runtime.draw2d.ui.internal.graphics.MapModeGraphics;
import org.eclipse.gmf.runtime.draw2d.ui.internal.graphics.ScaledGraphics;
import org.eclipse.gmf.runtime.draw2d.ui.mapmode.IMapMode;
import org.eclipse.gmf.runtime.draw2d.ui.render.figures.ScalableImageFigure;
import org.eclipse.gmf.runtime.draw2d.ui.render.internal.graphics.RenderedMapModeGraphics;
import org.eclipse.gmf.runtime.draw2d.ui.render.internal.graphics.RenderedScaledGraphics;
import org.eclipse.gmf.runtime.gef.ui.internal.editparts.AnimatedZoomListener;
import org.eclipse.gmf.runtime.notation.MeasurementUnit;
import org.eclipse.swt.widgets.Display;

/**
 * A specialized <code>DiagramRootEditPart</code> that supports rendering of
 * images.
 * 
 * @author cmahoney
 */
public class RenderedDiagramRootEditPart
	extends DiagramRootEditPart {

	/**
	 * Default constructor
	 */
	public RenderedDiagramRootEditPart() {
		super();
	}
	
	/**
	 * @param mu the <code>MeasurementUnit</code> that is the native coordinate system
	 * for this root edit part.
	 */
	public RenderedDiagramRootEditPart(MeasurementUnit mu) {
		super(mu);
	}

	static protected class DiagramRenderedScalableFreeformLayeredPane
		extends DiagramScalableFreeformLayeredPane implements AnimatedZoomListener {

		@SuppressWarnings("unused")
		private boolean animatedZoomOn;
		static final private Dimension MAX_RENDER_SIZE;
		static {
			Display display = DisplayUtils.getDisplay();
			MAX_RENDER_SIZE = new Dimension(display.getBounds().width, display
					.getBounds().height);
		}
		
		/*
		 * (non-Javadoc)
		 * 
		 * @see org.eclipse.gmf.runtime.draw2d.ui.internal.graphics.ScalableFreeformLayeredPane#createScaledGraphics(org.eclipse.gmf.runtime.draw2d.ui.internal.graphics.MapModeGraphics)
		 */
		protected ScaledGraphics createScaledGraphics(MapModeGraphics gMM) {
//			if (animatedZoomOn) {
//				return new RenderedScaledGraphics(gMM);
//			}

			return new RenderedScaledGraphics(gMM, true, MAX_RENDER_SIZE);
		}

		/*
		 * (non-Javadoc)
		 * 
		 * @see org.eclipse.gmf.runtime.draw2d.ui.internal.graphics.ScalableFreeformLayeredPane#createMapModeGraphics(org.eclipse.draw2d.Graphics)
		 */
		protected MapModeGraphics createMapModeGraphics(Graphics graphics) {
			MapModeGraphics gMM = new RenderedMapModeGraphics(graphics, getMapMode(), true, MAX_RENDER_SIZE);
			return gMM;
		}

		/*
		 * (non-Javadoc)
		 * 
		 * @see org.eclipse.gmf.runtime.gef.ui.internal.editparts.AnimatedZoomListener#animatedZoomEnded()
		 */
		public void animatedZoomEnded() {
			animatedZoomOn = false;
			
			// only repaint ScalableImageFigures
			Layer primaryLayer = getLayer(PRINTABLE_LAYERS);
			if (primaryLayer != null)
				paintScalableImageFigures(primaryLayer.getChildren());
		}

		private void paintScalableImageFigures(List figures) {
			ListIterator iter = figures.listIterator();
			Rectangle absbounds = getBounds().getCopy();
			translateToAbsolute(absbounds);
			
			while (iter.hasNext()) {
				IFigure fig = (IFigure)iter.next();
				if (fig instanceof ScalableImageFigure) {
					Rectangle absfigbounds = fig.getBounds().getCopy();
					fig.translateToAbsolute(absfigbounds);
					if (absbounds.intersects(absfigbounds))
						fig.repaint();
				}
				else {
					paintScalableImageFigures(fig.getChildren());
				}
			}
		}
		
		/*
		 * (non-Javadoc)
		 * 
		 * @see org.eclipse.gmf.runtime.gef.ui.internal.editparts.AnimatedZoomListener#animatedZoomStarted()
		 */
		public void animatedZoomStarted() {
			animatedZoomOn = true;
		}

		public DiagramRenderedScalableFreeformLayeredPane(IMapMode mm) {
			super(mm);
		}
	}

	/**
	 * Creates a scalable freeform layered pane that supports rendering of
	 * images.
	 */
	protected org.eclipse.draw2d.ScalableFreeformLayeredPane createScalableFreeformLayeredPane() {
		setLayers(new DiagramRenderedScalableFreeformLayeredPane(getMapMode()));
		return getLayers();
	}
}