///////////////////////////////////////////////////////////////////////////
// CFindText クラスのインタフェース宣言
//
// テキスト検索用のワーカースレッドオブジェクト
////////////////////////////////////////////////////////////////////////////

#if !defined( FINDTEXT_H_INCLUDED_ )
#define FINDTEXT_H_INCLUDED_

#include "TaEdit_std.h"

#include "regex/SRegex.h"
#include "LineData.h"
#include "TextMatchLib.h"
#include "TaEditProcessingDlg.h"
#include "ConfigInfo.h"
#include "ErrorBool.h"

#include "TaEditDoc.h"

class CFindText : public CProcesingObj
{
protected:
	typedef N_SRegex::SRegex< wchar_t, const wchar_t*, tagPseudPtr > T_FindObj;
public:
	CFindText();
	~CFindText();

	// 検索のための情報を設定する
	bool SetInfo(
		const CTaEditDoc *pArgDoc,
		T_CurPos SPos, 
		const wstring &rArgPtn,
		VClsPtr< CConfigInfo > pArgConf );

	// 検索を開始する
	virtual bool start();

	// 検索用スレッド
	virtual void run();

	// 終了可能か否か
	virtual bool EnableExit() const;

	// 割り込み
	virtual void Interrupt();

	// スレッドの終了を持ち合わせる
	virtual void WaitThreadTerminate();

	// 一定時間だけスレッドの終了を待ち合わせる
	virtual bool WaitThreadTerminateForTime( int ms );

	// 見つかったか否かを取得
	bool IsMatched() const;

	// 検索結果の範囲を取得
	const T_SelRange& GetMatchRange() const;

	// エラー情報を取得
	CErrorBool GetErrorInfo() const;
protected:
	// 検索用オブジェクトの構築
	bool CreateFindObj(
		T_FindObj *pFindObj,
		const wstring &rPattern,
		VClsPtr< CConfigInfo > pConf ) const;

	// SRegexのエラー値に対応するメッセージを取得する
	const wstring& GetRegexErrString( N_SRegex::SREGEX_ERR err, VClsPtr< CConfigInfo > pConf ) const;

	// 検索する
	bool FindNext( T_FindObj *pFindObj, T_SelRange *pRange ) const;

	// ドキュメント
	const CTaEditDoc *pDoc;

	// 検索開始位置
	T_CurPos SPos;

	volatile bool EnableExitFlg;	// 終了可能か否か

	T_SelRange m_ResultRange;	// 検索結果
	bool IsMatchedFlg;	// 見つかったか否か
	CErrorBool ErrorInfo;	// エラーの有無

	// 検索用オブジェクト
	T_FindObj m_FindObj;

};

#endif // FINDTEXT_H_INCLUDED_

