package org.eclipse.papyrus.uml.diagram.sequence.apex.edit.policies;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.draw2d.PositionConstants;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.Handle;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.requests.ChangeBoundsRequest;
import org.eclipse.gmf.runtime.diagram.ui.editparts.INodeEditPart;
import org.eclipse.gmf.runtime.diagram.ui.editpolicies.ResizableShapeEditPolicy;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.papyrus.uml.diagram.sequence.apex.util.ApexSequenceUtil;
import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.AbstractExecutionSpecificationEditPart;
import org.eclipse.uml2.uml.ExecutionSpecification;
import org.eclipse.uml2.uml.InteractionFragment;
/**
* @author Jiho
*
*/
public class ApexExecutionSpecificationSelectionEditPolicy extends
ResizableShapeEditPolicy {
public ApexExecutionSpecificationSelectionEditPolicy() {
setResizeDirections(PositionConstants.NORTH_SOUTH);
}
/**
* apex updated
*/
@Override
protected List createSelectionHandles() {
/* apex improved start */
List<Handle> list = new ArrayList<Handle>();
createMoveHandle(list);
createResizeHandle(list, PositionConstants.NORTH);
createResizeHandle(list, PositionConstants.SOUTH);
return list;
/* apex improved end */
/* apex replaced
return super.createSelectionHandles();
*/
}
/**
* apex updated
*/
@Override
protected void showChangeBoundsFeedback(ChangeBoundsRequest request) {
/* apex added start */
if (getHost() instanceof AbstractExecutionSpecificationEditPart) {
// north로 resize할 경우에도 south 방향으로 resize되도록 변경 해주는 기능
request.getMoveDelta().y = 0;
}
/* apex added end */
super.showChangeBoundsFeedback(request);
}
@Override
protected Command getResizeCommand(ChangeBoundsRequest request) {
// CompoundCommand compoundCmd = new CompoundCommand("");
// if (getHost() instanceof AbstractExecutionSpecificationEditPart) {
// AbstractExecutionSpecificationEditPart activationEP = (AbstractExecutionSpecificationEditPart)getHost();
// InteractionOperandEditPart ioep = ApexSequenceUtil.apexGetEnclosingInteractionOperandEditpart(activationEP);
// CombinedFragmentEditPart cfep = (CombinedFragmentEditPart)ioep.getParent().getParent();
// compoundCmd.add(InteractionCompartmentXYLayoutEditPolicy.getCombinedFragmentResizeChildrenCommand(request, cfep, activationEP));
// }
// compoundCmd.add(super.getResizeCommand(request));
// return compoundCmd;
Command command = null;
View view = (View)getHost().getModel();
EObject element = view.getElement();
if (element instanceof ExecutionSpecification) {
InteractionFragment parent = ((ExecutionSpecification)element).getEnclosingOperand();
if (parent != null) {
EditPart interactionOperandEP = ApexSequenceUtil.getEditPart(parent, INodeEditPart.class, getHost().getViewer());
EditPart combinedFragmentCompartmentEP = interactionOperandEP.getParent();
EditPart combinedFragmentEP = combinedFragmentCompartmentEP.getParent();
command = combinedFragmentEP.getCommand(request);
// command = InteractionCompartmentXYLayoutEditPolicy.getCombinedFragmentResizeChildrenCommand(
// request, (ShapeNodeEditPart)combinedFragmentEP, (ShapeNodeEditPart)getHost());
}
}
return command == null ? super.getResizeCommand(request) :
command.chain(super.getResizeCommand(request));
}
}