/*******************************************************************************
* Copyright (c) 2007-2009 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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
*
* Contributor:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.hibernate.ui.diagram.editors.figures;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.PolylineConnection;
import org.eclipse.draw2d.Shape;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.PointList;
/**
* Round angles of base polyline connection.
* @see PolylineConnection
*/
public class RoundPolylineConnection extends PolylineConnection {
private transient Point beg = new Point();
private transient Point end = new Point();
private transient Point eCorner = new Point();
private transient Point bCorner = new Point();
/**
* @see Shape#outlineShape(Graphics)
*/
protected void outlineShape(Graphics g) {
// this function draw "right angle" polyline connection
//super.outlineShape(g);
// this function draw rounded polyline connection
outlineRoundedShape(g);
}
/**
* Outline rounded polyline connection
* @param g
*/
protected void outlineRoundedShape(Graphics g) {
PointList points = getPoints();
Point point = points.getPoint(0);
boolean horiz;
beg.x = point.x;
beg.y = point.y;
if (points.getFirstPoint().y == points.getLastPoint().y) {
super.outlineShape(g);
return;
}
if (Math.abs(points.getFirstPoint().y - points.getLastPoint().y) < 4) {
int delta = Math.abs(points.getFirstPoint().y - points.getLastPoint().y);
if (points.size() == 4) {
Point point1 = points.getPoint(0);
Point point2 = points.getPoint(1);
Point point3 = points.getPoint(2);
Point point4 = points.getPoint(3);
if (point1.x < point4.x) {
point2.x -= delta / 2;
point3.x += delta / 2;
} else {
point2.x += delta / 2;
point3.x -= delta / 2;
}
g.drawLine(point1, point2);
g.drawLine(point2, point3);
g.drawLine(point3, point4);
return;
}
}
for (int i = 1; i < points.size(); i++) {
point = points.getPoint(i);
end.x = point.x;
end.y = point.y;
horiz = (beg.y == end.y);
eCorner.x = 0;
if (i != 1) {
if (horiz) {
if (end.x > beg.x) {
beg.x += 2;
} else {
beg.x -= 2;
}
} else {
if (end.y > beg.y) {
beg.y += 2;
} else {
beg.y -= 2;
}
}
eCorner.x = beg.x;
eCorner.y = beg.y;
}
if (bCorner.x != 0 && eCorner.x != 0) {
g.drawLine(bCorner, eCorner);
}
bCorner.x = 0;
if (i != points.size() - 1) {
if (horiz) {
if (end.x > beg.x) {
end.x -= 2;
} else {
end.x += 2;
}
} else {
if (end.y > beg.y) {
end.y -= 2;
} else {
end.y += 2;
}
}
bCorner.x = end.x;
bCorner.y = end.y;
}
g.drawLine(beg, end);
point = points.getPoint(i);
beg.x = point.x;
beg.y = point.y;
}
}
}