/* * 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 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.teiid.designer.core.ModelerCore; import org.teiid.designer.diagram.ui.DiagramUiConstants; import org.teiid.designer.diagram.ui.editor.DiagramViewer; import org.teiid.designer.diagram.ui.model.DiagramModelNode; import org.teiid.designer.diagram.ui.notation.uml.figure.UmlPackageFigure; import org.teiid.designer.diagram.ui.notation.uml.model.UmlPackageNode; import org.teiid.designer.diagram.ui.part.AbstractNotationEditPart; import org.teiid.designer.diagram.ui.part.PropertyChangeManager; import org.teiid.designer.diagram.ui.util.DiagramNodeSelectionEditPolicy; 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.editors.ModelEditorManager; import org.teiid.designer.ui.viewsupport.ModelObjectUtilities; /** * UmlPackageEditPart * * @since 8.0 */ public class UmlPackageEditPart extends AbstractNotationEditPart implements DirectEditPart { /////////////////////////////////////////////////////////////////////////////////////////////// // FIELDS /////////////////////////////////////////////////////////////////////////////////////////////// /** Singleton instance of MarqueeDragTracker. */ private DragTracker myDragTracker = null; private DirectEditManager manager; /////////////////////////////////////////////////////////////////////////////////////////////// // CONSTRUCTORS /////////////////////////////////////////////////////////////////////////////////////////////// public UmlPackageEditPart() { super(); init(); } public UmlPackageEditPart(String diagramTypeId) { super(); setDiagramTypeId(diagramTypeId); init(); } /////////////////////////////////////////////////////////////////////////////////////////////// // 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); Figure newFigure = getFigureGenerator().createFigure(getModel()); newFigure.setLocation(location); return newFigure; } /** * @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicies() * You need to tell how children nodes will be layed out... **/ @Override protected void createEditPolicies() { setPrimaryParent(true); installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE, new NonResizableEditPolicy()); installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new DiagramNodeSelectionEditPolicy()); installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, new DirectEditPartEditPolicy()); } /* (non-Javadoc) * @See org.teiid.designer.diagram.ui.part.EditableEditPart#edit() */ @Override public void edit() { // Here's where we open it's package diagram. if( doubleClickedName() ) { if(ModelerCore.getModelEditor().hasName(getModelObject()) && !ModelObjectUtilities.isReadOnly(getModelObject()) ) performDirectEdit(); } else { // Let's just open up the package diagram for this thing ModelEditorManager.open(((DiagramModelNode)getModel()).getModelObject(), true); // ((DiagramViewer)getViewer()).setInput( ((DiagramModelNode)getModel()).getModelObject() ); } } @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) { edit(); } } private boolean doubleClickedName() { SelectionTracker tracker = (SelectionTracker)getDragTracker(null); if( tracker != null && tracker.getLastMouseLocation() != null ) { Point point = new Point(tracker.getLastMouseLocation()); Point viewportLoc = ((DiagramViewer)getViewer()).getViewportLocation(); // Let's get the rectangle for the figure for the name in the header... UmlPackageFigure cFigure = (UmlPackageFigure)getDiagramFigure(); IFigure nameFigure = cFigure.getNameFigure(); if( nameFigure != null ) { // Let's add a coupleof pixels on the bounds Rectangle rect = new Rectangle(nameFigure.getBounds()); rect.x = rect.x + cFigure.getBounds().x - 3 - viewportLoc.x; rect.y = rect.y + cFigure.getBounds().y - 3 - viewportLoc.y; rect.width += 6; rect.height += 6; if( rect.contains(point) ) { return true; } } } return false; } /** * 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; } /** * @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(); } /* (non-JavaDoc) * @see java.beans.PropertyChangeListener#propertyChange(PropertyChangeEvent) **/ @Override public void propertyChange(PropertyChangeEvent evt) { // String prop = evt.getPropertyName(); if (prop.equals(DiagramUiConstants.DiagramNodeProperties.SIZE)) { getChangeManager().refresh(PropertyChangeManager.RESIZE_CHILDREN, true); } super.propertyChange(evt); if (prop.equals(DiagramUiConstants.DiagramNodeProperties.NAME)) { layout(); } else if (prop.equals(DiagramUiConstants.DiagramNodeProperties.LOCATION)) { getChangeManager().refresh(PropertyChangeManager.ANCHORS, true); getChangeManager().refresh(PropertyChangeManager.LABELS, true); } if (prop.equals(DiagramUiConstants.DiagramNodeProperties.PATH)) { refreshPath(); layout(); } } @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... // **/ // 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 (m_dragTracker == null && ((DiagramViewer)getViewer()).getSelectionHandler() != null ) { // m_dragTracker = new SelectionTracker(this, ((DiagramViewer)getViewer()).getSelectionHandler()); // } // return m_dragTracker; // } public void refreshPath() { ((UmlPackageFigure)getDiagramFigure()).updateForPath(((UmlPackageNode)getModel()).getPath()); } @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.util.directedit.DirectEditPart#getEditManager() */ @Override public DirectEditPartManager getEditManager() { return (DirectEditPartManager)manager; } private Label getLabel() { Label label = null; if( getFigure() instanceof DirectEditFigure ) { label = ((DirectEditFigure)getFigure()).getLabelFigure(); } return label; } }