//------------------------------------------------------------------------------
// Lamp : Open source game middleware
// Copyright (C) 2004  Junpei Ohtani ( Email : junpee@users.sourceforge.jp )
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
//------------------------------------------------------------------------------

/** @file
 * ウィンドウクリエータ実装
 * @author Junpee
 */

#include "LampBasic.h"
#include "Framework/Utility/WindowCreator.h"

namespace Lamp{

//------------------------------------------------------------------------------
// ウィンドウ作成パラメータコンストラクタ
WindowCreator::CreateParameter::CreateParameter(){
	windowName_ = "windowName";
	instanceHandle_ = NULL;
	windowProcedure_ = NULL;
	windowStyle_ =
		WS_OVERLAPPED |
		WS_CAPTION |
		WS_SYSMENU |
		WS_THICKFRAME |
		WS_MINIMIZEBOX |
		WS_MAXIMIZEBOX |
		WS_VISIBLE;
	createWidth_ = 640;
	createHeight_ = 480;
	iconHandle_ = ::LoadIcon(NULL, IDI_WINLOGO);
	smallIconHandle_ = ::LoadIcon(NULL, IDI_WINLOGO);
	cursorHandle_ = ::LoadCursor(NULL, IDC_ARROW);
}
//------------------------------------------------------------------------------
// ウィンドウの作成
HWND WindowCreator::create(const CreateParameter& parameter){
	// ウィンドウクラスの登録
	WNDCLASSEX windowClass;
	String windowClassName = parameter.windowName_ + "WindowClass";
	windowClass.cbSize = sizeof(WNDCLASSEX);	// WindowClassのサイズ
	windowClass.style = 0;						// ウィンドウスタイル
	windowClass.lpfnWndProc =					// ウィンドウプロシージャ
		parameter.windowProcedure_;
	windowClass.cbClsExtra = 0;					// 拡張情報サイズ
	windowClass.cbWndExtra = 0;					// 拡張情報サイズ
	windowClass.hInstance =						// インスタンスハンドル
		parameter.instanceHandle_;
	windowClass.hIcon =							// アイコンハンドル
		parameter.iconHandle_;
	windowClass.hIconSm =						// スモールアイコンハンドル
		parameter.smallIconHandle_;
	windowClass.hCursor =						// カーソルハンドル
		parameter.cursorHandle_;
	windowClass.hbrBackground =					// 背景ブラシ
		(HBRUSH)::GetStockObject(GRAY_BRUSH);
	windowClass.lpszMenuName = NULL;			// メニュー名
	windowClass.lpszClassName =					// ウィンドウクラス名
		windowClassName.getBytes();
	if(!::RegisterClassEx(&windowClass)){
		ErrorOut("SimpleFramework::createWindow() RegisterClassEx");
		return NULL;
	}
	// ウィンドウサイズの算出
	RECT windowRect;
	::SetRect(&windowRect, 0, 0,
		parameter.createWidth_, parameter.createHeight_);
	// メニューには対応しない
	::AdjustWindowRect(&windowRect, parameter.windowStyle_, false);
	// ウィンドウの作成
	return ::CreateWindowEx(
		0,										// 拡張ウィンドウスタイル
		windowClassName.getBytes(),				// ウィンドウクラス名
		parameter.windowName_.getBytes(),		// ウィンドウ名
		parameter.windowStyle_,					// ウィンドウスタイル
		CW_USEDEFAULT,							// ウィンドウX位置
		CW_USEDEFAULT,							// ウィンドウY位置
		(windowRect.right - windowRect.left),	// ウィンドウ幅
		(windowRect.bottom - windowRect.top),	// ウィンドウ高さ
		NULL,									// 親ウィンドウ
		NULL,									// メニューハンドル
		parameter.instanceHandle_,				// インスタンスハンドル
		NULL);									// ウィンドウ作成データ
}
//------------------------------------------------------------------------------
// ウィンドウの破棄
void WindowCreator::destroy(HWND windowHandle){
	// メニューの破棄
	HMENU menuHandle = GetMenu(windowHandle);
	if(menuHandle != NULL){ DestroyMenu(menuHandle); }
	// ウィンドウの破棄
	DestroyWindow(windowHandle);
}
//------------------------------------------------------------------------------
} // End of namespace Lamp
//------------------------------------------------------------------------------
