/**
* ガイド線クラス
*/
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 LineHandle implements ILineHandle {
/** 描画色 */
private Color mBaseLineColor = Color.CYAN;
private Color mHandleLineColor = Color.RED;
private boolean mIsEnableLeftDrag = false;
/** 縦線フラグ */
private boolean mIsVertical = true;
/** 基準点 */
private int mBaseLine;
/** 可動点 */
private int mHandleLine;
/** 画像中央からの基準点 */
private float mBaseLineOffset = 0.0f;
/** 画像中央からの基準点初期値 */
private float mInitBaseLineOffset = 0.0f;
/** 可動点のドラッグ状態 */
private boolean mIsDragHandle = false;
/** 基準点のドラッグ状態 */
private boolean mIsDragBaseLine = false;
/** 同期して動く線 */
private LineHandle mSyncLine = null;
/** 描画領域幅 */
private int mWidth;
/** 描画領域高さ */
private int mHeight;
/** 画像幅 */
private int mImageWidth;
/** 画像高さ */
private int mImageHeight;
/** 基準点からの距離 */
private int mHandleOffset = 0;
/** 基準点固定フラグ */
private boolean mIsFixed = false;
/**
* コンストラクタ
* @param isVertical true=縦線, false=横線
* @param offset 画像中央からの基準点初期値
*/
public LineHandle(boolean isVertical, float offset, Color baseColor, boolean leftDrag){
mIsVertical = isVertical;
mBaseLineOffset = offset;
mInitBaseLineOffset = offset;
mBaseLineColor = baseColor;
mIsEnableLeftDrag = leftDrag;
}
/**
* 同期する線の設定
* @param syncLine
*/
public void setSyncLine(LineHandle syncLine){
mSyncLine = syncLine;
}
/**
* 基準点の取得
* @return
*/
public float getBaseLineOffset(){
return mBaseLineOffset;
}
/**
* 描画色設定
* @param color
*/
public void setBaseLineColor(Color color){
mBaseLineColor = color;
}
@Override
public void resetPosition(){
mBaseLineOffset = mInitBaseLineOffset;
}
@Override
public void getHandleOffset(Dimension offset){
if(mIsVertical){
offset.width += mHandleOffset;
}
else{
offset.height += mHandleOffset;
}
}
@Override
public boolean isDragHandle(){
return mIsDragHandle || mIsDragBaseLine;
}
@Override
public void setBaseLineOffset(float offset){
mBaseLineOffset = offset;
}
private void setViewSize(int width, int height, int imageWidth, int imageHeight){
mWidth = width;
mHeight = height;
mImageWidth = imageWidth;
mImageHeight = imageHeight;
if(mIsVertical){
mBaseLine = width / 2 + (int)(mBaseLineOffset * imageWidth);
}
else{
mBaseLine = height / 2 + (int)(mBaseLineOffset * imageHeight);
}
}
@Override
public void paint(Graphics g, int width, int height, int imageWidth, int imageHeight){
setViewSize(width, height, imageWidth, imageHeight);
if(mIsVertical){
g.setColor(mBaseLineColor);
g.drawLine(mBaseLine, 0, mBaseLine, height-1);
if(mIsDragHandle){
g.setColor(mHandleLineColor);
g.drawLine(mHandleLine, 0, mHandleLine, height-1);
}
}
else{
g.setColor(mBaseLineColor);
g.drawLine(0, mBaseLine, width-1, mBaseLine);
if(mIsDragHandle){
g.setColor(mHandleLineColor);
g.drawLine(0, mHandleLine, width-1, mHandleLine);
}
}
}
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
if(mIsDragHandle){
mIsDragHandle = false;
mHandleLine = mBaseLine;
}
if(mIsDragBaseLine){
mIsDragBaseLine = false;
}
}
@Override
public void mousePressed(MouseEvent e) {
final int HandleSize = 2;
mHandleOffset = 0;
if(mIsVertical){
int x = e.getX();
if(mBaseLine - HandleSize <= x && x <= mBaseLine + HandleSize){
if(mIsEnableLeftDrag || javax.swing.SwingUtilities.isRightMouseButton(e)){
if(!mIsFixed){
mIsDragBaseLine = true;
}
}
else{
mIsDragHandle = true;
mHandleLine = x;
}
}
}
else{
int y = e.getY();
if(mBaseLine - HandleSize <= y && y <= mBaseLine + HandleSize){
if(mIsEnableLeftDrag || javax.swing.SwingUtilities.isRightMouseButton(e)){
if(!mIsFixed){
mIsDragBaseLine = true;
}
}
else{
mIsDragHandle = true;
mHandleLine = y;
}
}
}
}
@Override
public void mouseReleased(MouseEvent e) {
mHandleOffset = 0;
if(mIsDragHandle){
if(mHandleLine != mBaseLine){
int diff = mHandleLine - mBaseLine;
mHandleOffset = diff;
System.out.println("handle offset=" + diff);
}
mIsDragHandle = false;
}
else if(mIsDragBaseLine){
mIsDragBaseLine = false;
}
}
@Override
public void mouseDragged(MouseEvent e) {
if(mIsDragHandle){
if(mIsVertical){
mHandleLine = e.getX();
}
else{
mHandleLine = e.getY();
}
}
else if(mIsDragBaseLine){
if(mIsVertical){
mBaseLineOffset = (float)((e.getX() - mWidth / 2)/(float)mImageWidth);
if(mSyncLine != null){
mSyncLine.setBaseLineOffset(-mBaseLineOffset);
}
}
else{
mBaseLineOffset = (float)((e.getY() - mHeight / 2)/(float)mImageHeight);
if(mSyncLine != null){
mSyncLine.setBaseLineOffset(-mBaseLineOffset);
}
}
}
}
@Override
public void mouseMoved(MouseEvent e) {
}
@Override
public boolean isFixed() {
return mIsFixed;
}
@Override
public void fixPosition(boolean fixed) {
mIsFixed = fixed;
}
}