//------------------------------------------------------------------------------ // Copyright (c) 2005, 2006 IBM Corporation and others. // All rights reserved. This program and the accompanying materials // are made available under the terms of the Eclipse Public License v1.0 // which accompanies this distribution, and is available at // http://www.eclipse.org/legal/epl-v10.html // // Contributors: // IBM Corporation - initial implementation //------------------------------------------------------------------------------ package org.eclipse.epf.authoring.gef.edit.policies; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.draw2d.AbsoluteBendpoint; import org.eclipse.draw2d.PositionConstants; import org.eclipse.draw2d.XYLayout; import org.eclipse.draw2d.geometry.Point; import org.eclipse.epf.authoring.gef.commands.ChangeBoundsCommand; import org.eclipse.epf.authoring.gef.commands.ChangeHeightCommand; import org.eclipse.epf.authoring.gef.commands.CreateNodeCommand; import org.eclipse.epf.authoring.gef.commands.MoveBendpointCommand; import org.eclipse.epf.authoring.gef.edit.ActivityDetailDiagramEditPart; import org.eclipse.epf.authoring.gef.edit.DiagramEditPart; import org.eclipse.epf.authoring.gef.edit.LinkEditPart; import org.eclipse.epf.authoring.gef.edit.RoleTaskCompositeEditPart; import org.eclipse.epf.authoring.gef.edit.WorkProductCompositeEditPart; import org.eclipse.epf.diagram.model.ActivityDetailDiagram; import org.eclipse.epf.diagram.model.Diagram; import org.eclipse.epf.diagram.model.Link; import org.eclipse.epf.diagram.model.Node; import org.eclipse.epf.diagram.model.util.GraphicalDataHelper; import org.eclipse.gef.EditPart; import org.eclipse.gef.EditPolicy; import org.eclipse.gef.GraphicalEditPart; import org.eclipse.gef.Request; import org.eclipse.gef.commands.Command; import org.eclipse.gef.commands.CompoundCommand; import org.eclipse.gef.commands.UnexecutableCommand; import org.eclipse.gef.editpolicies.ConstrainedLayoutEditPolicy; import org.eclipse.gef.editpolicies.ResizableEditPolicy; import org.eclipse.gef.editpolicies.XYLayoutEditPolicy; import org.eclipse.gef.requests.ChangeBoundsRequest; import org.eclipse.gef.requests.CreateRequest; /** * An EditPolicy for use with <code>Figures</code> in {@link XYLayout} of diagram. The constraint for * XYLayout is a {@link org.eclipse.draw2d.geometry.Rectangle}. Implements the changeconstraint, delete, * resize commands of {@link ConstrainedLayoutEditPolicy} * * @author Phong Nguyen Le * @since 1.0 */ public class DiagramLayoutEditPolicy extends XYLayoutEditPolicy { protected Command createAddCommand(EditPart child, Object constraint) { return UnexecutableCommand.INSTANCE; } protected Command createChangeConstraintCommand(EditPart child, Object constraint) { return null; } protected Command createChangeConstraintCommand( ChangeBoundsRequest request, EditPart child, Object constraint) { // special for ADD EditPart parent = child.getParent(); if(parent instanceof ActivityDetailDiagramEditPart){ String autolayout = GraphicalDataHelper.getAutoLayoutFlag((ActivityDetailDiagram)(Node)parent.getModel()); if(autolayout != null){ GraphicalDataHelper.createProperty(((Node)parent.getModel()).getGraphNode(), GraphicalDataHelper.PROP_AUTO_LAYOUT, GraphicalDataHelper.PROP_AUTO_LAYOUT_VALUE_FALSE); } } Node node = (Node) child.getModel(); int directions = request.getResizeDirection(); if ((directions & PositionConstants.NORTH_SOUTH) == PositionConstants.SOUTH){ Point newLocation = node.getLocation().getTranslated( request.getMoveDelta()); int newHeight = request.getSizeDelta().height; if (newHeight != 0) { newHeight += ((GraphicalEditPart) child).getFigure().getBounds().height; if (newHeight < 10) return UnexecutableCommand.INSTANCE; } else newHeight = ((GraphicalEditPart) child).getFigure().getBounds().height; return new ChangeHeightCommand(node, newLocation, newHeight); } else{ // Other directions are EAST WEST. Point newLocation = node.getLocation().getTranslated( request.getMoveDelta()); int newWidth = request.getSizeDelta().width; if (newWidth != 0) { newWidth += ((GraphicalEditPart) child).getFigure().getBounds().width; if (newWidth < 10) return UnexecutableCommand.INSTANCE; } else newWidth = ((GraphicalEditPart) child).getFigure().getBounds().width; return new ChangeBoundsCommand(node, newLocation, newWidth); } } protected EditPolicy createChildEditPolicy(EditPart child) { ResizableEditPolicy childPolicy = new ResizableEditPolicy(); if(child instanceof RoleTaskCompositeEditPart || child instanceof WorkProductCompositeEditPart){ childPolicy.setResizeDirections(PositionConstants.NSEW); }else{ childPolicy.setResizeDirections(PositionConstants.EAST_WEST); } return childPolicy; } protected Command getCreateCommand(CreateRequest request) { if (request.getNewObject() instanceof Node) { Point loc = request.getLocation(); getHostFigure().translateToRelative(loc); return new CreateNodeCommand((Node) request.getNewObject(), (Diagram) getHost().getModel(), loc); } return UnexecutableCommand.INSTANCE; } protected Command getDeleteDependantCommand(Request request) { return null; } protected Command getResizeChildrenCommand(ChangeBoundsRequest request) { CompoundCommand resize = new CompoundCommand(); Command c; GraphicalEditPart child; List children = request.getEditParts(); for (int i = 0; i < children.size(); i++) { child = (GraphicalEditPart) children.get(i); c = createChangeConstraintCommand( request, child, translateToModelConstraint(getConstraintFor(request, child))); resize.add(c); if (!child.getSourceConnections().isEmpty()) { List list = child.getSourceConnections(); for (Iterator itor = list.iterator(); itor.hasNext();) { Object obj = itor.next(); if (obj instanceof LinkEditPart) { EditPart rootedit = child.getParent(); List sel = new ArrayList(); if (rootedit instanceof DiagramEditPart) { sel = ((DiagramEditPart) rootedit).getViewer() .getSelectedEditParts(); } EditPart part = ((LinkEditPart) obj).getTarget(); if (sel.contains(part)) { Link link = (Link) ((LinkEditPart) obj).getModel(); ((DiagramEditPart) rootedit).getViewer() .appendSelection((LinkEditPart) obj); List blist = link.getBendpoints(); for (int j = 0; j < blist.size(); j++) { AbsoluteBendpoint abpoint = (AbsoluteBendpoint) blist .get(j); Point deltaPoint = request.getMoveDelta(); ((LinkEditPart) obj).getFigure() .translateToAbsolute(deltaPoint); Point p = abpoint.getTranslated(request .getMoveDelta()); Command bendcommand = new MoveBendpointCommand( link, p, j); resize.add(bendcommand); } } } } } } return resize; } }