blob: cd28aea8e5dbd1367c8b53d1f41dedcdb51ca931 [file] [log] [blame]
/******************************************************************************
* 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.PositionConstants;
import org.eclipse.draw2d.geometry.Point;
/**
* Implementation of node that will be laid out by <code>GMFDirectedGraphLayout</code> as a node
* attached to the border of it's parent node.
*
* @author aboyko
* @since 2.1
*/
public class BorderNode extends ConstantSizeNode {
/**
* Describes how the border node is attached to the parent node. The outside
* ratio is a value between 0 and 1 representing the percentage of the
* border item that appears outside of the parent node.
*/
private float outsideRatio = 0.5f;
JointIncomingEdges incomingJointEdges = new JointIncomingEdges(this);
JointOutgoingEdges outgoingJointEdges = new JointOutgoingEdges(this);
ConstantSizeNode borderNodeParent;
int position = PositionConstants.NONE;
/**
* Creates an instance of a border node given its data and parent
* @param data data
* @param parentNode the parent node of the border node
*/
public BorderNode(Object data, ConstantSizeNode parentNode) {
super(data);
this.borderNodeParent = parentNode;
borderNodeParent.borderNodes.add(this);
incomingJointEdges.target = borderNodeParent;
outgoingJointEdges.source = borderNodeParent;
width = 10;
height = 10;
}
void setPoint(Point p) {
if (p.x == borderNodeParent.x) {
position = PositionConstants.WEST;
x = p.x - (int) (width * outsideRatio);
y = p.y - height / 2;
} else if (p.y == borderNodeParent.y) {
position = PositionConstants.NORTH;
x = p.x - width / 2;
y = p.y - (int) (height * outsideRatio);
} else if (p.x == borderNodeParent.x + borderNodeParent.width) {
position = PositionConstants.EAST;
x = p.x - (int) (width * (1 - outsideRatio));
y = p.y - height / 2;
} else {
position = PositionConstants.SOUTH;
x = p.x - width / 2;
y = p.y - (int) (height * (1 - outsideRatio));
}
}
void addIncomingEdge(ConstrainedEdge e) {
incomingJointEdges.edges.add(e);
e.target = borderNodeParent;
}
void addOutgoingEdge(ConstrainedEdge e) {
outgoingJointEdges.edges.add(e);
e.source = borderNodeParent;
}
Point getEdgesDefaultEndPoint() {
if (position == PositionConstants.WEST) {
return new Point(x, y + height / 2);
} else if (position == PositionConstants.NORTH) {
return new Point(x + width / 2, y);
} else if (position == PositionConstants.EAST) {
return new Point(x + width, y + height / 2);
} else {
return new Point(x + width / 2, y + height);
}
}
/**
* Gets the outside of parent ratio value. The outside ratio is a value
* between 0 and 1 representing the percentage of the border item that
* appears outside of the parent node.
*
* @return the value
* @since 2.1
*/
public float getOutsideRatio() {
return outsideRatio;
}
/**
* Sets the outside parent ratio value. The outside ratio is a value between
* 0 and 1 representing the percentage of the border item that appears
* outside of the parent node.
*
* @param outsideRatio
* @since 2.1
*/
public void setOutsideRatio(float outsideRatio) {
if (outsideRatio < 0f || outsideRatio > 1f) {
throw new IllegalArgumentException("Ratio must be between 0 and 1 inclusively"); //$NON-NLS-1$
}
this.outsideRatio = outsideRatio;
}
}