/*
 * @(#)GSelector.java
 *
 * Copyright 2001 by Intelligent Technology Inc. All rights reserved.
 */

package jp.co.iti.fagot.gob;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Stroke;

import jp.co.iti.fagot.fob.FColor;

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

import jp.co.iti.fagot.doc.DocGraphics;

import jp.co.iti.fagot.util.ZDebug;
/**
 * GSelector
 *
 * 選択点を管理する。VGraphicsにより、末端の描画要素における座標は上位
 * グループ要素の拡大縮小率により、実サイズが不定となる。
 * 選択点は、常に一定のサイズを末端クラスまで通知し、
 * <ul>
 * <li>一定サイズの選択点描画
 * <li>直線が選択されたとき、直線とクリック位置の距離を測定するときに
 *     選択の目安となるゆとり
 * </ul>
 * を提供する
 *
 * @author  福島康治
 * @version 1.01 2001/01/07
 */
public class GSelector extends GRectangle{

	/**
	 * コンストラクタ
	 */
	public GSelector() {
		this( new ZRectangle(0,0,5,5) );
	}

	/**
	 * コンストラクタ
	 */
	public GSelector(ZRectangle data) {
		setRect( data );
		getStyle().setFillColor( new FColor( Color.white ));
		getStyle().setStrokeColor( new FColor( Color.black ));
	}

	/**
	 * 矩形の取得
	 */
//	public ZRectangle getRect() {
//	return mRect;
//	}

	/**
	 * セレクターにヒットするか？
	 */
	public boolean isHit(ZPoint center, ZPoint pt) {
	ZRectangle rect = new ZRectangle( getRect() );
	rect.setCenter(center);
	return ( rect.contains(pt) );
	}

	/**
	 * ゆとりの取得
	 */
	public double getMargin(double x,double y) {
	// 正規係数の計算
	double zz = Math.sqrt(x*x+y*y);

	// 直行ベクトル(zz*y,zz*x)
	double zx = zz*y*getRect().getWidth();
	double zy = zz*x*getRect().getHeight();

	double margin = Math.sqrt(zx*zx+zy*zy);
	return ( margin );
	}

	/**
	 * 拡大率を変更したインスタンスを返す
	 */
	public GSelector createScaledSelector(double x,double y) {
	return ( new GSelector( new ZRectangle(0,0,getRect().getWidth()*x,
											   getRect().getHeight()*y ) ) );
	
	}

	//## 描画 #########################################################
	/**
	 * 描画
	 * 拡大・縮小せずに直接描画(位置だけは拡大点に移動)
	 */
	public void paint(DocGraphics graphics) {
	Graphics2D g2 = graphics.getGraphics();
	PStyle style = getStyle();
	ZRectangle rect = getRect();
	ZPoint pt = rect.getCenter();
	ZPoint ptTrans = graphics.getGridControler().transform( pt );
	rect.setCenter( ptTrans );


	// 塗りつぶし
	if ( !style.getFill().getColor().isNull() ) {
		// 色の設定
		Color oldColor = g2.getColor();
		g2.setColor( style.getFill().getColor().get() );

		// 塗りつぶし
		g2.fill( rect );

		// 元に戻す
		g2.setColor( oldColor ) ;
	}

	// 輪郭
	if ( !style.getStroke().getColor().isNull() ) {
		// 色の設定
		Color oldColor = g2.getColor();
		g2.setColor( style.getStroke().getColor().get() );

		// Stroke の作成
		Stroke oldStroke = g2.getStroke();
		g2.setStroke( style.getStroke().createStroke() );

		// 輪郭
		g2.draw( rect );

		// 元に戻す
		g2.setColor( oldColor ) ;
		g2.setStroke( oldStroke ) ;
	}
	}

	//## 描画(Gobから呼ばれて描画する場合) #############################
	/**
	 * 選択点の描画
	 * @param g グラフィックス
	 * @param pt 中心となるポイント
	 */
	public void paint(Graphics2D g, ZPoint pt) {
	ZRectangle rect = new ZRectangle( getRect() );
	rect.setCenter( pt );
	g.setColor(Color.white);
	g.fill(rect);
	g.setColor(Color.black);
	g.draw(rect);
	}

	/**
	 * 選択円の描画
	 * @param g グラフィックス
	 * @param pt 中心となるポイント
	 */
	public void paintCircle(Graphics2D g, ZPoint pt) {
	ZRectangle rect = new ZRectangle( getRect() );
	rect.setCenter( pt );
	g.setColor(Color.blue);
	g.fillOval((int)rect.getX(),(int)rect.getY(),
	           (int)rect.getWidth(),(int)rect.getHeight());
	g.drawOval((int)rect.getX(),(int)rect.getY(),
	           (int)rect.getWidth(),(int)rect.getHeight());
	}

	//## アトリビュート################################################
    /**
     * 矩形
     */
//    protected ZRectangle mRect;
}
