/*******************************************************************************
* Copyright (c) 2012 VMware, Inc.
* 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:
* VMware, Inc. - initial API and implementation
*******************************************************************************/
package org.springframework.ide.eclipse.config.graph.parts;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.draw2d.ConnectionAnchor;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.PositionConstants;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.gef.ConnectionEditPart;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.Request;
import org.eclipse.gef.requests.DropRequest;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
import org.springframework.ide.eclipse.config.graph.figures.BorderedActivityLabel;
import org.springframework.ide.eclipse.config.graph.model.Activity;
import org.springframework.ide.eclipse.config.graph.model.Transition;
import org.springframework.ide.eclipse.config.graph.policies.ActivityNodeEditPolicy;
import org.springframework.ide.eclipse.config.graph.policies.FixedConnectionNodeEditPolicy;
/**
* @author Leo Dos Santos
*/
@SuppressWarnings("restriction")
public abstract class BorderedActivityPart extends SimpleActivityPart {
protected BorderedActivityLabel figure;
private boolean hasAnchors = true;
public BorderedActivityPart(Activity activity) {
super(activity);
}
protected BorderedActivityLabel createBorderedLabel(int direction, List<String> incomings, List<String> outgoings) {
return new BorderedActivityLabel(direction, incomings, outgoings);
}
@Override
protected void createEditPolicies() {
super.createEditPolicies();
if (hasAnchors) {
installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, getFixedConnectionNodeEditPolicy());
}
else {
installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, getStandardConnectionNodeEditPolicy());
}
}
@Override
protected IFigure createFigure() {
Activity activity = getModelElement();
List<String> incomings = new ArrayList<String>();
List<String> outgoings = new ArrayList<String>();
if (hasAnchors) {
incomings.addAll(activity.getPrimaryIncomingAttributes());
incomings.addAll(activity.getSecondaryIncomingAttributes());
outgoings.addAll(activity.getPrimaryOutgoingAttributes());
outgoings.addAll(activity.getSecondaryOutgoingAttributes());
}
int direction = PositionConstants.SOUTH;
EditPart part = getViewer().getContents();
if (part instanceof ActivityDiagramPart) {
ActivityDiagramPart diagramPart = (ActivityDiagramPart) part;
direction = diagramPart.getDirection();
}
figure = createBorderedLabel(direction, incomings, outgoings);
return figure;
}
@Override
protected int getAnchorOffset() {
return -1;
}
public ConnectionAnchor getConnectionAnchorAt(Point p) {
return ((BorderedActivityLabel) getFigure()).getConnectionAnchorAt(p);
}
protected abstract FixedConnectionNodeEditPolicy getFixedConnectionNodeEditPolicy();
protected abstract ActivityNodeEditPolicy getStandardConnectionNodeEditPolicy();
@Override
public ConnectionAnchor getSourceConnectionAnchor(ConnectionEditPart connection) {
if (connection instanceof TransitionPart) {
TransitionPart part = (TransitionPart) connection;
Transition trans = (Transition) part.getModel();
IDOMNode input = trans.getInput();
if (input != null) {
ConnectionAnchor anchor = ((BorderedActivityLabel) getFigure()).getConnectionAnchor(trans.getInput()
.getLocalName());
if (anchor != null) {
return anchor;
}
}
}
return super.getSourceConnectionAnchor(connection);
}
@Override
public ConnectionAnchor getSourceConnectionAnchor(Request request) {
Point pt = new Point(((DropRequest) request).getLocation());
ConnectionAnchor anchor = ((BorderedActivityLabel) getFigure()).getSourceConnectionAnchorAt(pt);
if (anchor != null) {
return anchor;
}
return super.getSourceConnectionAnchor(request);
}
@Override
public ConnectionAnchor getTargetConnectionAnchor(ConnectionEditPart connection) {
if (connection instanceof TransitionPart) {
TransitionPart part = (TransitionPart) connection;
Transition trans = (Transition) part.getModel();
IDOMNode input = trans.getInput();
if (input != null) {
ConnectionAnchor anchor = ((BorderedActivityLabel) getFigure()).getConnectionAnchor(trans.getInput()
.getLocalName());
if (anchor != null) {
return anchor;
}
}
}
return super.getTargetConnectionAnchor(connection);
}
@Override
public ConnectionAnchor getTargetConnectionAnchor(Request request) {
Point pt = new Point(((DropRequest) request).getLocation());
ConnectionAnchor anchor = ((BorderedActivityLabel) getFigure()).getTargetConnectionAnchorAt(pt);
if (anchor != null) {
return anchor;
}
return super.getTargetConnectionAnchor(request);
}
public void setBorderLabel(String label) {
if (figure != null) {
figure.setBorderLabel(label);
}
}
public void setHasAnchors(boolean hasAnchors) {
this.hasAnchors = hasAnchors;
}
}