/*
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2005 satoshi akabane(akabane@logical-paradox.org)
 * $Id: Window.java,v 1.6 2005/11/12 06:15:56 rampil Exp $
 */
package org.logical_paradox.common.swing;

import java.awt.Dimension;
import java.awt.Frame;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Toolkit;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.image.BufferStrategy;

import javax.swing.JFrame;

/**
 * ウィンドウ
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.6 $
 */
public class Window {
	private final String title;
	private final WindowPanel wndpnl;
	private final int width;
	private final int height;
	/** フレーム */
	private Frame mainFrm;
	/** ウィンドウが表示されてるかどうか */
	private boolean show = false;

	/** デフォルトのウィンドウリスナー */
	private WindowListener defaultWindowListener;

	/**
	 * コンストラクタ
	 * @param name ウィンドウタイトル
	 * @param panel ウィンドウの中身
	 * @param w ウィンドウの横サイズ
	 * @param h ウィンドウの縦サイズ
	 */
	public Window(String name, WindowPanel panel, int w, int h) {
		title = name;
		wndpnl = panel;
		width = w;
		height = h;

		init();
	}
	/**
	 * 初期化処理
	 */
	protected void init() {
		GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
		GraphicsDevice device = ge.getDefaultScreenDevice();
		GraphicsConfiguration gc = device.getDefaultConfiguration();

		if(wndpnl != null) {
			// パネルが指定されている場合，JFrameを作成する
			JFrame jmainFrm = new JFrame(gc);
			jmainFrm.getContentPane().add(wndpnl);
			wndpnl.setParentFrame(jmainFrm);
			mainFrm = jmainFrm;
		} else {
			// パネルが指定されていない場合，Frameを作成する
			mainFrm = new Frame(gc);
		}

		mainFrm.setTitle(title);
		defaultWindowListener =	new WindowAdapter() {
						public void windowClosing(WindowEvent e) {
							System.exit(0);
						}
					};
		mainFrm.addWindowListener(defaultWindowListener);

		Dimension windowLocation = Toolkit.getDefaultToolkit().getScreenSize();
		mainFrm.setLocation(((int)windowLocation.getWidth() - width) /2, ((int)windowLocation.getHeight() - height) /2);
		mainFrm.setSize(new Dimension(width, height));
	}
	/**
	 * キーリスナーを登録する
	 * @param listener キーリスナー
	 */
	public void addKeyListener(KeyListener listener) {
		mainFrm.addKeyListener(listener);
	}
	/**
	 * リサイズ可能かどうかを設定する．
	 * @param b true:リサイズ可能 / false:リサイズ不可能
	 */
	public void setResizable(boolean b) {
		mainFrm.setResizable(b);
	}
	/**
	 * このウィンドウのバッファストラテジを作成して返す．
	 * @param size バッファサイズ(通常2)
	 * @return 作成されたバッファストラテジ
	 */
	public BufferStrategy createBufferStrategy(int size) {
		mainFrm.setIgnoreRepaint(true);
		mainFrm.createBufferStrategy(size);

		return mainFrm.getBufferStrategy();
	}
	/**
	 * ウィンドウを表示する
	 */
	public void setVisible(boolean b) {
		mainFrm.setVisible(b);
		show = b;
	}
	/**
	 * ウィンドウが表示されてるかどうかを返す
	 * @return true:表示されている / false:表示されていない
	 */
	public boolean getVisible() {
		return show;
	}
	/**
	 * ウィンドウリスナーを変更する．
	 * ウィンドウクローズ処理時に何かしたい場合に，カスタムリスナーを登録しておいて
	 * 使用する．
	 * @param lsnr 登録するリスナー
	 */
	public void changeWindowListener(WindowListener lsnr) {
		mainFrm.removeWindowListener(defaultWindowListener);
		mainFrm.addWindowListener(lsnr);
		defaultWindowListener = lsnr;
	}
}
