/*******************************************************************************
 * Copyright (c) 2008, 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.util;

import org.eclipse.draw2d.AbstractRouter;
import org.eclipse.draw2d.Connection;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.PointList;

public class ImplicitLinkHandlerConnectionRouter extends AbstractRouter {
	
	private boolean horizontal;
	
	public ImplicitLinkHandlerConnectionRouter(boolean horizontal) {
		this.horizontal = horizontal;
	}
	
	public void route(Connection conn) {
		if ((conn.getSourceAnchor() == null) || (conn.getTargetAnchor() == null)) 
			return;
		
		Point start = getStartPoint(conn);
		conn.translateToRelative(start);
		Point end = getEndPoint(conn);
		conn.translateToRelative(end);
		
		Point c1 = null, c2 = null;
		
		if(horizontal){
			c1 = new Point(end.x-10, start.y);
			c2 = new Point(end.x-10, end.y);
		}else{
			c2 = new Point(end.x, end.y-10);
			c1 = new Point(start.x, end.y-10);
		}
		
		
		PointList list = new PointList();
		list.addPoint(start);
		list.addPoint(c1);
		list.addPoint(c2);
		list.addPoint(end);
		
		conn.setPoints(list);

	}

}
