blob: 5cc885d1fb636d08a98b066e14a3d63d2b6dba47 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2012 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.bpel.ui.figures;
import org.eclipse.bpel.ui.BPELUIPlugin;
import org.eclipse.bpel.ui.IBPELUIConstants;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.PolylineConnection;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.PointList;
import org.eclipse.jface.resource.ColorRegistry;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
public class BPELPolylineConnection extends PolylineConnection {
private static final int LEFT_RIGHT = 0, RIGHT_LEFT = 1, TOP_BOTTOM = 2, BOTTOM_TOP = 3;
Color color1, color2, color3;
Image topLeft, topRight, bottomLeft, bottomRight, arrowDown, arrowRight;
public BPELPolylineConnection(Image topLeft, Image topRight, Image bottomLeft, Image bottomRight, Image arrowDown, Image arrowRight) {
BPELUIPlugin plugin = BPELUIPlugin.INSTANCE;
ColorRegistry colorRegistry = plugin.getColorRegistry();
color1 = colorRegistry.get(IBPELUIConstants.COLOR_LINK_ONE);
color2 = colorRegistry.get(IBPELUIConstants.COLOR_LINK_TWO);
color3 = colorRegistry.get(IBPELUIConstants.COLOR_LINK_THREE);
this.topLeft = topLeft;
this.topRight = topRight;
this.bottomLeft = bottomLeft;
this.bottomRight = bottomRight;
this.arrowDown = arrowDown;
this.arrowRight = arrowRight;
// Leave room for the 3-pixel wide line, as well as our custom arrowhead.
setLineWidth(12);
}
@Override
protected void outlineShape(Graphics g) {
PointList list = getPoints();
int size = list.size();
int lastDirection = LEFT_RIGHT;
for (int i = 0; i < size - 1; i++) {
Point p1 = list.getPoint(i);
Point p2 = list.getPoint(i + 1);
// First determine the direction of the line.
int direction;
if (p1.x == p2.x) {
if (p1.y > p2.y) {
direction = BOTTOM_TOP;
} else {
direction = TOP_BOTTOM;
}
} else {
if (p1.x > p2.x) {
direction = RIGHT_LEFT;
} else {
direction = LEFT_RIGHT;
}
}
// If we are on the last one, draw the arrow too.
if (i == size - 2) {
Image arrowImage = arrowDown;
// If the end is horizontal, transform the arrow
if(direction == RIGHT_LEFT || direction == LEFT_RIGHT){
arrowImage = arrowRight;
}
g.drawImage(arrowImage, p2.x - 6, p2.y - 6);
}
// Draw the line.
// If we are on the last one, the line should fall short by 4 pixels.
if (i == size - 2) {
if(direction == RIGHT_LEFT || direction == LEFT_RIGHT)
p2.x -= 4;
else
p2.y -= 4;
}
g.setLineWidth(1);
g.setForegroundColor(color2);
g.drawLine(p1, p2);
if (direction == BOTTOM_TOP || direction == TOP_BOTTOM) {
// Vertical
g.setForegroundColor(color1);
g.drawLine(p1.x-1, p1.y, p2.x-1, p2.y);
g.setForegroundColor(color3);
g.drawLine(p1.x+1, p1.y, p2.x+1, p2.y);
} else {
// Horizontal
g.setForegroundColor(color1);
g.drawLine(p1.x, p1.y-1, p2.x, p2.y-1);
g.setForegroundColor(color3);
g.drawLine(p1.x, p1.y+1, p2.x, p2.y+1);
}
// If we are on the second (or greater), draw the corner.
if (i != 0) {
// Draw the corner connection
Image image;
switch (lastDirection) {
case TOP_BOTTOM:
if (direction == LEFT_RIGHT) {
image = bottomLeft;
} else {
image = bottomRight;
}
break;
case BOTTOM_TOP:
if (direction == LEFT_RIGHT) {
image = topLeft;
} else {
image = topRight;
}
break;
case LEFT_RIGHT:
if (direction == TOP_BOTTOM) {
image = topRight;
} else {
image = bottomRight;
}
break;
default:
if (direction == TOP_BOTTOM) {
image = topLeft;
} else {
image = bottomLeft;
}
break;
}
//int x = p1.x - 1;
//int y = p1.y - 1;
g.drawImage(image, p1.x-1, p1.y-1);
}
lastDirection = direction;
}
}
}