/******************************************************************************
* Copyright (c) 2008 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.draw2d.ui.graph;
import org.eclipse.draw2d.geometry.PointList;
import org.eclipse.draw2d.graph.Edge;
import org.eclipse.draw2d.graph.Node;
/**
* Implementation of Edge that:
* <li> Can connect border node(s)
* <li> Can be routed obliquely or orthogonally
*
* @author aboyko
* @since 2.1
*/
public class ConstrainedEdge extends Edge {
public static String DEFAULT_ROUTING_STYLE = "Default"; //$NON-NLS-1$
public static String ORTHOGONAL_ROUTING_STYLE = "Orthogonal"; //$NON-NLS-1$
private String style = DEFAULT_ROUTING_STYLE;
BorderNode sourceConstraint = null;
BorderNode targetConstraint = null;
PointList startingRoutedPoints = new PointList();
PointList endingRoutedPoints = new PointList();
/**
* Constructs a new edge with the given source and target nodes. All other fields will
* have their default values.
* @param source the source Node
* @param target the target Node
* @since 2.1
*/
public ConstrainedEdge(Node source, Node target) {
this(null, source, target);
}
/**
* Constructs a new edge with the given source, target, delta, and weight.
* @param source the source Node
* @param target the target Node
* @param delta the minimum edge span
* @param weight the weight hint
* @since 2.1
*/
public ConstrainedEdge(Node source, Node target, int delta, int weight) {
this(source, target);
this.delta = delta;
this.weight = weight;
}
/**
* Constructs a new edge with the given data object, source, and target node.
* @param data an arbitrary data object
* @param source the source node
* @param target the target node
* @since 2.1
*/
public ConstrainedEdge(Object data, Node source, Node target) {
super(data, source, target);
if (source instanceof BorderNode) {
sourceConstraint = (BorderNode)source;
this.source = sourceConstraint.borderNodeParent;
this.source.outgoing.add(this);
sourceConstraint.addOutgoingEdge(this);
}
if (target instanceof BorderNode) {
targetConstraint = (BorderNode)target;
this.target = targetConstraint.borderNodeParent;
this.target.incoming.add(this);
targetConstraint.addIncomingEdge(this);
}
if (this.source.equals(this.target)) {
throw new RuntimeException("Edges between border nodes on the same parent or border node and its parent are disallowed."); //$NON-NLS-1$
}
}
/**
* Gets the routing style for the edge
* @return the style constant
* @since 2.1
*/
public String getStyle() {
return style;
}
/**
* Sets the routing style for the edge (orthogonal or default)
* @param style the style constant
* @since 2.1
*/
public void setStyle(String style) {
this.style = style;
}
/* (non-Javadoc)
* @see org.eclipse.draw2d.graph.Edge#invert()
*/
public void invert() {
super.invert();
if (sourceConstraint != null) {
sourceConstraint.outgoingJointEdges.edges.remove(this);
}
if (targetConstraint != null) {
targetConstraint.incomingJointEdges.edges.remove(this);
}
BorderNode temp = sourceConstraint;
sourceConstraint = targetConstraint;
targetConstraint = temp;
if (sourceConstraint != null) {
sourceConstraint.outgoingJointEdges.edges.add(this);
}
if (targetConstraint != null) {
targetConstraint.incomingJointEdges.edges.add(this);
}
}
}