/*******************************************************************************
* 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.seam.ui.pages.editor.edit;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import org.eclipse.draw2d.Connection;
import org.eclipse.draw2d.ConnectionLocator;
import org.eclipse.draw2d.Cursors;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.gef.ConnectionEditPart;
import org.eclipse.gef.DragTracker;
import org.eclipse.gef.handles.SquareHandle;
import org.eclipse.gef.tools.ConnectionEndpointTracker;
/**
* A handle used on a {@link Connection}.
*/
public class PagesConnectionHandle extends SquareHandle implements PropertyChangeListener {
private boolean vertical = false;
private int index;
public PagesConnectionHandle(ConnectionEditPart owner, boolean vertical,
int index) {
this.vertical = vertical;
this.index = index;
if (vertical)
setCursor(Cursors.SIZEN);
else
setCursor(Cursors.SIZEW);
setOwner(owner);
setLocator(new JSFMidpointLocator(getConnection(), index));
}
protected DragTracker createDragTracker() {
ConnectionEndpointTracker tracker;
tracker = new PagesConnectionDragTracker((ConnectionEditPart) getOwner(),
vertical, index);
return tracker;
}
/**
* Adds this as a {@link org.eclipse.draw2d.FigureListener} to the owner's
* {@link org.eclipse.draw2d.Figure}.
*/
public void addNotify() {
super.addNotify();
getConnection().addPropertyChangeListener(Connection.PROPERTY_POINTS,
this);
}
/**
* Returns the Connection this handle is on.
*/
public Connection getConnection() {
return (Connection) getOwnerFigure();
}
protected boolean isVertical() {
return vertical;
}
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals(Connection.PROPERTY_POINTS))
revalidate();
}
public void removeNotify() {
getConnection().removePropertyChangeListener(
Connection.PROPERTY_POINTS, this);
super.removeNotify();
}
class JSFMidpointLocator extends ConnectionLocator {
private int index;
public JSFMidpointLocator(Connection c, int i) {
super(c);
index = i;
}
protected int getIndex() {
return index;
}
protected Point getReferencePoint() {
Connection conn = super.getConnection();
if (getIndex() + 1 > conn.getPoints().size() - 2) {
PagesConnectionHandle.this.setVisible(false);
return new Point(0, 0);
}
Point p = Point.SINGLETON;
Point p1 = conn.getPoints().getPoint(getIndex());
Point p2 = conn.getPoints().getPoint(getIndex() + 1);
conn.translateToAbsolute(p1);
conn.translateToAbsolute(p2);
p.x = (p2.x - p1.x) / 2 + p1.x;
p.y = (p2.y - p1.y) / 2 + p1.y;
return p;
}
}
}