// ★コメント未記入
// EmphasisDefine.cpp: CEmphasisDefine クラスのインプリメンテーション
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Shitarabian.h"
#include "EmphasisDefine.h"
#include "Common.h"
#include "ExeCommon.h"
#include "SettingPath.h"

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

//////////////////////////////////////////////////////////////////////
// 構築/消滅
//////////////////////////////////////////////////////////////////////

CEmphasisDefine::CEmphasisDefine()
:	m_bEnabled( TRUE )
,	m_aItemz()
,	m_bMultiLineEmphasisStarterPrepared( FALSE )
,	m_bMultiLineEmphasisStarterRegExpExist( FALSE )
,	m_bMultiLineEmphasisStarterNormalExist( FALSE )
{
// 定義を追加したらヘッダの定数定義も変更すること
	CEmphasisItem	Item;

	// 通常文字
	Item.SetPattern((CString)"通常の文字");
	Item.SetForeColor( RGB(0,0,0) );
	Item.SetBackColor( RGB(255,255,255) );
	Item.SetEnableToggle( FALSE );
	m_aItemz.Add( Item );

	// 選択文字
	Item.SetPattern((CString)"選択範囲");
	Item.SetForeColor( RGB(255,255,255) );
	Item.SetBackColor( RGB(64,128,128) );
	Item.SetEnableToggle( FALSE );
	m_aItemz.Add( Item );

	// 行番号
	Item.SetPattern((CString)"行番号");
	Item.SetForeColor( RGB(255,255,255) );
	Item.SetBackColor( RGB(0,0,0) );
	Item.SetEnableToggle( FALSE );
	m_aItemz.Add( Item );

	// マーク行
	Item.SetPattern((CString)"マーク行");
	Item.SetForeColor( RGB(255,255,255) );
	Item.SetBackColor( RGB(0,255,255) );
	Item.SetEnableToggle( FALSE );
	m_aItemz.Add( Item );

	// 編集行
	Item.SetPattern((CString)"編集行");
	Item.SetForeColor( RGB(255,255,255) );
	Item.SetBackColor( RGB(128,128,128) );
	Item.SetEnableToggle( FALSE );
	m_aItemz.Add( Item );

	// ルーラー
	Item.SetPattern((CString)"ルーラー");
	Item.SetForeColor( RGB(255,255,255) );
	Item.SetBackColor( RGB(200,200,200) );
	Item.SetEnableToggle( FALSE );
	m_aItemz.Add( Item );

// ▼ (3632) BGN 2003.12.28 (moralog) キャレット位置表示色定義追加
	// キャレット位置
	Item.SetPattern((CString)"キャレット位置");
	Item.SetForeColor( RGB(255,255,255) );
	Item.SetBackColor( RGB(128,128,128) );
	Item.SetEnableToggle( FALSE );
	m_aItemz.Add( Item );
// ▲ (3632) END

	// EOF
	Item.SetPattern((CString)"[EOF]");
	Item.SetForeColor( RGB(255,255,255) );
	Item.SetBackColor( RGB(128,128,128) );
	Item.SetEnableToggle( TRUE );
	m_aItemz.Add( Item );

	// 改行文字
	Item.SetPattern((CString)"改行");
	Item.SetForeColor( RGB(128,128,128) );
	Item.SetBackColor( RGB(255,255,255) );
	Item.SetEnableToggle( TRUE );
	m_aItemz.Add( Item );

	// 検索HIT文字
	Item.SetPattern((CString)"検索HIT文字");
	Item.SetForeColor( RGB(0,0,0) );
	Item.SetBackColor( RGB(255,255,0) );
	Item.SetEnableToggle( TRUE );
	m_aItemz.Add( Item );
}

CEmphasisDefine::~CEmphasisDefine()
{

}



BOOL	CEmphasisDefine::Write()
{
	try
	{
		CString		strFilename = CSettingPath::GetInstance()->GetFolderPath() + "emphasis.ini";
		CStdioFile	file( strFilename, CFile::modeCreate | CFile::modeWrite );

		// バージョンの書きだし
		CString		strVersion;
		strVersion.LoadString( IDS_RELEASE_VERSION );
		file.WriteString( strVersion + "\n" );

		// 有効無効
		file.WriteString( BoolToString( m_bEnabled ) + "\n" );

		int	idxChar;
		for( idxChar=0 ; idxChar<m_aItemz.GetSize() ; idxChar++ )
		{
			BOOL	bSuccess = m_aItemz[idxChar].Write( &file );
			if ( !bSuccess )
			{
				return( FALSE );
			}
		}

		return( TRUE );
	}
	catch( CFileException* e )
	{
		e->Delete();
		ErrorLog( "ファイル出力", "CEmphasisDefine::Write()" );
		return( FALSE );
	}
}



BOOL	CEmphasisDefine::Read()
{
	CString		strGeneralFilename = CSettingPath::GetInstance()->GetFolderPath() + "emphasis.ini";

	CFileStatus	status;
	BOOL	bExists = CFile::GetStatus( strGeneralFilename, status );
	if ( !bExists )
	{
		// ファイル自体が無い
		return( FALSE );
	}

	try
	{
		CStdioFile	file( strGeneralFilename, CFile::modeRead | CFile::shareDenyNone );

		BOOL	bSuccess = TRUE;

		// バージョンの読み込み
		CString		strVersion;
		bSuccess = file.ReadString( strVersion );
		if ( !bSuccess )
		{
			return( FALSE );
		}

		// 有効無効
		CString	strEnable;
		bSuccess = file.ReadString( strEnable );
		if ( !bSuccess )
		{
			return( FALSE );
		}
		m_bEnabled = StringToBool( strEnable );

		m_aItemz.RemoveAll();
		while( TRUE )
		{
			CEmphasisItem	Item;

			bSuccess = Item.Read( file );
			if ( !bSuccess )
			{
				break;
			}

			m_aItemz.Add( Item );
		}

// ▼ (3632) BGN 2003.12.28 (moralog) バージョン管理追加
		// バージョン管理
		{
			long	lVersion = ::StringToVersion( strVersion );
			if ( lVersion <= 31228 )
			{
				// キャレット位置表示の定義がないので追加する
				CEmphasisItem	Item;
				Item.SetPattern((CString)"キャレット位置");
				Item.SetForeColor( RGB(255,255,255) );
				Item.SetBackColor( RGB(128,128,128) );
				Item.SetEnableToggle( TRUE );
				m_aItemz.InsertAt( EMPHASIS_CARETPOSITION, Item );
			}
		}
// ▲ (3632) END

		return( TRUE );
	}
	catch( CFileException* e )
	{
		e->Delete();
		ErrorLog( "ファイル入力", "CEmphasisDefine::Read()" );
		return( FALSE );
	}

	return( TRUE );
}


void CEmphasisDefine::Copy( CEmphasisDefine& SrcDefine )
{
	m_bEnabled = SrcDefine.m_bEnabled;
	GetItemz().Copy( SrcDefine.GetItemz());	
}


void CEmphasisDefine::SetEnable( BOOL bEnabled )
{
	m_bEnabled = bEnabled; 
};



// 複数行強調表示の正規表現でないパターンが存在するか
BOOL CEmphasisDefine::IsMultiLineEmphasisStarterNormalExist()
{
	if ( !m_bMultiLineEmphasisStarterPrepared )
	{
		MultiLineEmphasisStarterPrepare();
	}
	return( m_bMultiLineEmphasisStarterNormalExist );
}


// 複数行強調表示の正規表現パターン（連結ずみ）を戻す
CString& CEmphasisDefine::GetMultiLineEmphasisStarterRegExp()
{
	if ( !m_bMultiLineEmphasisStarterPrepared )
	{
		MultiLineEmphasisStarterPrepare();
	}
	return( m_strMultiLineEmphasisStarterRegExp );
}

// 複数行強調表示のパターン抽出
void CEmphasisDefine::MultiLineEmphasisStarterPrepare()
{
	m_bMultiLineEmphasisStarterRegExpExist = FALSE;
	m_bMultiLineEmphasisStarterNormalExist = FALSE;
	m_strMultiLineEmphasisStarterRegExp.Empty();

	// 強調表示設定から複数行強調表示のもののみ条件を抽出する
	int		idxEmphasis;
	CArray<CEmphasisItem, CEmphasisItem&>&	aEmphasisz = GetItemz();
	for( idxEmphasis=EMPHASIS_NEEDCOLORINGITEM ; idxEmphasis<aEmphasisz.GetSize() ; idxEmphasis++ )
	if( aEmphasisz[ idxEmphasis ].GetEnable() )					// 定義が有効
	if( !aEmphasisz[ idxEmphasis ].GetTerminator().IsEmpty() )	// 終端がある == 複数行強調表示
	{
		// 正規表現の場合、連結したパターンを作成しておく
		if ( aEmphasisz[ idxEmphasis ].GetFindCondition()->bRegExp )
		{
			CString	strPattern( aEmphasisz[ idxEmphasis ].GetPattern() );
			if( !strPattern.IsEmpty() )
			{
				if( !m_strMultiLineEmphasisStarterRegExp.IsEmpty() )
				{
					m_strMultiLineEmphasisStarterRegExp += "|";
				}
				CString	strTmp;
				strTmp.Format(
					"%s(%s)", m_strMultiLineEmphasisStarterRegExp,strPattern
				);
				m_strMultiLineEmphasisStarterRegExp = strTmp;

				m_bMultiLineEmphasisStarterRegExpExist = TRUE;
			}
		}
		else
		{
			// 正規表現でない場合、存在するというフラグのみ立てておく
			m_bMultiLineEmphasisStarterNormalExist = TRUE;
		}
	}

	m_bMultiLineEmphasisStarterPrepared = TRUE;
	return;
}