/*
* 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.transformation.ui.part;
import java.beans.PropertyChangeEvent;
import java.util.List;
import org.eclipse.draw2d.ChopboxAnchor;
import org.eclipse.draw2d.ConnectionAnchor;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.ConnectionEditPart;
import org.eclipse.gef.DragTracker;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.Request;
import org.eclipse.gef.RequestConstants;
import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
import org.teiid.designer.diagram.ui.DiagramUiConstants;
import org.teiid.designer.diagram.ui.model.DiagramModelNode;
import org.teiid.designer.diagram.ui.part.AbstractDiagramEditPart;
import org.teiid.designer.diagram.ui.part.EditableEditPart;
import org.teiid.designer.diagram.ui.util.HiliteDndNodeSelectionEditPolicy;
import org.teiid.designer.diagram.ui.util.SelectionTracker;
import org.teiid.designer.diagram.ui.util.directedit.DirectEditPartEditPolicy;
import org.teiid.designer.metamodels.diagram.Diagram;
import org.teiid.designer.transformation.ui.figure.TransformationFigure;
import org.teiid.designer.transformation.ui.model.TransformationNode;
import org.teiid.designer.transformation.util.TransformationHelper;
import org.teiid.designer.ui.editors.ModelEditorManager;
/**
*
* @since 8.0
*/
public class TransformationEditPart extends AbstractDiagramEditPart implements EditableEditPart {
private ChopboxAnchor singleAnchor;
private DragTracker myDragTracker = null;
public TransformationEditPart() {
super();
}
public TransformationEditPart( String diagramTypeId ) {
super();
setDiagramTypeId(diagramTypeId);
init();
}
public void init() {
if (getAnchorManager() == null) {
setAnchorManager(getEditPartFactory().getAnchorManager(this));
}
}
/**
* @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure()
**/
@Override
protected IFigure createFigure() {
Point location = new Point(100, 100);
TransformationFigure transformFigure = (TransformationFigure)getFigureFactory().createFigure(getModel());
transformFigure.setLocation(location);
return transformFigure;
}
/**
* @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicies()
**/
@Override
protected void createEditPolicies() {
// installEditPolicy(EditPolicy.LAYOUT_ROLE, new DiagramXYLayoutEditPolicy());
installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE, new NonResizableEditPolicy());
// installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new DiagramNodeSelectionEditPolicy());
installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new HiliteDndNodeSelectionEditPolicy());
installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, new DirectEditPartEditPolicy());
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.part.EditableEditPart#edit()
*/
@Override
public void edit() {
if (ModelEditorManager.canEdit(((DiagramModelNode)getModel()).getModelObject())) {
ModelEditorManager.edit(((DiagramModelNode)getModel()).getModelObject());
} else {
// We might have an Operations Object here. In which case we go ahead and try to edit
if (((DiagramModelNode)getModel()).getModelObject() != null) {
// Get the diagram's Target
Diagram diagram = ((DiagramModelNode)getModel()).getDiagram();
if (diagram != null) {
if (diagram.getTarget() != null && TransformationHelper.isOperation(diagram.getTarget())) {
ModelEditorManager.edit(diagram.getTarget());
}
}
}
}
}
@Override
public void performRequest( Request request ) {
if (request.getType() == RequestConstants.REQ_DIRECT_EDIT) {
getSelectionHandler().handleDoubleClick(this.getModelObject());
}
}
/**
* @see org.eclipse.gef.editparts.AbstractEditPart#getModelChildren() You must implement this method if you want you root
* model to have children!
**/
@Override
protected List getModelChildren() {
List children = ((TransformationNode)getModel()).getChildren();
return children;
}
/**
* @see org.eclipse.gef.editparts.AbstractEditPart#refreshVisuals()
**/
@Override
protected void refreshVisuals() {
Point loc = ((DiagramModelNode)getModel()).getPosition();
Dimension size = ((DiagramModelNode)getModel()).getSize();
Rectangle r = new Rectangle(loc, size);
((GraphicalEditPart)getParent()).setLayoutConstraint(this, getFigure(), r);
getFigure().repaint();
}
@Override
public void propertyChange( PropertyChangeEvent evt ) {
//
String prop = evt.getPropertyName();
if (prop.equals(DiagramUiConstants.DiagramNodeProperties.SIZE)) {
resizeChildren();
}
super.propertyChange(evt);
if (prop.equals(DiagramUiConstants.DiagramNodeProperties.CONNECTION)) {
refresh();
createOrUpdateAnchorsLocations(true);
refreshAllLabels();
}
if (prop.equals(DiagramUiConstants.DiagramNodeProperties.LOCATION)) {
((DiagramModelNode)getModel()).updateAssociations();
}
if (prop.equals(DiagramUiConstants.DiagramNodeProperties.SUBSCRIPT)) {
((TransformationFigure)getDiagramFigure()).setSubscript(((TransformationNode)getModel()).getSubscript());
refreshVisuals();
}
}
@Override
public void resizeChildren() {
// call header.resize();
getDiagramFigure().updateForSize(((DiagramModelNode)getModel()).getSize());
}
/**
* This method is not mandatory to implement, but if you do not implement it, you will not have the ability to
* rectangle-selects several figures...
**/
@Override
public DragTracker getDragTracker( Request req ) {
// Unlike in Logical Diagram Editor example, I use a singleton because this
// method is Entered >> several time, so I prefer to save memory ; and it works!
if (myDragTracker == null) {
myDragTracker = new SelectionTracker(this);
}
return myDragTracker;
}
public ConnectionAnchor getAnchor() {
if (singleAnchor == null) singleAnchor = new ChopboxAnchor(this.getFigure());
return singleAnchor;
}
// =================================================================================================
// =================================================================================================
// Connection Methods from NodeEditPart interface and Overriding AbstractGraphicalEditPart
// =================================================================================================
/**
* @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#getModelSourceConnections()
**/
@Override
protected List getModelSourceConnections() {
return ((TransformationNode)getModel()).getSourceConnections();
}
/**
* @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#getModelTargetConnections()
**/
@Override
protected List getModelTargetConnections() {
return ((TransformationNode)getModel()).getTargetConnections();
}
/**
* @see org.eclipse.gef.NodeEditPart#getSourceConnectionAnchor(ConnectionEditPart)
**/
@Override
public ConnectionAnchor getSourceConnectionAnchor( ConnectionEditPart connection ) {
return getAnchor();
}
/**
* @see org.eclipse.gef.NodeEditPart#getSourceConnectionAnchor(Request)
**/
@Override
public ConnectionAnchor getSourceConnectionAnchor( Request request ) {
return getAnchor();
}
/**
* @see org.eclipse.gef.NodeEditPart#getTargetConnectionAnchor(ConnectionEditPart)
**/
@Override
public ConnectionAnchor getTargetConnectionAnchor( ConnectionEditPart connection ) {
return getAnchor();
}
/**
* @see org.eclipse.gef.NodeEditPart#getTargetConnectionAnchor(Request)
**/
@Override
public ConnectionAnchor getTargetConnectionAnchor( Request request ) {
return getAnchor();
}
}