blob: 8ac98bb232b86514e5ce34900d7760562857a941 [file] [log] [blame]
/******************************************************************************
* 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;
}
}