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

import java.awt.Window;

import java.util.Vector;

import jp.co.iti.fagot.IZApp;

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

import jp.co.iti.fagot.util.ZResource;
import jp.co.iti.fagot.util.ZDebug;
/**
 * ウィンドウマネージャ
 * アプリケーションの子ウィンドウ(Frame,Dialog)を管理する
 * @author  福島康治
 * @version 1.01 2001/01/07
 */
public class UWindowManager {

	/**
     * コンストラクタ
	 * @param app アプリケーション
	 * @param nCount 子ウィンドウの数
	 */
	public UWindowManager(IZApp app,int nCount) {
	mApp = app;
	mChildren = new Window[nCount];
	}

	//## オーバライド #################################################
	/**
	 * 子ウィンドウの作成（通常オーバライドされる）
	 * @param nIndex ウィンドウ番号
	 */
	public Window createWindow( int nIndex ) {
	return null;
	}

	/**
	 * ウィンドウの更新（通常オーバライドされる）
	 * @param nIndex ウィンドウ番号
	 */
	public void updateWindow( int nIndex ) {
	}

	//## ウィンドウ操作 ###############################################
	/**
	 * 開く
	 */
	public void openWindow() {
	if ( !mEnableWindow ) {
		// 前回終了時に子フレームが表示されていれば表示する
		for( int nIndex=0 ; nIndex<getWindowCount() ; nIndex++ ) {
			if ( getResource().getBoolean(RES_PREFIX+nIndex) ) {
				setVisible( nIndex, true );
			}
		}
		mEnableWindow = true;
	}
	}

	/**
	 * 子ウィンドウの表示
	 * @param nIndex フレーム番号
	 * @param bShow 表示有無
	 */
	public void setVisible( int nIndex, boolean bShow ) {
	if ( bShow ) {
		if ( getWindow(nIndex) == null ) {
			mChildren[nIndex] = createWindow(nIndex) ;
		}
		// 表示
		updateWindow( nIndex );
	}
	getWindow(nIndex).setVisible( bShow );
	}

	/**
	 * 子ウィンドウが表示されているか？
	 * @param nIndex フレーム番号
	 * @param bShow 表示有無
	 */
	public boolean isVisible( int nIndex ) {
	boolean bRet = true;
	if ( getWindow(nIndex) == null ) {
		bRet = false ;
	} else {
		bRet = getWindow(nIndex).isVisible();
//		bRet = ((Window)win).isShowing() ;
	}
	return bRet;
	}

	/**
	 * ウィンドウの取得
	 * @param nIndex ウィンドウ番号
	 */
	public Window getWindow( int nIndex ) {
	return mChildren[nIndex];
	}

	/**
	 * 子ウィンドウの収集
	 */
	public Vector getWindows() {
	Vector vec = new Vector();
	for( int nIndex=0 ; nIndex<getWindowCount() ; nIndex++ ) {
		Window win = getWindow(nIndex);
		if ( win != null ) {
			vec.add( win );
		}
	}
	return vec;
	}

	/**
	 * 閉じる
	 */
	public void closeWindow() {
	if ( mEnableWindow ) {
		// 子フレームが表示されていれば、次回起動時にも表示するよう、
		// 表示状態を保存する
		for( int nIndex=0 ; nIndex<getWindowCount() ; nIndex++ ) {
			Window win = getWindow( nIndex );
			if ( win != null ) {
				boolean bShow = isVisible( nIndex ) ;
				getResource().putString(RES_PREFIX+nIndex,
										((bShow)?"true":"false"));
				if ( bShow ) {
					String szWin = null ;
					if ( win instanceof UFrame ) {
						szWin = ((UFrame)win).getFrameName();
					} else if ( win instanceof UDialog ) {
						szWin = ((UDialog)win).getDialogName();
					}
					if ( szWin != null ) {
						// フレームの位置保存
						getResource().saveGeometry(win,szWin);
					}
					setVisible( nIndex,false );
				}
			}
		}
		mEnableWindow = false;
	}
	}

	/**
	 * 子ウィンドウが有効か？
	 */
	public boolean isEnable( int nIndex ) {
	return mEnableWindow;
	}

	//## プロパティ ###################################################
	/**
	 * アプリケーションの取得
	 */
	public IZApp getApp() {
	return mApp;
	}

	/**
	 * リソースの取得
	 */
	public ZResource getResource() {
	ZResource res = null;
	if ( getApp() != null ) {
		res = getApp().getResource();
	}
	return res;
	}

	/**
	 * 子ウィンドウの数の取得
	 */
	public int getWindowCount() {
	int nCount = 0 ;
	if ( mChildren != null ) {
		nCount = mChildren.length;
	}
	return nCount;
	}

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

    /**
     * 子ウィンドウ
     */
	protected Window mChildren[] = null;

	/**
	 * リソースアクセスプレフィックス
	 */
	static protected final String RES_PREFIX = "app.childWindow.";

	/**
	 * ウィンドウが有効か？
	 */
	protected boolean mEnableWindow = false;
}
