/*-----------------------------------------------------------------------------
[名称]	SettingDlg.cpp
[概要]	設定ダイアログクラスの実装
[備考]	なし
[履歴]	2003-02-28	NC		コメント付加(moralog)
-----------------------------------------------------------------------------*/


//-----------------------------------------------------------------------------
// インクルード
//-----------------------------------------------------------------------------
#include "stdafx.h"
#include "Shitarabian.h"
#include "SettingDlg.h"
#include "GeneralSetting.h"
#include "SettingPath.h"
#include "ShitarabianDoc.h"
#include "ShitarabianView.h"
#include "ExeCommon.h"
#include "ShitarabianPlugInManager.h"
#include "MainFrm.h"
#include "EditDrawer.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


/*-----------------------------------------------------------------------------
[名称]	コンストラクタ
[機能]	CDialog::CDialog()のヘルプ参照。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
CSettingDlg::CSettingDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CSettingDlg::IDD, pParent)
	, m_pGeneralSetting( NULL )
	, m_pDoc( NULL )
{
	//{{AFX_DATA_INIT(CSettingDlg)
	m_strSettingName = _T("");
	m_strExt = _T("");
	//}}AFX_DATA_INIT
}


/*-----------------------------------------------------------------------------
[名称]	データ変換
[機能]	CDialog::DoDataExchange()のヘルプ参照。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CSettingDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CSettingDlg)
	DDX_Control(pDX, IDC_SETTING_TAB, m_tabSheet);
	DDX_CBString(pDX, IDC_SETTING_SETTINGNAME, m_strSettingName);
	DDX_Text(pDX, IDC_SETTING_EXT, m_strExt);
	DDX_Control(pDX, IDC_SETTING_SETTINGNAME, m_comboSettingName);
	DDX_Control(pDX, IDC_SETTING_SAVE, m_btnSave);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CSettingDlg, CDialog)
	//{{AFX_MSG_MAP(CSettingDlg)
	ON_BN_CLICKED(IDC_SETTING_SAVE, OnSettingSave)
	ON_CBN_EDITCHANGE(IDC_SETTING_SETTINGNAME, OnEditchangeSettingSettingname)
	ON_CBN_SELCHANGE(IDC_SETTING_SETTINGNAME, OnSelchangeSettingSettingname)
	ON_BN_CLICKED(IDC_SETTING_REFLECT, OnSettingReflect)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/*-----------------------------------------------------------------------------
[名称]	初期化ハンドラ
[機能]	ダイアログの初期化。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
BOOL CSettingDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();

	// 現在の設定を一時書き出す
	m_pGeneralSetting->Write();
	CShitarabianPlugInManager::GetInstance()->OnSave( m_pDoc );

	// ページの追加
	m_tabSheet.InsertItem( TCIF_TEXT|TCIF_PARAM, 0, "表示", 0, (LPARAM)&m_SettingViewDlg );
	m_tabSheet.InsertItem( TCIF_TEXT|TCIF_PARAM, 1, "表示色", 0, (LPARAM)&m_SettingEmphasisDlg );
	m_tabSheet.InsertItem( TCIF_TEXT|TCIF_PARAM, 2, "空白文字", 0, (LPARAM)&m_SettingWhiteSpaceDlg );
	m_tabSheet.InsertItem( TCIF_TEXT|TCIF_PARAM, 3, "BOX表示文字", 0, (LPARAM)&m_SettingBoxCharDlg );
	m_tabSheet.InsertItem( TCIF_TEXT|TCIF_PARAM, 4, "印刷", 0, (LPARAM)&m_SettingPrintDlg );

	// 各子ダイアログの初期化
	CreatePagez();

	// シート上のコントロールを設定したいので（設定の列挙など）読み込む
	ReadFromGeneral();

	// とりあえず１ページ目を表示
	m_SettingViewDlg.ShowWindow( SW_SHOW );
	PostMessage( WM_PAINT, 0, 0 );

	return TRUE;  // コントロールにフォーカスを設定しないとき、戻り値は TRUE となります
	          // 例外: OCX プロパティ ページの戻り値は FALSE となります
}


/*-----------------------------------------------------------------------------
[名称]	「設定保存」ボタンハンドラ
[機能]	設定の保存処理。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CSettingDlg::OnSettingSave() 
{
	// 適用処理
	OnSettingReflect();

	if ( m_pGeneralSetting != NULL )
	{
		BOOL	bPrepare = 
		CSettingPath::GetInstance()->PrepareFolder(
			m_strSettingName
		);

		if ( bPrepare )
		{
			// 設定の保存
			m_pGeneralSetting->Write();

			// コンボボックスの初期化
			ReadFromGeneral();
		}
		else
		{
			::ErrorLog(
				"設定ファイルの保存失敗",
				"CSettingDlg::OnSettingSave()"
			);
		}

		// 設定フォルダを元に戻す
		CSettingPath::GetInstance()->ResetGeneralFolder();
	}
}


/*-----------------------------------------------------------------------------
[名称]	設定名称編集変更ハンドラ
[機能]	コンボボックスの設定名称の編集に伴う表示制御。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CSettingDlg::OnEditchangeSettingSettingname()
{
	VisibleControl();
}


/*-----------------------------------------------------------------------------
[名称]	設定変更ハンドラ
[機能]	コンボボックスの設定名称の選択変更に伴う設定読み込み。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CSettingDlg::OnSelchangeSettingSettingname() 
{
	int		idxCurItem = m_comboSettingName.GetCurSel();

	if ( idxCurItem != CB_ERR )
	if ( m_pGeneralSetting != NULL )
	{
		CString		str;
		m_comboSettingName.GetLBText(
			idxCurItem,
			str
		);
		// 設定フォルダを変更してロード
		CSettingPath::GetInstance()->SetFolderIndex(
			idxCurItem
		);
		m_pGeneralSetting->Read();

		// プラグイン設定の読み込み
		CShitarabianPlugInManager::GetInstance()->OnLoad( m_pDoc );

		// ダイアログコントロールの再設定
		ReadFromGeneral();
		m_strSettingName = str;
		UpdateData( FALSE );

		// 描画情報再構築
		ReBuildView();

		// 再描画
		m_pDoc->SetAllUpdate();
		m_pDoc->ReDraw();

		// 設定フォルダを元に戻す
		CSettingPath::GetInstance()->ResetGeneralFolder();
	}

	// ダイアログの再設定
	DestroyPagez();
	CreatePagez();

	VisibleControl();
}


/*-----------------------------------------------------------------------------
[名称]	表示制御
[機能]	ボタンのEnale制御。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CSettingDlg::VisibleControl()
{
	CString		strName;
	m_comboSettingName.GetWindowText( strName );
	m_btnSave.EnableWindow( !strName.IsEmpty() );
}


/*-----------------------------------------------------------------------------
[名称]	「CANCEL」ハンドラ
[機能]	保存された設定を再度読み込む。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CSettingDlg::OnCancel() 
{
	// 書き出しておいた設定を再度読み込む
	m_pGeneralSetting->Read();
	CShitarabianPlugInManager::GetInstance()->OnLoad( m_pDoc );

	// 描画情報再構築
	ReBuildView();

	// 再描画
	m_pDoc->SetAllUpdate();
	m_pDoc->ReDraw();

	CDialog::OnCancel();
}


/*-----------------------------------------------------------------------------
[名称]	設定読み込み
[機能]	設定種類をコンボボックスへ列挙する。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CSettingDlg::ReadFromGeneral()
{
	m_strExt = m_pGeneralSetting->GetExt();

	{
	// 設定ファイルのフォルダを検索
	// コンボボックスに列挙する
		m_comboSettingName.ResetContent();
		int	idxFolder;
		for( idxFolder=0 ; idxFolder<CSettingPath::GetInstance()->Count() ; idxFolder++)
		{
			CString	str = CSettingPath::GetInstance()->GetFolderName(idxFolder);
			m_comboSettingName.AddString( str );
		}

		// コンボボックスに設定名称を表示
		m_strSettingName = m_pGeneralSetting->GetSettingName();
	}

	UpdateData( FALSE );
	VisibleControl();
}


/*-----------------------------------------------------------------------------
[名称]	終了処理ハンドラ
[機能]	終了処理。リソースの解放。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
BOOL CSettingDlg::DestroyWindow() 
{
	m_tabSheet.DeleteAllItems();

	DestroyPagez();
	
	return CDialog::DestroyWindow();
}


/*-----------------------------------------------------------------------------
[名称]	「ＯＫ」ボタンハンドラ
[機能]	設定情報の保存と反映。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CSettingDlg::OnOK() 
{
	OnSettingReflect();
	CDialog::OnOK();
}


/*-----------------------------------------------------------------------------
[名称]	「適用」ボタンハンドラ
[機能]	設定情報の保存と反映。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CSettingDlg::OnSettingReflect()
{
	// ダイアログのOK処理
	m_SettingViewDlg.Confirm();
	m_SettingEmphasisDlg.Confirm();
	m_SettingWhiteSpaceDlg.Confirm();
	m_SettingBoxCharDlg.Confirm();
	m_SettingPrintDlg.Confirm();

	// ダイアログ設定の反映
	{
		// Emphasis
		CGeneralSetting::GetInstance()->GetEmphasisDefine()->Copy( m_EmphasisDefine );
		CGeneralSetting::GetInstance()->GetEmphasisDefine()->MultiLineEmphasisStarterPrepare();

		// BoxChar
		CGeneralSetting::GetInstance()->GetBoxCharDefine()->Copy( *m_SettingBoxCharDlg.m_BoxCharList.GetDefine() );

		// 設定の保存
		UpdateData( TRUE );
		m_pGeneralSetting->SetExt( m_strExt );
		m_pGeneralSetting->SetSettingName( m_strSettingName );
		m_pGeneralSetting->Write();
	}

	// 描画情報再構築
	ReBuildView();

	// 再描画
	m_pDoc->SetAllUpdate();
	m_pDoc->ReDraw();
}


/*-----------------------------------------------------------------------------
[名称]	ページダイアログの破棄
[機能]	各子ダイアログの破棄処理。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CSettingDlg::DestroyPagez()
{
	m_SettingViewDlg.DestroyWindow();
	m_SettingEmphasisDlg.DestroyWindow();
	m_SettingWhiteSpaceDlg.DestroyWindow();
	m_SettingBoxCharDlg.DestroyWindow();
	m_SettingPrintDlg.DestroyWindow();
}


/*-----------------------------------------------------------------------------
[名称]	ページダイアログの初期化
[機能]	各子ダイアログの初期化処理。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CSettingDlg::CreatePagez()
{
	// 表示設定
	m_SettingViewDlg.Create( IDD_SETTING_VIEW, &m_tabSheet );

	// 表示色
	m_EmphasisDefine.Copy( *CGeneralSetting::GetInstance()->GetEmphasisDefine() );
	m_SettingEmphasisDlg.Attach( &m_EmphasisDefine );
	m_SettingEmphasisDlg.Create( IDD_EMPHASIS, &m_tabSheet );

	// 空白文字
	m_SettingWhiteSpaceDlg.Create( IDD_BLANK, &m_tabSheet );

	// BOX表示文字
	m_SettingBoxCharDlg.m_BoxCharList.GetDefine()->Copy( *CGeneralSetting::GetInstance()->GetBoxCharDefine() );
	m_SettingBoxCharDlg.Create( IDD_BOXCHAR, &m_tabSheet );

	// 印刷
	m_SettingPrintDlg.Attach( CGeneralSetting::GetInstance()->GetPrintDefine() );
	m_SettingPrintDlg.Create( IDD_PRINT, &m_tabSheet );

	m_tabSheet.ReflectPagez();
}


/*-----------------------------------------------------------------------------
[名称]	設定情報反映
[機能]	設定情報をViewに反映し、表示情報を再構築する。
[戻値]	なし
[備考]	スクロール位置を復元する。
-----------------------------------------------------------------------------*/
void CSettingDlg::ReBuildView()
{
	// 設定コンボボックス変更
	::GetMainFrame()->ResetSettingCombo();

	// 表示している最上行を取得（表示行位置復元のため）
	long	lStartRow = m_pDoc->GetMainView()->VisibleRowStart();

	// Drawerにフォント変更通知
	CEditDrawer::GetInstance()->RecalcFontSize();

	// ドキュメント表示情報の再構築
	m_pDoc->ReflectEmphasis();
	m_pDoc->AnalizeEmphasisLinez( 0, m_pDoc->GetLineCount()-1 );

	// 表示行を復元する
	{
		// スクロールボックス移動
		CPoint		ptScroll;
		ptScroll.y = CEditDrawer::GetInstance()->CaretRowToPixelZoomed( lStartRow );
		ptScroll.x = 0;

	// please! すべてのVIewに適用しないといけないと思うが
		m_pDoc->GetMainView()->SetDeviceScrollPosition( ptScroll );
	}
}
