| /******************************************************************************* |
| * 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; |
| } |
| } |
| } |