/*******************************************************************************
* Copyright (c) 2000, 2005 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.setX(reference.preciseX);
break;
case PositionConstants.RIGHT:
result.setX(
reference.preciseX + reference.preciseWidth - result.preciseWidth);
break;
case PositionConstants.TOP:
result.setY(reference.preciseY);
break;
case PositionConstants.BOTTOM:
result.setY(
reference.preciseY + reference.preciseHeight - result.preciseHeight);
break;
case PositionConstants.CENTER:
result.setX(
reference.preciseX
+ (reference.preciseWidth / 2)
- (result.preciseWidth / 2));
break;
case PositionConstants.MIDDLE:
result.setY(
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;
}
}