/*******************************************************************************
 * <copyright>
 *
 * Copyright (c) 2005, 2012 SAP AG.
 * 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:
 *    SAP AG - initial API, implementation and documentation
 *    mwenz - Bug 342869 - Image doesn't scale the contained SWT Image on resize
 *
 * </copyright>
 *
 *******************************************************************************/
package org.eclipse.graphiti.testtool.sketch.features.create;

import org.eclipse.graphiti.features.IFeatureProvider;
import org.eclipse.graphiti.features.context.ICreateContext;
import org.eclipse.graphiti.features.impl.AbstractCreateFeature;
import org.eclipse.graphiti.mm.GraphicsAlgorithmContainer;
import org.eclipse.graphiti.mm.algorithms.AbstractText;
import org.eclipse.graphiti.mm.algorithms.Ellipse;
import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;
import org.eclipse.graphiti.mm.algorithms.Image;
import org.eclipse.graphiti.mm.algorithms.Polygon;
import org.eclipse.graphiti.mm.algorithms.Polyline;
import org.eclipse.graphiti.mm.algorithms.Rectangle;
import org.eclipse.graphiti.mm.algorithms.RoundedRectangle;
import org.eclipse.graphiti.mm.algorithms.styles.Font;
import org.eclipse.graphiti.mm.algorithms.styles.Orientation;
import org.eclipse.graphiti.mm.pictograms.Anchor;
import org.eclipse.graphiti.mm.pictograms.AnchorContainer;
import org.eclipse.graphiti.mm.pictograms.BoxRelativeAnchor;
import org.eclipse.graphiti.mm.pictograms.ChopboxAnchor;
import org.eclipse.graphiti.mm.pictograms.Connection;
import org.eclipse.graphiti.mm.pictograms.ContainerShape;
import org.eclipse.graphiti.mm.pictograms.Diagram;
import org.eclipse.graphiti.mm.pictograms.FixPointAnchor;
import org.eclipse.graphiti.services.Graphiti;
import org.eclipse.graphiti.services.IGaService;
import org.eclipse.graphiti.services.IPeCreateService;
import org.eclipse.graphiti.testtool.sketch.SketchFeatureProvider;
import org.eclipse.graphiti.testtool.sketch.SketchImageProvider;
import org.eclipse.graphiti.util.IColorConstant;

/**
 * The Class SketchCreateGaFeature.
 */
public abstract class SketchCreateGaFeature extends AbstractCreateFeature {

	private static final String NEW_ELEMENT = "new element";
	private Class<? extends GraphicsAlgorithm> gaType;
	private static int MIN_SIZE = 51;

	/**
	 * Instantiates a new sketch create ga feature.
	 * 
	 * @param fp
	 *            the fp
	 * @param name
	 *            the name
	 * @param description
	 *            the description
	 * @param gaType
	 *            the ga type
	 */
	public SketchCreateGaFeature(IFeatureProvider fp, String name, String description,
			Class<? extends GraphicsAlgorithm> gaType) {
		super(fp, name, description);
		setGaType(gaType);
	}

	public boolean canCreate(ICreateContext context) {
		boolean ret = false;
		ContainerShape targetContainer = context.getTargetContainer();
		if (targetContainer != null) {
			ret = true;
		}
		return ret;
	}

	public Object[] create(ICreateContext context) {
		ContainerShape targetContainer = context.getTargetContainer();
		AnchorContainer newAc = createAnchorContainer(targetContainer);
		IPeCreateService pecService = Graphiti.getPeCreateService();
		IGaService gaService = Graphiti.getGaService();
		final ChopboxAnchor newAnchor = pecService.createChopboxAnchor(newAc);

		int width = context.getWidth() < MIN_SIZE ? MIN_SIZE : context.getWidth();
		int height = context.getHeight() < MIN_SIZE ? MIN_SIZE : context.getHeight();

		GraphicsAlgorithm newGa = createGa(newAc, width, height);

		gaService.setLocationAndSize(newGa, context.getX(), context.getY(), width, height);

		if (!Image.class.equals(gaType)) {
			AbstractText label;
			if (isMultiLineText()) {
				label = gaService.createDefaultMultiText(getDiagram(), newGa, NEW_ELEMENT);
			} else {
				label = gaService.createText(newGa, NEW_ELEMENT);
			}
			Font font = gaService.manageFont(getDiagram(), "Comic Sans MS", 14);
			label.setFont(font);
			label.setForeground(manageColor(IColorConstant.BLUE));
			label.setHorizontalAlignment(Orientation.ALIGNMENT_CENTER);
			label.setVerticalAlignment(Orientation.ALIGNMENT_CENTER);
			gaService.setLocationAndSize(label, 0, 0, width, height);
		}
		layoutPictogramElement(newAc);

		final Connection targetConnection = context.getTargetConnection();
		if (targetConnection != null) {
			gaService.setLocation(newGa, context.getX() - (width / 2), context.getY() - (height / 2));

			Anchor oldEndAnchor = targetConnection.getEnd();
			targetConnection.setEnd(newAnchor);

			Connection connection = pecService.createFreeFormConnection(getDiagram());
			Polyline p = gaService.createPolyline(connection);

			GraphicsAlgorithm targetConnectionGraphicsAlgorithm = targetConnection.getGraphicsAlgorithm();
			p.setLineWidth(targetConnectionGraphicsAlgorithm.getLineWidth());
			p.setForeground(targetConnectionGraphicsAlgorithm.getForeground());
			p.setLineStyle(targetConnectionGraphicsAlgorithm.getLineStyle());

			connection.setStart(newAnchor);
			connection.setEnd(oldEndAnchor);
		}

		SketchFeatureProvider fp = (SketchFeatureProvider) getFeatureProvider();
		if (fp.isTestMode() && (newGa instanceof Rectangle)) {
			BoxRelativeAnchor bra = pecService.createBoxRelativeAnchor(newAc);
			Rectangle r = gaService.createRectangle(bra);
			gaService.setLocationAndSize(r, -5, 0, 10, 10);
			r.setTransparency(1.0);
			bra.setRelativeWidth(0.5);

			FixPointAnchor fpa = pecService.createFixPointAnchor(newAc);
			r = gaService.createRectangle(fpa);
			gaService.setLocationAndSize(r, 0, 0, 10, 10);
			r.setTransparency(1.0);
			fpa.setLocation(gaService.createPoint(10, 10));
		}
		// Create an italic font to use it later in the rich tooltip
		gaService.manageFont(getDiagram(), IGaService.DEFAULT_FONT, IGaService.DEFAULT_FONT_SIZE, true, false);

		return new Object[] { newAc };
	}

	/**
	 * Creates the anchor container.
	 * 
	 * @param targetContainer
	 *            the target container
	 * 
	 * @return the anchor container
	 */
	abstract protected AnchorContainer createAnchorContainer(ContainerShape targetContainer);

	/**
	 * Creates the ga.
	 * 
	 * @param gac
	 *            the gac
	 * @param width
	 *            the width
	 * @param height
	 *            the height
	 * 
	 * @return the graphics algorithm
	 */
	protected GraphicsAlgorithm createGa(GraphicsAlgorithmContainer gac, int width, int height) {
		GraphicsAlgorithm ret = null;
		IGaService gaService = Graphiti.getGaService();
		if (RoundedRectangle.class.equals(gaType)) {
			ret = gaService.createRoundedRectangle(gac, 10, 10);
		} else if (Rectangle.class.equals(gaType)) {
			ret = gaService.createRectangle(gac);
		} else if (Ellipse.class.equals(gaType)) {
			ret = gaService.createEllipse(gac);
		} else if (Polyline.class.equals(gaType)) {
			// top-left, top-right, bottom-right, bottom-left
			int[] xy = new int[] { 0, 0, width, 0, width, height, 0, height };
			int[] ba = new int[] { 0, 0, 20, 40, 40, 20, 0, 0 };
			Polyline p = gaService.createPolyline(gac, xy, ba);
			ret = p;
		} else if (Polygon.class.equals(gaType)) {
			if (getCreateName().startsWith("Tria")) { // triangle
				// top-middle, bottom-right, bottom-left
				int xy[] = new int[] { width / 2, 0, width, height, 0, height };
				int ba[] = new int[] { 0, 0, 40, 40, 40, 40 };
				Polygon p = gaService.createPolygon(gac, xy, ba);
				ret = p;
			} else { // arrow
				// top-left, top-middle, middle-right, bottom-middle,
				// bottom-right
				int xy[] = new int[] { 0, 0, (2 * width / 3), 0, width, height / 2, (2 * width / 3), height, 0, height };
				int ba[] = new int[] { 0, 0, 30, 15, 0, 0, 15, 30, 60, 60 };
				Polygon p = gaService.createPolygon(gac, xy, ba);
				ret = p;
			}
		} else if (Image.class.equals(gaType)) {
			Image image = gaService.createImage(gac, SketchImageProvider.IMG_GRAPHITI);
			image.setStretchH(true);
			image.setStretchV(true);
			image.setProportional(true);
			ret = image;
		}

		if (ret != null) {
			Diagram diagram = getDiagram();
			ret.setForeground(gaService.manageColor(diagram, IColorConstant.BLACK));
			ret.setBackground(gaService.manageColor(diagram, IColorConstant.WHITE));
			ret.setTransparency(0.3);
			ret.setLineWidth(2);
		}

		return ret;
	}

	private void setGaType(Class<? extends GraphicsAlgorithm> gaType) {
		this.gaType = gaType;
	}

	protected Class<?> getGaType() {
		return gaType;
	}

	protected boolean isMultiLineText() {
		return true;
	}
}
