/*
 * @(#)RidEnvAction.java
 *
 * Copyright 2001 Nomura Research Institute, LTD. All rights reserved.
 *
 * RID-X : rid env action
 *
 * @author  Intelligent Technology Inc.
 * @version 1.01 2002/01/22
 */
package jp.co.nri.rid.action;

import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;

import java.awt.event.ActionEvent;

import javax.swing.Action;
import javax.swing.AbstractAction;
import javax.swing.ButtonGroup;
import javax.swing.JRadioButton;
import javax.swing.JCheckBox;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;

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

import jp.co.iti.fagot.IZApp;
import jp.co.iti.fagot.action.ZAction;

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

import jp.co.iti.fagot.ui.UFrame;
import jp.co.iti.fagot.ui.UDialog;

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

import jp.co.nri.Rid;
import jp.co.nri.rid.doc.RidDocumentSite;
import jp.co.nri.rid.doc.RidElementPage;
import jp.co.nri.rid.doc.AccessCounts;

import jp.co.nri.rid.RUpdateManager;
import jp.co.nri.rid.environment.EnvironmentDialog;

/**
 * Rid 環境設定系アクションを定義する
 */
public class RidEnvAction extends ZAction {
	/**
	 * 唯一のコンストラクタです。
	 * @param app アプリケーション
	 * @param szAction アクション名
	 */
	public RidEnvAction(IZApp app,String szAction) {
    super(app,szAction);
	}

	/**
	 * アクション実行
	 */
	public void doAction(ActionEvent e) {
	if ( getActionName().equals( SET_ENV ) ) {
		// 環境設定
		try {
			EnvironmentDialog env = new EnvironmentDialog();
			env.EnvDialog();
		} catch ( Throwable t ) {
		}

		
		// アクティブパネルの再描画
		RUpdateManager.update(RUpdateManager.PANEL_ACTIVE);

	} else if ( getActionName().equals( SET_LOG ) ) {
		showAccessLogDialog();
		// 再描画は、applyAccessLogDialog()で呼び出される。
	}
	}

	/**
	 * UI更新
	 */
	public void update() {
	}

	//## ダイアログ ###################################################
	/**
	 * アクセスログダイアログの表示
	 * @return boolean OKボタンが押された場合 true
	 */
	protected boolean showAccessLogDialog() {
	ZResource       res = getApp().getResource();
	RidDocumentSite doc = (RidDocumentSite)ZInstance.map().get(Rid.DOCUMENT_SITE);
	DocElement      top = doc.getTopZone();

	mDialog = new UDialog(getApp(),"accesslog");

	// パネル内レイアウトの作成
	GridBagLayout gridbag = new GridBagLayout();
	GridBagConstraints cns = new GridBagConstraints();
	JPanel panel = new JPanel();
	panel.setLayout( gridbag );

	//-----------------------------------------------------------------
	// １行目：表示形式
	cns.fill = GridBagConstraints.BOTH;
	cns.weightx = 0.0;
	panel.add(new JLabel(res.getString("msg.accesslog.type")),cns);

	JPanel radioPanel = new JPanel();
	mTypeGroup = new ButtonGroup();
	// 直列
	mSerial = new JRadioButton(res.getString("msg.accesslog.type.serial")) ;
	mTypeGroup.add( mSerial );
	radioPanel.add( mSerial );
	// 並列
	mParallel = new JRadioButton(res.getString("msg.accesslog.type.parallel")) ;
	mTypeGroup.add( mParallel );
	radioPanel.add( mParallel );
	// 結合
	mJoin = new JRadioButton(res.getString("msg.accesslog.type.join")) ;
	mTypeGroup.add( mJoin );
	radioPanel.add( mJoin );

	// 初期値の設定
	String szType = top.getAttribute("AccessLogType") ;
	if ( szType.equals("join") ) {
		mJoin.setSelected(true);
	} else if ( szType.equals("parallel") ) {
		mParallel.setSelected(true);
	} else {
		mSerial.setSelected(true);
	}

	// ラジオボタンをパネルに貼り付ける
	cns.gridwidth = GridBagConstraints.REMAINDER;
	cns.weightx = 10.0;
	panel.add(radioPanel,cns);

	//-----------------------------------------------------------------
	// ２行目：データ系列
	cns.gridwidth = GridBagConstraints.RELATIVE;
	cns.weightx = 0.0;
	panel.add(new JLabel(res.getString("msg.accesslog.data")),cns);

	JPanel dataPanel = new JPanel();
	mChecks = new Vector();
	// データ系列を取得するために、ページ群からAccessLogsを取得する
	// トップページの取得
	String szPanelId = "Map.Site" ;
	AccessCounts acc = null;
	Vector pages = doc.getTopZone().getPages(true);
	Enumeration elm = pages.elements();
	while ( elm.hasMoreElements() ) {
		RidElementPage page = (RidElementPage)elm.nextElement();
		if ( page.getMapParent(szPanelId,"Auto").equals("root") ) {
			AccessCounts acc2 = page.getMaxAccessCount(szPanelId,null);
			if ( acc == null ) {
				acc = acc2 ;
			} else {
				acc.margeMax( acc2 );
			}
		}
	}

	if ( acc != null ) {
		// データ系列の個数取得
		int nCount = acc.getArrayCount();
		String szLogList = top.getAttribute("AccessLogList");
		for ( int nAt=0 ; nAt<nCount ; nAt++ ) {
			JCheckBox check = new JCheckBox();
			check.setText( Integer.toString(nAt+1) ) ;
			if ( szLogList.length()<=nAt || szLogList.charAt(nAt)!='n' ) {
				check.setSelected( true ) ;
			}
			mChecks.add( check );
			dataPanel.add( check );
		}
	} else {
		dataPanel.add(new JLabel("no data"));
	}

	// データ系列をパネルに貼り付ける
	cns.gridwidth = GridBagConstraints.REMAINDER;
	cns.weightx = 10.0;
	panel.add(dataPanel,cns);

	//-----------------------------------------------------------------
	// ３行目：ボタン
	JPanel btnPanel = new JPanel();
	Action act  = null ;

	// OKボタン
	act = new AbstractAction("OK") {
	    public void actionPerformed(ActionEvent e) { mDialog.onOK(); }
	};
	JButton okBtn = new JButton(act);
	okBtn.setText("OK");
	btnPanel.add( okBtn );

	// Cancelボタン
	act = new AbstractAction("Cancel") {
	    public void actionPerformed(ActionEvent e) { mDialog.onCancel(); }
	};
	JButton cancelBtn = new JButton(act);
	cancelBtn.setText("Cancel");
	btnPanel.add( cancelBtn );

	// Cancelボタン
	act = new AbstractAction("Apply") {
	    public void actionPerformed(ActionEvent e) { applyAccessLogDialog(); }
	};
	JButton applyBtn = new JButton(act);
	applyBtn.setText("Apply");
	btnPanel.add( applyBtn );

	cns.weightx = 0.0;
	panel.add(btnPanel,cns);

	// デフォルトボタンの設定
	mDialog.getRootPane().setDefaultButton(okBtn);

	// ダイアログの表示
	mDialog.setComponent( panel,false );
	mDialog.setControlPanel( "none" );
//	mDialog.pack();
	
	doc.beginTransaction();
	boolean bRet = mDialog.doModal();
	if ( bRet ) {
		applyAccessLogDialog();
	}
	doc.commit();
	return bRet;
	}

	/**
	 * アクセスログダイアログの適用
	 */
	protected void applyAccessLogDialog() {
	RidDocumentSite doc = (RidDocumentSite)ZInstance.map().get(Rid.DOCUMENT_SITE);
	DocElement      top = doc.getTopZone();

	// タイプの設定
	String szType = "serial";
	if ( mJoin.isSelected() ) {
		szType = "join";
	} else if ( mParallel.isSelected() ) {
		szType = "parallel";
	}
	top.setAttribute("AccessLogType",szType);

	// データ系列の設定
	String szLogList = "";
	Enumeration elm = mChecks.elements();
	while( elm.hasMoreElements() ) {
		JCheckBox check = (JCheckBox)elm.nextElement();
		szLogList += (check.isSelected())?'y':'n' ;
	}
	top.setAttribute("AccessLogList",szLogList);

	doc.requestUpdateAccessCount();

	// アクティブパネルの再描画
	RUpdateManager.update(RUpdateManager.PANEL_ACTIVE);
	}


	//## アトリビュート ###############################################
    /**
     * アクション名：環境設定
     */
	final static public String SET_ENV			= "set_env" ;

    /**
     * アクション名：アクセスログ設定
     */
	final static public String SET_LOG			= "set_log" ;

    /**
     * アクセスログ用ダイアログ
     */
	protected UDialog mDialog = null;

    /**
     * アクセスログ用ラジオボタン：直列
     */
	protected JRadioButton mSerial    = null;

    /**
     * アクセスログ用ラジオボタン：並列
     */
	protected JRadioButton mParallel  = null;

    /**
     * アクセスログ用ラジオボタン：結合
     */
	protected JRadioButton mJoin      = null;

    /**
     * アクセスログ用ボタングループ
     */
	protected ButtonGroup  mTypeGroup = null;

    /**
     * アクセスログ用チェックボックス
     */
	protected Vector mChecks = null;
}
