////////////////////////////////////////////////////////////////////////////
// CReplaceAll クラスのインプリメンテーション
//
////////////////////////////////////////////////////////////////////////////

#include "ReplaceAll.h"

////////////////////////////////////////////////////////////////////////////
// 構築/破棄
////////////////////////////////////////////////////////////////////////////

CReplaceAll::CReplaceAll() :
	IsInterrupted( false ),
	pUnConstDoc( NULL ),
	pAfterString( NULL )
{
	m_ResultRange = T_SelRange( T_CurPos( 0, 0 ), T_CurPos( 0, 0 ) );
}

CReplaceAll::~CReplaceAll()
{

}

////////////////////////////////////////////////////////////////////////////
// メソッド
////////////////////////////////////////////////////////////////////////////

// 情報を設定する
bool CReplaceAll::SetInfo(
	CTaEditDoc *pArgDoc,
	const wstring &rArgPtn,
	VClsPtr< CConfigInfo > pArgConf,
	const wstring& argAfterStr )
{
	assert( NULL != this );
	pUnConstDoc = pArgDoc;
	pDoc = pArgDoc;
	pAfterString = &argAfterStr;
	// 検索用オブジェクトを構築
	if ( CreateFindObj( &m_FindObj, rArgPtn, pArgConf ) )
		return true;
	pDoc = NULL;
	pUnConstDoc = NULL;
}

// 検索を開始する
bool CReplaceAll::start()
{
	assert( NULL != this && NULL != pUnConstDoc && NULL != pDoc );
	return CFindText::start();
}

// 検索用スレッド
void CReplaceAll::run()
{
	assert( NULL != this && NULL != pUnConstDoc && NULL != pDoc );
	T_SelRange MatchRange;	// マッチした範囲を保持する
	bool result = true;

	ErrorInfo = CErrorBool();
	SPos = T_CurPos( 0, 0 );
	IsInterrupted = false;
	while ( !IsInterrupted && FindNext( &m_FindObj, &MatchRange ) && ErrorInfo ) {
		// マッチした範囲を置換する
		ErrorInfo = pUnConstDoc->Insert( (*pAfterString), MatchRange.GetSPos(), MatchRange, &SPos );
	}

	EnableExitFlg = true;	// 終了可能のフラグを設定
}

// 割り込み
void CReplaceAll::Interrupt()
{
	IsInterrupted = true;
	CFindText::Interrupt();
}

// 見つかったか否かを取得
bool CReplaceAll::IsMatched() const
{
	return false;	// なにが見つかるわけでもない
}

