/*******************************************************************************
 * <copyright>
 *
 * Copyright (c) 2012, 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
 *
 * </copyright>
 *
 *******************************************************************************/
package org.eclipse.graphiti.pattern;

import org.eclipse.emf.common.util.EList;
import org.eclipse.graphiti.mm.Property;
import org.eclipse.graphiti.mm.PropertyContainer;
import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;
import org.eclipse.graphiti.mm.pictograms.ContainerShape;
import org.eclipse.graphiti.mm.pictograms.Diagram;
import org.eclipse.graphiti.mm.pictograms.PictogramElement;
import org.eclipse.graphiti.mm.pictograms.Shape;
import org.eclipse.graphiti.pattern.config.IPatternConfiguration;
import org.eclipse.graphiti.services.Graphiti;

/**
 * This class provides the basis for all specific pattern types. It provides
 * functionality to tag a shape as being created and maintained by a specific
 * pattern type. Type type is identified using a special {@link Property} with
 * the key PROPERTY_KEY_PATTERN_TYPE.
 * 
 * @since 0.10
 * @experimental This API is in an experimental state and should be used by
 *               clients only with care, as it not final and can be removed or
 *               changed without prior notice!
 */
public abstract class TypedPattern extends AbstractPattern {

	/**
	 * Constant indication the type of pattern, e.g. ID pattern.
	 */
	protected static final String PROPERTY_KEY_PATTERN_TYPE = "org.eclipse.graphiti.pattern.patternType";

	/**
	 * Constructor to be used when no configuration data is needed.
	 */
	public TypedPattern() {
		super();
	}

	/**
	 * Constructor to be used when configuration data is needed.
	 */
	public TypedPattern(IPatternConfiguration patternConfiguration) {
		super(patternConfiguration);
	}

	/**
	 * Sets the property that indicates that the given root shape of the pattern
	 * is created and maintained by a specific pattern type.
	 * 
	 * @param patternRootShape
	 *            The {@link PropertyContainer} object that is used as root
	 *            shape of the pattern.
	 * @param patternType
	 *            The {@link String} type of the pattern.
	 */
	protected void setPatternType(PropertyContainer patternRootShape, String patternType) {
		Graphiti.getPeService().setPropertyValue(patternRootShape, PROPERTY_KEY_PATTERN_TYPE, patternType);
	}

	/**
	 * Returns the property that indicates that the given root shape of the
	 * pattern is created and maintained by a specific pattern type if it is set
	 * for the given shape or one of its parents. If the property is set for the
	 * given shape it is returned, otherwise the parents are asked for the
	 * property; first the parent {@link ContainerShape} in the shape hierarchy
	 * is asked if there is no parent the {@link GraphicsAlgorithm} parent is
	 * asked.
	 * 
	 * @param patternRootShape
	 *            The {@link PropertyContainer} object that is used as root
	 *            shape of the pattern.
	 * @return The {@link String} type of the pattern.
	 */
	protected String getPatternType(PropertyContainer patternRootShape) {
		EList<Property> properties = patternRootShape.getProperties();
		for (Property property : properties) {
			if (PROPERTY_KEY_PATTERN_TYPE.equals(property.getKey())) {
				return property.getValue();
			}
		}
		if (patternRootShape instanceof Shape) {
			ContainerShape parent = ((Shape) patternRootShape).getContainer();
			if (parent != null && !(parent instanceof Diagram)) {
				return getPatternType(parent);
			}
		} else if (patternRootShape instanceof GraphicsAlgorithm) {
			PictogramElement pictogramElement = ((GraphicsAlgorithm) patternRootShape).getPictogramElement();
			if (pictogramElement != null) {
				return getPatternType(pictogramElement);
			} else {
				GraphicsAlgorithm parentGraphicsAlgorithm = ((GraphicsAlgorithm) patternRootShape)
						.getParentGraphicsAlgorithm();
				if (parentGraphicsAlgorithm != null) {
					return getPatternType(parentGraphicsAlgorithm);
				}
			}
		}
		return null;
	}
}
