/*******************************************************************************
 * Copyright (c) 2000, 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.gef;

/**
 * A specialization of {@link GraphicalEditPart GraphicalEditPart} for
 * representing connections. ConnectionEditParts must join a <I>source</I> and
 * <I>target</I> EditPart. Its Figure is typically a line between two "nodes",
 * with possible decorations on that line.
 * <P>
 * In GEF, ConnectionEditParts are <EM><I>structural features</I></EM> of their
 * source and target "nodes", which are EditParts. However, the model does not
 * have this requirement. The application may store the connection model in any
 * way, or there may even be no real model. The burden is on the source and
 * target EditPart to obtain their appropriate connections in the methods
 * {@link org.eclipse.gef.editparts.AbstractGraphicalEditPart#getModelSourceConnections()
 * getModelSourceConnections()} and
 * {@link org.eclipse.gef.editparts.AbstractGraphicalEditPart#getModelTargetConnections()
 * getModelTargetConnections()}. How this is done is application specific.
 * <P>
 * Since ConnectionEditParts are features of their node EditPart, it is those
 * EditParts that must create and manage the connection. Creation is performed
 * by whichever end happens to "intialize" itself first. Therefore an end always
 * looks first in the
 * {@link org.eclipse.gef.EditPartViewer#getEditPartRegistry() EditPartRegistry}
 * to see if the connection was already created by the other end.
 * <P>
 * ConnectionEditParts are EditParts, and therefore can have children. This is a
 * common way to implement labels and other selectable decorations on
 * connections. Similarly, a ConnectionEditPart can also be a "node", meaning it
 * can serve as the source or target of some other ConnectionEditPart. This
 * makes connection to connection possible.
 * <P>
 * IMPORTANT: The need to display something as a line does not automatically
 * mean that a ConnectionEditPart is required. There are several situations in
 * which ConnectionEditParts should not be used. You should use
 * ConnectionEditParts in general if:
 * <UL>
 * <LI>The connection should be selectable by the user independant of its
 * "nodes".
 * <LI>The connection can be deleted, leaving the source and target intact.
 * <LI>The connection cannot exist without a source and target. A instance of
 * when this is <B>not</B> true is <I>assocations</I>. Associations are
 * top-level object that are children of the diagram. They are probably only
 * valid if they have a source and target, but many applications allow you to
 * create things in any order.
 * </UL>
 */
public interface ConnectionEditPart extends GraphicalEditPart {

	/**
	 * @return the EditPart at the <i>source</i> end of this connection.
	 */
	EditPart getSource();

	/**
	 * @return the EditPart at the <i>target</i> end of this connection.
	 */
	EditPart getTarget();

	/**
	 * Sets the <i>source</i> of this connection.
	 * 
	 * @param source
	 *            the source of this connection
	 */
	void setSource(EditPart source);

	/**
	 * Sets the<i>target</i> of this connection.
	 * 
	 * @param target
	 *            the target of this connection
	 */
	void setTarget(EditPart target);
}
