/* * 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.mapping.ui.part; import java.beans.PropertyChangeEvent; import java.util.Collections; import java.util.List; 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.DragTracker; import org.eclipse.gef.EditPolicy; import org.eclipse.gef.GraphicalEditPart; import org.eclipse.gef.Request; import org.eclipse.gef.tools.SelectEditPartTracker; import org.eclipse.swt.graphics.Color; 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.PropertyChangeManager; import org.teiid.designer.diagram.ui.util.DiagramNodeSelectionEditPolicy; import org.teiid.designer.mapping.ui.figure.MappingExtentFigure; import org.teiid.designer.mapping.ui.model.MappingExtentNode; import org.teiid.designer.metamodels.transformation.StagingTable; /** * @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 MappingExtentEditPart extends AbstractDiagramEditPart { /////////////////////////////////////////////////////////////////////////////////////////////// // FIELDS /////////////////////////////////////////////////////////////////////////////////////////////// private static int nExtents = 0; // private int thisExtentID = 0; /** Singleton instance of MarqueeDragTracker. */ private DragTracker myDragTracker = null; /////////////////////////////////////////////////////////////////////////////////////////////// // CONSTRUCTORS /////////////////////////////////////////////////////////////////////////////////////////////// public MappingExtentEditPart() { super(); } public MappingExtentEditPart(String diagramTypeId) { super(); setDiagramTypeId(diagramTypeId); init(); // thisExtentID = nExtents; nExtents++; } /////////////////////////////////////////////////////////////////////////////////////////////// // METHODS /////////////////////////////////////////////////////////////////////////////////////////////// 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); MappingExtentFigure extentFigure = (MappingExtentFigure)getFigureFactory().createFigure(getModel()); extentFigure.setLocation(location); List toolTips = ((MappingExtentNode)getModel()).getToolTipStrings(); if( toolTips != null && !toolTips.isEmpty() ) extentFigure.setToolTip(extentFigure.createToolTip(toolTips)); // boolean isRequired = ((MappingExtentNode)getModel()).getExtent().isMappingRequired(); // if( isRequired ) { //// extentFigure.setOutlineColor(ColorConstants.red); // } extentFigure.setOutlineWidth(3); return extentFigure; } /** * @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicies() **/ @Override protected void createEditPolicies() { installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new DiagramNodeSelectionEditPolicy()); installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE, null); } /** * @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 = ((DiagramModelNode) 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)) { ((MappingExtentFigure)getFigure()).updateForSize(((DiagramModelNode) getModel()).getSize()); getChangeManager().refresh(PropertyChangeManager.ANCHORS, false); getChangeManager().refresh(PropertyChangeManager.VISUALS, false); } else if (prop.equals(DiagramUiConstants.DiagramNodeProperties.CONNECTION)) { getChangeManager().refresh(PropertyChangeManager.GENERAL, false); getChangeManager().refresh(PropertyChangeManager.ANCHORS, false); getChangeManager().refresh(PropertyChangeManager.VISUALS, false); } else if (prop.equals(DiagramUiConstants.DiagramNodeProperties.LOCATION)) { getChangeManager().refresh(PropertyChangeManager.ANCHORS, false); getChangeManager().refresh(PropertyChangeManager.VISUALS, false); } } @Override public void resizeChildren() { getDiagramFigure().updateForSize(((DiagramModelNode) getModel()).getSize()); } /* (non-Javadoc) * @See org.teiid.designer.diagram.ui.part.DiagramEditPart#hiliteBackground(org.eclipse.swt.graphics.Color) */ @Override public void hiliteBackground(Color hiliteColor) { if( hasConnections() ) { getDiagramFigure().hiliteBackground(hiliteColor); } else { DiagramModelNode nextNode = (MappingExtentNode)getModel(); if( !(nextNode.getModelObject() instanceof StagingTable ) ) { getDiagramFigure().hiliteBackground(null); } else getDiagramFigure().hiliteBackground(hiliteColor); } } private boolean hasConnections() { DiagramModelNode nextNode = (MappingExtentNode)getModel(); if( (nextNode.getSourceConnections() != null && !nextNode.getSourceConnections().isEmpty() ) || (nextNode.getTargetConnections() != null && !nextNode.getTargetConnections().isEmpty() ) ) { return true; } return false; } /* (non-Javadoc) * @See org.teiid.designer.diagram.ui.part.DiagramEditPart#getDependencies() */ @Override public List getDependencies() { DiagramModelNode modelNode = (DiagramModelNode)getModel(); if( modelNode != null ) return modelNode.getDependencies(); return Collections.EMPTY_LIST; } /* (non-Javadoc) * @See org.teiid.designer.diagram.ui.part.DiagramEditPart#layout(boolean) */ @Override public void layout(boolean layoutChildren) { // Then do a getFigure().layout here. if (getDiagramFigure() != null) { getDiagramFigure().layoutFigure(); } updateModelSize(); } /** * 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 SelectEditPartTracker(this); //(this, getSelectionHandler()); } return myDragTracker; } /* (non-Javadoc) * @See org.teiid.designer.diagram.ui.part.DiagramEditPart#shouldReveal() */ @Override public boolean shouldReveal() { // XXX Auto-generated method stub return false; } /* (non-Javadoc) * @See org.teiid.designer.diagram.ui.part.DiagramEditPart#updateModelSize() */ @Override public void updateModelSize() { if( ((MappingExtentNode)getModel()).getExtent().getMappingReference() instanceof StagingTable) ((MappingExtentNode)getModel()).updateModelForExtent(); else super.updateModelSize(); } /* (non-Javadoc) * @see org.eclipse.gef.EditPart#activate() */ @Override public void activate() { // XXX Auto-generated method stub super.activate(); if( ((MappingExtentNode)getModel()).getExtent().getMappingReference() instanceof StagingTable) ((MappingExtentNode)getModel()).updateModelForExtent(); } /** * * @see org.teiid.designer.diagram.ui.part.DiagramEditPart#constructionCompleted() * @since 5.0 */ @Override public void constructionCompleted(boolean updateLinkedParts) { if( isUnderConstruction() ) { getChangeManager().executeRefresh(updateLinkedParts); super.constructionCompleted(updateLinkedParts); } } }