package org.eclipse.papyrus.uml.diagram.sequence.apex.edit.policies;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.draw2d.Border;
import org.eclipse.draw2d.Cursors;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.LineBorder;
import org.eclipse.draw2d.PositionConstants;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.SharedCursors;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.editpolicies.ResizableEditPolicy;
import org.eclipse.gef.handles.AbstractHandle;
import org.eclipse.gef.handles.MoveHandle;
import org.eclipse.gef.handles.MoveHandleLocator;
import org.eclipse.gef.handles.RelativeHandleLocator;
import org.eclipse.gef.handles.ResizeHandle;
import org.eclipse.gef.requests.ChangeBoundsRequest;
import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.CombinedFragmentCombinedFragmentCompartmentEditPart;
import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.InteractionOperandEditPart;
import org.eclipse.papyrus.uml.diagram.sequence.util.OperandBoundsComputeHelper;
public class ApexInteractionOperandDragEditPolicy extends ResizableEditPolicy {
/**
* Disable drag and allow only north resize. {@inheritDoc}
*/
public ApexInteractionOperandDragEditPolicy() {
super();
setDragAllowed(false);
setResizeDirections(PositionConstants.NORTH_SOUTH);
}
/**
* apex updated
*/
@Override
protected List createSelectionHandles() {
/* apex improved start */
List handles = new ArrayList();
boolean isFirstOperand = false;
boolean isLastOperand = false;
if (getHost() instanceof InteractionOperandEditPart) {
InteractionOperandEditPart ioEP = (InteractionOperandEditPart)getHost();
List children = ioEP.getParent().getChildren();
if (children.size() > 0) {
if (ioEP.equals(children.get(0))) {
isFirstOperand = true;
}
if (ioEP.equals(children.get(children.size() - 1))) {
isLastOperand = true;
}
}
createMoveHandle(handles, ioEP);
if (!isFirstOperand) {
createResizeHandle(handles, PositionConstants.NORTH, ioEP);
}
// if (!isLastOperand) {
createResizeHandle(handles, PositionConstants.SOUTH, ioEP);
// }
}
for (int i = 0, size = handles.size(); i < size; i++) {
if (handles.get(i) instanceof AbstractHandle) {
AbstractHandle handle = (AbstractHandle)handles.get(i);
Border border = handle.getBorder();
if (border instanceof LineBorder) {
((LineBorder)border).setWidth(2);
}
}
}
return handles;
/* apex improved end */
/* apex removed
return super.createSelectionHandles();
*/
}
/**
* Creates a 'move' handle
* @param handles
* @param host
*/
private void createMoveHandle(List handles, InteractionOperandEditPart host) {
MoveHandleLocator locator = new MoveHandleLocator(host.getPrimaryShape());
MoveHandle moveHandle = new MoveHandle(host, locator);
if (isDragAllowed()) {
moveHandle.setDragTracker(getDragTracker());
moveHandle.setCursor(Cursors.SIZEALL);
} else {
moveHandle.setDragTracker(getSelectTracker());
moveHandle.setCursor(SharedCursors.ARROW);
}
handles.add(moveHandle);
}
/**
* Creates a 'resize' handle
* @param handles
* @param host
*/
private void createResizeHandle(List handles, int direction, InteractionOperandEditPart host) {
if ((getResizeDirections() & direction) == direction) {
RelativeHandleLocator locator = new RelativeHandleLocator(host.getPrimaryShape(), direction);
ResizeHandle resizeHandle = new ResizeHandle(host, locator, Cursors
.getDirectionalCursor(direction, getHostFigure().isMirrored()));
resizeHandle.setDragTracker(getResizeTracker(direction));
handles.add(resizeHandle);
} else {
createDragHandle(handles, direction, host);
}
}
/**
* Creates a 'drag' handle
* @param handles
* @param direction
* @param host
*/
private void createDragHandle(List handles, int direction, InteractionOperandEditPart host) {
RelativeHandleLocator locator = new RelativeHandleLocator(host.getPrimaryShape(), direction);
ResizeHandle handle = new ResizeHandle(host, locator, null);
if (isDragAllowed()) {
handle.setDragTracker(getDragTracker());
handle.setCursor(Cursors.SIZEALL);
} else {
handle.setDragTracker(getSelectTracker());
handle.setCursor(SharedCursors.ARROW);
}
handles.add(handle);
}
/**
* apex updated
* 최상단 Op의 상변에서의 처리도 OperandBoundsComputeHelper에서 모두 처리하도록 변경
*
* Handle resize InteractionOperand {@inheritDoc}
*/
@Override
protected Command getResizeCommand(ChangeBoundsRequest request) {
if (this.getHost() instanceof InteractionOperandEditPart
&& this.getHost().getParent() instanceof CombinedFragmentCombinedFragmentCompartmentEditPart) {
int heightDelta = request.getSizeDelta().height();
int widthDelta = request.getSizeDelta().width();
int direction = request.getResizeDirection();
InteractionOperandEditPart currentIOEP = (InteractionOperandEditPart)this.getHost();
CombinedFragmentCombinedFragmentCompartmentEditPart compartEP = (CombinedFragmentCombinedFragmentCompartmentEditPart)this.getHost().getParent();
return OperandBoundsComputeHelper.createIOEPResizeCommand(request, currentIOEP);
}
return null;
}
}