//////////////////////////////////////////
// CommandProc.h
// Copyright (c) 11/15/2021 by BCCSkelton
//////////////////////////////////////////

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

	//起動時のカレントディレクトリーを記録
	GetCurrentDirectory(MAX_PATH, m_CPath);
	//ボタンにツールヒントコントロールを付ける
	SetToolTip(m_hWnd, IDC_CD, "ディレクトリーを変更します");
	SetToolTip(m_hWnd, IDC_EXE, "引数付きで外部コマンド（実行ファイル）を実行します");
	SetToolTip(m_hWnd, IDC_DIR, "現在のディレクトリーでExplorerを起動します");
	SetToolTip(m_hWnd, IDC_CMD, "現在のディレクトリーでコマンドプロンプトを起動します");
	SetToolTip(m_hWnd, IDC_PS, "現在のディレクトリーでパワーシェルを起動します");
	SetToolTip(m_hWnd, IDOK, "終了します");
	return TRUE;
}

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

	//終了時にログがあれば記録する
	if(*m_Log.ToChar()) {
		//本日のローカル日付をdate文字列に入れる
		SYSTEMTIME st;
		char date[12];
		GetLocalTime(&st);
		wsprintf(date, "%2d-%2d-%4d", st.wMonth, st.wDay, st.wYear);
		//ファイル名（"（ファイルパス）\LogOfMM/DD/YYYY.log"）をnmにセット
		CSTR nm;
		CARG arg;
		nm = arg.Path();
		nm = nm + "\\LogOf";
		nm = nm + date;
		nm = nm + ".log";
		//ログを保存する（後にバッチファイルとして使える）
		m_Log.ToFile(nm.ToChar());
		MessageBox(m_hWnd, "操作ログを保存しました\n（バッチファイルとして使用することができます）", "操作ログ", MB_OK | MB_ICONINFORMATION);
	}
	return TRUE;
}

//ダイアログベースの場合はこれが必要
bool CMyWnd::OnDestroy(WPARAM wPram, LPARAM lParam) {

	PostQuitMessage(0);
	return TRUE;
}

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

	//移動先パスを取得
	char* cp = cmndlg.GetPath(m_hWnd, "移動先ディレクトリーの選択");
	if(cp) {
		SetCurrentDirectory(cp);
		//移動先パスを(m_CPathに記録
		lstrcpy(m_CPath, cp);
		//操作ログを記録
		m_Log = m_Log + "cd \"";
		m_Log = m_Log + cp;
		m_Log = m_Log + "\"\n";
		return TRUE;
	}
	else {
		MessageBox(m_hWnd, "操作がキャンセルされました", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
}

bool CMyWnd::OnDir() {

	//エクスプローラーを/eオプションで起動
	CSTR path = "explorer.exe /e, ";
	path = path + m_CPath;
	WinExec(path.ToChar(), SW_SHOWNORMAL);
	return TRUE;
}

bool CMyWnd::OnExe() {

	//IDD_ARGダイアログを開く
	exedlg.DoModal(m_hWnd, "IDD_EXE", exedlgProc, m_hInstance);
	//ダイアログの操作でカレントディレクトリーが変更された可能性がある為
	SetCurrentDirectory(m_CPath);
	return TRUE;
}

bool CMyWnd::OnCmd() {

	//コマンドプロンプトを起動
	WinExec("cmd.exe", SW_SHOWNORMAL);
	return TRUE;
}

bool CMyWnd::OnPs() {

	//コマンドプロンプトを起動
	WinExec("powershell.exe", SW_SHOWNORMAL);
	return TRUE;
}

bool CMyWnd::OnIdok() {

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

bool CMyWnd::OnCancel() {

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

///////////////////////////////
//IDD_EXEダイアログの関数定義
//ウィンドウメッセージ関数
///////////////////////////////
bool EXEDLG::OnInit(WPARAM wPram, LPARAM lParam) {

	//クライアントエリア初期化
	RECT rec;
	GetClientRect(m_hWnd, &rec);
	m_Width = rec.right - rec.left;		//405
	m_Height = rec.bottom - rec.top;	//371
	//コモンコントロールの初期化
	InitCommonControls();
	//ステータスバー登録−SetHandle(hWnd))
	SBar.SetHandle(GetDlgItem(m_hWnd, IDC_STATUSBAR));
	//ステータスバー区画設定
	int sec[1] = {-1};
	SBar.SetSection(1, sec);
	//ステータスバー文字列設定
	SBar.SetText(0, "実行ファイル名−「ファイル」ボタンで選択");
	//ファイルボタンにツールヒントコントロールを付ける
	SetToolTip(m_hWnd, IDC_FILE1, "実行ファイルを選択します");
	SetToolTip(m_hWnd, IDC_FILE2, "引数１にファイルパス・名を使用します");
	SetToolTip(m_hWnd, IDC_FILE3, "引数２にファイルパス・名を使用します");
	SetToolTip(m_hWnd, IDC_FILE4, "引数３にファイルパス・名を使用します");
	SetToolTip(m_hWnd, IDC_DONE, "最終コマンドを標示します");
	SetToolTip(m_hWnd, IDOK, "最終コマンドを実行します");
	SetToolTip(m_hWnd, IDCANCEL, "終了します");
	//コマンドエディットコントロールの初期化
	g_CE.m_hWnd = GetDlgItem(m_hWnd, IDC_EXEDIT);
	g_CE.m_hInstance = m_hInstance;
	g_CE.SetFont(8, "ＭＳ 明朝");
	return TRUE;
}

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

	//ステータスバー再設定
	SBar.AutoSize();
	//コントロールの位置、サイズ変更
	RECT rec;	//矩形取得用
	POINT pt;	//スクリーン座標変換用
	int w, h;	//幅、高さ計算用
	int diffx = LOWORD(lParam) - m_Width;	//前回と今回の差分
	int diffy = HIWORD(lParam) - m_Height;	//前回と今回の差分
	m_Width = LOWORD(lParam);				//今回の幅
	m_Height = HIWORD(lParam);				//今回の高さ
	//左右移動のみ
	//IDC_FILE1
	GetWindowRect(GetDlgItem(m_hWnd, IDC_FILE1), &rec);	//ウィンドウ位置取得
	w = rec.right - rec.left;
	h = rec.bottom - rec.top;
	pt.x = rec.left;
	pt.y = rec.top;
	ScreenToClient(m_hWnd, &pt);
	MoveWindow(GetDlgItem(m_hWnd, IDC_FILE1), pt.x + diffx, pt.y, w, h, TRUE);
	//IDC_DONE
	GetWindowRect(GetDlgItem(m_hWnd, IDC_DONE), &rec);	//ウィンドウ位置取得
	w = rec.right - rec.left;
	h = rec.bottom - rec.top;
	pt.x = rec.left;
	pt.y = rec.top;
	ScreenToClient(m_hWnd, &pt);
	MoveWindow(GetDlgItem(m_hWnd, IDC_DONE), pt.x + diffx, pt.y, w, h, TRUE);
	//幅変更のみ
	//IDC_EDIT1, IDC_EDIT2, IDC_EDIT3
	for(int i = IDC_EDIT1; i <= IDC_EDIT3; i++) {
		GetWindowRect(GetDlgItem(m_hWnd, i), &rec);	//ウィンドウ位置取得
		w = rec.right - rec.left;
		h = rec.bottom - rec.top;
		pt.x = rec.left;
		pt.y = rec.top;
		ScreenToClient(m_hWnd, &pt);
		MoveWindow(GetDlgItem(m_hWnd, i), pt.x, pt.y, w + diffx, h, TRUE);
	}
	//上下移動のみ
	//IDCANCEL
	GetWindowRect(GetDlgItem(m_hWnd, IDCANCEL), &rec);	//ウィンドウ位置取得
	w = rec.right - rec.left;
	h = rec.bottom - rec.top;
	pt.x = rec.left;
	pt.y = rec.top;
	ScreenToClient(m_hWnd, &pt);
	MoveWindow(GetDlgItem(m_hWnd, IDCANCEL), pt.x, pt.y + diffy, w, h, TRUE);
	//左右上下移動
	//IDOK
	GetWindowRect(GetDlgItem(m_hWnd, IDOK), &rec);	//ウィンドウ位置取得
	w = rec.right - rec.left;
	h = rec.bottom - rec.top;
	pt.x = rec.left;
	pt.y = rec.top;
	ScreenToClient(m_hWnd, &pt);
	MoveWindow(GetDlgItem(m_hWnd, IDOK), pt.x + diffx, pt.y + diffy, w, h, TRUE);
	//幅高さ変更
	//IDC_EXEDIT
	GetWindowRect(GetDlgItem(m_hWnd, IDC_EXEDIT), &rec);	//ウィンドウ位置取得
	w = rec.right - rec.left;
	h = rec.bottom - rec.top;
	pt.x = rec.left;
	pt.y = rec.top;
	ScreenToClient(m_hWnd, &pt);
	MoveWindow(GetDlgItem(m_hWnd, IDC_EXEDIT), pt.x, pt.y, w + diffx, h + diffy, TRUE);
	//クライアントエリアを再描画
	InvalidateRect(m_hWnd, NULL, TRUE);
	return TRUE;
}

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

	//典型的なウィンドウのサイズ制限処理
	MINMAXINFO *pmmi;
	pmmi = (MINMAXINFO*)lParam;
	pmmi->ptMinTrackSize.x = 421;	//クライアントエリア405
	pmmi->ptMinTrackSize.y = 410;	//クライアントエリア371

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

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

	//実行ファイルパス、名を取得
	char* cp = cmndlg.GetFileName(m_hWnd, "実行ファイル(*.exe)\0*.exe\0\0");
	if(!cp) {
		MessageBox(m_hWnd, "操作がキャンセルされました", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	//ステータスバー標示
	SBar.SetText(0, cp);
	SBar.SendMsg(SB_SETTIPTEXT, 0, (LPARAM)cp);	//ToolTipをつける
	//実行ファイル名を""で囲んで保存
	m_FileName = "\"";
	m_FileName = m_FileName + cp;
	m_FileName = m_FileName + "\"";
	return TRUE;
}

bool EXEDLG::OnFile2() {

	char* cp = cmndlg.GetFileName(m_hWnd, "対象ファイル(*.*)\0*.*\0\0");
	if(cp) {
		//引数を""で囲む
		CSTR Arg = "\"";
		Arg = Arg + cp;
		Arg = Arg + "\"";
		SendItemMsg(IDC_EDIT1, WM_SETTEXT, 0, (LPARAM)Arg.ToChar());
		return TRUE;
	}
	else
		return FALSE;
}
bool EXEDLG::OnFile3() {

	char* cp = cmndlg.GetFileName(m_hWnd, "対象ファイル(*.*)\0*.*\0\0");
	if(cp) {
		//引数を""で囲む
		CSTR Arg = "\"";
		Arg = Arg + cp;
		Arg = Arg + "\"";
		SendItemMsg(IDC_EDIT2, WM_SETTEXT, 0, (LPARAM)Arg.ToChar());
		return TRUE;
	}
	else
		return FALSE;
}

bool EXEDLG::OnFile4() {

	char* cp = cmndlg.GetFileName(m_hWnd, "対象ファイル(*.*)\0*.*\0\0");
	if(cp) {
		//引数を""で囲む
		CSTR Arg = "\"";
		Arg = Arg + cp;
		Arg = Arg + "\"";
		SendItemMsg(IDC_EDIT3, WM_SETTEXT, 0, (LPARAM)Arg.ToChar());
		return TRUE;
	}
	else
		return FALSE;
}

bool EXEDLG::OnDone() {

	char arg[MAX_PATH];
	CSTR Arg = m_FileName;	//最初に実行ファイル名が入る
	if(SendItemMsg(IDC_EDIT1, WM_GETTEXT, MAX_PATH,(LPARAM)arg)) {
		Arg = Arg + " ";
		Arg = Arg + arg;
	}
	if(SendItemMsg(IDC_EDIT2, WM_GETTEXT, MAX_PATH, (LPARAM)arg)) {
		Arg = Arg + " ";
		Arg = Arg + arg;
	}
	if(SendItemMsg(IDC_EDIT3, WM_GETTEXT, MAX_PATH, (LPARAM)arg)) {
		Arg = Arg + " ";
		Arg = Arg + arg;
	}
	//最終編集処理のためにIDC_EXEDITへ
	SendItemMsg(IDC_EXEDIT, WM_SETTEXT, 0, (LPARAM)Arg.ToChar());
	return TRUE;
}

bool EXEDLG::OnIdok() {

	//最終編集後のIDC_EXEDITの文字列をbuffに取得
	char buff[MAX_PATH * 2];	//260 x 2 = 520
	if(SendItemMsg(IDC_EXEDIT, WM_GETTEXTLENGTH, 0, 0) > MAX_PATH * 2) {
		MessageBox(m_hWnd, "文字数が多すぎます", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	SendItemMsg(IDC_EXEDIT, WM_GETTEXT, MAX_PATH * 2, (LPARAM)buff);
	//m_Cmdへ代入して引き渡す
	Command.m_Cmd = buff;
	//m_Logに記録
	Command.m_Log = Command.m_Log + Command.m_Cmd;
	Command.m_Log = Command.m_Log + "\n";
	//コマンドの実行
	g_CE.Exec(Command.m_Cmd.ToChar());
 	return TRUE;
}

bool EXEDLG::OnCancel() {

	//ESCキー対応
	EndModal(TRUE);
	return TRUE;
}
