blob: 351568b6fca9da52f300d99a95a64310e8e2193c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2010 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.gef.requests;
import org.eclipse.draw2d.PositionConstants;
import org.eclipse.draw2d.geometry.PrecisionRectangle;
import org.eclipse.draw2d.geometry.Rectangle;
/**
* A request to align multiple objects.
*/
public class AlignmentRequest extends ChangeBoundsRequest {
private int alignment;
private Rectangle alignmentRect;
/**
* Default constructor.
*/
public AlignmentRequest() {
}
/**
* Constructs a new AlignmentRequest with the new type.
*
* @param type
* the type
*/
public AlignmentRequest(Object type) {
super(type);
}
private void doNormalAlignment(Rectangle result, Rectangle reference) {
switch (alignment) {
case PositionConstants.LEFT:
result.x = reference.x;
break;
case PositionConstants.RIGHT:
result.x = reference.x + reference.width - result.width;
break;
case PositionConstants.TOP:
result.y = reference.y;
break;
case PositionConstants.BOTTOM:
result.y = reference.y + reference.height - result.height;
break;
case PositionConstants.CENTER:
result.x = reference.x + (reference.width / 2) - (result.width / 2);
break;
case PositionConstants.MIDDLE:
result.y = reference.y + (reference.height / 2)
- (result.height / 2);
break;
}
}
private void doPrecisionAlignment(PrecisionRectangle result,
PrecisionRectangle reference) {
switch (alignment) {
case PositionConstants.LEFT:
result.setPreciseX(reference.preciseX());
break;
case PositionConstants.RIGHT:
result.setPreciseX(reference.preciseX() + reference.preciseWidth()
- result.preciseWidth());
break;
case PositionConstants.TOP:
result.setPreciseY(reference.preciseY());
break;
case PositionConstants.BOTTOM:
result.setPreciseY(reference.preciseY() + reference.preciseHeight()
- result.preciseHeight());
break;
case PositionConstants.CENTER:
result.setPreciseX(reference.preciseX()
+ (reference.preciseWidth() / 2)
- (result.preciseWidth() / 2));
break;
case PositionConstants.MIDDLE:
result.setPreciseY(reference.preciseY()
+ (reference.preciseHeight() / 2)
- (result.preciseHeight() / 2));
break;
}
}
/**
* Returns the alignment. Possible values are {@link PositionConstants#LEFT}
* , {@link PositionConstants#RIGHT}, {@link PositionConstants#TOP} and
* {@link PositionConstants#BOTTOM}.
*
* @return the alignment
*/
public int getAlignment() {
return alignment;
}
/**
* Returns the rectangle used to align the edit part with.
*
* @return the alignment rectangle
*/
public Rectangle getAlignmentRectangle() {
return alignmentRect;
}
/**
* @see ChangeBoundsRequest#getTransformedRectangle(Rectangle)
*/
public Rectangle getTransformedRectangle(Rectangle rect) {
Rectangle result = rect.getCopy();
Rectangle reference = getAlignmentRectangle();
if (result instanceof PrecisionRectangle) {
if (reference instanceof PrecisionRectangle)
doPrecisionAlignment((PrecisionRectangle) result,
(PrecisionRectangle) reference);
else
doPrecisionAlignment((PrecisionRectangle) result,
new PrecisionRectangle(reference));
} else
doNormalAlignment(result, reference);
return result;
}
/**
* Sets the alignment.
*
* @param align
* the alignment
* @see #getAlignment()
*/
public void setAlignment(int align) {
alignment = align;
}
/**
* Sets the alignment rectangle.
*
* @param rect
* the alignment rectangle
* @see #getAlignmentRectangle()
*/
public void setAlignmentRectangle(Rectangle rect) {
alignmentRect = rect;
}
}