blob: 89e2abffb2df15e2eb7c58049a90896a2491eb5f [file] [log] [blame]
//------------------------------------------------------------------------------
// Copyright (c) 2005, 2006 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 implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.authoring.gef.edit;
import org.eclipse.draw2d.ConnectionAnchor;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.epf.authoring.gef.figures.Diamond;
import org.eclipse.epf.authoring.gef.util.AnchorUtil;
import org.eclipse.epf.authoring.gef.util.ConnectionAnchorLocator;
import org.eclipse.epf.diagram.model.Link;
import org.eclipse.epf.diagram.model.TypedNode;
import org.eclipse.gef.ConnectionEditPart;
import org.eclipse.gef.Request;
import org.eclipse.gef.editpolicies.DirectEditPolicy;
import org.eclipse.gef.requests.CreateConnectionRequest;
import org.eclipse.gef.requests.LocationRequest;
import org.eclipse.swt.graphics.Color;
/**
* EditPart for DecisionNode, used in activity diagram.
*
* @author Phong Nguyen Le
* @since 1.0
*/
public class DecisionNodeEditPart extends NodeEditPart implements
ConnectionAnchorLocator {
private static final Color BG_COLOR = new Color(null, 254, 204, 153);
private Point recentSourceEndPoint;
private Point recentTargetEndPoint;
public DecisionNodeEditPart(TypedNode model) {
super(model);
}
/**
* @see org.eclipse.epf.authoring.gef.edit.BaseEditPart#createDirectEditPolicy()
*/
protected DirectEditPolicy createDirectEditPolicy() {
return null;
}
/**
* @see org.eclipse.epf.authoring.gef.edit.BaseEditPart#createFigure()
*/
protected IFigure createFigure() {
Diamond figure = new Diamond();
figure.setBackgroundColor(BG_COLOR);
figure.setSize(48, 24);
return figure;
}
/*
* (non-Javadoc)
* @see org.eclipse.epf.authoring.gef.edit.NodeEditPart#getSourceConnectionAnchor(org.eclipse.gef.ConnectionEditPart)
*/
public ConnectionAnchor getSourceConnectionAnchor(
ConnectionEditPart connection) {
boolean isRelative = false;
Point sourceEndPoint;
if (recentSourceEndPoint == null) {
// get source end point from the model
Link link = (Link) connection.getModel();
sourceEndPoint = link.getSourceEndPoint();
isRelative = true;
} else {
sourceEndPoint = recentSourceEndPoint;
}
if (sourceEndPoint != null) {
return new RelativeXYAnchor(getFigure(), sourceEndPoint, isRelative);
}
return super.getSourceConnectionAnchor(connection);
}
/*
* (non-Javadoc)
* @see org.eclipse.epf.authoring.gef.edit.NodeEditPart#getSourceConnectionAnchor(org.eclipse.gef.Request)
*/
public ConnectionAnchor getSourceConnectionAnchor(Request request) {
Point p = null;
if (request instanceof CreateConnectionRequest) {
CreateConnectionRequest req = (CreateConnectionRequest) request;
p = req.getLocation();
} else if (request instanceof LocationRequest) {
p = ((LocationRequest) request).getLocation();
}
if (p != null) {
recentSourceEndPoint = getLocation(p);
return new RelativeXYAnchor(getFigure(), recentSourceEndPoint, true);
}
return super.getSourceConnectionAnchor(request);
}
/*
* (non-Javadoc)
* @see org.eclipse.epf.authoring.gef.edit.NodeEditPart#getTargetConnectionAnchor(org.eclipse.gef.ConnectionEditPart)
*/
public ConnectionAnchor getTargetConnectionAnchor(
ConnectionEditPart connection) {
boolean isRelative = false;
Point targetEndPoint;
if (recentTargetEndPoint == null) {
// get target end point from model
Link link = (Link) connection.getModel();
targetEndPoint = link.getTargetEndPoint();
isRelative = true;
} else {
targetEndPoint = recentTargetEndPoint;
}
if (targetEndPoint != null) {
return new RelativeXYAnchor(getFigure(), targetEndPoint, isRelative);
}
return super.getTargetConnectionAnchor(connection);
}
/*
* (non-Javadoc)
* @see org.eclipse.epf.authoring.gef.edit.NodeEditPart#getTargetConnectionAnchor(org.eclipse.gef.Request)
*/
public ConnectionAnchor getTargetConnectionAnchor(Request request) {
Point p = null;
if (request instanceof CreateConnectionRequest) {
CreateConnectionRequest req = (CreateConnectionRequest) request;
p = req.getLocation();
} else if (request instanceof LocationRequest) {
p = ((LocationRequest) request).getLocation();
}
if (p != null) {
recentTargetEndPoint = getLocation(p);
return new RelativeXYAnchor(getFigure(), recentTargetEndPoint, true);
}
return super.getTargetConnectionAnchor(request);
}
/**
* @see org.eclipse.epf.authoring.gef.util.ConnectionAnchorLocator#getLocation(Point)
*/
public Point getLocation(Point reference) {
Diamond f = ((Diamond) getFigure());
// translate points to absolute
Point[] points = new Point[f.getPoints().size()];
for (int i = f.getPoints().size() - 1; i > -1; i--) {
Point p = f.getPoints().getPoint(i);
f.translateToAbsolute(p);
points[i] = p;
}
Point p = AnchorUtil.getClosestPoint(points, reference);
if (p != null) {
Rectangle r = f.getBounds().getCopy();
f.translateToAbsolute(r);
p.performTranslate(-r.x, -r.y);
}
return p;
}
}