/***************************************************************************** * Copyright (c) 2011 Atos. * * * 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: * Arthur Daussy (Atos) - Initial API and implementation * Arthur Daussy - 371712 : 372745: [ActivityDiagram] Major refactoring group framework * *****************************************************************************/ package org.eclipse.papyrus.uml.diagram.activity.activitygroup.editpolicy.notifiers; import org.eclipse.gef.EditPart; import org.eclipse.gef.EditPolicy; import org.eclipse.gef.Request; import org.eclipse.gef.commands.Command; import org.eclipse.gef.requests.ChangeBoundsRequest; import org.eclipse.gmf.runtime.common.core.command.CompositeCommand; import org.eclipse.gmf.runtime.common.core.command.ICommand; import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy; import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart; import org.eclipse.papyrus.uml.diagram.activity.activitygroup.GroupRequestAdvisor; import org.eclipse.papyrus.uml.diagram.activity.activitygroup.IContainerNodeDescriptor; import org.eclipse.papyrus.uml.diagram.activity.activitygroup.IGroupEditPolicies; import org.eclipse.papyrus.uml.diagram.activity.activitygroup.IGroupRequestAdvisor; import org.eclipse.papyrus.uml.diagram.activity.activitygroup.request.AbstractGroupRequest; import org.eclipse.papyrus.uml.diagram.activity.activitygroup.utils.DebugUtils; import org.eclipse.papyrus.uml.diagram.activity.activitygroup.utils.Utils; /** * Implementation of {@link GroupListenerEditPolicy} for Activity Group * * @author adaussy * */ public class GroupNotifyingOnMoveEditPolicy extends GroupListenerEditPolicy { public GroupNotifyingOnMoveEditPolicy(IContainerNodeDescriptor groupDescriptor) { super(groupDescriptor); } /** * Override to : * -> Put in "Movin state" this edit part and all its children which are Group Framework concern */ @Override public Command getCommand(Request request) { if(request instanceof ChangeBoundsRequest) { final ChangeBoundsRequest req = (ChangeBoundsRequest)request; CompositeCommand cc = new CompositeCommand("GroupNotifyingEditPolicy "); for(final EditPart part : Utils.getTargetedEditPart(req)) { ICommand cmd = getGroupRequestAdvisor().notifyGroupFramework(new AbstractGroupRequest((IGraphicalEditPart)getHost(), Utils.getChangeBoundsRequestCopy(req, part), part, getTargetGroupDescriptor(part)) { public GroupRequestType getGroupRequestType() { return GroupRequestType.MOVE; } }); if(cmd != null && cmd.canExecute()) { cc.compose(cmd); } } stopMovingPartState(req); if(cc != null && cc.canExecute()) { return new ICommandProxy(cc); } } return null; } /** * Set the art concern by the request to "Moving state" {@link IGroupNotifier#isPartMoving()} * * @param req */ public void stopMovingPartState(final ChangeBoundsRequest req) { Iterable<IGraphicalEditPart> targetedEditPart = Utils.getTargetedEditPart(req); stopMovingParts(targetedEditPart); } /** * Set all part specify and its descendant to "Moving State" * * @param targetedEditPart */ protected void stopMovingParts(Iterable<IGraphicalEditPart> targetedEditPart) { if(targetedEditPart != null) { for(EditPart part : targetedEditPart) { EditPolicy editPolicy = part.getEditPolicy(IGroupEditPolicies.GROUP_FRAMEWORK_NOTIFYING_ON_MOVE_EDIT_POLICY); if(editPolicy instanceof GroupNotifyingOnMoveEditPolicy) { GroupNotifyingOnMoveEditPolicy editPolicy2 = (GroupNotifyingOnMoveEditPolicy)editPolicy; if(DebugUtils.isDebugging()) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(Utils.getCorrectLabel(editPolicy2.getEObject())); stringBuilder.append(" is stoping to move"); DebugUtils.getLog().debug(stringBuilder.toString()); } editPolicy2.stopMoving(); } stopMovingParts(part.getChildren()); } } } public void initMovingPartState(final ChangeBoundsRequest req) { Iterable<IGraphicalEditPart> targetedEditPart = Utils.getTargetedEditPart(req); startMovingParts(req, targetedEditPart); } protected void startMovingParts(final ChangeBoundsRequest req, Iterable<IGraphicalEditPart> targetedEditPart) { if(targetedEditPart != null) { for(final EditPart part : targetedEditPart) { EditPolicy editPolicy = part.getEditPolicy(IGroupEditPolicies.GROUP_FRAMEWORK_NOTIFYING_ON_MOVE_EDIT_POLICY); if(editPolicy instanceof GroupNotifyingOnMoveEditPolicy) { GroupNotifyingOnMoveEditPolicy editPolicy2 = (GroupNotifyingOnMoveEditPolicy)editPolicy; if(DebugUtils.isDebugging()) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(Utils.getCorrectLabel(editPolicy2.getEObject())); stringBuilder.append(" is start to move"); DebugUtils.getLog().debug(stringBuilder.toString()); } editPolicy2.startMoving(req); } startMovingParts(req, part.getChildren()); } } } protected IGroupRequestAdvisor getGroupRequestAdvisor() { return GroupRequestAdvisor.getInstance(); } /** * Override in order to accept correct request */ @Override public boolean understandsRequest(Request req) { if(req instanceof ChangeBoundsRequest) { return true; } return false; } }