/* * 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.util.Iterator; import java.util.List; import org.eclipse.draw2d.Figure; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.Label; 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.RequestConstants; import org.eclipse.gef.editpolicies.NonResizableEditPolicy; import org.eclipse.gef.tools.DirectEditManager; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.swt.graphics.Color; import org.teiid.designer.core.ModelerCore; import org.teiid.designer.diagram.ui.model.DiagramModelNode; import org.teiid.designer.diagram.ui.notation.uml.model.UmlOperationNode; import org.teiid.designer.diagram.ui.part.AbstractNotationEditPart; import org.teiid.designer.diagram.ui.part.DiagramEditPart; import org.teiid.designer.diagram.ui.util.HiliteDndNodeSelectionEditPolicy; import org.teiid.designer.diagram.ui.util.SelectionTracker; import org.teiid.designer.diagram.ui.util.directedit.DirectEditFigure; import org.teiid.designer.diagram.ui.util.directedit.DirectEditPart; import org.teiid.designer.diagram.ui.util.directedit.DirectEditPartEditPolicy; import org.teiid.designer.diagram.ui.util.directedit.DirectEditPartManager; import org.teiid.designer.diagram.ui.util.directedit.LabelCellEditorLocator; import org.teiid.designer.ui.viewsupport.ModelObjectUtilities; /** * UmlOperationEditPart * * @since 8.0 */ public class UmlOperationEditPart extends AbstractNotationEditPart implements DirectEditPart { private DirectEditManager manager; private DragTracker myDragTracker = null; /** * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure() **/ @Override protected IFigure createFigure() { Point location = new Point(100, 100); Figure newFigure = getFigureGenerator().createFigure(getModel()); newFigure.setLocation(location); ((DiagramModelNode) getModel()).setPosition(location); ((DiagramModelNode) getModel()).setSize(newFigure.getSize()); return newFigure; } /** * @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicies() * You need to tell how children nodes will be layed out... **/ @Override protected void createEditPolicies() { installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE, new NonResizableEditPolicy()); 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( getSelectionHandler().shouldRename(getModelObject()) ) { if( ModelerCore.getModelEditor().hasName(getModelObject()) && !ModelObjectUtilities.isReadOnly(getModelObject())) performDirectEdit(); } } @Override public void performDirectEdit(){ if(manager == null) manager = new DirectEditPartManager(this, TextCellEditor.class, new LabelCellEditorLocator(getLabel())); manager.show(); } @Override public void performRequest(Request request){ if (request.getType() == RequestConstants.REQ_DIRECT_EDIT) { if( ! (getSelectionHandler().handleDoubleClick(this.getModelObject())) ){ if( ModelerCore.getModelEditor().hasName(getModelObject()) ) performDirectEdit(); } } } /** * @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 String getText() { return ((DiagramModelNode)getModel()).getName(); } @Override public void setText(String newName) { ((DiagramModelNode)getModel()).setName(newName); } @Override public String getEditString(){ return ((DiagramModelNode)getModel()).getName(); } private Label getLabel() { Label label = null; if( getFigure() instanceof DirectEditFigure ) { label = ((DirectEditFigure)getFigure()).getLabelFigure(); } return label; } /* (non-Javadoc) * @See org.teiid.designer.diagram.ui.part.DiagramEditPart#hiliteBackground(org.eclipse.swt.graphics.Color) */ @Override public void hiliteBackground(Color hiliteColor) { getDiagramFigure().hiliteBackground(hiliteColor); } /* (non-Javadoc) * @See org.teiid.designer.diagram.ui.part.DiagramEditPart#shouldHiliteBackground() */ @Override public boolean shouldHiliteBackground(List sourceEditParts) { // We'll start off by checking to see that list of sourceEditParts do not have the same parent as this. Iterator iter = sourceEditParts.iterator(); DiagramEditPart nextEP = null; while( iter.hasNext()) { nextEP = (DiagramEditPart)iter.next(); if( nextEP.getParent().equals(this.getParent())) return false; } return true; } /* (non-JavaDoc) * @See org.teiid.designer.diagram.ui.DiagramEditPart#resizeChildren() * Overrides AbstractDefaultEditPart so it can put the "data type" in the signature **/ @Override public void refreshName() { // Need to get the figure and update the name getDiagramFigure().updateForName(((UmlOperationNode)getModel()).getSignature()); } /** * 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; } /** * Update the positions of the association's labels **/ @Override public void refreshFont(boolean refreshChildren) { // Then do a getFigure().layout here. if (getDiagramFigure() != null) { getDiagramFigure().refreshFont(); getDiagramFigure().layoutFigure(); // Let's get children of container and set their model ((DiagramModelNode)getModel()).setSize(getFigure().getSize()); ((DiagramModelNode)getModel()).setPosition(new Point(getFigure().getBounds().x, getFigure().getBounds().y)); // System.out.println(" ==>> UmlAttributeEditPart.refreshFont() new model Location = " + // ((DiagramModelNode)getModel()).getPosition() + " Size = " + ((DiagramModelNode)getModel()).getSize()); } refreshVisuals(); refreshAllLabels(); } /* (non-Javadoc) * @See org.teiid.designer.diagram.ui.util.directedit.DirectEditPart#getEditManager() */ @Override public DirectEditPartManager getEditManager() { return (DirectEditPartManager)manager; } }