package jaist.css.covis.pui;
import java.awt.Dimension;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import org.piccolo2d.PCamera;
import org.piccolo2d.util.PBounds;
/**
* 表示領域(キャンバス)のサイズ変更に合わせて,ぴったりレイアウトするためのPropertyChangeListener
*
* おもにPMenu (Piccolo Menu:勝手に作成した簡易ボタン)の位置を調整するために使用
*
* @author miuramo
*
*/
public class CameraFitConstraint implements PropertyChangeListener {
public static enum PositionEnum {
TOPLEFT, TOPRIGHT, TOPFILL, TOPCENTER, BOTTOMLEFT, BOTTOMRIGHT, BOTTOMFILL; // Cascading Style Sheet のマージン定義における並びと同じ
}
CameraFittable target;
PCamera camera;
PositionEnum constraint;
Dimension defaultGap;
public CameraFitConstraint(CameraFittable t, PCamera cam, PositionEnum con,
Dimension _defaultGap) {
target = t;
camera = cam;
constraint = con;
// defaultOffset = _defaultOffset;
defaultGap = _defaultGap;
}
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getSource() == camera) {
if (evt.getPropertyName().equals("bounds")) {
fitTo(camera.getBoundsReference());
}
}
}
public void fitTo(PBounds b){
if (constraint == PositionEnum.TOPRIGHT)
fitToTopRight(camera.getBoundsReference());
else if (constraint == PositionEnum.TOPLEFT)
fitToTopLeft(camera.getBoundsReference());
else if (constraint == PositionEnum.TOPCENTER)
fitToTopCenter(camera.getBoundsReference());
}
public void fitToTopRight(PBounds b) {
// Boundsが変化したら!!!
// resize((float)b.width);
target.setOffset(b.width - target.getFullBounds().width, 0);
// preBounds = b;
}
public void fitToTopLeft(PBounds b) {
// Boundsが変化したら!!!
// resize((float)b.width);
target.setOffset(0, 0);
// preBounds = b;
}
public void fitToTopCenter(PBounds b) {
// Boundsが変化したら!!!
// resize((float)b.width);
target.setOffset(b.getWidth()/2 - target.getFullBounds().width/2, 0);
// preBounds = b;
}
public void fitToBottomFill(PBounds b) {
// Boundsが変化したら!!!
resize((float) b.width);
target.setOffset(defaultGap.getWidth(), b.height
- target.getFullBounds().height - 2);
// preBounds = b;
}
public void resize(float width) {
target.setPathToRectangle((float) 0, (float) 0,
(float) (width - (defaultGap.getWidth() * 2)),
(float) defaultGap.getHeight());
}
}