/* * 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 java.beans.PropertyChangeEvent; import java.util.Iterator; import java.util.List; import org.eclipse.draw2d.Figure; 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.EditPart; 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.figure.ContainerFigure; import org.teiid.designer.diagram.ui.model.DiagramModelNode; import org.teiid.designer.diagram.ui.part.AbstractNotationEditPart; import org.teiid.designer.diagram.ui.part.DiagramEditPart; import org.teiid.designer.diagram.ui.part.PropertyChangeManager; import org.teiid.designer.diagram.ui.util.DiagramNodeSelectionEditPolicy; import org.teiid.designer.diagram.ui.util.SelectionTracker; /** * UmlClassifierContainerEditPart * * @since 8.0 */ public class UmlClassifierContainerEditPart extends AbstractNotationEditPart { private DragTracker myDragTracker = null; /** * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure() **/ @Override protected IFigure createFigure() { Point posn = new Point(100, 100); Figure newFigure = getFigureGenerator().createFigure(getModel()); newFigure.setLocation(posn); ((DiagramModelNode) getModel()).setPosition(posn); ((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() { setSelectablePart(false); installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE, new NonResizableEditPolicy()); installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new DiagramNodeSelectionEditPolicy()); } /** * @see org.eclipse.gef.editparts.AbstractEditPart#refreshVisuals() **/ @Override protected void refreshVisuals() { Point posn = ((DiagramModelNode) getModel()).getPosition(); Dimension size = ((DiagramModelNode) getModel()).getSize(); Rectangle r = new Rectangle(posn, size); ((GraphicalEditPart) getParent()).setLayoutConstraint(this, getFigure(), r); getFigure().repaint(); } @Override public IFigure getContentPane() { if( this.getFigure() instanceof ContainerFigure ) return ((ContainerFigure)getFigure()).getContentsPane(); return null; } /* (non-JavaDoc) * @see java.beans.PropertyChangeListener#propertyChange(PropertyChangeEvent) **/ @Override public void propertyChange(PropertyChangeEvent evt) { String prop = evt.getPropertyName(); if (prop.equals(DiagramUiConstants.DiagramNodeProperties.CHILDREN)) { getChangeManager().refresh(PropertyChangeManager.CHILDREN, true); layout(DiagramEditPart.LAYOUT_CHILDREN); getChangeManager().refresh(PropertyChangeManager.VISUALS, false); getChangeManager().refresh(PropertyChangeManager.ANCHORS, false); } else if (prop.equals(DiagramUiConstants.DiagramNodeProperties.SIZE)) { 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); } else if (prop.equals(DiagramUiConstants.DiagramNodeProperties.PROPERTIES)) { refreshVisuals(); getChangeManager().refresh(PropertyChangeManager.VISUALS, false); } } /** * Update the positions of the association's labels **/ @Override public void refreshFont(boolean refreshChildren) { // Walk the children and tell them to refresh font. // Layout out it's children first if( refreshChildren ) { List editPartChildren = getChildren(); Iterator iter = editPartChildren.iterator(); EditPart nextEP = null; while (iter.hasNext()) { nextEP = (EditPart)iter.next(); if (nextEP instanceof DiagramEditPart) ((DiagramEditPart)nextEP).refreshFont(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(" ==>> UmlClassifierEditPart.refreshFont() new model Location = " + // ((DiagramModelNode)getModel()).getPosition() + " Size = " + ((DiagramModelNode)getModel()).getSize()); } refreshAllLabels(); } @Override public void performRequest(Request request) { if (request.getType() == RequestConstants.REQ_DIRECT_EDIT) { getSelectionHandler().handleDoubleClick(((DiagramEditPart)this.getParent()).getModelObject()); } } /** * 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; } }