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

import java.util.Hashtable; 
import java.util.Vector;
import java.util.Enumeration;
import java.util.Locale;

import java.awt.Frame;
import java.awt.Component;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.Action;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JToolBar;
import javax.swing.ImageIcon;
import javax.swing.UIManager;
import javax.swing.SwingUtilities;

import java.net.URL;

import jp.co.iti.fagot.IZApp;
import jp.co.iti.fagot.ZApp;

import jp.co.iti.fagot.util.ZResource;
import jp.co.iti.fagot.util.ZDebug;
/**
 * Frame系共通部品
 * @author  福島康治
 * @version 1.01 2001/01/07
 */
public class UFrame extends JFrame implements IZApp {

	/**
     * コンストラクタ
     * @param szName フレーム名
	 */
	public UFrame(String szName) {
	mFrameName = szName;
	}

	//## UI共通 #######################################################
	/**
     * L&Fの設定
	 */
	public void setLookAndFeel() {
	// Look&Feel
	String szLF = getResource().getString("app.lookandfeel");
	if ( szLF != null ) {
		try {
			UIManager.setLookAndFeel(szLF);
		    SwingUtilities.updateComponentTreeUI(this);
		    Enumeration elm = getChildWindows().elements();
		    while ( elm.hasMoreElements() ) {
			    SwingUtilities.updateComponentTreeUI(
			    	(Component)elm.nextElement());
			}
		} catch ( Throwable t ) {
			ZDebug.err("Error loading L&F: " + t);
			t.printStackTrace();
		}
	}
	}

	/**
     * UIファクトリーの作成
	 */
	protected void createUIFactory() {
		mUIFactory = new UIFactory(this);
	}

	/**
     * タイトルの表示,アイコンの表示
	 */
	protected void setTitle() {
	// タイトルの表示
	String szTitle = getResource().getString("app."+mFrameName+".title" );
	setTitle( szTitle );

	// アイコンの表示
	URL url = getResource().getURL("app."+mFrameName+".icon") ;
	if ( url != null ) {
		ImageIcon img = new ImageIcon(url);
		setIconImage( img.getImage() );
	}
	}

	/**
	 * メニューバーの構築
	 */
	protected void createMenuBar() {
	mMenubar = 	getUIFactory().createMenuBar("app.menubar");
	if ( mMenubar != null ) {
		getRootPane().setJMenuBar( mMenubar ) ;
	}
	}

	/**
	 * ツールバーの構築
	 */
	protected void createToolBar() {
	mToolbar = getUIFactory().createToolBar("app.toolbar");
	if ( mToolbar != null ) {
		getContentPane().add("North",mToolbar);
    }
	}

	/**
     * フレームアダプタの設定
	 */
	protected void addFrameAdapter() {
	addWindowListener(new UFrameAdapter());	// フレーム終了時の設定
	}

	/**
     * UIファクトリーの取得
	 */
	public UIFactory getUIFactory() {
	return mUIFactory;
	}

	/**
     * 最近開いたファイルメニューの更新
     *
	 * 履歴は更新されないが、dlg.setCurrentDirectoryを行ってディレクトリが
	 * 変更になるとメニュー表示でエラーがでるため、ここでファイル履歴を更新する
	 *
     * @param szFile ファイル名（メニューの更新のみの場合null）
	 */
	public void updateRecent(String szFile) {
//	getUIFactory().updateRecent( this, "recent", szFile );
	}

	//## 子ウィンドウ #################################################
	/**
     * ウィンドウマネージャの設定
     * @param mgr ウィンドウマネージャ
	 */
	public void setWindowManager(UWindowManager mgr) {
	mWindowManager = mgr;
	}

	/**
     * ウィンドウマネージャの取得
	 */
	public UWindowManager getWindowManager() {
	return mWindowManager;
	}

	/**
     * 子ウィンドウの収集
	 */
	protected Vector getChildWindows() {
	if ( getWindowManager() != null ) {
		return getWindowManager().getWindows();
	}
	return new Vector();
	}

	//## Resource #####################################################
	/**
     * リソースの作成
	 */
	protected void createResource() {
	mResource = new ZResource(getClass()) ;
	}

	/**
	 * リソースの保存
	 */
	public void saveResource() {
	getResource().saveProperty();
	}

	/**
     * リソースの取得
	 */
	public ZResource getResource() {
	return mResource;
	}

	/**
     * フレーム名の取得
	 */
	public String getFrameName() {
	return mFrameName;
	}

	//## Action #######################################################
	/**
	 * アクション登録
	 * @param actions アクション
	 */
	protected void addActions(Action[] actions ) {
	for (int nIndex = 0; nIndex < actions.length; nIndex++) {
	    Action act = actions[nIndex];
	    mActions.put(act.getValue(Action.NAME), act);
	}
	}

	/**
	 * アクションを取得します。
	 * @param szCmd  アクション名
	 * @returns item アクション、または、null
	 */
	public Action getAction(String szCmd) {
	return (Action) mActions.get(szCmd);
	}

	/**
	 * アクションUIの更新
	 */
	public void updateActions() {
	Enumeration elm = mActions.elements() ;
	while ( elm.hasMoreElements() ) {
		Action act = (Action)elm.nextElement();
//		if ( act instanceof UAction ) {
//			((UAction)act).update();
//		}
	}
	}

	//## public #######################################################
	/**
	 * フレームの取得
	 * 子ダイアログを出す場合などに利用する
	 */
	public Frame getFrame() {
	return this;
	}

	/**
	 * フレームの終了(オーバライドされる)
	 */
	public void exitFrame() {
	}

	/**
	 * 終了前処理
	 */
	public boolean preExit( boolean bForce ) {
	return true;
	}

	/**
	 * アプリケーションの終了
	 */
	public void exit() {
	}

	//## サブクラス ###################################################
	/**
	 * 安全に停止するためのWindowAdapter派生クラス
	 */
	protected class UFrameAdapter extends WindowAdapter {
	/**
	 * ウィンドウの終了
	 * @param event ウィンドウイベント
	 */
	public void windowClosing(WindowEvent e) {
	exitFrame();
	}

	/**
	 * ウィンドウの非アクティブ化
	 * @param event ウィンドウイベント
	 */
	public void windowDeactivated(WindowEvent e) {
	System.gc();
	}
	}

	//## アトリビュート ###############################################
    /**
     * Frame名
     */
    private String		mFrameName;

	/**
	 * UIファクトリー
	 */
    private UIFactory	mUIFactory;

	/**
	 * ウィンドウマネージャ
	 */
	private UWindowManager mWindowManager = null;

	/**
	 * メニューバ
	 */
    private JMenuBar	mMenubar;

	/**
	 * ツールバー
	 */
    private JToolBar	mToolbar;

    /**
     * アクションハッシュテーブル
     */
    private Hashtable	mActions = new Hashtable();

    /**
     * リソース
     */
    private ZResource	mResource;
}
