blob: 7f073dd614bad8ca6c58d4fa5273847b64e2eab4 [file] [log] [blame]
package org.eclipse.gmf.examples.ocldriven.diagram.figures;
import org.eclipse.draw2d.Shape;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Rectangle;
public abstract class AbstractProportionalShape extends Shape {
public AbstractProportionalShape() {
}
protected void setW2HRatio(float w2hRatio) {
myW2HRatio = w2hRatio;
myIsKeepingProportions = true;
}
protected void setKeepingProportions(boolean newValue) {
myIsKeepingProportions = newValue;
}
protected boolean isKeepingProportions() {
return myIsKeepingProportions;
}
/**
* If keeping proportions, returns the maximum rectangle that is fully
* inside the bounds and has the specified proportions. Otherwise, returns
* the bounds.
*/
public Rectangle getProportionalBounds() {
Rectangle area = getClientArea();
if (!myIsKeepingProportions || myW2HRatio == 0.0f || area.height == 0) {
return new Rectangle(area);
}
int newX = area.x;
int newY = area.y;
int newW = area.width;
int newH = area.height;
float currentRatio = ((float) newW) / ((float) newH);
float discrepancy = currentRatio / myW2HRatio;
if (discrepancy < 1) {
// we are too high.
newH = Math.round(newH * discrepancy);
newY += (area.height - newH) / 2;
} else {
// we are too wide
newW = Math.round(newW / discrepancy);
newX += (area.width - newW) / 2;
}
return new Rectangle(newX, newY, newW, newH);
}
/**
* If keeping proportions, returns the dimension tweaked by the same factor
* as the proportional bounds relate to the original bounds. Otherwise,
* returns the original dimension.
*/
public Dimension adjustDimension(Dimension d) {
Rectangle area = getClientArea();
if (!myIsKeepingProportions || myW2HRatio == 0.0f || area.height == 0) {
return new Dimension(d);
}
float currentRatio = ((float) area.width) / ((float) area.height);
float discrepancy = currentRatio / myW2HRatio;
if (discrepancy < 1) {
return new Dimension(d.width, (int) (d.height * discrepancy));
} else {
return new Dimension((int) (d.width / discrepancy), d.height);
}
}
private float myW2HRatio = 1.0f;
private boolean myIsKeepingProportions;
}