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