//////////////////////////////////////////
// MSCompAssProc.h
// Copyright (c) 09/30/2022 by BCCSkelton
//////////////////////////////////////////

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

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

	//ツールバー登録−SetHandle(hWnd))
	TBar.SetHandle(GetDlgItem(m_hWnd, IDC_TOOLBAR));
	//ツールバーボタン用カスタムビットマップ追加
	TBar.AddBmp(m_hInstance, MAKEINTRESOURCE(IDI_TOOLBAR), 9);
	//ツールバーボタン追加
	TBBUTTON tbb[12];
	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].fsState = TBSTATE_ENABLED;
	tbb[1].fsStyle = TBSTYLE_BUTTON;
	tbb[1].idCommand = IDM_CLOSE;
	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_EDIT;
	tbb[6].iBitmap = TBar.m_id + 4;
	tbb[6].fsState = TBSTATE_ENABLED;
	tbb[6].fsStyle = TBSTYLE_BUTTON;
	tbb[6].idCommand = IDM_COMPILE;
	tbb[7].iBitmap = TBar.m_id + 5;
	tbb[7].fsState = TBSTATE_ENABLED;
	tbb[7].fsStyle = TBSTYLE_BUTTON;
	tbb[7].idCommand = IDM_RUN;
	tbb[8].fsStyle = TBSTYLE_SEP;	//セパレーター
	tbb[9].iBitmap = TBar.m_id + 6;
	tbb[9].fsState = TBSTATE_ENABLED;
	tbb[9].fsStyle = TBSTYLE_BUTTON;
	tbb[9].idCommand = IDM_SETTING;
	tbb[10].iBitmap = TBar.m_id + 7;
	tbb[10].fsState = TBSTATE_ENABLED;
	tbb[10].fsStyle = TBSTYLE_BUTTON;
	tbb[10].idCommand = IDM_HELP;
	tbb[11].iBitmap = TBar.m_id + 8;
	tbb[11].fsState = TBSTATE_ENABLED;
	tbb[11].fsStyle = TBSTYLE_BUTTON;
	tbb[11].idCommand = IDM_VERSION;
	TBar.AddButtons(12, tbb);

	//ステータスバー登録−SetHandle(hWnd))
	SBar.SetHandle(GetDlgItem(m_hWnd, IDC_STATUSBAR));
	//ステータスバー区画設定
	int sec[2] = {110, -1};
	SBar.SetSection(2, sec);
	//ステータスバー文字列設定
	SBar.SetText(0, "MSComAss Ver 1.6");
	SBar.SetText(1, "（ファイル種類）");

	//クライアントエリア初期化
	RECT rec;
	GetClientRect(m_hWnd, &rec);
	m_Width = rec.right - rec.left;
	m_Height = rec.bottom - rec.top;

	//コマンドエディットコントロールの初期化
	ce.m_hWnd = GetDlgItem(m_hWnd, IDC_OUTPUT);
	ce.m_hInstance = m_hInstance;
	ce.SetFont(8, "ＭＳ 明朝");

	//ファイルパスの設定
	g_OwnPath = Arg.Path();
	g_IniFile = g_OwnPath + "\\MSCompAss.ini";
	Ini.SetName(g_IniFile.ToChar());
	g_Csc = Ini.ReadStr("System", "CSC");
	g_Vbc = Ini.ReadStr("System", "VBC");
	g_Edit = Ini.ReadStr("System", "EDITOR");
	g_HelpFile = g_OwnPath + "\\MSCompAssHelp.chm";

	//ファイルフィルターと種類の初期値（C#ファイル）
	g_Filter = "C#ファイル(*.cs)\0*.cs\0Visual Basicファイル(*.vb)\0*.vb\0全てのファイル\0*.*\0\0";	//フィルター用変数

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

	//ツールチップ表示の開始
	if(!g_Tip[0].SetToolTip(m_hWnd, IDC_FILENAME, "「ファイル名」です"))
		MessageBox(m_hWnd, "ツールチップの設定に失敗しました", "エラー", MB_OK | MB_ICONERROR);
	else
		g_Tip[0].SetWidth(540);					//最大幅を540ピクセルに設定
	if(!g_Tip[1].SetToolTip(m_hWnd, IDC_OPTION, "「コンパイルオプション」です", TRUE))
		MessageBox(m_hWnd, "ツールチップの設定に失敗しました", "エラー", MB_OK | MB_ICONERROR);
	else {
		g_Tip[1].SetWidth(480);						//最大幅を480ピクセルに設定
		g_Tip[1].SetBackColor(RGB(0, 255, 255));	//背景色を水色に設定
		g_Tip[1].SetTextColor(RGB(0, 0, 128));		//文字色を紺に設定
	}

	//データファイルで起動された場合、ファイルをオープンする（2番目以降は無視）
	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_CLOSE:
			lptip->lpszText = "ファイルを閉じる";
			break;
		case IDM_EXIT:
			lptip->lpszText = "MSCompAssの終了";
			break;
		case IDM_EDIT:
			lptip->lpszText = "ソースファイルの編集";
			break;
		case IDM_COMPILE:
			lptip->lpszText = "コンパイル";
			break;
		case IDM_RUN:
			lptip->lpszText = "Exeファイルの実行";
			break;
		case IDM_SETTING:
			lptip->lpszText = "設定";
			break;
		case IDM_HELP:
			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();
	//コントロールの位置、サイズ変更
	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_FILENAME、IDC_OPTION
	for(int i = IDC_FILENAME; i <= IDC_OPTION; 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);
	}
	//幅高さ変更
	//IDC_OUTPUT
	GetWindowRect(GetDlgItem(m_hWnd, IDC_OUTPUT), &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_OUTPUT), pt.x, pt.y, w + diffx, h + diffy, TRUE);
	//クライアントエリアを再描画
	InvalidateRect(m_hWnd, NULL, 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::OnDestroy(WPARAM wPram, LPARAM lParam) {

	PostQuitMessage(0);
	return TRUE;
}

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_ptFileでファイルパス、名を渡す
	g_ByFile = TRUE;
	OnOpen();
	DragFinish(hDrop);							//終了処理
	return TRUE;
}

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

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

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

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

	optiondlg.DoModal(m_hWnd, "IDD_OPTION", optiondlgProc);
	//optionの表示
	SendItemMsg(IDC_OPTION, WM_SETTEXT, 0, (LPARAM)m_Opt.ToChar());
	//「Option」に新しいオプション文字列を設定
	g_Tip[1].UpdateText(m_Opt.ToChar());
	return TRUE;
}

bool CMyWnd::OnOpen() {

    //メニューやコントロールによるものか、それ以外かによる分岐
	if(g_ByFile)	//ファイル引数付き起動、Drag and Dropまたはメニューの場合
		g_ByFile = FALSE;	//初期状態に戻す
	else {
		//ファイル名を取得
		char *cp = cmndlg.GetFileName(m_hWnd, g_Filter, TRUE);
		if(!cp) {
			MessageBox(m_hWnd, "キャンセルされました", "エラー", MB_OK | MB_ICONSTOP);
			return FALSE;
		}
		else
			 g_FileName = cp;
	}
	g_FileType = g_ExtChk.CheckExt(g_FileName.ToChar(), g_Filter);
	if(!g_FileType) {
		MessageBox(m_hWnd, "対象外のファイルです", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	//フルパスファイル名g_FileNameからファイルパスをg_TargetPathに記録
	Arg = Arg.GetLongName(g_FileName.ToChar());
	g_TargetPath = Arg.Path();
	//ソースファイルのディレクトリーへ移動
	SetCurrentDirectory(g_TargetPath.ToChar());
	//ファイルパス、名を「ファイル名」に表示
	SendItemMsg(IDC_FILENAME, WM_SETTEXT, 0, (LPARAM)g_FileName.ToChar());
	//IDC_OUPUTを初期化
	SendItemMsg(IDC_OUTPUT, WM_SETTEXT, 0, (LPARAM)"");
	//ステータスバーの表示
	CSTR fn(Arg.FileName());
	if(g_FileType == 1) {
		fn = fn + "（C#ファイル）のコンパイル";
		SBar.SetText(1, fn.ToChar());
	}
	else {
		fn = fn + "（Visual Basicファイル）のコンパイル";
		SBar.SetText(1, fn.ToChar());
	}
	//「ファイル名」をツールチップに設定
	g_Tip[0].UpdateText(g_FileName.ToChar());
	//オプションファイル（*.opt）があれば読み込む
	if(ReadOpt()) {
		//optionの表示
		SendItemMsg(IDC_OPTION, WM_SETTEXT, 0, (LPARAM)m_Opt.ToChar());
		//「Option」に新しいオプション文字列を設定
		g_Tip[1].UpdateText(m_Opt.ToChar());
	}
	return TRUE;
}

bool CMyWnd::OnClose() {

	//変数、コントロールの初期化
	g_TargetPath = "";
	g_FileName = "";
	g_FileType = 0;
	m_Opt = "";
	*optiondlg.m_RscFile = NULL;
	*optiondlg.m_IconFile = NULL;
	for(int i = 0; *optiondlg.m_RefFile[i]; i++)
		*optiondlg.m_RefFile[i] = NULL;
	*optiondlg.m_Others = NULL;
	SendItemMsg(IDC_FILENAME, WM_SETTEXT, 0, (LPARAM)g_FileName.ToChar());
	SendItemMsg(IDC_OPTION, WM_SETTEXT, 0, (LPARAM)m_Opt.ToChar());
	SendItemMsg(IDC_OUTPUT, WM_SETTEXT, 0, (LPARAM)"");
	SBar.SetText(1, "（ファイル種類）");
	return TRUE;
}

bool CMyWnd::OnExit() {

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

bool CMyWnd::OnEdit() {

	if(!*g_Edit.ToChar()) {
		MessageBox(m_hWnd, "エディターが選択されていません", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	if(!*g_FileName.ToChar()) {
		int res = MessageBox(m_hWnd, "ファイルが選択されていません\r\n新規にソースファイルを作成しますか？", "エラー", MB_YESNO | MB_ICONERROR);
		if(res != IDYES)
			return FALSE;
	}
	CSTR Cmd = "\"";
	Cmd = Cmd + g_Edit + "\" \"";
	Cmd = Cmd + g_FileName.ToChar() + "\"";
	WinExec(Cmd.ToChar(), SW_SHOWNORMAL);
	return TRUE;
}

bool CMyWnd::OnCompile() {

	//エラーチェック
	if(!*g_Csc.ToChar()) {
		MessageBox(m_hWnd, "csc.exeが登録されていません", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	if(!*g_Vbc.ToChar()) {
		MessageBox(m_hWnd, "vbc.exeが登録されていません", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	if(!*g_FileName.ToChar()) {
		MessageBox(m_hWnd, "ファイルが選択されていません", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	//コンパイルコマンド作成
	CSTR cmd = "\"";
	if(g_FileType == 1) {	//C#ファイル
		cmd = cmd + g_Csc + "\" ";
	}
	else {					//Visual Basicファイル
		cmd = cmd + g_Vbc + "\" ";
	}
	if(*m_Opt.ToChar())
		cmd = cmd + m_Opt;	//オプションがあれば追加
	cmd = cmd + " \"" + g_FileName + "\"";
	//ソースファイルのディレクトリーでコンパイルを行う
	SetCurrentDirectory(g_TargetPath.ToChar());	//移動された場合が考えられるので再度．．．
	//コンパイラー出力の表示（IDC_OUTPUTのサイズ変動を防止）
	RECT rec;
	GetWindowRect(GetDlgItem(m_hWnd, IDC_OUTPUT), &rec);	//ウィンドウ位置取得
	ce.Exec(cmd.ToChar(), "***** コンパイル開始 *****\r\n", "***** コンパイル終了 *****\r\n");
	POINT pt;
	pt.x = rec.left;
	pt.y = rec.top;
	ScreenToClient(m_hWnd, &pt);
	MoveWindow(GetDlgItem(m_hWnd, IDC_OUTPUT), pt.x, pt.y, rec.right - rec.left, rec.bottom - rec.top, TRUE);
	//最後にコンパイルした際のオプションをソースファイルと同じフォールダーに保存する
	WriteOpt();
	//非クライアント領域を含むウィンドウ全体を無効化
	RedrawWindow(m_hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ERASE | RDW_FRAME | RDW_ALLCHILDREN);

	return TRUE;
}

bool CMyWnd::OnRun() {

	if(!*g_FileName.ToChar()) {
		MessageBox(m_hWnd, "ファイルが選択されていません", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	//Exeファイルのフルパス名を作成
	CSTR cmd = "\"";
	cmd = cmd + g_FileName;	//フルパスファイル名（*.csまたは*.vb）
	char *period = strstr(cmd.ToChar(), ".");
	*period = NULL;			//拡張子以降を切除
	cmd = cmd + ".exe\"";
	//Exeファイルの実行
	CSTR dos("cmd.exe /c ");
	switch(g_Target) {
	case 0:					//未選択は規定値の1と同じ
	case 1:					//コンソールプログラム(cmd.exeから実行)
		dos = dos + cmd;
		WinExec(dos.ToChar(), SW_SHOWNORMAL);
		break;
	case 2:					//ウィンドウズプログラム
		WinExec(cmd.ToChar(), SW_SHOWNORMAL);
		break;
	case 3:					//DLLプログラム
		MessageBox(m_hWnd, "このプログラムはDLLです", "確認", MB_OK | MB_ICONINFORMATION);
		break;
	default:
		return FALSE;
	}
	return TRUE;
}

bool CMyWnd::OnSetting() {

	if(setupdlg.DoModal(m_hWnd, "IDD_SETUP", setupdlgProc)) {
		//Iniファイルに書き込む
		Ini.WriteStr("System", "CSC", g_Csc.ToChar());
		Ini.WriteStr("System", "VBC", g_Vbc.ToChar());
		Ini.WriteStr("System", "EDITOR", g_Edit.ToChar());
	}
	return TRUE;
}

bool CMyWnd::OnHelp() {

	CSTR cmd = "hh \"";
	cmd = cmd + g_HelpFile + "\"";
	WinExec(cmd.ToChar(), SW_SHOWNORMAL);
	return TRUE;
}

bool CMyWnd::OnVersion() {

	versiondlg.DoModal(m_hWnd, "IDD_VERSION", versiondlgProc);
	return TRUE;
}

///////////////////
//ユーザー定義関数
///////////////////
bool CMyWnd::ReadOpt() {

	m_Opt = "";		//オプションを初期化
	char fn[MAX_PATH], *cp;
	lstrcpy(fn, g_FileName.ToChar());
	switch(g_FileType) {
	case 1:	//C#
		lstrcpy(strstr(fn, ".cs"), ".opt");
		break;
	case 2:	//VB
		lstrcpy(strstr(fn, ".vb"), ".opt");
		break;
	default:
		return FALSE;
	}
	CINI optin(fn);
	//targetオプション
	g_Target = optin.ReadInt("Compile Option", "Target");
	if(g_Target) {
		m_Opt = g_TargetList[g_Target];
		m_Opt = m_Opt + " ";
	}
	//resourceオプション
	g_Resource = optin.ReadInt("Compile Option", "Resource");
	if(g_Resource) {	//リソースファイル名を追加
		m_Opt = m_Opt + g_ResrcList[g_Resource];
		cp = optin.ReadStr("Compile Option", "RscFile");
		if(cp && lstrcmp(cp, "Not Found")) {
			lstrcpy(optiondlg.m_RscFile, cp);
			m_Opt = m_Opt + "\"";
			m_Opt = m_Opt + cp;
			m_Opt = m_Opt + "\" ";
			lstrcpy(optiondlg.m_RscFile, cp);	//オプションダイアログ用
		}
		else
			*optiondlg.m_RscFile = NULL;		//オプションダイアログ用
	}
	else
		*optiondlg.m_RscFile = NULL;			//オプションダイアログ用
	//プログラムアイコンオプション
	cp = optin.ReadStr("Compile Option", "IconFile");
	if(cp && lstrcmp(cp, "Not Found")) {
		m_Opt = m_Opt + "/win32icon:\"";
		m_Opt = m_Opt + cp;
		m_Opt = m_Opt + "\" ";
		lstrcpy(optiondlg.m_IconFile, cp);		//オプションダイアログ用
	}
	else
		*optiondlg.m_IconFile = NULL;			//オプションダイアログ用
	//debugオプション
	g_DbgOpt = optin.ReadInt("Compile Option", "DbgOpt");
	if(g_DbgOpt) {
		m_Opt = m_Opt + g_DbgOptList[g_DbgOpt];
		m_Opt = m_Opt + " ";
	}
	//warningオプション
	g_WarnErr = optin.ReadInt("Compile Option", "WarnErr");
	if(g_WarnErr) {
		m_Opt = m_Opt + g_WarnErrList[g_WarnErr];
		m_Opt = m_Opt + " ";
	}
	//参照オプション
	cp = optin.ReadStr("Compile Option", "RefFile");	//第１参照ファイル（"RefFile"）
	if(cp && lstrcmp(cp, "Not Found")) {
		lstrcpy(optiondlg.m_RefFile[0], cp);			//オプションダイアログ用
		m_Opt = m_Opt + "/reference:\"";
		m_Opt = m_Opt + cp;
		m_Opt = m_Opt + "\" ";
		//第１以降の参照ファイル（"RefFile01"〜）
		char str[10];
		for(int i = 1; i < DLLMAX; i++) {				//DLLMAXの最大数
			wsprintf(str, "RefFile%02d", i);
			cp = optin.ReadStr("Compile Option", str);
			if(cp && lstrcmp(cp, "Not Found")) {
				lstrcpy(optiondlg.m_RefFile[i], cp);	//オプションダイアログ用
				m_Opt = m_Opt + "/reference:\"";
				m_Opt = m_Opt + cp;
				m_Opt = m_Opt + "\" ";
			}
			else										//"RefFile01"が無ければ中止
				break;
		}
	}
	else
		*optiondlg.m_RefFile[0] = NULL;			//第１オプションダイアログ用
	//その他オプション
	cp = optin.ReadStr("Compile Option", "Others");
	if(cp && lstrcmp(cp, "Not Found")) {
		m_Opt = m_Opt + cp;
		lstrcpy(optiondlg.m_Others, cp);		//オプションダイアログ用
	}
	else
		*optiondlg.m_Others = NULL;				//オプションダイアログ用
	return TRUE;
}

void CMyWnd::WriteOpt() {

	char fn[MAX_PATH];
	lstrcpy(fn, g_FileName.ToChar());
	switch(g_FileType) {
	case 1:	//C#
		lstrcpy(strstr(fn, ".cs"), ".opt");
		break;
	case 2:	//VB
		lstrcpy(strstr(fn, ".vb"), ".opt");
		break;
	default:
		return;
	}
	CINI optout(fn);
	optout.WriteInt("Compile Option", "Target", g_Target);
	optout.WriteInt("Compile Option", "Resource", g_Resource);
	optout.WriteStr("Compile Option", "RscFile", optiondlg.m_RscFile); 
	optout.WriteStr("Compile Option", "IconFile", optiondlg.m_IconFile); 
	optout.WriteInt("Compile Option", "DbgOpt", g_DbgOpt);
	optout.WriteInt("Compile Option", "WarnErr", g_WarnErr);
	for(int i = 0; i < DLLMAX; i++) {
		char str[10];
		if(i == 0)
			lstrcpy(str, "RefFile");
		else
			wsprintf(str, "RefFile%02d", i);
		if(*optiondlg.m_RefFile[i])
			optout.WriteStr("Compile Option", str, optiondlg.m_RefFile[i]);
		else
			optout.WriteStr("Compile Option", str, NULL);
	}
	optout.WriteStr("Compile Option", "Others", optiondlg.m_Others);
}

///////////////////////////////
//ユーザーダイアログの関数定義
//コントロール関数
///////////////////////////////
//IDD_SETUP ダイアログ
bool SETUPDLG::OnInit(WPARAM wParam, LPARAM lParam) {

	SendItemMsg(IDC_CSCPATH, WM_SETTEXT, 0, (LPARAM)g_Csc.ToChar());
	SendItemMsg(IDC_VBCPATH, WM_SETTEXT, 0, (LPARAM)g_Vbc.ToChar());
	SendItemMsg(IDC_EDITPATH, WM_SETTEXT, 0, (LPARAM)g_Edit.ToChar());
	return TRUE;
}

bool SETUPDLG::OnCscbtn() {

	char* cp = cmndlg.GetFileName(m_hWnd, "C#コンパイラー(csc.exe)\0*.exe\0\0", TRUE);
	if(cp) {
		g_Csc = cp;
		SendItemMsg(IDC_CSCPATH, WM_SETTEXT, 0, (LPARAM)cp);
	}
	return TRUE;
}

bool SETUPDLG::OnVbcbtn() {

	char* cp = cmndlg.GetFileName(m_hWnd, "Visual Basicコンパイラー(vbc.exe)\0*.exe\0\0", TRUE);
	if(cp) {
		g_Vbc = cp;
		SendItemMsg(IDC_VBCPATH, WM_SETTEXT, 0, (LPARAM)cp);
	}
	return TRUE;
}

bool SETUPDLG::OnEditbtn() {

	char* cp = cmndlg.GetFileName(m_hWnd, "エディター\0*.exe\0\0", TRUE);
	if(cp) {
		g_Edit = cp;
		SendItemMsg(IDC_EDITPATH, WM_SETTEXT, 0, (LPARAM)cp);
	}
	return TRUE;
}

bool SETUPDLG::OnIdok() {

	EndModal(TRUE);
	return TRUE;
}

bool SETUPDLG::OnCancel() {

	EndModal(FALSE);
	return TRUE;
}

////////////////////////
//IDD_OPTION ダイアログ
////////////////////////
bool OPTIONDLG::OnInit(WPARAM wParam, LPARAM lParam) {

	//コントロールの初期設定
	for(int i = 0; i < 4; i++)
		SendItemMsg(IDC_TARGET, CB_INSERTSTRING, i, (LPARAM)g_TargetList[i]);
	SendItemMsg(IDC_TARGET, CB_SETCURSEL, g_Target, 0);
	for(int i = 0; i < 3; i++)
		SendItemMsg(IDC_RESOURCE, CB_INSERTSTRING, i, (LPARAM)g_ResrcList[i]);
	SendItemMsg(IDC_RESOURCE, CB_SETCURSEL, g_Resource, 0);
	for(int i = 0; i < 4; i++)
		SendItemMsg(IDC_DBGOPT, CB_INSERTSTRING, i, (LPARAM)g_DbgOptList[i]);
	SendItemMsg(IDC_DBGOPT, CB_SETCURSEL, g_DbgOpt, 0);
	for(int i = 0; i < 6; i++)
		SendItemMsg(IDC_WARNERR, CB_INSERTSTRING, i, (LPARAM)g_WarnErrList[i]);
	SendItemMsg(IDC_WARNERR, CB_SETCURSEL, g_WarnErr, 0);
	if(*m_RscFile)
		SendItemMsg(IDC_RSCFILE, WM_SETTEXT, 0, (LPARAM)m_RscFile);
	if(*m_IconFile)
		SendItemMsg(IDC_ICONFILE, WM_SETTEXT, 0, (LPARAM)m_IconFile);
	for(int i = 0; *m_RefFile[i]; i++)
		SendItemMsg(IDC_REFERENCE, LB_ADDSTRING, 0, (LPARAM)m_RefFile[i]);
	SetHScroll();	//リストボックスの水平スクロールを設定する
	if(*m_Others)
		SendItemMsg(IDC_OTHERS, WM_SETTEXT, 0, (LPARAM)m_Others);
	return TRUE;
}

bool OPTIONDLG::OnRes(WPARAM wParam) {

	if(HIWORD(wParam) != CBN_SELCHANGE)
		return FALSE;
	if(!SendItemMsg(IDC_RESOURCE, CB_GETCURSEL, 0, 0)) {
		*m_RscFile = NULL;
		SendItemMsg(IDC_RSCFILE, WM_SETTEXT, 0, (LPARAM)m_RscFile);
	}
}

bool OPTIONDLG::OnRscFile() {

	if(!SendItemMsg(IDC_RESOURCE, CB_GETCURSEL, 0, 0)) {
		MessageBox(m_hWnd, "リソースファイルが必要な選択ではありません", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	char* cp = cmndlg.GetFileName(m_hWnd, "C#リソースファイル(*.resources)\0*.resources\0Win32リソースファイル(*.res)\0*.res\0全てのファイル(*.*)\0*.*\0\0", TRUE);
	if(!cp) {
		int res = MessageBox(m_hWnd, "選択がキャンセルされました\r\nリソースファイル名を初期化しますか？", "警告", MB_OKCANCEL | MB_ICONQUESTION);
        if(res == IDOK) {
			*m_RscFile = NULL;
			SendItemMsg(IDC_RSCFILE, WM_SETTEXT, 0, (LPARAM)m_RscFile);
		}
		return FALSE;
	}
	lstrcpy(m_RscFile, cp);
	SendItemMsg(IDC_RSCFILE, WM_SETTEXT, 0, (LPARAM)m_RscFile);
	return TRUE;
}

bool OPTIONDLG::OnIconFile() {

	char* cp = cmndlg.GetFileName(m_hWnd, "アイコンファイル(*.ico)\0*.ico\0\0", TRUE);
	if(!cp) {
		int res = MessageBox(m_hWnd, "指定がキャンセルされました\r\nアイコンファイル名を初期化しますか？", "警告", MB_OKCANCEL | MB_ICONQUESTION);
        if(res == IDOK) {
			*m_IconFile = NULL;
			SendItemMsg(IDC_ICONFILE, WM_SETTEXT, 0, (LPARAM)m_IconFile);
		}
		return FALSE;
	}
	lstrcpy(m_IconFile, cp);
	SendItemMsg(IDC_ICONFILE, WM_SETTEXT, 0, (LPARAM)m_IconFile);
	return TRUE;
}

bool OPTIONDLG::OnRefFile() {

	int n = SendItemMsg(IDC_REFERENCE, LB_GETCOUNT, 0, 0);		//項目数を取得
	if(n == DLLMAX) {											//最大参照ファイル数に到達
		MessageBox(m_hWnd, "これ以上参照ファイルを追加できません。", "エラー", MB_OKCANCEL | MB_ICONERROR);
		return FALSE;
	}
	char* cp = cmndlg.GetFileName(m_hWnd, "DLLファイル(*.dll)\0*.dll\0全てのファイル(*.*)\0*.*\0\0", TRUE);
	if(!cp) {
		int res = MessageBox(m_hWnd, "選択がキャンセルされました\r\n参照ファイルリストを初期化しますか？", "警告", MB_OKCANCEL | MB_ICONQUESTION);
        if(res == IDOK) {
			for(int i = n; i > 0; i--) {
				*m_RefFile[i - 1] = NULL;
				SendItemMsg(IDC_REFERENCE, LB_DELETESTRING, i - 1, 0);
			}
		}
		return FALSE;
	}
	lstrcpy(m_RefFile[n], cp);											//参照ファイル名を記録
	SendItemMsg(IDC_REFERENCE, LB_ADDSTRING, 0, (LPARAM)m_RefFile[n]);	//リストボックスに追加
	SetHScroll();														//リストボックスの水平スクロールを設定する
	return TRUE;
}

bool OPTIONDLG::OnDelFile() {

	int n = SendItemMsg(IDC_REFERENCE, LB_GETCOUNT, 0, 0);		//項目数を取得
	int sel = SendItemMsg(IDC_REFERENCE, LB_GETCURSEL, 0, 0);	//削除対象項目の取得
	if(sel == LB_ERR) {
		MessageBox(m_hWnd, "削除対象が未選択です", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	else {
		SendItemMsg(IDC_REFERENCE, LB_DELETESTRING, sel, 0);	//リストボックスから削除
		for(int i = sel; i < n - 1; i++)						//削除された参照ファイル
			lstrcpy(m_RefFile[i], m_RefFile[i + 1]);			//以降のファイル名を詰める
		*m_RefFile[n - 1] = NULL;								//最終ファイル名をNULLにする
		return TRUE;
	}
}

bool OPTIONDLG::OnIdok() {

	//オプション文字列の初期化
	MSCompAss.m_Opt = "";
	//targetオプション
	g_Target = SendItemMsg(IDC_TARGET, CB_GETCURSEL, 0, 0);
	if(g_Target) {
		MSCompAss.m_Opt = g_TargetList[g_Target];
		MSCompAss.m_Opt = MSCompAss.m_Opt + " ";
	}
	//resourceオプション
	g_Resource = SendItemMsg(IDC_RESOURCE, CB_GETCURSEL, 0, 0);
	//リソースオプションが指定されていて、リソースファイルが無い場合
	if(g_Resource) {
		if(!*m_RscFile) {
			MessageBox(m_hWnd, "リソースファイルがありません\r\nリソースファイルを指定してください", "エラー", MB_OK | MB_ICONERROR);
			return FALSE;
		}
		MSCompAss.m_Opt = MSCompAss.m_Opt + g_ResrcList[g_Resource];
		MSCompAss.m_Opt = MSCompAss.m_Opt + "\"";
		MSCompAss.m_Opt = MSCompAss.m_Opt + m_RscFile;
		MSCompAss.m_Opt = MSCompAss.m_Opt + "\" ";
	}
	else {	//選択されなかった場合、ファイル名、エディットコントロールを初期化する
		*m_RscFile = NULL;
		SendItemMsg(IDC_RSCFILE, WM_SETTEXT, MAX_PATH, (LPARAM)m_RscFile);
	}
	//プログラムアイコンオプション
	if(*m_IconFile) {
		MSCompAss.m_Opt = MSCompAss.m_Opt + "/win32icon:";
		MSCompAss.m_Opt = MSCompAss.m_Opt + "\"";
		MSCompAss.m_Opt = MSCompAss.m_Opt + m_IconFile;
		MSCompAss.m_Opt = MSCompAss.m_Opt + "\" ";
	}
	//debugオプション
	g_DbgOpt = SendItemMsg(IDC_DBGOPT, CB_GETCURSEL, 0, 0);
	if(g_DbgOpt) {
		MSCompAss.m_Opt = MSCompAss.m_Opt + g_DbgOptList[g_DbgOpt];
		MSCompAss.m_Opt = MSCompAss.m_Opt + " ";
	}
	//warningオプション
	g_WarnErr = SendItemMsg(IDC_WARNERR, CB_GETCURSEL, 0, 0);
	if(g_WarnErr) {
		MSCompAss.m_Opt = MSCompAss.m_Opt + g_WarnErrList[g_WarnErr];
		MSCompAss.m_Opt = MSCompAss.m_Opt + " ";
	}
	//参照オプション
	for(int i = 0; *m_RefFile[i]; i++) {
		MSCompAss.m_Opt = MSCompAss.m_Opt + "/reference:\"";
		MSCompAss.m_Opt = MSCompAss.m_Opt + m_RefFile[i];
		MSCompAss.m_Opt = MSCompAss.m_Opt + "\" ";
	}
	//その他オプション
	SendItemMsg(IDC_OTHERS, WM_GETTEXT, MAX_PATH, (LPARAM)m_Others);
	if(*m_Others)
		MSCompAss.m_Opt = MSCompAss.m_Opt + m_Others;
	EndModal(TRUE);
	return TRUE;
}

bool OPTIONDLG::OnCancel() {

	EndModal(FALSE);
	return TRUE;
}

//////////////////////////////////////////
//ユーザー定義関数
//IDC_REFERENCEの水平スクロールバーを設定
//////////////////////////////////////////
void OPTIONDLG::SetHScroll() {

	int n = SendItemMsg(IDC_REFERENCE, LB_GETCOUNT, 0, 0);	//項目数を取得
	int max = 0, maxlen = 0;
	for(int i = 0; i < n ; i++) {
		int len = lstrlen(m_RefFile[i]);
		if(len > maxlen) {
			max = i;
			maxlen = len;
		}
	}
	HDC hDC = GetDC(GetDlgItem(m_hWnd, IDC_REFERENCE));
	SIZE size;
	GetTextExtentPoint(hDC, m_RefFile[max], maxlen, &size);
	SendItemMsg(IDC_REFERENCE, LB_SETHORIZONTALEXTENT, size.cx , (LPARAM)0);
	ReleaseDC(GetDlgItem(m_hWnd, IDC_REFERENCE), hDC);
}

/////////////////////////
//IDD_VERSION ダイアログ
/////////////////////////
bool VERSIONDLG::OnIdok() {

	EndModal(TRUE);
	return TRUE;
}

bool VERSIONDLG::OnCancel() {

	EndModal(FALSE);
	return TRUE;
}
