/*******************************************************************************
 * <copyright>
 *
 * Copyright (c) 2005, 2010 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.services;

import java.util.List;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.graphiti.mm.Property;
import org.eclipse.graphiti.mm.pictograms.Diagram;
import org.eclipse.graphiti.mm.pictograms.PictogramElement;
import org.eclipse.graphiti.mm.pictograms.PictogramLink;
import org.eclipse.graphiti.tb.IToolBehaviorProvider;

/**
 * The interface ILinkService provides services for the link handling between
 * the graphical representation (pictogram elements) and the domain model
 * (business objects).
 * 
 * @noimplement This interface is not intended to be implemented by clients.
 * @noextend This interface is not intended to be extended by clients.
 */
public interface ILinkService {

	/**
	 * Returns all business objects which are linked to the given pictogram
	 * element.<br>
	 * Note: Identity of domain or business objects is determined by default
	 * using the method
	 * {@link EcoreUtil#equals(org.eclipse.emf.ecore.EObject, org.eclipse.emf.ecore.EObject)}
	 * , which relies on the compared EMF objects having different IDs or
	 * attributes. The way Graphiti used to compare EMF business objects can be
	 * changed by overriding
	 * {@link IToolBehaviorProvider#equalsBusinessObjects(Object, Object)}.
	 * 
	 * @param pictogramElement
	 *            The pictogram element for which to return the business
	 *            objects.
	 * @return The business objects which are linked to the given pictogram
	 *         element. Can be empty but not null.
	 */
	EObject[] getAllBusinessObjectsForLinkedPictogramElement(PictogramElement pictogramElement);

	/**
	 * Returns the first of possibly several business objects which are linked
	 * to the given pictogram element. This is a convenience method for
	 * {@link #getAllBusinessObjectsForLinkedPictogramElement(PictogramElement)}
	 * , because in many use cases only a single business object is linked.<br>
	 * Note: Identity of domain or business objects is determined by default
	 * using the method
	 * {@link EcoreUtil#equals(org.eclipse.emf.ecore.EObject, org.eclipse.emf.ecore.EObject)}
	 * , which relies on the compared EMF objects having different IDs or
	 * attributes. The way Graphiti used to compare EMF business objects can be
	 * changed by overriding
	 * {@link IToolBehaviorProvider#equalsBusinessObjects(Object, Object)}.
	 * 
	 * @param pictogramElement
	 *            The pictogram element for which to return the business
	 *            objects.
	 * @return The first of possibly several business objects which are linked
	 *         to the given pictogram element. Can be null.
	 */
	EObject getBusinessObjectForLinkedPictogramElement(PictogramElement pictogramElement);

	/**
	 * Returns the pictogram link referencing the given pictogram element.
	 * 
	 * @param pictogramElement
	 *            the pictogram element
	 * @return the pictogram link referencing the given pictogram element
	 */
	PictogramLink getLinkForPictogramElement(PictogramElement pictogramElement);

	/**
	 * Gets all pictogram elements which references the given business object.<br>
	 * Note: Identity of domain or business objects is determined by default
	 * using the method
	 * {@link EcoreUtil#equals(org.eclipse.emf.ecore.EObject, org.eclipse.emf.ecore.EObject)}
	 * , which relies on the compared EMF objects having different IDs or
	 * attributes. The way Graphiti used to compare EMF business objects can be
	 * changed by overriding
	 * {@link IToolBehaviorProvider#equalsBusinessObjects(Object, Object)}.
	 * 
	 * @param diagram
	 *            the diagram
	 * @param eObject
	 *            the referenced business object
	 * @return all pictogram elements in the diagram which references the given
	 *         business object
	 */
	List<PictogramElement> getPictogramElements(Diagram diagram, EObject eObject);

	/**
	 * Gets all pictogram elements which references at least one of the given
	 * business objects.<br>
	 * Note: Identity of domain or business objects is determined by default
	 * using the method
	 * {@link EcoreUtil#equals(org.eclipse.emf.ecore.EObject, org.eclipse.emf.ecore.EObject)}
	 * , which relies on the compared EMF objects having different IDs or
	 * attributes. The way Graphiti used to compare EMF business objects can be
	 * changed by overriding
	 * {@link IToolBehaviorProvider#equalsBusinessObjects(Object, Object)}.
	 * 
	 * @param diagram
	 *            the diagram
	 * @param eObjects
	 *            the referenced business objects
	 * @param onlyActive
	 *            if true, then only active pictogram elements of the diagram
	 *            will be considered; if false all pictogram elements will be
	 *            considered
	 * @return all (active) pictogram elements in the diagram which have at
	 *         least one reference to one of the business objects
	 */
	List<PictogramElement> getPictogramElements(Diagram diagram, List<EObject> eObjects, boolean onlyActive);

	/**
	 * Checks existence and value of the link property to a given pictogram
	 * element. It is intended to use this property to be able to disinguish
	 * multiple pictogram elements linked to same domain model object.
	 * 
	 * @param pictogramElement
	 *            the pictogram element
	 * @param propertyValue
	 *            the value to check against the property
	 * @return true if link property exists an has the given value; false if not
	 */
	boolean hasLinkProperty(PictogramElement pictogramElement, String propertyValue);

	/**
	 * Adds or modifies the link property to a given pictogram element. It is
	 * intended to use this property to be able to disinguish multiple pictogram
	 * elements linked to same domain model object.
	 * 
	 * @param pictogramElement
	 *            the pictogram element
	 * @param propertyValue
	 *            the new value for the link property
	 */
	void setLinkProperty(PictogramElement pictogramElement, String propertyValue);

	/**
	 * Gets the link property to a given pictogram element.
	 * 
	 * @param pictogramElement
	 *            the pictogram element
	 * @return the link property
	 */
	Property getLinkProperty(PictogramElement pictogramElement);
}
