/*-----------------------------------------------------------------------------
[名称]	BoxCharDefine.cpp
[概要]	BOX表示文字定義管理クラスの実装
[備考]	なし
[履歴]	2003-02-10	NC		コメント付加(moralog)
		2003-12-26  b031228 (3285) HTML文字符号の先頭がBOX表示される修正 (dincom)
-----------------------------------------------------------------------------*/

//-----------------------------------------------------------------------------
// インクルード
//-----------------------------------------------------------------------------
#include "stdafx.h"
#include "shitarabian.h"
#include "BoxCharDefine.h"
#include "ExeCommon.h"
#include "Common.h"
#include "SettingPath.h"
#include "Unicoder.h"

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


/*-----------------------------------------------------------------------------
[名称]	コンストラクタ
[機能]	インスタンスの生成。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
CBoxCharDefine::CBoxCharDefine()
:	m_bEnabled( TRUE )
,	m_aItemz()
{
	TBoxChar	Item;

	// 全角空白
	Item.strChar = "　";
	Item.bEnable = FALSE;
	m_aItemz.Add( Item );

	// 半角空白
	Item.strChar = " ";
	Item.bEnable = FALSE;
	m_aItemz.Add( Item );

	// タブ
	Item.strChar = "\t";
	Item.bEnable = FALSE;
	m_aItemz.Add( Item );
}

/*-----------------------------------------------------------------------------
[名称]	デストラクタ
[機能]	インスタンスの破棄。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
CBoxCharDefine::~CBoxCharDefine()
{

}

/*-----------------------------------------------------------------------------
[名称]	複製（コピー）
[機能]	属性値のコピー。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CBoxCharDefine::Copy(
	CBoxCharDefine& SrcDefine	// I  :複製元オブジェクト [-] (-) :-
)
{
	m_bEnabled = SrcDefine.GetEnable();
	m_aItemz.RemoveAll();
	m_aItemz.Append( SrcDefine.GetItemz() );
}

/*-----------------------------------------------------------------------------
[名称]	BOX表示文字検査
[機能]	任意の文字がBOX表示されるべきか否かを戻す。
[戻値]	BOOL	BOX表示文字判定 [-] (TRUE:BOX表示文字、FALSE:BOX表示文字でない)
[備考]	なし
-----------------------------------------------------------------------------*/
BOOL CBoxCharDefine::IsBox(
	const char* pstrSrc		// I  :検査対象文字 [-] (-) :-
)
{
	// ▼ (3285) BGN 2003.12.26 (dincom) 
	// ＨＭＬ文字符号表示が無効のとき、ＨＴＭＬ文字をＢＯＸ表示しない
	{
		CUnicoder*	pUnicoder = CUnicoder::GetInstance();
		// HTML文字が無効
		if ( !pUnicoder->GetEnable() )
		{
			// ＨＴＭＬ文字符号かを確認する
			pUnicoder->SetEnable( TRUE );
			wchar_t		wcharUnicode;
			long		nUnicodeByte = pUnicoder->IsUnicode( pstrSrc, &wcharUnicode );
			pUnicoder->SetEnable( FALSE );
			if ( nUnicodeByte > 0 )
			{
				// HTML文字符号（無効時）であればＢＯＸ表示しない
				return( FALSE );
			}
		}
	}
	// ▲ (3285) END

	long	idxItem;
	if( GetEnable() )
	for( idxItem=0 ; idxItem<m_aItemz.GetSize() ; idxItem++ )
	if( m_aItemz[ idxItem ].bEnable )
	if( !m_aItemz[ idxItem ].strChar.IsEmpty() )
	{
		if (
			memcmp( pstrSrc, (LPCTSTR)m_aItemz[ idxItem ].strChar, m_aItemz[ idxItem ].strChar.GetLength() )
			== 0
		)
		{
			return( TRUE );
		}
	}
	return( FALSE );
}

/*-----------------------------------------------------------------------------
[名称]	ファイル書き出し
[機能]	ファイルへの設定保存。
[戻値]	BOOL	処理結果 [-] (TRUE:成功、FALSE:失敗)
[備考]	なし
-----------------------------------------------------------------------------*/
BOOL CBoxCharDefine::Write()
{
	try
	{
		CString		strFilename = CSettingPath::GetInstance()->GetFolderPath() + "boxchar.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++ )
		{
			CString	strChar;
			strChar.Format(
				"%s\n%s\n",
				BoolToString( m_aItemz[idxChar].bEnable ),
				QuoteString( m_aItemz[idxChar].strChar )
			);
			file.WriteString( strChar );
		}

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

/*-----------------------------------------------------------------------------
[名称]	ファイル読み込み
[機能]	ファイルからの設定読込。
[戻値]	BOOL	処理結果 [-] (TRUE:成功、FALSE:失敗)
[備考]	なし
-----------------------------------------------------------------------------*/
BOOL CBoxCharDefine::Read()
{
	CString		strGeneralFilename = CSettingPath::GetInstance()->GetFolderPath() + "boxchar.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 )
		{
			CString		strLine;

			TBoxChar	Item;
			bSuccess &= file.ReadString( strLine );
			Item.bEnable = StringToBool( strLine );

			bSuccess &= file.ReadString( strLine );
			Item.strChar = DeQuoteString( strLine );

			if ( bSuccess )
			{
				m_aItemz.Add( Item );
			}
			else
			{
				break;
			}
		}

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

	return( TRUE );
}

