/**
 * @(#)RUpdateManager.java
 *
 * Copyright 2001 Nomura Research Institute, LTD. All rights reserved.
 *
 * RID-X : UpdateManager
 *
 * @author  Intelligent Technology Inc.
 * @version 1.01 2001/05/08
 */
package jp.co.nri.rid;

import javax.swing.JTable;

import jp.co.iti.fagot.ZApp;

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

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

import jp.co.iti.fagot.doc.DocPane;
import jp.co.iti.fagot.doc.DocBar;
import jp.co.iti.fagot.doc.DocDocument;

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

import jp.co.nri.Rid;

import jp.co.nri.rid.table.RTable;
import jp.co.nri.rid.table.LineNoRowHeader;

/**
 * UpdateManager
 * 画面の更新状態を管理するクラス
 * ユーザアクションの後、updateメソッドを呼び出すと、
 * <ul>
 * <li>タブシート内のアクティブなパネル
 * <li>DocBar
 * <li>プロパティウィンドウ
 * <li>広域図
 * <li>ツールバーのenable
 * </ul>
 * が最新の状態に更新される。
 */
public class RUpdateManager {

	/**
	 * 画面の更新
	 * @param nId 更新ID
	 */
	static public void update( int nId ) {
		update( nId, false );
	}

	/**
	 * 画面の更新
	 * @param nId     更新ID
	 * @param bLayout 画面表示の最適化
	 */
	static public void update( int nId, boolean bLayout ) {
	String szActive = ZInstance.prop().getProperty( Rid.PANEL_ACTIVE );

	// アクティブパネルの更新
	boolean activePanelUpdate = false;
	if ( nId == 0 ) {
		nId = UPDATE_PROPERTY|UPDATE_PAN|UPDATE_DOCBAR;
		activePanelUpdate = true;
	} else if ( nId == PROPERTY_CHANGED ) {
		nId = 0;
		activePanelUpdate = true;
		mPropertyUpdate = true;
	}

	int nActivePanel = 0;
	int nChildWindow = 0;
	if ( activePanelUpdate ) {
		if ( szActive.equals(	 Rid.PANEL_ZONE			) ) { nId |= UPDATE_ZONE      ; nActivePanel = Rid.PANEL_ZONE_INDEX      ; nChildWindow = 1 ; }
		else if ( szActive.equals(Rid.PANEL_MAP			) ) { nId |= UPDATE_MAP       ; nActivePanel = Rid.PANEL_MAP_INDEX       ; nChildWindow = 1 ; }
		else if ( szActive.equals(Rid.PANEL_PAGES		) ) { nId |= UPDATE_PAGES     ; nActivePanel = Rid.PANEL_PAGES_INDEX     ; nChildWindow = 2 ; }
		else if ( szActive.equals(Rid.PANEL_RESOURCES	) ) { nId |= UPDATE_RESOURCES ; nActivePanel = Rid.PANEL_RESOURCES_INDEX ; nChildWindow = 2 ; }
		else if ( szActive.equals(Rid.PANEL_DOCUMENTS	) ) { nId |= UPDATE_DOCUMENTS ; nActivePanel = Rid.PANEL_DOCUMENTS_INDEX ; nChildWindow = 2 ; }
		else if ( szActive.equals(Rid.PANEL_PAGERES		) ) { nId |= UPDATE_PAGERES   ; nActivePanel = Rid.PANEL_PAGERES_INDEX   ; nChildWindow = 2 ; }
		else if ( szActive.equals(Rid.PANEL_LINKS		) ) { nId |= UPDATE_LINKS     ; nActivePanel = Rid.PANEL_LINKS_INDEX     ; nChildWindow = 2 ; }
		else if ( szActive.equals(Rid.PANEL_SEARCH		) ) { nId |= UPDATE_SEARCH    ; nActivePanel = Rid.PANEL_SEARCH_INDEX    ; nChildWindow = 2 ; }
	}

	// Zoneパネルの更新
	if ( ( nId & UPDATE_ZONE )!=0 && szActive.equals(Rid.PANEL_ZONE) ) {
		DocPane zonePanel = (DocPane)ZInstance.map().get(Rid.PANEL_ZONE);
//		DocDocument siteDoc = zonePanel.getDocument();
		zonePanel.updateGobs();
		if ( bLayout ) {
			zonePanel.updateLayout();
		} else {
			zonePanel.repaint();
		}

		// Zoneパネルタイトルの更新
		RidZoneTitlePane title = (RidZoneTitlePane)ZInstance.map().get(Rid.PANEL_ZONE_TITLE);
		title.restract();
	}

	// Mapパネルの更新
	if ( ( nId & UPDATE_MAP )!=0 && szActive.equals(Rid.PANEL_MAP) ) {
		DocPane mapPanel = (DocPane)ZInstance.map().get(Rid.PANEL_MAP);
		DocDocument siteDoc = mapPanel.getDocument();
		mapPanel.updateGobs();
		if ( bLayout ) {
			mapPanel.updateLayout();
		} else {
			mapPanel.repaint();
		}

		// Mapパネルタイトルの更新
		RidMapTitlePane title = (RidMapTitlePane)ZInstance.map().get(Rid.PANEL_MAP_TITLE);
		title.restract();
	}

	// Pageリストの更新
	if ( ( nId & UPDATE_PAGES )!=0  && szActive.equals(Rid.PANEL_PAGES) ) {
		RTable pageTable = (RTable)ZInstance.map().get(Rid.PANEL_PAGES);
		DocDocument siteDoc = (DocDocument)ZInstance.map().get(Rid.DOCUMENT_SITE);
		pageTable.reload(siteDoc);

		LineNoRowHeader header = (LineNoRowHeader)ZInstance.map().get(Rid.PANEL_PAGES_HEADER);
		header.resizeandrepaint();
	}

	// Resourceリストの更新
	if ( ( nId & UPDATE_RESOURCES )!=0  && szActive.equals(Rid.PANEL_RESOURCES) ) {
		RTable resTable = (RTable)ZInstance.map().get(Rid.PANEL_RESOURCES);
		DocDocument resDoc = (DocDocument)ZInstance.map().get(Rid.DOCUMENT_RESOURCE);
		resTable.reload(resDoc);

		LineNoRowHeader header = (LineNoRowHeader)ZInstance.map().get(Rid.PANEL_RESOURCES_HEADER);
		header.resizeandrepaint();
	}

	// Documentリストの更新
	if ( ( nId & UPDATE_DOCUMENTS )!=0  && szActive.equals(Rid.PANEL_DOCUMENTS) ) {
		RTable docTable = (RTable)ZInstance.map().get(Rid.PANEL_DOCUMENTS);
		DocDocument docDoc = (DocDocument)ZInstance.map().get(Rid.DOCUMENT_DOCUMENT);
		docTable.reload(docDoc);

		LineNoRowHeader header = (LineNoRowHeader)ZInstance.map().get(Rid.PANEL_DOCUMENTS_HEADER);
		header.resizeandrepaint();
	}

	// Page-Resource対応表の更新
	if ( ( nId & UPDATE_PAGERES )!=0  && szActive.equals(Rid.PANEL_PAGERES) ) {
		RTable pageresTable = (RTable)ZInstance.map().get(Rid.PANEL_PAGERES);
		DocDocument resDoc = (DocDocument)ZInstance.map().get(Rid.DOCUMENT_RESOURCE);
		pageresTable.reload(resDoc);

		LineNoRowHeader header = (LineNoRowHeader)ZInstance.map().get(Rid.PANEL_PAGERES_HEADER);
		header.resizeandrepaint();
	}

	// Link表の更新
	if ( ( nId & UPDATE_LINKS )!=0  && szActive.equals(Rid.PANEL_LINKS) ) {
		RTable linkTable = (RTable)ZInstance.map().get(Rid.PANEL_LINKS);
		DocDocument siteDoc = (DocDocument)ZInstance.map().get(Rid.DOCUMENT_SITE);
		linkTable.reload(siteDoc);

		LineNoRowHeader header = (LineNoRowHeader)ZInstance.map().get(Rid.PANEL_LINKS_HEADER);
		header.resizeandrepaint();
	}

	UFrame frame = (UFrame)ZApp.getTheApp();
	UWindowManager wnd = frame.getWindowManager();
	// プロパティパネルの更新
	if ( ( nId & UPDATE_PROPERTY ) != 0 ) {

		if ( mPropertyUpdate ) {
			// プロパティパネルからの更新直後はプロパティパネルを更新しない
			mPropertyUpdate = false;
		} else if ( wnd != null ) {
			wnd.updateWindow(0);
		}
	}

	// パンパネルの更新
	if ( ( nId & UPDATE_PAN ) != 0 && wnd != null ) {
		wnd.updateWindow(1);
	}

	// Docbarの更新
	if ( ( nId & UPDATE_DOCBAR ) != 0 ) {
		DocBar bar = (DocBar)ZInstance.map().get(Rid.DOCBAR);
		bar.setPanel(nActivePanel);
	}

	// アプリケーション起動時には更新しない
	if ( ZInstance.map().get( Rid.DOCUMENT_SITE ) != null ) {
		// 子ウィンドウの開閉
		if ( wnd != null ) {
			if ( nChildWindow == 1 ) {
				frame.getWindowManager().openWindow();
			} else if ( nChildWindow == 2 ) {
				frame.getWindowManager().closeWindow();
			}

			// ツールバーに表示されているアクションの更新
			((ZAction)frame.getAction("undo")).update();
			((ZAction)frame.getAction("redo")).update();
			((ZAction)frame.getAction("cut")).update();
			((ZAction)frame.getAction("childwin0")).update();
			((ZAction)frame.getAction("childwin1")).update();
		}
	}

	}

	//## アトリビュート ###############################################
	/**
	 * プロパティ更新フラグ
	 */
	static protected boolean mPropertyUpdate = false;

	/**
	 * 更新項目定義：ゾーンパネル
	 */
	final static public int UPDATE_ZONE			= 0x0001;

	/**
	 * 更新項目定義：マップパネル
	 */
	final static public int UPDATE_MAP			= 0x0004;

	/**
	 * 更新項目定義：リストパネル
	 */
	final static public int UPDATE_PAGES		= 0x0010;

	/**
	 * 更新項目定義：リソースパネル
	 */
	final static public int UPDATE_RESOURCES	= 0x0020;

	/**
	 * 更新項目定義：ドキュメントパネル
	 */
	final static public int UPDATE_DOCUMENTS	= 0x0040;

	/**
	 * 更新項目定義：ページリソース対応表パネル
	 */
	final static public int UPDATE_PAGERES		= 0x0080;

	/**
	 * 更新項目定義：リンクパネル
	 */
	final static public int UPDATE_LINKS		= 0x2000;

	/**
	 * 更新項目定義：検索パネル
	 */
	final static public int UPDATE_SEARCH		= 0x1000;

	/**
	 * 更新項目定義：プロパティウィンドウ
	 */
	final static public int UPDATE_PROPERTY		= 0x0100;

	/**
	 * 更新項目定義：広域図
	 */
	final static public int UPDATE_PAN			= 0x0200;

	/**
	 * 更新項目定義：ドキュメントバー
	 */
	final static public int UPDATE_DOCBAR		= 0x0400;

	/**
	 * 更新ID定義：ドキュメントの更新
	 */
	final static public int SET_DOCUMENT			= 0;

	/**
	 * 更新ID定義：アクティブパネルの更新
	 */
	final static public int PANEL_ACTIVE			= 0;

	/**
	 * 更新ID定義：アクティブパネルのスクロール
	 */
	final static public int PANEL_SCROLL			= UPDATE_PAN;

	/**
	 * 更新ID定義：プロパティの更新
	 */
	final static public int PROPERTY_CHANGED		= 0xFFFF;

	/**
	 * 更新ID定義：左ボタンup
	 */
	final static public int UIADATPER_LBTNUP		= UPDATE_PROPERTY|UPDATE_PAN ;

	/**
	 * 更新ID定義：画面の更新(gob再作成)
	 */
	final static public int CREATE_GOBS				= UPDATE_PROPERTY|UPDATE_PAN ;

	/**
	 * 更新ID定義：画面の更新(選択の更新)
	 */
	final static public int SELECT_GOBS				= UPDATE_PROPERTY;

	/**
	 * 更新ID定義：Zoneパネルの表示更新
	 */
	final static public int VIEWACTION_VIEWZONE		= UPDATE_ZONE;

	/**
	 * 更新ID定義：Mapパネルの表示更新
	 */
	final static public int VIEWACTION_VIEWMAPPAGE	= UPDATE_MAP;
}
