/*
 * @(#)RidChangeAction.java
 *
 * Copyright 2001 Nomura Research Institute, LTD. All rights reserved.
 *
 * RID-X : パネル切替系 Action
 *
 * @author  Intelligent Technology Inc.
 * @version 1.01 2002/08/09
 */
package jp.co.nri.rid.doc;

import java.awt.event.ActionEvent;

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

import javax.swing.JTabbedPane;

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

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

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

import jp.co.nri.Rid;

import jp.co.nri.rid.doc.RidElement;
import jp.co.nri.rid.doc.RidElementZone;
import jp.co.nri.rid.doc.RidDocumentSite;

import jp.co.nri.rid.RUpdateManager;
/**
 * Rid パネル切替系 Action
 */
public class RidChangeAction extends RidAction {

	/**
	 * デフォルトコンストラクタ
	 */
	public RidChangeAction() {
	}

	//## アトリビュート################################################
	/**
	 * アクション実行
	 */
	public void doAction(ActionEvent evt) {
	String szAction = getActionName();
	Vector targets  = getTargets();
	JTabbedPane     tab = (JTabbedPane)ZInstance.map().get(Rid.PANEL_TAB);
	RidDocumentSite doc = (RidDocumentSite)ZInstance.map().get(Rid.DOCUMENT_SITE);
	RidElementZone  top = doc.getTopZone();

	boolean isTran = doc.isTransaction();
	if ( !isTran ) {
		doc.beginTransaction();
	}

	if ( szAction.equals( ZONE ) ) {
		// タブシートの移動
		tab.setSelectedIndex(Rid.PANEL_ZONE_INDEX);

		// 選択状態の変更
		setSelect( top, targets );

		// Zoneパネルの取得
		DocPane  editor = (DocPane)ZInstance.map().get(Rid.PANEL_ZONE);
		DocElement root = (DocElement)doc.getRootElement(editor.getPanelId());

		// 選択されているターゲットが１つの場合は、ターゲットの親Zoneをトップに変更
		RidElementZone newRoot = null ;
		if ( targets.size() == 1 ) {
			DocElement target = (DocElement)targets.firstElement() ;
			DocElement parent = (DocElement)target.getParentNode() ;
			if ( parent instanceof RidElementZone ) {
				if ( parent != root ) {
					newRoot = (RidElementZone)parent ;
				}
			} else {
				newRoot = top;
			}

		// 現在のルートがTOPでない場合は、TOPをルートに変更
		} else {
			if ( top != root ) {
				newRoot = top;
			}
		}
		
		// ルートの変更
		if ( newRoot != null ) {
			// updateはchangeRoot内で行うので不要
			newRoot.changeRoot(editor);
		} else {
			// アクティブパネルの再描画
			RUpdateManager.update(RUpdateManager.PANEL_ACTIVE, true);
		}

	} else if ( szAction.equals( SITE ) ||
				szAction.equals( HIER ) ||
				szAction.equals( CIRCLE ) ) {
		// タブシートの移動
		tab.setSelectedIndex(Rid.PANEL_MAP_INDEX);

		// 選択状態の変更
		setSelect( top, targets );

		// アクティブマップの変更
		String[] szMap = ZString.tokenize( szAction, "_" );
		setActiveMap( top, szMap[1] );

		// Mapパネルの取得
		DocPane editor = (DocPane)ZInstance.map().get(Rid.PANEL_MAP);
		RidElementPage defaultTop = doc.getDefaultTopPage(editor.getPanelId());
		RidElementPage currentTop = doc.getTopPage(editor.getPanelId());

		// トップページの変更
		if ( defaultTop != currentTop ) {
			defaultTop.changeTop( editor );
		} else {
			// アクティブパネルの再描画
			RUpdateManager.update(RUpdateManager.PANEL_ACTIVE, true);
		}
	}

	if ( !isTran ) {
		doc.commit();
	}
	}

	/**
	 * UI更新
	 */
	public void update() {
	String szAction = getActionName();
	boolean bState = true;
	Vector targets  = getTargets();

	RidDocumentSite doc = (RidDocumentSite)ZInstance.map().get(Rid.DOCUMENT_SITE);
	RidElementZone  top = doc.getTopZone();

	if ( targets.size() == 0 ) {
		bState = false;
	}

	if ( szAction.equals( ZONE ) ) {
		// 選択されているターゲットが１つでルートの場合は切替しない
		RidElementZone newRoot = null ;
		if ( targets.size() == 1 ) {
			DocElement target = (DocElement)targets.firstElement() ;
			if ( target == top ) {
				bState = false;
			}
		}
	}

	firePropertyChange(ZAction.ENABLED,null,new Boolean(bState));
	}

	//## アトリビュート ###############################################
    /**
     * アクション名：zoneに切替
     */
	final static public String ZONE		= "change_zone" ;

    /**
     * アクション名：siteに切替
     */
	final static public String SITE		= "change_site" ;

    /**
     * アクション名：hierに切替
     */
	final static public String HIER		= "change_hier" ;

    /**
     * アクション名：circleに切替
     */
	final static public String CIRCLE	= "change_circle" ;
}
