/**
 * @(#)GOperationZoom.java
 *
 * Copyright 2001 by Intelligent Technology Inc. All rights reserved.
 */
package jp.co.iti.fagot.gob;

import java.awt.Point;
import java.awt.Dimension;

import javax.swing.JComponent;
import javax.swing.JViewport;

import jp.co.iti.fagot.geom.ZPoint;

import jp.co.iti.fagot.doc.DocPane;
import jp.co.iti.fagot.doc.DocElement;
import jp.co.iti.fagot.doc.DocGridControler;

import jp.co.iti.fagot.util.ZDebug;

/**
 * 拡大・縮小オペレーション
 *
 * 移動中Pathは選択オペレーション(GOperationSelect)と同じなので、
 * GOperationSelectの派生クラスとする
 *
 * @author  福島康治
 * @version 1.01 2001/01/07
 */
public class GOperationZoom extends GOperationSelect {

	/**
	 * コンストラクタ
	 * @param isZoom 拡大のときTrue
	 */
	public GOperationZoom(boolean isZoom) {
		super();
		wIsZoom = isZoom;
	}

	//## 値 ###########################################################

	//## 位置##########################################################

	//## 移動##########################################################
	/**
	 * 操作時の移動モード
	 * @param pt 論理座標
	 */
	public byte getHitModeGob(ZPoint pt) {
	return GOperation.ZOOMON;
	}

	/**
	 * 操作前の移動モード
	 * @param pt 論理座標
	 */
	public byte getPreMoveModeGob(ZPoint pt) {
	if ( wIsZoom ) {
		return GOperation.ZOOMIN;
	}
	return GOperation.ZOOMOUT;
	}

	//## 移動##########################################################
	/**
	 * 移動の終了
	 * @param grid グリッドコントローラ
	 */
	public void moveEndGob( DocGridControler grid ) {
	// 現在座標の退避
	ZPoint staPt = grid.getStartPoint();
	ZPoint curPt = grid.getMovePoint();
	ZPoint center = null;

	DocPane editor = grid.getEditor();
	JViewport port = (JViewport)editor.getParent();

	// 変換座標の{拡大|縮小}
	DocElement root = (DocElement)editor.getDocument().getRootElement(editor.getPanelId());
	double scale = root.getDisplayScale(editor.getPanelId());
	// クリック誤差を5ピクセルとする
	double dd = 5;
	if ( staPt.getX()-dd < curPt.getX() &&
		 staPt.getX()+dd > curPt.getX() &&
		 staPt.getY()-dd < curPt.getY() &&
		 staPt.getY()+dd > curPt.getY() ) {
		// ほとんど移動していない場合は、クリック点を中央にして
		// 拡大率の変更
//		ZDebug.trace("***sta="+staPt.toString()+"  curPt="+curPt.toString());
//		ZDebug.trace("-----------at.getScaleX()"+at.getScaleX());
		if ( wIsZoom ) {
			scale *= 1.25;
		} else {
			scale /= 1.25;
		}
		center = curPt;
	} else {
		// 矩形が指定されたら、指定された領域を表示するように座標を計算
//		ZDebug.trace("---sta="+staPt.toString()+"  curPt="+curPt.toString());
		Dimension dim  = port.getSize();
		double dx = dim.width/ Math.max(1,Math.abs(staPt.getX()-curPt.getX()));
		double dy = dim.height/Math.max(1,Math.abs(staPt.getY()-curPt.getY()));
		scale = Math.min(dx,dy);
//		ZDebug.trace("dx="+staPt.getX()+"-"+curPt.getX()+"/"+dim.width);
//		ZDebug.trace("dy="+staPt.getY()+"-"+curPt.getY()+"/"+dim.height);
//		ZDebug.trace("dz="+dx+" ? "+dy);

		center = new ZPoint( (staPt.getX()+curPt.getX())/2,
							 (staPt.getY()+curPt.getY())/2 );
	}

	// 最大/最小サイズへの補正
//	ZDebug.trace("-----------at.getScaleX()"+at.getScaleX());
	if ( scale > 4.00 ) {
		scale = 4.00;
	} else if ( scale < 0.1 ) {
		scale = 0.1;
	}
//	ZDebug.trace("-----------at.getScaleX()"+at.getScaleX());

	// ポートの再レイアウト
	root.setDisplayScale(editor.getPanelId(),scale);
	port.doLayout();

	// ビューポートの移動
	editor.setCenter( center );
	}

	/**
	 * 移動の完了が必要か？
	 */
	public boolean needsMoveEnd() {
	return true;
	}

	//## アトリビュート################################################
	/**
	 * {拡大|縮小}
	 * 拡大の時True
	 */
	protected boolean wIsZoom = true;
}
