//////////////////////////////////////////
// MSCompAss.h
// Copyright (c) 09/30/2022 by BCCSkelton
//////////////////////////////////////////
//BCCSkeltonのヘッダー−これに必要なヘッダーが入っている
#include	"BCCSkelton.h"
//リソースIDのヘッダー
#include	"ResMSCompAss.h"

//参照DLL（Assembly）最大数
#define	DLLMAX	16

/////////////////////////////////////////////////////////////////////
//CMyWndクラスをCDLGクラスから派生させ、メッセージ用の関数を宣言する
/////////////////////////////////////////////////////////////////////
class CMyWnd : public CDLG
{
public:	//以下はコールバック関数マクロと関連している
	//２重起動防止用のMutex用ID名称
	CMyWnd(char* UName) : CDLG(UName) {}
	//メンバー変数
	int m_Width;		//ダイアログクライアントエリア幅
	int m_Height;		//ダイアログクライアントエリア高さ
	CSTR m_Opt;			//オプション文字列記録用
	//メニュー項目、ダイアログコントロール関連
	bool OnOption();
	bool OnOpen();
	bool OnClose();
	bool OnExit();
	bool OnEdit();
	bool OnCompile();
	bool OnRun();
	bool OnSetting();
	bool OnHelp();
	bool OnVersion();
	//ウィンドウメッセージ関連
	bool OnInit(WPARAM, LPARAM);
	bool OnNotify(WPARAM, LPARAM);
	bool OnSize(WPARAM, LPARAM);
	bool OnClose(WPARAM, LPARAM);
	bool OnDestroy(WPARAM, LPARAM);
	bool OnDropFiles(WPARAM, LPARAM);
	bool OnMinMax(WPARAM, LPARAM);
	//ユーザー定義関数
	bool ReadOpt();
	void WriteOpt();
};

////////////////////////////////////////////////////////////////////////
//派生させたCMyWndクラスのインスタンスとコールバック関数(マクロ）の作成
//主ウィンドウはダイアログと違い、コールバック関数は一つしか作れない
////////////////////////////////////////////////////////////////////////
CMyWnd MSCompAss("MSCompAss");	//ウィンドウクラスインスタンスの生成

BEGIN_MODELESSDLGMSG(ModelessProc, MSCompAss)	//コールバック関数名は主ウィンドウの場合ModelessProcにしている
	//メニュー項目、ダイアログコントロール関連
	ON_COMMAND(MSCompAss, IDC_OPTBTN, OnOption())
	ON_COMMAND(MSCompAss, IDM_OPEN, OnOpen())
	ON_COMMAND(MSCompAss, IDM_CLOSE, OnClose())
	ON_COMMAND(MSCompAss, IDM_EXIT, OnExit())
	ON_COMMAND(MSCompAss, IDM_EDIT, OnEdit())
	ON_COMMAND(MSCompAss, IDM_COMPILE, OnCompile())
	ON_COMMAND(MSCompAss, IDM_RUN, OnRun())
	ON_COMMAND(MSCompAss, IDM_SETTING, OnSetting())
	ON_COMMAND(MSCompAss, IDM_HELP, OnHelp())
	ON_COMMAND(MSCompAss, IDM_VERSION, OnVersion())
	//ウィンドウメッセージ関連
	//自動的にダイアログ作成時にOnInit()、終了時にOnClose()を呼びます
	ON_NOTIFY(MSCompAss)
	ON_SIZE(MSCompAss)
	ON_DESTROY(MSCompAss)
	ON_(MSCompAss, WM_DROPFILES, OnDropFiles(wParam, lParam))
	ON_(MSCompAss, WM_GETMINMAXINFO, OnMinMax(wParam, lParam))
END_DLGMSG

///////////////////
//ツールバーの作成
///////////////////
CTBAR TBar;

///////////////////////
//ステータスバーの作成
///////////////////////
CSBAR SBar;

////////////////////////
//コモンダイアログの作成
////////////////////////
CMNDLG cmndlg;

///////////////////////////////////////////
// CDLGクラスからSETUPDLGクラスを派生
// 複数の同一ダイアログ変数とダイアログも作
// れるが、一つのダイアログに一つの派生ダイ
// アログクラスを作成するのが基本
///////////////////////////////////////////
class SETUPDLG : public CDLG {
public:
	bool OnInit(WPARAM, LPARAM);
	bool OnCscbtn();
	bool OnVbcbtn();
	bool OnEditbtn();
	bool OnIdok();
	bool OnCancel();
};

////////////////////////////////////////////////////////////////////////////
// SETUPDLGクラスダイアログ変数の生成とそのコールバック関数（マクロ）を定義
// 複数同一クラスのダイアログを作成することを予期してコールバック関数を明記
////////////////////////////////////////////////////////////////////////////
SETUPDLG setupdlg;

BEGIN_MODALDLGMSG(setupdlgProc, setupdlg)	//第1引数がコールバック関数の名前
	ON_COMMAND(setupdlg, IDC_CSCBTN, OnCscbtn())
	ON_COMMAND(setupdlg, IDC_VBCBTN, OnVbcbtn())
	ON_COMMAND(setupdlg, IDC_EDITBTN, OnEditbtn())
	ON_COMMAND(setupdlg, IDOK, OnIdok())
	ON_COMMAND(setupdlg, IDCANCEL, OnCancel())
END_DLGMSG

///////////////////////////////////////////
// CDLGクラスからOPTIONDLGクラスを派生
// 複数の同一ダイアログ変数とダイアログも作
// れるが、一つのダイアログに一つの派生ダイ
// アログクラスを作成するのが基本
///////////////////////////////////////////
class OPTIONDLG : public CDLG {
public:
	char m_RscFile[MAX_PATH] = {0};			//メンバー変数（オプションファイル名）
	char m_IconFile[MAX_PATH] = {0};		//メンバー変数（アイコンファイル名）
	char m_RefFile[DLLMAX][MAX_PATH] = {0};	//メンバー変数（参照DLLファイル名）
	char m_Others[MAX_PATH] = {0};			//その他オプション文字列記録用
	bool OnInit(WPARAM, LPARAM);
	bool OnRes(WPARAM);
	bool OnRscFile();
	bool OnIconFile();
	bool OnRefFile();
	bool OnDelFile();
	bool OnIdok();
	bool OnCancel();
	//ユーザー定義関数
	void SetHScroll();
};

/////////////////////////////////////////////////////////////////////////////
// OPTIONDLGクラスダイアログ変数の生成とそのコールバック関数（マクロ）を定義
// 複数同一クラスのダイアログを作成することを予期してコールバック関数を明記
/////////////////////////////////////////////////////////////////////////////
OPTIONDLG optiondlg;

BEGIN_MODALDLGMSG(optiondlgProc, optiondlg)	//第1引数がコールバック関数の名前
	ON_COMMAND(optiondlg, IDC_RESOURCE, OnRes(wParam))
	ON_COMMAND(optiondlg, IDC_FINDBTN, OnRscFile())
	ON_COMMAND(optiondlg, IDC_ICONBTN, OnIconFile())
	ON_COMMAND(optiondlg, IDC_REFBTN, OnRefFile())
	ON_COMMAND(optiondlg, IDC_DELBTN, OnDelFile())
	ON_COMMAND(optiondlg, IDOK, OnIdok())
	ON_COMMAND(optiondlg, IDCANCEL, OnCancel())
END_DLGMSG

///////////////////////////////////////////
// CDLGクラスからVERSIONDLGクラスを派生
// 複数の同一ダイアログ変数とダイアログも作
// れるが、一つのダイアログに一つの派生ダイ
// アログクラスを作成するのが基本
///////////////////////////////////////////
class VERSIONDLG : public CDLG {
public:
	bool OnIdok();
	bool OnCancel();
};

////////////////////////////////////////////////////////////////////////////
// VERSIONDLGクラスダイアログ変数の生成とそのコールバック関数（マクロ）を定義
// 複数同一クラスのダイアログを作成することを予期してコールバック関数を明記
////////////////////////////////////////////////////////////////////////////
VERSIONDLG versiondlg;

BEGIN_MODALDLGMSG(versiondlgProc, versiondlg)	//第1引数がコールバック関数の名前
	ON_COMMAND(versiondlg, IDOK, OnIdok())
	ON_COMMAND(versiondlg, IDCANCEL, OnCancel())
END_DLGMSG

/////////////////////////////
//コマンドラインクラスの作成
/////////////////////////////
CARG Arg;

//////////////////////////////
//iniファイル作成クラスの作成
//////////////////////////////
CINI Ini;

/////////////////////////////
//拡張子チェッククラスの作成
/////////////////////////////
CEXTCHK g_ExtChk;

///////////////////////
//CCMDEDITクラスの作成
///////////////////////
CCMDEDIT ce(64);	//エディットコントロール用に64Kバイトのバッファーを確保

////////////////////
//CTTIPクラスの作成
////////////////////
CTTIP g_Tip[2];		//「ファイル名」と「Option」のツールチップ

//---------------
//グローバル変数
//---------------
//システム関係（iniファイル用）
CSTR g_OwnPath;			//BCCMakerフォールダーへのパス
CSTR g_IniFile;			//MCCMaker.iniファイルのパス・ファイル名
CSTR g_HelpFile;		//ヘルプファイルのパス・ファイル名
//コンパイラー関係
CSTR g_Csc;				//csc.exeのパス・ファイル名
CSTR g_Vbc;				//vbc.exeのパス・ファイル名
CSTR g_Edit;			//エディターのパス・ファイル名
//ファイル起動用変数
int g_ByFile;			//ドロップファイルがある場合のフラグ
//ファイル読み込み用変数
char* g_Filter;			//フィルター用変数
int g_FileType;			//拡張子用変数（".cs" - 1、".vb" - 2それ以外 - 0）
//ソースファイル関係
CSTR g_TargetPath;		//ソースファイルへのパス（コンパイル中はそこにいる）
CSTR g_FileName;		//ソースファイルのフルパスファイル名
//オプション関係（適用が無い場合-1、ある場合配列の引数になる）
//- 出力ファイル -
int g_Target = 0;								//以下のインデックス
char* g_TargetList[] = {"",						//無選択
						"/target:exe",			//コンソールアプリケーション (既定)
						"/target:winexe",		//Windowsアプリケーション
						"/target:library"};		//ライブラリ(DLL)
//- リソース -
int g_Resource = 0;								//以下のインデックス
char* g_ResrcList[] = {"",						//無選択
						"/resource:",			//リソースファイル(.res)の指定が必要
						"/win32res:"};			//リソース情報の指定が必要
//- コード生成 -
int g_DbgOpt = 0;								//以下のインデックス
char* g_DbgOptList[] = {"",						//無選択
						"/debug+",				//[+|-]の指定が必要
						"/optimize+",			//[+|-]の指定が必要
						"/debug+ /optimize+"};	//[+|-]の指定が必要
//- エラーと警告 -
int g_WarnErr = 0;								//以下のインデックス
char* g_WarnErrList[] = {"",					//無選択
						"/warn:0",				//[0-4]の指定が必要(0-しない)
						"/warn:1",				//重大度の高いもの
						"/warn:2",				//より重大度の低いもの
						"/warn:3",				//更に重大度の低いもの
						"/warn:4"};				//最も重大度の低いもの
