package org.eclipse.papyrus.uml.diagram.statemachine.custom.policies;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.draw2d.PositionConstants;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.requests.ChangeBoundsRequest;
import org.eclipse.gmf.runtime.diagram.ui.tools.DragEditPartsTrackerEx;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.papyrus.uml.diagram.common.commands.SemanticAdapter;
import org.eclipse.papyrus.uml.diagram.statemachine.custom.commands.CustomRegionResizeCommand;
import org.eclipse.papyrus.uml.diagram.statemachine.custom.figures.RegionFigure;
import org.eclipse.papyrus.uml.diagram.statemachine.custom.helpers.Zone;
import org.eclipse.papyrus.uml.diagram.statemachine.edit.parts.RegionCompartmentEditPart;
import org.eclipse.papyrus.uml.diagram.statemachine.edit.parts.RegionEditPart;
/**
* A specific drag tracker for regions. It locally stores the potential target
* edit part during a drag and drop.
*
* @author David Servat
*/
public class CustomRegionDragTracker extends DragEditPartsTrackerEx {
/** The RegionEditPart. */
protected RegionEditPart regionEP = null;
CustomRegionResizeCommand internalResizeCommand = null;
Rectangle regionFigureBounds;
public CustomRegionDragTracker(RegionEditPart regionEditPart) {
super(regionEditPart);
this.regionEP = regionEditPart;
}
public Rectangle getRegionFigureBounds() {
return regionFigureBounds.getCopy();
}
/**
* This method returns the target RegionEditPart if any, or returns null.
*
* @return the target RegionEditPart
*/
public RegionEditPart getTargetRegionEditPart() {
EditPart ep = getTargetEditPart();
if((ep != null) && (ep instanceof RegionCompartmentEditPart) && ep.getParent().getParent().equals(regionEP.getParent())) {
return (RegionEditPart)ep.getParent();
}
return null;
}
@Override
protected boolean handleButtonUp(int button) {
try {
if(internalResizeCommand != null)
internalResizeCommand.undo(null, null);
} catch (ExecutionException e) {
}
return super.handleButtonUp(button);
}
@Override
protected boolean handleDragStarted() {
// TODO Auto-generated method stub
boolean b = super.handleDragStarted();
CustomRegionResizableEditPolicy policy = (CustomRegionResizableEditPolicy)regionEP.getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
regionEP.setSelected(EditPart.SELECTED_NONE);
View regionView = (View)regionEP.getModel();
IAdaptable adaptableForRegion = new SemanticAdapter(null, regionView);
ChangeBoundsRequest internalResizeRequest = new ChangeBoundsRequest();
int regionWidth = Zone.getWidth(regionView);
int regionHeight = Zone.getHeight(regionView);
RegionFigure regionFigure = regionEP.getPrimaryShape();
regionFigureBounds = regionFigure.getBounds().getCopy();
// transform the coordinates to absolute
regionFigure.translateToAbsolute(regionFigureBounds);
String zone = Zone.getZone(regionView);
if(Zone.isRight(zone)) {
internalResizeRequest.setResizeDirection(PositionConstants.WEST);
internalResizeRequest.setSizeDelta(new Dimension(-regionWidth, 0));
} else if(Zone.isLeft(zone)) {
internalResizeRequest.setResizeDirection(PositionConstants.EAST);
internalResizeRequest.setSizeDelta(new Dimension(-regionWidth, 0));
} else if(Zone.isTop(zone)) {
internalResizeRequest.setResizeDirection(PositionConstants.SOUTH);
internalResizeRequest.setSizeDelta(new Dimension(0, -regionHeight));
} else if(Zone.isBottom(zone)) {
internalResizeRequest.setResizeDirection(PositionConstants.NORTH);
internalResizeRequest.setSizeDelta(new Dimension(0, -regionHeight));
}
internalResizeCommand = new CustomRegionResizeCommand(adaptableForRegion, null, regionEP.getEditingDomain(), null, internalResizeRequest, null);
try {
internalResizeCommand.execute(null, null);
} catch (ExecutionException e) {
}
return b;
}
}