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

import java.awt.Window;

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

import javax.swing.JComponent;

import org.w3c.dom.Element;

import jp.co.iti.fagot.IZApp;

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

import jp.co.iti.fagot.ui.UWindowManager;
import jp.co.iti.fagot.ui.UDialog;
import jp.co.iti.fagot.ui.UFrameChild;

import jp.co.iti.fagot.gob.GElement;
import jp.co.iti.fagot.gob.GobManager;

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

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

import jp.co.nri.Rid;

import jp.co.nri.rid.RPanPanel;

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

import jp.co.nri.rid.xml.PaneledElementFactory;

//import jp.co.nri.rid.action.RViewAction;

/**
 * ChildWindow Manager
 */
public class RWindowManager extends UWindowManager {

	/**
	 * コンストラクタ
	 * @param app アプリケーション
	 */
	public RWindowManager(IZApp app) {
	super(app,WINDOW_COUNT);
	}

	//## オーバライド #################################################
	/**
	 * 子ウィンドウの作成
	 * @param nIndex ウィンドウ番号
	 */
	public Window createWindow( int nIndex ) {
	Window win = null;
	switch ( nIndex ) {

	  case PROPERTY: // プロパティダイアログ
		UDialog ppdialog = new UDialog(mApp,"property");
		updatePropertyDialog(ppdialog);
		win = ppdialog;
		break;

	  case PANPANEL: // 広域図
		UDialog pDialog = new UDialog(mApp,"panpanel");
		RPanPanel panpanel = new RPanPanel();
//		panpanel.setContainer( mPanel );
		pDialog.setComponent(panpanel,true);
		win = pDialog;
		break;
	}
	return win;
	}

	/**
	 * ウィンドウの更新
	 * @param nIndex ウィンドウ番号
	 */
	public void updateWindow( int nIndex ) {
	// ドキュメントが設定されていない場合、Windowがnullでない場合にウィンドウを更新
	//
	// 表示開始時には isVisibleはtrueではないので、isVisibleは使わない
//	if ( mDoc == null || !isVisible(nIndex) ) {
	// ウィンドウが表示されていない場合は実行しない
	Window win = getWindow(nIndex);
	if ( win == null ) {
		return ;
	}

	switch ( nIndex ) {
	  case PROPERTY: // プロパティダイアログ
		UDialog ppdialog = (UDialog)win;
		updatePropertyDialog(ppdialog);
		break;

	  case PANPANEL: // 広域図
		RPanPanel panpanel = (RPanPanel)((UDialog)win).getComponent();
		panpanel.restract();
//		panpanel.setDocument( mDoc );
		break;
	}
	}

	/**
	 * 子ウィンドウの表示
	 * @param nIndex フレーム番号
	 * @param bShow 表示有無
	 */
	public void setVisible( int nIndex, boolean bShow ) {
	super.setVisible(nIndex,bShow);

	ZChildWindowAction action = (ZChildWindowAction)getApp().getAction(ZChildWindowAction.PREFIX+nIndex);
	if ( action != null ) {
		action.update();
	}
	}

	//## 個別処理 #####################################################
	/**
	 * プロパティウィンドウの更新
	 * @param dialog プロパティダイアログ
	 */
	protected void updatePropertyDialog( UDialog dialog ) {
	// アクティブパネルの取得
	String szTitle = ZInstance.prop().getProperty( Rid.PANEL_ACTIVE );
	JComponent active = (JComponent)ZInstance.map().get(szTitle);
	if ( !(active instanceof DocPane) ) {
		// アクティブパネルが描画パネルでない場合はとりあえず描画しない
		dialog.getContentPane().removeAll();
		dialog.validate();
		dialog.repaint();
		return;
	}

	// アクティブパネルの選択されているGOBを取得
	DocPane panel = (DocPane)active;
	DocElement target = null;
	Vector gobs = GobManager.getSelectedElement(panel.getPanelId());
	if ( gobs.size() != 1 ) {
		target = (DocElement)((RidDocumentSite)panel.getDocument()).getRootElement(panel.getPanelId());
	} else {
		GElement item = (GElement)gobs.firstElement();
		target = (DocElement)item.getContainer();
	}

	if ( target == null ) {
		// ターゲットが存在しない場合は描画しない
		dialog.getContentPane().removeAll();
		dialog.validate();
		dialog.repaint();
		return;
	}

	// プロパティパネルの貼り付け
	dialog.getContentPane().removeAll();
	PaneledElementFactory pef = new PaneledElementFactory();
	Element layout = DocManager.createElementLayout(target.getTagName());
	dialog.setComponent( pef.PaneledElement(target,layout), true );
	dialog.validate();
	}

	//## アトリビュート ###############################################
	/**
	 * ウィンドウ定義：プロパティウィンドウ
	 */
	final static public int PROPERTY	= 0 ;

	/**
	 * ウィンドウ定義：広域図
	 */
	final static public int PANPANEL	= 1 ;

	/**
	 * ウィンドウ定義：子ウィンドウの数
	 */
	final static public int WINDOW_COUNT	= 2 ;

}
