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

import java.awt.Stroke;
import java.awt.BasicStroke;

import jp.co.iti.fagot.fob.FobManager;
import jp.co.iti.fagot.fob.FColor;
import jp.co.iti.fagot.fob.FFloat;
import jp.co.iti.fagot.fob.FFloatArray;
import jp.co.iti.fagot.fob.FString;

/**
 * P系クラスは描画部品の描画属性(プロパティ)を格納する
 *
 * http://www.w3.org/TR/2000/CR-SVG-20001102/DTD/svg-20001102.dtdにおける
 * PresentationAttributes-FillStroke に対応
 *
 * Stroke
 *
 * @author  福島康治
 * @version 1.01 2001/01/07
 */
public class PStroke {
	/**
	 * コンストラクタ
	 */
	public PStroke() {
		//{{FAGOT_ATTR
		mColor      = new FColor();
		mDashArray  = new FFloatArray();
		mDashOffset = new FFloat();
		mLineCap    = new FString();
		mLineJoin   = new FString();
		mMiterLimit = new FFloat();
		mOpacity    = new FFloat();
		mWidth      = new FFloat();
		//}}FAGOT_ATTR
	}

	//## 値 ###########################################################
	/**
	 * 属性の設定
	 */
	public void set(PStroke src) {
		mColor.set( src.getColor() );
		mDashArray.set( src.getDashArray() );
		mDashOffset.set( src.getDashOffset() );
		mLineCap.set( src.getLineCap() );
		mLineJoin.set( src.getLineJoin() );
		mMiterLimit.set( src.getMiterLimit() );
		mOpacity.set( src.getOpacity() );
		mWidth.set( src.getWidth() );
	}

	/**
	 * 属性の追加
	 */
	public void add(PStroke src) {
		if ( !src.getColor().isNull() ) {
			mColor.set( src.getColor() );
		}
		if ( !src.getDashArray().isNull() ) {
			mDashArray.set( src.getDashArray() );
		}
		if ( !src.getDashOffset().isNull() ) {
			mDashOffset.set( src.getDashOffset() );
		}
		if ( !src.getLineCap().isNull() ) {
			mLineCap.set( src.getLineCap() );
		}
		if ( !src.getLineJoin().isNull() ) {
			mLineJoin.set( src.getLineJoin() );
		}
		if ( !src.getMiterLimit().isNull() ) {
			mMiterLimit.set( src.getMiterLimit() );
		}
		if ( !src.getOpacity().isNull() ) {
			mOpacity.set( src.getOpacity() );
		}
		if ( !src.getWidth().isNull() ) {
			mWidth.set( src.getWidth() );
		}
	}

	/**
	 * Strokeの取得
	 */
	public Stroke createStroke() {
	// 破線パターンの取得
	float[] dash = null ;
	if ( !getDashArray().isNull() ) {
		dash = getDashArray().get();
	}
	
	// 破線オフセットの取得
	float   dash_phase = 0.0f;
	if ( !getDashOffset().isNull() ) {
		dash_phase = getDashOffset().get();
	}
	
	// 両端の装飾の取得
	int   cap   = BasicStroke.CAP_SQUARE;
	if ( !getLineCap().isNull() ) {
		if ( getLineCap().get().equals("butt") ) {
			cap = BasicStroke.CAP_BUTT;
		} else if ( getLineCap().get().equals("round") ) {
			cap = BasicStroke.CAP_ROUND;
		}
	}

	// 接合の装飾の取得
	int   join  = BasicStroke.JOIN_MITER;
	if ( !getLineJoin().isNull() ) {
		if ( getLineJoin().get().equals("round") ) {
			join = BasicStroke.JOIN_ROUND;
		} else if ( getLineJoin().get().equals("bevel") ) {
			join = BasicStroke.JOIN_BEVEL;
		}
	}

	// 接合の装飾がmiterの時、切り取るリミットの取得
	float miterlimit = 10.0f;
	if ( !getMiterLimit().isNull() ) {
		miterlimit = getMiterLimit().get();
	}

	// 幅の取得
	float width = 1.0f;
	if ( !getWidth().isNull() ) {
		width = getWidth().get();
	}

	return new BasicStroke(width,cap,join,miterlimit,dash,dash_phase);
	}

	/**
	 * 色の取得
	 */
	public FColor getColor() {
		return mColor;
	}
	/**
	 * 破線パターンの取得
	 */
	public FFloatArray getDashArray( ) {
		return mDashArray;
	}
	/**
	 * 破線オフセットの取得
	 */
	public FFloat getDashOffset( ) {
		return mDashOffset;
	}
	/**
	 * 両端の装飾の取得
	 */
	public FString getLineCap( ) {
		return mLineCap;
	}
	/**
	 * 接合の装飾の取得
	 */
	public FString getLineJoin( ) {
		return mLineJoin;
	}
	/**
	 * 接合の装飾がmiterの時、切り取るリミットの取得
	 */
	public FFloat getMiterLimit( ) {
		return mMiterLimit;
	}
	/**
	 * 透過度の取得
	 */
	public FFloat getOpacity( ) {
		return mOpacity;
	}
	/**
	 * 幅の取得
	 */
	public FFloat getWidth( ) {
		return mWidth;
	}

	//## FAGOT ########################################################
	/**
	 * Fobマネージャの登録(ユーザデータはパススルー)
	 * @param mgr マネージャ
	 * @param usrData ユーザデータ
	 */
	public void setFobManager(FobManager mgr, Object usrData) {
		//{{FAGOT_ATTR
		mColor.setFobManager(mgr,usrData);
		mDashArray.setFobManager(mgr,usrData);
		mDashOffset.setFobManager(mgr,usrData);
		mLineCap.setFobManager(mgr,usrData);
		mLineJoin.setFobManager(mgr,usrData);
		mMiterLimit.setFobManager(mgr,usrData);
		mOpacity.setFobManager(mgr,usrData);
		mWidth.setFobManager(mgr,usrData);
		//}}FAGOT_ATTR
	}

	//## CLONE ########################################################
	/**
	 * 複製の作成
	 */
	public Object clone() {
	PStroke obj = new PStroke();
	obj.set(this);
	return obj;
	}

	//## アトリビュート ###############################################
	/**
	 * 色
	 */
	protected FColor mColor;
	/**
	 * 破線パターン
	 */
	protected FFloatArray mDashArray;
	/**
	 * 破線オフセット
	 */
	protected FFloat mDashOffset;
	/**
	 * 両端の装飾
	 */
	protected FString mLineCap;
	/**
	 * 接合の装飾
	 */
	protected FString mLineJoin;
	/**
	 * 接合の装飾がmiterの時、切り取るリミット
	 */
	protected FFloat mMiterLimit;
	/**
	 * 透過度
	 */
	protected FFloat mOpacity;
	/**
	 * 幅
	 */
	protected FFloat mWidth;

}
