Newer
Older
piccolo2d.java / anchorgarden / src / main / java / jaist / css / covis / pui / CameraFitConstraint.java
@Motoki Miura Motoki Miura on 14 Apr 2022 2 KB only matched package names
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());
	}
}