/****************************************************************************** * Copyright (c) 2007, 2008 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 API and implementation ****************************************************************************/ package org.eclipse.gmf.runtime.diagram.ui.editparts; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.draw2d.IFigure; import org.eclipse.gef.EditPart; import org.eclipse.gef.EditPolicy; import org.eclipse.gef.commands.Command; import org.eclipse.gef.editpolicies.SnapFeedbackPolicy; import org.eclipse.gmf.runtime.diagram.ui.actions.ActionIds; import org.eclipse.gmf.runtime.diagram.ui.editpolicies.ContainerEditPolicy; import org.eclipse.gmf.runtime.diagram.ui.editpolicies.DecorationEditPolicy; import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles; import org.eclipse.gmf.runtime.diagram.ui.editpolicies.GroupComponentEditPolicy; import org.eclipse.gmf.runtime.diagram.ui.editpolicies.GroupXYLayoutEditPolicy; import org.eclipse.gmf.runtime.diagram.ui.editpolicies.NonResizableEditPolicyEx; import org.eclipse.gmf.runtime.diagram.ui.internal.figures.GroupFigure; import org.eclipse.gmf.runtime.diagram.ui.requests.ArrangeRequest; import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure; import org.eclipse.gmf.runtime.notation.View; /** * The editpart for a group. A group is a special type of container around * shapes. * * @author crevells, mmostafa * @since 2.1 */ public class GroupEditPart extends ShapeNodeEditPart { /** * A <code>ContainerEditPolicy</code> for a <code>GroupEditPart</code>. * * @since 2.1 */ protected static class GroupContainerEditPolicy extends ContainerEditPolicy { protected Command getArrangeCommand(ArrangeRequest request) { if (ActionIds.ACTION_ARRANGE_SELECTION.equals(request.getType()) || ActionIds.ACTION_TOOLBAR_ARRANGE_SELECTION.equals(request .getType())) { List parts = request.getPartsToArrange(); if (parts.size() == 1 && parts.contains(getHost())) { ArrangeRequest newRequest = createRequest(request, getHost().getChildren()); return super.getArrangeCommand(newRequest); } } return super.getArrangeCommand(request); } private ArrangeRequest createRequest(ArrangeRequest request, List partsToArrange) { ArrangeRequest newRequest = new ArrangeRequest((String) request .getType(), request.getLayoutType()); newRequest.setExtendedData(request.getExtendedData()); newRequest.setPartsToArrange(partsToArrange); return newRequest; } } /** * Creates a new <code>GroupEditPart</code>. * * @param view * the view controlled by this edit part */ public GroupEditPart(View view) { super(view); } protected NodeFigure createNodeFigure() { return new GroupFigure(); } public boolean canAttachNote() { return false; } public IFigure getContentPane() { return ((GroupFigure) getFigure()).getContainerFigure(); } public void setLayoutConstraint(EditPart child, IFigure childFigure, Object constraint) { getContentPaneFor((IGraphicalEditPart) child).setConstraint( childFigure, constraint); } protected void createDefaultEditPolicies() { installEditPolicy(EditPolicyRoles.DECORATION_ROLE, new DecorationEditPolicy()); installEditPolicy(EditPolicy.LAYOUT_ROLE, new GroupXYLayoutEditPolicy()); installEditPolicy(EditPolicy.COMPONENT_ROLE, new GroupComponentEditPolicy()); installEditPolicy(EditPolicy.CONTAINER_ROLE, new GroupContainerEditPolicy()); installEditPolicy(EditPolicyRoles.SNAP_FEEDBACK_ROLE, new SnapFeedbackPolicy()); } public EditPolicy getPrimaryDragEditPolicy() { return new NonResizableEditPolicyEx(); } /** * Gets all the shape children of this group, digging into any nested groups * found. * * @return all the shape children including shapes in nested groups */ public List getShapeChildren() { List flatChildren = new ArrayList(getChildren().size()); for (Iterator iter = getChildren().iterator(); iter.hasNext();) { Object childEP = iter.next(); if (childEP instanceof GroupEditPart) { flatChildren.addAll(((GroupEditPart) childEP) .getShapeChildren()); } else { flatChildren.add(childEP); } } return flatChildren; } }