/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.jsf.ui.editor.edit;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.PointList;
import org.eclipse.gef.ConnectionEditPart;
import org.eclipse.gef.tools.ConnectionEndpointTracker;
import org.jboss.tools.jsf.ui.editor.figures.ConnectionFigure;
public class JSFConnectionDragTracker extends ConnectionEndpointTracker {
private boolean vertical;
private PointList list;
private int index1, index2;
private Point point1, point2;
private boolean first = true;
public JSFConnectionDragTracker(ConnectionEditPart cep, boolean vertical,
int id) {
super(cep);
this.vertical = vertical;
list = getConnection().getPoints();
index1 = id;
index2 = id + 1;
point1 = list.getPoint(index1);
point2 = list.getPoint(index2);
}
public void commitDrag() {
}
protected boolean handleDragInProgress() {
if (first) {
list = getConnection().getPoints();
point1 = list.getPoint(index1);
point2 = list.getPoint(index2);
first = false;
}
Dimension delta = getDragMoveDelta();
Point p1, p2;
if (vertical) {
p1 = new Point(point1.x, point1.y + delta.height);
p1.y -= p1.y % 8;
p2 = new Point(point2.x, point2.y + delta.height);
p2.y -= p2.y % 8;
} else {
p1 = new Point(point1.x + delta.width, point1.y);
p1.x -= p1.x % 8;
p2 = new Point(point2.x + delta.width, point2.y);
p2.x -= p2.x % 8;
if (index1 == 1 && p1.x < list.getPoint(0).x + 5) {
p1.x = list.getPoint(0).x + 5;
p2.x = list.getPoint(0).x + 5;
}
if (index2 == list.size() - 2
&& p1.x > list.getPoint(list.size() - 1).x - 5) {
p1.x = list.getPoint(list.size() - 1).x - 5;
p2.x = list.getPoint(list.size() - 1).x - 5;
}
}
list.removePoint(index1);
list.removePoint(index1);
list.insertPoint(p1, index1);
list.insertPoint(p2, index2);
getConnection().setPoints(list);
((ConnectionFigure) getConnection()).setManual(true);
return true;
}
protected boolean handleButtonUp(int button) {
if (stateTransition(STATE_DRAG_IN_PROGRESS, STATE_TERMINAL)) {
first = true;
((LinkEditPart) getConnectionEditPart()).save();
}
return true;
}
protected Point getLocation() {
Point p = new Point(getCurrentInput().getMouseLocation());
if (getFlag(1)) {
p.x -= p.x % 8;
p.y -= p.y % 8;
}
return p;
}
protected Point getStartLocation() {
Point p = super.getStartLocation().getCopy();
if (getFlag(1)) {
p.x -= p.x % 8;
p.y -= p.y % 8;
}
return p;
}
}