#include "stdafx.h"
#include "FWatchApp.hpp"
#include "resource.h"

#include "FWatchVersionDlg.hpp"

#include "Utility.hpp"

#include <shellapi.h>

#include <vector>

#pragma comment(lib, "Version.lib")
#pragma comment(lib, "shell32.lib")

FWatchVersionDlg::FWatchVersionDlg()
{
}

FWatchVersionDlg::~FWatchVersionDlg()
{
}

void FWatchVersionDlg::show(HWND hWnd)
{
	::DialogBoxParam(
		app.getInstanceHandle(),
		(LPCTSTR) IDD_ABOUTBOX,
		hWnd,
		(DLGPROC) DlgProc,
		(LPARAM) this
		);
}

BOOL FWatchVersionDlg::OnInitDialog()
{
	HWND hAppName = GetDlgItem(hDlg_, IDC_ABOUT_APPNAME);
	HWND hCopyright = GetDlgItem(hDlg_, IDC_ABOUT_COPYRIGHT);
	HWND hVersion = GetDlgItem(hDlg_, IDC_ABOUT_VERSION);

	assert(hAppName && "アプリケーション名表示ラベルのウィンドウハンドルがNULLです。");
	assert(hCopyright && "コピーライト表示ラベルのウィンドウハンドルがNULLです。");
	assert(hVersion && "バージョン表示ラベルのウィンドウハンドルがNULLです。");

	SetWindowText(hAppName, app.getVersionComment().c_str());
	SetWindowText(hCopyright, app.getLegalCopyright().c_str());
	SetWindowText(hVersion, app.getFileVersion().c_str());

	return TRUE;
}

// バージョン情報ボックス用メッセージ ハンドラ
LRESULT CALLBACK FWatchVersionDlg::DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	FWatchVersionDlg* me = (FWatchVersionDlg*) ::GetWindowLongPtr(hDlg, DWLP_USER);
	assert((me == NULL || me->hDlg_ == hDlg) && "参照が不正です。");

	switch (message)
	{
	case WM_INITDIALOG:
		{
			me = (FWatchVersionDlg*) lParam;
			assert(me != NULL && "インスタンスへのポインタが設定されていません。");
			::SetWindowLongPtr(hDlg, DWLP_USER, (LONG) me);
			me->hDlg_ = hDlg;
			return me->OnInitDialog();
		}

	case WM_COMMAND:
		{
			const UINT uID = LOWORD(wParam);
			switch (uID)
			{
			case IDOK:
			case IDCANCEL:
				EndDialog(hDlg, uID);
				break;

			case IDC_HOMEPAGE:
				{
					const tstring url = app.LoadString(IDS_PROJECT_HOMEPAGE);
					::ShellExecute(NULL, _T("OPEN"), url.c_str(), NULL, NULL, SW_SHOWNORMAL);
				}
				break;

			default:
				return FALSE;
			}
		}
		return TRUE;
	}
    return FALSE;
}
