/******************************************************************************* | |
* 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 2.0 | |
* which accompanies this distribution, and is available at | |
* https://www.eclipse.org/legal/epl-2.0/ | |
* | |
* SPDX-License-Identifier: EPL-2.0 | |
* | |
* 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; | |
} | |
} | |
} |