/* _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
|
|   windowManager.cpp
|
+ -------------------------------------------------------------------------------------------------
|
+ _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ */

#include "Common.h"

#include "systemManager.h"
#include "Mouse.h"

#include "windowManager.h"

//! コールバック
LRESULT CALLBACK MessageProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	return(WindowManager::getInstance()->messageProc(hWnd, msg, wParam, lParam));
}

//! コンストラクタ
WindowManager::WindowManager()
{
}

//! デストラクタ
WindowManager::~WindowManager()
{
	release();
}

//! 解放
void WindowManager::release(void)
{
}

//! 初期化
void WindowManager::init(HINSTANCE hInst, char* cmdLine, int cmdShow)
{
	m_instanceHandle = hInst;
	m_cmdLine = cmdLine;
	m_cmdShowNum = cmdShow;
}

//! ウィンドウ生成
void WindowManager::createWindow(int width, int height)
{
	m_winWidth = width;
	m_winHeight = height;

	char    winName[]	= "AngeViergeBBS";	// ウィンドウクラス名

	// ウィンドウクラスの初期化
	WNDCLASSEX	wcex = {
		sizeof(WNDCLASSEX),				// この構造体のサイズ
		NULL,							// ウインドウのスタイル(default)
		MessageProc,					// メッセージ処理関数の登録
		0,								// 通常は使わないので常に0
		0,								// 通常は使わないので常に0
		m_instanceHandle,				// インスタンスへのハンドル
		NULL,							// アイコン（なし）
		LoadCursor(NULL, IDC_ARROW),	// カーソルの形
		NULL, NULL,						// 背景なし、メニューなし
		winName,						// クラス名の指定
		NULL							// 小アイコン（なし）
	};

	// ウィンドウクラスの登録
	RegisterClassEx(&wcex);
	
	// 画面全体の幅と高さを取得
	int sw = GetSystemMetrics(SM_CXSCREEN);
	int sh = GetSystemMetrics(SM_CYSCREEN);

	if(false){
		// フルスクリーン
		m_windowHandle = CreateWindow(winName, winName, WS_POPUP, 0, 0, sw, sh, NULL, NULL, m_instanceHandle, NULL);
	}else{
		// ウィンドウモード
		m_windowHandle = CreateWindow(winName, winName, WS_OVERLAPPEDWINDOW, 0, 0, width, height, NULL, NULL, m_instanceHandle, NULL);

		// ウィンドウサイズを再設定する
		RECT rect;
		int ww, wh;
		int cw, ch;
		int x, y;

		// クライアント領域の外の幅を計算
		GetClientRect(m_windowHandle, &rect);	// クライアント部分のサイズの取得
		cw = rect.right - rect.left;			// クライアント領域外の横幅を計算
		ch = rect.bottom - rect.top;			// クライアント領域外の縦幅を計算

		// ウインドウ全体の横幅の幅を計算
		GetWindowRect(m_windowHandle, &rect);	// ウインドウ全体のサイズ取得
		ww = rect.right - rect.left;			// ウインドウ全体の幅の横幅を計算
		wh = rect.bottom - rect.top;			// ウインドウ全体の幅の縦幅を計算
		x = (sw - ww) / 2;
		y = (sh - wh) / 2;
		ww -= cw;								// クライアント領域以外に必要な幅
		wh -= ch;								// クライアント領域以外に必要な高さ

		// ウィンドウサイズの再計算
		ww += width;		// 必要なウインドウの幅
		wh += height;		// 必要なウインドウの高さ

		// ウインドウサイズの再設定
		SetWindowPos(m_windowHandle, HWND_TOP, x, y, ww, wh, 0);
	}

    ShowWindow(m_windowHandle, m_cmdShowNum);	// ウィンドウの表示
	ValidateRect(m_windowHandle, 0);			// WM_PAINTが呼ばれないようにする
}

//! メッセージ処理
LRESULT WindowManager::messageProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	LRESULT	ret = 0;

	switch(msg){
		case WM_CLOSE:
			PostQuitMessage(0);
			break;

		case WM_KEYDOWN:
			if(wParam == VK_ESCAPE){
				PostQuitMessage(0);
			}
			break;

		case WM_MOUSEWHEEL:
			SystemManager::getInstance()->getMouse()->setWheel(GET_WHEEL_DELTA_WPARAM(wParam)/WHEEL_DELTA);
			break;

		default:
			ret = DefWindowProc(hWnd, msg, wParam, lParam); 
	}

	return(ret);
}

//! インスタンス取得
WindowManager* WindowManager::getInstance(void)
{
	static WindowManager winMan;
	return(&winMan);
}

