/*****************************************************************************
* Copyright (c) 2011 CEA LIST.
*
*
* 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:
* Patrick Tessier (CEA LIST) patrick.tessier@cea.fr - Initial API and implementation
*
*****************************************************************************/
package org.eclipse.papyrus.uml.diagram.common.dragtracker;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.requests.ChangeBoundsRequest;
import org.eclipse.gef.tools.ResizeTracker;
/**
* this tracker is used to prevent the resize of a figure outdoor of its container
*
*/
public class NoScrollResizeTracker extends ResizeTracker {
public NoScrollResizeTracker(GraphicalEditPart owner, int direction) {
super(owner, direction);
}
@Override
protected void updateSourceRequest() {
int BORDER=10;
super.updateSourceRequest();
ChangeBoundsRequest request = (ChangeBoundsRequest) getSourceRequest();
Dimension deltaResize= request.getSizeDelta();
Point delta= request.getMoveDelta();
if( getOwner() instanceof GraphicalEditPart){
Rectangle childRect=((GraphicalEditPart)getOwner()).getFigure().getBounds();
if( getOwner().getParent() instanceof GraphicalEditPart){
Rectangle parentRect= ((GraphicalEditPart) getOwner().getParent()).getFigure().getBounds();
//calculus the virtual position
Rectangle virtualPosition= childRect.getCopy();
virtualPosition.x=virtualPosition.x+delta.x;
virtualPosition.y=virtualPosition.y+delta.y;
virtualPosition.width=virtualPosition.width+deltaResize.width;
virtualPosition.height=virtualPosition.height+deltaResize.height;
if( virtualPosition.x<0){
delta.x=0-childRect.x;
deltaResize.width=Math.abs(delta.x);
}
if( virtualPosition.y<0){
delta.y=0-childRect.y;
deltaResize.height=Math.abs(delta.y);
}
if( virtualPosition.getBottomRight().x>parentRect.width-BORDER){
deltaResize.width=parentRect.width-childRect.getBottomRight().x-BORDER;
}
if(virtualPosition.getBottomRight().y>parentRect.height-2*BORDER){
deltaResize.height=parentRect.height-childRect.getBottomRight().y-2*BORDER;
}
request.setMoveDelta(delta);
}
}
}
}