//////////////////////////////////////////
// WCEditorProc.h
// Copyright (c) 06/30/2022 by ECCSkelton
//////////////////////////////////////////

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

	//コモンコントロールの初期化
	InitCommonControls();
	//ステータスバー登録−Init(hWnd, hIinstance, ID, (以下省略可）Style)
	SBar.Init(m_hWnd, m_hInstance, STATUSBAR);
	//ステータスバー区画設定
	int sec[3] = {100, 200, -1};
	SBar.SetSection(3, sec);
	//ステータスバー文字列設定
	SBar.SetText(0, L"WCEditor Ver 1.1");
	SBar.SetText(1, g_UTFTypes[0]);
	SBar.SetText(2, L"新規ファイル");
	//EDITコントロールの作成（登録、作成、）
	g_Edit.Init(L"EDIT", m_hInstance);
	g_Edit.Create(L"", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_HSCROLL | WS_VSCROLL |
					ES_MULTILINE | ES_WANTRETURN | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_LEFT,
					WS_EX_CLIENTEDGE, m_hWnd, (HMENU)IDC_EDIT, 0, 0, 0, 0);
	SendItemMsg(IDC_EDIT, EM_SETLIMITTEXT, 1048576, 0);		//1M bytes
	return TRUE;
}

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

	//ステータスバー自動調整
	SBar.AutoSize();
	//EDITコントロール位置調整
	RECT rec;
	GetWindowRect(SBar.GetHandle(), &rec);
	MoveWindow(GetDlgItem(m_hWnd, IDC_EDIT), 0, 0, LOWORD(lParam), HIWORD(lParam) - rec.bottom + rec.top, TRUE);
	return TRUE;
}

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

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

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

	//IDC_EDITに文字列があれば保存するか確認するする
	if(SendItemMsg(IDC_EDIT, WM_GETTEXTLENGTH, 0, 0)) {
		if(MessageBoxW(m_hWnd, L"現在のテキストを保存しますか？", L"確認", MB_YESNO | MB_ICONQUESTION) == IDYES)
			OnSave();
	}
	//IDC_EDITを初期化
	SendItemMsg(IDC_EDIT, WM_SETTEXT, 0, (LPARAM)L"");
	//ステータスバーに新規であることを表示
	SBar.SetText(2, L"新規ファイル");
	g_FileName = L"";
	return TRUE;
}

bool CMyWnd::OnOpen() {

	//開くファイルを指定する
	WCHAR* fn = g_Cmndlg.GetFileName(m_hWnd, L"テキストファイル(*.txt)\0*.txt\0全てのファイル\0*.*\0\0", TRUE);
	if(fn) {
		//ファイルパス、名をg_FileNameに保存する
		g_FileName = fn;
		//g_Fileにファイルを読み込む
		g_File.FromFile(g_FileName.ToChar());
		//IDC_EDITにファイルを表示
		SendDlgItemMessageW(m_hWnd, IDC_EDIT, WM_SETTEXT, 0, (LPARAM)g_File.ToChar());
		//ステータスバーにファイルパス名を表示
		SBar.SetText(2, g_FileName.ToChar());
		return TRUE;
	}
	else {
		MessageBoxW(m_hWnd, L"キャンセルされました。", L"エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
}

bool CMyWnd::OnSave() {

	if(!*g_FileName.ToChar())	//新規ファイルならOnSaveasへ移行
		OnSaveas();
	else {
		//WCHAR配列を文字列長分確保してIDC_EDITの文字列を取得する
		DWORD size = SendItemMsg(IDC_EDIT, WM_GETTEXTLENGTH, 0, 0);
		WCHAR* ptr = new WCHAR[size + 1]();
		//IDC_EDITのデータをg_Fileへ保存
		SendItemMsg(IDC_EDIT, WM_GETTEXT, size + 1, (LPARAM)ptr);
		//データをg_Fileに保存してWCHAR配列は破棄する
		g_File = ptr;
		delete [] ptr;
		//UTF区分、BOMの有無に従って保存
		switch(m_POS) {
		case 0:
			g_File.ToFile(g_FileName.ToChar());
			break;
		case 1:
			g_File.ToUTF8File(g_FileName.ToChar(), TRUE);
			break;
		case 2:
			g_File.ToUTF8File(g_FileName.ToChar(), FALSE);
			break;
		case 3:
			g_File.ToSJISFile(g_FileName.ToChar());
			break;
		}
	}
	return TRUE;
}

bool CMyWnd::OnSaveas() {

	//保存するファイルパス名を指定する
	WCHAR* fn = g_Cmndlg.GetFileName(m_hWnd, L"テキストファイル(*.txt)\0*.txt\0全てのファイル\0*.*\0\0", FALSE);
	if(fn) {
		g_FileName = fn;
		//WCHAR配列を文字列長分確保してIDC_EDITの文字列を取得する
		DWORD size = SendItemMsg(IDC_EDIT, WM_GETTEXTLENGTH, 0, 0);
		WCHAR* ptr = new WCHAR[size + 1]();
		//IDC_EDITのデータをg_Fileへ保存
		SendItemMsg(IDC_EDIT, WM_GETTEXT, size + 1, (LPARAM)ptr);
		//データをg_Fileに保存してWCHAR配列は破棄する
		g_File = ptr;
		delete [] ptr;
		//UTF区分、BOMの有無に従って保存
		bool ret;
		switch(m_POS) {
		case 0:
			ret = g_File.ToFile(g_FileName.ToChar());
			break;
		case 1:
			ret = g_File.ToUTF8File(g_FileName.ToChar(), TRUE);
			break;
		case 2:
			ret = g_File.ToUTF8File(g_FileName.ToChar(), FALSE);
			break;
		case 3:
			ret = g_File.ToSJISFile(g_FileName.ToChar());
			break;
		}
		if(!ret) {
			MessageBoxW(m_hWnd, L"ファイルの保存に失敗しました", L"エラー", MB_OK | MB_ICONERROR);
			return FALSE;
		}
		else {
			//ステータスバーにファイルパス名を表示
			SBar.SetText(2, g_FileName.ToChar());
			return TRUE;
		}
	}
	else {
		MessageBoxW(m_hWnd, L"キャンセルされました。", L"エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
}

bool CMyWnd::OnExit() {

	SendMsg(WM_CLOSE, 0, 0);	//終了処理
	return TRUE;
}

bool CMyWnd::OnCut() {

	SendItemMsg(IDC_EDIT, WM_CUT, 0, 0);	//Cut処理
	return TRUE;
}

bool CMyWnd::OnCopy() {

	SendItemMsg(IDC_EDIT, WM_COPY, 0, 0);	//Copy処理
	return TRUE;
}

bool CMyWnd::OnPaste() {

	SendItemMsg(IDC_EDIT, WM_PASTE, 0, 0);	//Paste処理
	return TRUE;
}

bool CMyWnd::OnUtf16() {

	m_POS = 0;
	ChangeCheck(m_POS);	//メニューアイテムにチェックを入れる
	SBar.SetText(1, g_UTFTypes[m_POS]);
	return TRUE;
}

bool CMyWnd::OnUtf8() {

	m_POS = 1;
	ChangeCheck(m_POS);	//メニューアイテムにチェックを入れる
	SBar.SetText(1, g_UTFTypes[m_POS]);
	return TRUE;
}

bool CMyWnd::OnUtf8n() {

	m_POS = 2;
	ChangeCheck(m_POS);	//メニューアイテムにチェックを入れる
	SBar.SetText(1, g_UTFTypes[m_POS]);
	return TRUE;
}

bool CMyWnd::OnSJIS() {

	m_POS = 3;
	ChangeCheck(m_POS);		//メニューアイテムにチェックを入れる
	SBar.SetText(1, g_UTFTypes[m_POS]);
	return TRUE;
}

bool CMyWnd::OnVersion() {

	//IDD_VERSIONダイアログを呼び出す
	versiondlg.DoModal(m_hWnd, L"IDD_VERSION", GetInstance());
	return TRUE;
}

///////////////////////////////////
//ユーザー定義関数
//メニューアイテムチェック切替
///////////////////////////////////
void CMyWnd::ChangeCheck(int pos) {

	static int prevpos = 0;							//直前の位置
	HMENU hMenu = GetSubMenu(GetMenu(m_hWnd), 2);	//表示メニューハンドルの取得
	//メニューアイテム
	MENUITEMINFO mii;
	mii.cbSize = sizeof(mii);
	mii.fMask = MIIM_STATE;
	//既にチェックされているアイテムのチェックを外す
	mii.fState = MFS_UNCHECKED;
	SetMenuItemInfo(hMenu, prevpos, TRUE, &mii);
	//指定アイテムをチェックする
	mii.fState = MFS_CHECKED;
	SetMenuItemInfo(hMenu, pos, TRUE, &mii);
	//直前の位置を記録
	prevpos = pos;
}

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

	WCHAR* str = L"WCEditor Version 1.1\nCopyright 2022 by Ysama";
	SendDlgItemMessageW(m_hWnd, IDC_LABEL, WM_SETTEXT, 0, (LPARAM)str);
	return TRUE;
}

bool VERSIONDLG::OnIdok() {

	EndModal(TRUE);
	return TRUE;
}

