//////////////////////////////////////////
// ResourceListProc.h
// Copyright (c) 08/11/2024 by BCCSkelton
//////////////////////////////////////////

/////////////////////////////////
//主ウィンドウCMyWndの関数の定義
//ウィンドウメッセージ関数
/////////////////////////////////
bool CMyWnd::OnCreate(WPARAM wParam, LPARAM lParam) {

	//コモンコントロールの初期化
	InitCommonControls();

	//ツールバー登録−Init(hWnd, hIinstance, ID, (以下省略可）Style)
	TBar.Init(m_hWnd, m_hInstance, TOOLBAR);
	//ツールバーボタン用カスタムビットマップ追加
	TBar.AddBmp(m_hInstance, MAKEINTRESOURCE(IDI_TOOLBAR), 4);
	//ツールバーボタン追加
	TBBUTTON tbb[6];
	ZeroMemory(tbb, sizeof(tbb));
	tbb[0].iBitmap = TBar.m_id + 0;
	tbb[0].fsState = TBSTATE_ENABLED;
	tbb[0].fsStyle = TBSTYLE_BUTTON;
	tbb[0].idCommand = IDM_OPEN;
	tbb[1].iBitmap = TBar.m_id + 1;
	tbb[1].fsStyle = TBSTYLE_BUTTON;
	tbb[1].idCommand = IDM_SAVE;
	tbb[2].fsStyle = TBSTYLE_SEP;	//セパレーター
	tbb[3].iBitmap = TBar.m_id + 2;
	tbb[3].fsState = TBSTATE_ENABLED;
	tbb[3].fsStyle = TBSTYLE_BUTTON;
	tbb[3].idCommand = IDM_EXIT;
	tbb[4].fsStyle = TBSTYLE_SEP;	//セパレーター
	tbb[5].iBitmap = TBar.m_id + 3;
	tbb[5].fsState = TBSTATE_ENABLED;
	tbb[5].fsStyle = TBSTYLE_BUTTON;
	tbb[5].idCommand = IDM_VERSION;
	TBar.AddButtons(6, tbb);

	//ステータスバー登録−Init(hWnd, hIinstance, ID, (以下省略可）Style)
	SBar.Init(m_hWnd, m_hInstance, STATUSBAR);
	//ステータスバー区画設定
	int sec[2] = {120, -1};
	SBar.SetSection(2, sec);
	//ステータスバー文字列設定
	SBar.SetText(0, "ResourceList Ver 1.0");
	SBar.SetText(1, "（ファイル名）");

	//ドラッグアンドドロップの受付開始
	DragAcceptFiles(m_hWnd, TRUE);

	//エディットコントロールの作成
	Edit.Init("EDIT", m_hInstance);
	Edit.Create("（リソース情報データを表示します）",
					WS_CHILD | WS_VISIBLE | WS_BORDER | WS_HSCROLL | WS_VSCROLL |
					ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_MULTILINE | ES_READONLY,
					WS_EX_CLIENTEDGE, m_hWnd, IDC_EDIT, 0, 0, 0, 0);
	Edit.SetFont(11, "ＭＳ 明朝");

	//データファイルで起動された場合、ファイルをオープンする
	if(g_ByFile) {
		g_FileName = Arg.v(1);	//第１パラメーターのファイル名（のみ）
		g_ByFile =TRUE;
		OnOpen();
	}
	return TRUE;
}

bool CMyWnd::OnNotify(WPARAM wParam, LPARAM lParam) {

	//ツールバーからのツールチップ情報取得
	if(((LPNMHDR)lParam)->code == TTN_NEEDTEXT) {
		static LPTOOLTIPTEXT lptip;
		lptip = (LPTOOLTIPTEXT)lParam;
		switch (lptip->hdr.idFrom) {
		case IDM_OPEN:
			lptip->lpszText = "実行可能ファイルを開く";
			break;
		case IDM_SAVE:
			lptip->lpszText = "リソース情報ファイルの保存";
			break;
		case IDM_EXIT:
			lptip->lpszText = "終了";
			break;
		case IDM_VERSION:
			lptip->lpszText = "バージョン情報";
			break;
		default:
			return FALSE;
		}
		return TRUE;
	}
	return FALSE;
}

bool CMyWnd::OnSize(WPARAM wParam, LPARAM lParam) {

	//ツールバー再設定
	TBar.AutoSize();
	//ステータスバー再設定
	SBar.AutoSize();
	//EDITコントロールをクライアントエリアに設定
	RECT rec;
	GetWindowRect(TBar.GetHandle(), &rec);	//ツールバー高さ取得
	int top = (rec.bottom - rec.top);
	int height = HIWORD(lParam) - top;
	GetWindowRect(SBar.GetHandle(), &rec);	//ステータスバー高さ取得
	height -= (rec.bottom - rec.top);
	MoveWindow(GetDlgItem(m_hWnd, IDC_EDIT), 0, top, LOWORD(lParam), height, TRUE);
	return TRUE;
}

bool CMyWnd::OnClose(WPARAM wParam, LPARAM lParam) {

	if(MessageBox(m_hWnd, "終了しますか", "終了確認",
					MB_YESNO | MB_ICONINFORMATION) == IDYES)
		//処理をするとDestroyWindow、PostQuitMessageが呼ばれる
		return TRUE;
	else
		//そうでなければウィンドウではDefWindowProc関数をreturn、ダイアログではreturn FALSEとなる。
		return FALSE;
}

bool CMyWnd::OnDropFiles(WPARAM wParam, LPARAM lParam) {

	//典型的なドラッグアンドドロップ処理
	static char lpszFn[MAX_PATH];				//ファイル名用バッファ
	HDROP hDrop = (HDROP)wParam; 				//HDROPを取得
	DragQueryFile(hDrop, 0, lpszFn, MAX_PATH);	//最初のファイル名を取得
	g_FileName =lpszFn;							//g_FileNameでファイルパス、名（のみ）を渡す
	g_ByFile = TRUE;
	OnOpen();
	DragFinish(hDrop);							//終了処理
	return TRUE;
}

bool CMyWnd::OnMinMax(WPARAM wParam, LPARAM lParam) {

	//典型的なウィンドウのサイズ制限処理
	MINMAXINFO *pmmi;
	pmmi = (MINMAXINFO*)lParam;
	pmmi->ptMinTrackSize.x = 496;	//クライアントエリア480 + 16
	pmmi->ptMinTrackSize.y = 381;	//クライアントエリア320 + 61

	return FALSE;					//処理はDefWndProcに任す
}

/////////////////////////////////
//主ウィンドウCMyWndの関数の定義
//メニュー項目、コントロール関数
/////////////////////////////////
bool CMyWnd::OnOpen() {

	//ファイル、フィルター用変数
	char* ptFile;
	char* ptFilter = "モジュールファイル（exe, dll）\0*.exe;*.dll\0すべてのファイル\0*.*\0\0";
    //ファイル名の取得
	if(g_ByFile)		//ファイル引数付き起動、Drag and Dropまたはメニューの場合
		g_ByFile = FALSE;		//初期状態に戻す
	else {				//メニューやコントロールの場合
		//選択されているアイテムの文字列を取得し、これでフィルターを作成
		ptFile = cmndlg.GetFileName(m_hWnd, ptFilter, TRUE);
		if(!ptFile) {
			MessageBox(m_hWnd, "ファイルが選択されませんでした", "エラー", MB_OK | MB_ICONSTOP);
			return FALSE;
		}
		else {
			g_FileName = ptFile;
		}
	}
	SBar.SetText(1, g_FileName.ToChar());
	SBar.SendMsg(SB_SETTIPTEXT, 1, (LPARAM)g_FileName.ToChar());	//ToolTipをつける
	//リソースリストの設定と表示
	ResList.BeginResList(g_FileName.ToChar());		//新しい実行可能ファイルを再度開く
	SendMessage(Edit.GetHandle(), WM_SETTEXT, 0, (LPARAM)ResList.GetData());
	//「リソース情報ファイルの保存」を有効にする
	HMENU hMenu = GetMenu(ResourceList.GetHandle());	//メニューハンドルの取得
	HMENU hFileMenu = GetSubMenu(hMenu, 0);
	EnableMenuItem(hFileMenu, IDM_SAVE, MF_BYCOMMAND | MF_ENABLED);
	//EnableMenuItem(hFileMenu, IDM_SAVE, MF_BYCOMMAND | (EnableFlag ? MF_ENABLED : MF_GRAYED));
	//ツールバーボタンを有効にする
	SendMessage(TBar.GetHandle(), TB_ENABLEBUTTON, IDM_SAVE, MAKELONG(TRUE, 0));
	return TRUE;
}

bool CMyWnd::OnSave() {

	ResList.SaveList();
	return TRUE;
}

bool CMyWnd::OnExit() {

	SendMsg(WM_CLOSE, 0, 0);
	return TRUE;
}

bool CMyWnd::OnVersion() {

	//IDD_VERSIONダイアログの表示
	versiondlg.DoModal(m_hWnd, "IDD_VERSION", versiondlgProc);
	return TRUE;
}

/////////////////////////////////
//VERSIONDLGダイアログの関数定義
//コントロール関数
/////////////////////////////////
bool VERSIONDLG::OnIdok() {

	EndModal(TRUE);
	return TRUE;
}
