/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.diagram.ui.util;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPartViewer;
import org.eclipse.gef.Request;
import org.eclipse.gef.RequestConstants;
import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
import org.eclipse.gef.editparts.ZoomManager;
import org.eclipse.gef.tools.SelectEditPartTracker;
import org.eclipse.swt.events.MouseEvent;
import org.teiid.designer.diagram.ui.connection.NodeConnectionEditPart;
import org.teiid.designer.diagram.ui.editor.DiagramViewer;
import org.teiid.designer.diagram.ui.editor.IDiagramSelectionHandler;
import org.teiid.designer.diagram.ui.figure.DiagramPolylineConnection;
import org.teiid.designer.diagram.ui.part.DiagramEditPart;
/**
* @author blafond
*
* To change the template for this generated type comment go to
* Window>Preferences>Java>Code Generation>Code and Comments
*
* @since 8.0
*/
public class ConnectionSelectionTracker extends SelectEditPartTracker {
private IDiagramSelectionHandler selectionHandler;
private EditPart selectedEndEditPart;
/**
* @param owner
*/
public ConnectionSelectionTracker(EditPart owner ) {
super(owner);
}
public ConnectionSelectionTracker(EditPart owner, IDiagramSelectionHandler selectionHandler ) {
super(owner);
this.selectionHandler = selectionHandler;
}
@Override
protected boolean handleDoubleClick(int button) {
// Let's rely on the edit part to make the decision.
if( getSourceEditPart() instanceof DiagramEditPart ) {
Request request = new Request(RequestConstants.REQ_DIRECT_EDIT);
getSourceEditPart().performRequest(request);
}
return true;
}
/* (non-Javadoc)
* @see org.eclipse.gef.Tool#mouseDoubleClick(org.eclipse.swt.events.MouseEvent, org.eclipse.gef.EditPartViewer)
*/
@Override
public void mouseDoubleClick(MouseEvent me, EditPartViewer viewer) {
// System.out.println(" -->> ConnectionSelectionTracker.mouseDoubleClick()");
super.mouseDoubleClick(me, viewer);
}
/* (non-Javadoc)
* @see org.eclipse.gef.tools.SelectEditPartTracker#performSelection()
*/
@Override
protected void performSelection() {
// We need to completedly override the super method here if we selected near an end.
if( selectedEndEditPart != null ) {
if (hasSelectionOccurred())
return;
setFlag(FLAG_SELECTION_PERFORMED, true);
EditPartViewer viewer = getCurrentViewer();
// Deselect the connection link
viewer.deselect(getSourceEditPart());
selectionHandler.hiliteConnection((NodeConnectionEditPart)getSourceEditPart());
// Add the selectedEndEditPart
selectionHandler.setClearHilites(false);
viewer.select(selectedEndEditPart);
selectionHandler.setClearHilites(true);
} else {
super.performSelection();
}
}
/* (non-Javadoc)
* @see org.eclipse.gef.Tool#mouseDown(org.eclipse.swt.events.MouseEvent, org.eclipse.gef.EditPartViewer)
*/
@Override
public void mouseDown(MouseEvent me, EditPartViewer viewer) {
selectedEndEditPart = getEndEditPart(me, viewer);
super.mouseDown(me, viewer);
}
private EditPart getEndEditPart(MouseEvent me, EditPartViewer viewer) {
// we know we selected this link, so we should be in the bounds of this figure
if( getSourceEditPart() instanceof NodeConnectionEditPart) {
ZoomManager zm = (ZoomManager)((DiagramViewer)viewer).getEditor().getAdapter(ZoomManager.class);
double zoomValue = zm.getZoom();
int threshold = (int)(20/zoomValue);
int scrollX = ((DiagramViewer)viewer).getCurrentHScrollValue();
int scrollY = ((DiagramViewer)viewer).getCurrentVScrollValue();
DiagramPolylineConnection dpc = (DiagramPolylineConnection)((AbstractGraphicalEditPart)getSourceEditPart()).getFigure();
Point p0 = new Point((me.x + scrollX)/zoomValue, (me.y + scrollY)/zoomValue);
Point p1 = dpc.getStart();
int deltaX = p0.x - p1.x;
int deltaY = p0.y - p1.y;
int dist = (int)Math.sqrt( deltaX*deltaX + deltaY*deltaY);
if( dist < threshold ) {
return getSourceEndEditPart();
}
Point p2 = dpc.getEnd();
deltaX = p0.x - p2.x;
deltaY = p0.y - p2.y;
dist = (int)Math.sqrt( deltaX*deltaX + deltaY*deltaY);
if( dist < threshold ) {
return getTargetEndEditPart();
}
}
return null;
}
private EditPart getSourceEndEditPart() {
return DiagramUiUtilities.getSourceEndEditPart((NodeConnectionEditPart)getSourceEditPart());
}
private EditPart getTargetEndEditPart() {
return DiagramUiUtilities.getTargetEndEditPart((NodeConnectionEditPart)getSourceEditPart());
}
}