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

import java.awt.event.ActionEvent;

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeEvent;

import javax.swing.JToggleButton;

import java.util.Enumeration;
import java.util.Hashtable; 
import java.util.Vector;

import jp.co.iti.fagot.IZApp;
import jp.co.iti.fagot.ui.UIFactory;
/**
 * グループ toggledButton のラッピングクラスです。
 * @author  福島康治
 * @version 1.01 2001/01/07
 */
public class ZGroupToggleButton {
	/**
	 * 唯一のコンストラクタです。
	 * @param app		アプリケーションクラス
	 * @param ui			UIファクトリー
	 * @param szActions	アクション名
	 */
	public ZGroupToggleButton(IZApp app,UIFactory ui,String[] szActions) {
	mApp = app ;

	// アクション格納領域
	mActions = new Hashtable();

	for ( int nIndex=0; nIndex<szActions.length; nIndex++ ) {
		String szAct = szActions[nIndex];
		JToggleButton btn = (JToggleButton)ui.getToolItem(szAct);

		if ( btn != null ) {
			mActions.put(szAct,new ZGroupToggleButtonAction(app,btn,szAct));
		} else {
			System.out.println("Button not found:"+szAct);
		}
	}

	// デフォルト状態の設定
	mDefault = szActions[0] ;
	setDefault();
	}

	/**
	 * ボタン状態をデフォルトに戻す
	 */
	public void setDefault() {
	Enumeration elm = mActions.elements();
	while ( elm.hasMoreElements() ) {
		ZToggleButtonAction act = (ZToggleButtonAction)elm.nextElement();
		act.off();
	}

	setState(mDefault);
	}

	/**
	 * ボタン状態をセットする
	 * @param szNew 選択されているボタンのアクション名
	 */
	public void setState( String szNew ) {
	// 現在状態の解除
	String szOld = mState;
	if ( mState != null ) {
		ZToggleButtonAction act = getAction( mState ) ;
		if ( act != null ) {
			act.off();
		}
	}

	// 新状態の設定
	mState = szNew ;
	if ( mState != null ) {
		ZToggleButtonAction act = getAction( mState ) ;
		if ( act != null ) {
			act.on();
		}
	}

	// イベントの通知
	PropertyChangeEvent evt = new PropertyChangeEvent(this,"groupbar",szOld,mState);
	firePropertyChanged( evt );
	}

	/**
	 * ボタン状態を取得する
	 * @return 選択されているボタンのアクション名
	 */
	public String getState() {
	return ( mState );
	}

	/**
	 * アクションを取得
	 * @param szAction アクション名
	 * @return アクション
	 */
	protected ZToggleButtonAction getAction ( String szAction ) {
	return ( (ZToggleButtonAction) mActions.get(szAction) );
	}

	//## プロパティチェンジリスナー ###################################
	/**
     * 状態変更リスナーの登録
     * @param lis リスナー
	 */
	public void addPropertyChangeListener(PropertyChangeListener listener) {
	mListener.add(listener);
	}

	/**
     * 状態変更リスナーの削除
     * @param lis リスナー
	 */
	public void removePropertyChangeListener(PropertyChangeListener listener) {
	mListener.remove(listener);
	}

	/**
     * 状態変更の通知
	 * @param evt インプットボックスイベント
	 */
	public void firePropertyChanged( PropertyChangeEvent evt ) {
	if ( mLock ) {
		return;
	}
	mLock = true;
	Enumeration elm = mListener.elements();
	while ( elm.hasMoreElements() ) {
		PropertyChangeListener listener = (PropertyChangeListener)elm.nextElement();
		listener.propertyChange( evt );
	}
	mLock = false;
	}

	//## サブクラス ###################################################
	/**
	 * ToggleButton用アクション
	 */
	public class ZGroupToggleButtonAction extends ZToggleButtonAction {
	/**
	 * 唯一のコンストラクタです。
	 * @param app      アプリケーションクラス
	 * @param btn      ボタン
	 * @param szAction アクション名
	 */
	public ZGroupToggleButtonAction(IZApp app, JToggleButton btn,
									String szAction) {
    super(app,btn,szAction);
	}

	/**
	 * アクション実行
	 */
	public void doAction(ActionEvent e) {
	setState( getActionName() );
	}
	}

	//## アトリビュート ###############################################
    /**
     * アプリケーション
     */
	protected IZApp		mApp	= null ;

    /**
     * アクションリスト
     */
	protected Hashtable	mActions= null ;

    /**
     * デフォルトボタンのアクション名
     */
	protected String 	mDefault= null ;

    /**
     * 現在選択されているボタンのアクション名
     */
	protected String 	mState  = null ;

    /**
     * ロック
     * 入力ボックスの変更により、再度データが変更された場合、
     * イベントが再発生する可能性があるので、その場合はイベントを通知しないよう
     * 制限するためのフラグ
     */
	protected boolean 	mLock		= false;

    /**
     * 状態変更リスナーリスト
     */
	protected Vector	mListener	= new Vector();
}
