/*
* 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.notation.uml.part;
import java.beans.PropertyChangeEvent;
import java.util.List;
import java.util.Vector;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.PolygonDecoration;
import org.eclipse.gef.DragTracker;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.Request;
import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
import org.eclipse.swt.graphics.Color;
import org.teiid.designer.diagram.ui.DiagramUiConstants;
import org.teiid.designer.diagram.ui.connection.BinaryAssociation;
import org.teiid.designer.diagram.ui.connection.DiagramUmlAssociation;
import org.teiid.designer.diagram.ui.connection.LinkBendpointEditPolicy;
import org.teiid.designer.diagram.ui.connection.LinkEndpointEditPolicy;
import org.teiid.designer.diagram.ui.connection.NodeConnectionEditPart;
import org.teiid.designer.diagram.ui.connection.NodeConnectionModel;
import org.teiid.designer.diagram.ui.connection.decorator.DecoratorFactory;
import org.teiid.designer.diagram.ui.editor.DiagramEditorUtil;
import org.teiid.designer.diagram.ui.figure.DiagramPolylineConnection;
import org.teiid.designer.diagram.ui.util.ConnectionSelectionTracker;
import org.teiid.designer.diagram.ui.util.DiagramNodeSelectionEditPolicy;
/**
* ForeignKeyLinkEditPart
*
* @since 8.0
*/
public class UmlAssociationLinkEditPart extends NodeConnectionEditPart {
private DragTracker dragTracker = null;
/**
* @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure()
**/
@Override
protected IFigure createFigure() {
DiagramPolylineConnection connectionFigure = new DiagramPolylineConnection();
List toolTips = ((NodeConnectionModel)getModel()).getToolTipStrings();
if( toolTips != null && !toolTips.isEmpty() )
connectionFigure.setToolTip(connectionFigure.createToolTip(toolTips));
int targetDecID = ((NodeConnectionModel)getModel()).getTargetDecoratorId();
int sourceDecID = ((NodeConnectionModel)getModel()).getSourceDecoratorId();
Color diagramBkgdColor = ((AbstractGraphicalEditPart)getDiagramViewer().getContents()).getFigure().getBackgroundColor();
PolygonDecoration newTargetDecoration = DecoratorFactory.getDecorator(targetDecID);
PolygonDecoration newSourceDecoration = DecoratorFactory.getDecorator(sourceDecID);
int iStandardWidth = 1;
if( newTargetDecoration != null ) {
newTargetDecoration.setLineWidth(iStandardWidth);
if( targetDecID == BinaryAssociation.DECORATOR_DIAMOND_OPEN ||
targetDecID == BinaryAssociation.DECORATOR_ARROW_CLOSED)
newTargetDecoration.setBackgroundColor(diagramBkgdColor);
connectionFigure.setTargetDecoration(newTargetDecoration);
}
if( newSourceDecoration != null ) {
newSourceDecoration.setLineWidth(iStandardWidth);
if( sourceDecID == BinaryAssociation.DECORATOR_DIAMOND_OPEN ||
sourceDecID == BinaryAssociation.DECORATOR_ARROW_CLOSED)
newSourceDecoration.setBackgroundColor(diagramBkgdColor);
connectionFigure.setSourceDecoration(newSourceDecoration);
}
connectionFigure.setLineStyle( ((NodeConnectionModel)getModel()).getLineStyle() );
connectionFigure.setLineWidth( iStandardWidth );
connectionFigure.setForegroundColor(ColorConstants.blue);
return connectionFigure;
}
/* (non-Javadoc)
* @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicies()
*/
@Override
protected void createEditPolicies() {
// installEditPolicy(EditPolicy.CONNECTION_ENDPOINTS_ROLE, new DiagramConnectionEndpointEditPolicy());
refreshBendpointEditPolicy();
installEditPolicy(EditPolicy.CONNECTION_ENDPOINTS_ROLE, new LinkEndpointEditPolicy());
installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new DiagramNodeSelectionEditPolicy());
}
/* (non-Javadoc)
* @see org.eclipse.gef.EditPart#getDragTracker(org.eclipse.gef.Request)
*/
@Override
public DragTracker getDragTracker(Request req) {
if( dragTracker == null )
dragTracker = new ConnectionSelectionTracker(this, getDiagramViewer().getSelectionHandler());
return dragTracker;
}
private void refreshBendpointEditPolicy(){
if (DiagramEditorUtil.getCurrentDiagramRouterStyle() != DiagramUiConstants.LinkRouter.MANUAL )
installEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE, null);
else
installEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE, new LinkBendpointEditPolicy());
}
/**
* @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
* @since 4.2
*/
@Override
public void propertyChange(PropertyChangeEvent evt) {
String prop = evt.getPropertyName();
super.propertyChange(evt);
if (DiagramUiConstants.DiagramNodeProperties.ROUTER.equals(prop)){
if(((DiagramUmlAssociation)getModel()).changedRouterFromOtoM((String)evt.getOldValue(), (String)evt.getNewValue()) ) {
DiagramPolylineConnection dpc = (DiagramPolylineConnection)getFigure();
Vector orthPts = new Vector(dpc.getInternalPoints());
((NodeConnectionModel)getModel()).clearBendpoints();
((NodeConnectionModel)getModel()).setBendpoints(orthPts);
}
refreshBendpointEditPolicy();
refreshBendpoints();
}
// super.propertyChange(evt);
}
}