/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
/******************************************************************************
* Code adapted from Graphical Modeling Framework's
* org.eclipse.gmf.runtime.gef.ui.internal.tools.ConnectionBendpointTrackerEx
* Downloaded: Feburary, 2016
*
* Copyright (c) 2007 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 de.rcenvironment.core.gui.workflow.parts;
import org.eclipse.draw2d.PositionConstants;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.PrecisionPoint;
import org.eclipse.draw2d.geometry.PrecisionRectangle;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.ConnectionEditPart;
import org.eclipse.gef.SnapToHelper;
import org.eclipse.gef.requests.BendpointRequest;
import org.eclipse.gef.tools.ConnectionBendpointTracker;
import org.eclipse.swt.SWT;
/**
* A derived ConnectionBendpointTracker that overrides the updateSourceRequest method allowing bendpoints to snap to grid.
*
// * @author carson_li // Name commented out as checkstyle won't accept otherwise
* @author Oliver Seebach
*/
public class CustomConnectionBendpointTracker extends ConnectionBendpointTracker {
private static final double NUMBER_1_5 = 1.5;
private static final double NUMBER_0_5 = 0.5;
private static final int MODIFIER_NO_SNAPPING = SWT.ALT;
private PrecisionRectangle sourceRectangle;
private Point originalLocation = null;
public CustomConnectionBendpointTracker(ConnectionEditPart host, int index) {
super(host, index);
}
/*
* @see org.eclipse.gef.tools.SimpleDragTracker#updateSourceRequest()
*/
protected void updateSourceRequest() {
BendpointRequest request = (BendpointRequest) getSourceRequest();
if (originalLocation == null) {
originalLocation = getStartLocation().getCopy();
}
Dimension delta = getDragMoveDelta();
if (getCurrentInput().isShiftKeyDown()) {
float ratio = 0;
if (delta.width != 0) {
ratio = (float) delta.height / (float) delta.width;
}
ratio = Math.abs(ratio);
if (ratio > NUMBER_0_5 && ratio < NUMBER_1_5) {
if (Math.abs(delta.height) > Math.abs(delta.width)) {
if (delta.height > 0) {
delta.height = Math.abs(delta.width);
} else {
delta.height = -Math.abs(delta.width);
}
} else {
if (delta.width > 0) {
delta.width = Math.abs(delta.height);
} else {
delta.width = -Math.abs(delta.height);
}
}
} else {
if (Math.abs(delta.width) > Math.abs(delta.height)) {
delta.height = 0;
} else {
delta.width = 0;
}
}
}
Point moveDelta = new Point(delta.width, delta.height);
SnapToHelper snapToHelper = (SnapToHelper) getConnectionEditPart().getAdapter(SnapToHelper.class);
Rectangle rect = new Rectangle(originalLocation.x, originalLocation.y,
1, 1);
if (sourceRectangle == null) {
sourceRectangle = new PrecisionRectangle(rect);
}
if (snapToHelper != null
&& !getCurrentInput().isModKeyDown(MODIFIER_NO_SNAPPING)) {
PrecisionRectangle baseRect = sourceRectangle.getPreciseCopy();
baseRect.translate(moveDelta);
PrecisionPoint preciseDelta = new PrecisionPoint(moveDelta);
snapToHelper.snapPoint(request, PositionConstants.HORIZONTAL
| PositionConstants.VERTICAL,
new PrecisionRectangle[] { baseRect }, preciseDelta);
Point newLocation = originalLocation.getCopy().translate(
preciseDelta);
request.setLocation(newLocation);
} else {
request.setLocation(getLocation());
}
}
/*
* @see org.eclipse.gef.tools.AbstractTool#handleDragStarted()
*/
protected boolean handleDragStarted() {
originalLocation = null;
sourceRectangle = null;
return super.handleDragStarted();
}
}