/**
* ガイド線6本セット
*/
package jp.crwdev.app.gui;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import jp.crwdev.app.interfaces.ILineHandle;
public class LineHandleSet implements ILineHandle {
/** ガイド線配列 */
private LineHandle[] mHandles = new LineHandle[6];
/** 表示フラグ */
private boolean mIsVisible = false;
/** 左右線同期フラグ */
private boolean mSyncVerticalLines = true;
/** 上下線同期フラグ */
private boolean mSyncHorizontalLines = true;
/** ガイド線配列インデックス */
private static int CENTER_VERTICAL = 0;
private static int CENTER_HORIZONTAL = 1;
private static int LEFT_VERTICAL = 2;
private static int RIGHT_VERTICAL = 3;
private static int UPPER_HORIZONTAL = 4;
private static int LOWER_HORIZONTAL = 5;
/**
* コンストラクタ
*/
public LineHandleSet(){
mHandles[CENTER_VERTICAL] = new LineHandle(true, 0.0f, Color.CYAN, false);
mHandles[CENTER_HORIZONTAL] = new LineHandle(false, 0.0f, Color.CYAN, false);
mHandles[LEFT_VERTICAL] = new LineHandle(true, -0.45f, Color.CYAN, false);
mHandles[RIGHT_VERTICAL] = new LineHandle(true, 0.45f, Color.CYAN, false);
mHandles[UPPER_HORIZONTAL] = new LineHandle(false, -0.45f, Color.CYAN, false);
mHandles[LOWER_HORIZONTAL] = new LineHandle(false, 0.45f, Color.CYAN, false);
setSyncLineVertical(true);
setSyncLineHorizontal(true);
}
public void setAspect(float width, float height, int imageWidth, int imageHeight, boolean fixHeight){
if(fixHeight){
float ratio = width / height;
float targetWidth = imageHeight * ratio;
float offset = targetWidth / imageWidth;
float baseHeight = Math.abs(mHandles[UPPER_HORIZONTAL].getBaseLineOffset()) +
Math.abs(mHandles[LOWER_HORIZONTAL].getBaseLineOffset());
float base = baseHeight * offset / 2.0f;
mHandles[LEFT_VERTICAL].setSyncLine(null); // 一時的に同期解除
mHandles[RIGHT_VERTICAL].setSyncLine(null);
mHandles[LEFT_VERTICAL].setBaseLineOffset(-base);
mHandles[RIGHT_VERTICAL].setBaseLineOffset(base);
if(isSyncLineVertical()){
setSyncLineVertical(true); // 同期
}
}
else{
float ratio = height / width;
float targetHeight = imageWidth * ratio;
float offset = targetHeight / imageHeight;
float baseWidth = Math.abs(mHandles[LEFT_VERTICAL].getBaseLineOffset()) +
Math.abs(mHandles[RIGHT_VERTICAL].getBaseLineOffset());
float base = baseWidth * offset / 2.0f;
mHandles[UPPER_HORIZONTAL].setSyncLine(null); // 一時的に同期解除
mHandles[LOWER_HORIZONTAL].setSyncLine(null);
mHandles[UPPER_HORIZONTAL].setBaseLineOffset(-base);
mHandles[LOWER_HORIZONTAL].setBaseLineOffset(base);
if(isSyncLineHorizontal()){
setSyncLineHorizontal(true); // 同期
}
}
}
/**
* ガイドの上線位置の取得
* @return
*/
public float getTopOffset(){
return Math.min(mHandles[UPPER_HORIZONTAL].getBaseLineOffset(), mHandles[LOWER_HORIZONTAL].getBaseLineOffset());
}
/**
* ガイドの下線位置の取得
* @return
*/
public float getBottomOffset(){
return Math.max(mHandles[UPPER_HORIZONTAL].getBaseLineOffset(), mHandles[LOWER_HORIZONTAL].getBaseLineOffset());
}
/**
* ガイドの左線位置の取得
* @return
*/
public float getLeftOffset(){
return Math.min(mHandles[LEFT_VERTICAL].getBaseLineOffset(), mHandles[RIGHT_VERTICAL].getBaseLineOffset());
}
/**
* ガイドの右線位置の取得
* @return
*/
public float getRightOffset(){
return Math.max(mHandles[LEFT_VERTICAL].getBaseLineOffset(), mHandles[RIGHT_VERTICAL].getBaseLineOffset());
}
/**
* 左右線同期状態取得
* @return
*/
public boolean isSyncLineVertical(){
return mSyncVerticalLines;
}
/**
* 上下線同期状態取得
* @return
*/
public boolean isSyncLineHorizontal(){
return mSyncHorizontalLines;
}
/**
* 左右線同期設定
* @param enable
*/
public void setSyncLineVertical(boolean enable){
mSyncVerticalLines = enable;
if(enable){
mHandles[LEFT_VERTICAL].setSyncLine(mHandles[RIGHT_VERTICAL]);
mHandles[RIGHT_VERTICAL].setSyncLine(mHandles[LEFT_VERTICAL]);
}
else{
mHandles[LEFT_VERTICAL].setSyncLine(null);
mHandles[RIGHT_VERTICAL].setSyncLine(null);
}
}
/**
* 上下線同期設定
* @param enable
*/
public void setSyncLineHorizontal(boolean enable){
mSyncHorizontalLines = enable;
if(enable){
mHandles[UPPER_HORIZONTAL].setSyncLine(mHandles[LOWER_HORIZONTAL]);
mHandles[LOWER_HORIZONTAL].setSyncLine(mHandles[UPPER_HORIZONTAL]);
}
else{
mHandles[UPPER_HORIZONTAL].setSyncLine(null);
mHandles[LOWER_HORIZONTAL].setSyncLine(null);
}
}
/**
* 表示/非表示設定
* @param visible
*/
public void setVisible(boolean visible) {
mIsVisible = visible;
}
/**
* 表示状態取得
* @return
*/
public boolean isVisible() {
return mIsVisible;
}
@Override
public void resetPosition() {
for(int i=0; i<6; i++){
mHandles[i].resetPosition();
}
}
@Override
public void getHandleOffset(Dimension offset){
for(int i=0; i<6; i++){
mHandles[i].getHandleOffset(offset);
}
}
@Override
public boolean isDragHandle() {
if(!mIsVisible){
return false;
}
for(int i=0; i<6; i++){
if(mHandles[i].isDragHandle()){
return true;
}
}
return false;
}
@Override
public void paint(Graphics g, int width, int height, int imageWidth, int imageHeight) {
if(!mIsVisible){
return;
}
for(int i=0; i<6; i++){
mHandles[i].paint(g, width, height, imageWidth, imageHeight);
}
}
@Override
public void setBaseLineOffset(float offset) {
for(int i=0; i<6; i++){
mHandles[i].setBaseLineOffset(offset);
}
}
@Override
public void mouseClicked(MouseEvent e) {
if(!mIsVisible){
return;
}
for(int i=0; i<6; i++){
mHandles[i].mouseClicked(e);
}
}
@Override
public void mouseEntered(MouseEvent e) {
if(!mIsVisible){
return;
}
for(int i=0; i<6; i++){
mHandles[i].mouseEntered(e);
}
}
@Override
public void mouseExited(MouseEvent e) {
if(!mIsVisible){
return;
}
for(int i=0; i<6; i++){
mHandles[i].mouseExited(e);
}
}
@Override
public void mousePressed(MouseEvent e) {
if(!mIsVisible){
return;
}
for(int i=0; i<6; i++){
mHandles[i].mousePressed(e);
}
}
@Override
public void mouseReleased(MouseEvent e) {
if(!mIsVisible){
return;
}
for(int i=0; i<6; i++){
mHandles[i].mouseReleased(e);
}
}
@Override
public void mouseDragged(MouseEvent e) {
if(!mIsVisible){
return;
}
for(int i=0; i<6; i++){
mHandles[i].mouseDragged(e);
}
}
@Override
public void mouseMoved(MouseEvent e) {
if(!mIsVisible){
return;
}
for(int i=0; i<6; i++){
mHandles[i].mouseMoved(e);
}
}
@Override
public boolean isFixed() {
return mHandles[0].isFixed();
}
@Override
public void fixPosition(boolean fixed) {
for(int i=0; i<6; i++){
mHandles[i].fixPosition(fixed);
}
}
}