/*-----------------------------------------------------------------------------
[名称]	Finder.h
[概要]	検索クラスのヘッダ
[備考]	なし
[履歴]	2003-02-25	NC		コメント付加(moralog)
-----------------------------------------------------------------------------*/
#if !defined(AFX_FINDER_H_INCLUDED_)
#define AFX_FINDER_H_INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


//-----------------------------------------------------------------------------
// インクルード
//-----------------------------------------------------------------------------
class CShitarabianDoc;
#include <afxtempl.h>


/*-----------------------------------------------------------------------------
[名称]	検索条件
[用途]	検索条件の一部を保存する。
[備考]	CEmphasisItemなどで使用。
-----------------------------------------------------------------------------*/
typedef struct{
	BOOL		bRegExp;		// 正規表現 [-] (-)
	BOOL		bCaseCare;		// 大文字小文字区別 [-] (-)
	BOOL		bToken;			// 単語単位 [-] (-)
} TFindCondition;


/*-----------------------------------------------------------------------------
[名称]	マッチ情報
[用途]	検索にマッチした情報を格納する。
[備考]	注意：strSubMatch は要する場合だけ設定される。
-----------------------------------------------------------------------------*/
typedef struct{
	long		idxStartColumn;	// マッチ開始カラム [-] (-)
	long		nColumn;		// マッチカラム数 [-] (-)
	CString		strSubMatch;	// サブマッチ文字列 [$1] (-)
} TMatch;


/*-----------------------------------------------------------------------------
[名称]	検索クラス
[用途]	検索処理の基底クラス。
[備考]	ちょっと抽象クラス。
		検索エンジンごとに派生クラスを作成すること。
-----------------------------------------------------------------------------*/
class CFinder  
{
public:
	// 生成・破棄
	CFinder();
	virtual ~CFinder();

// エンジン情報
	// 利用可能確認
	virtual BOOL	IsAlive(){ return( TRUE ); };

	// 検索エンジン名称取得
	virtual CString	Name(){ return(""); };

	// 正規表現判定（正規表現エンジンか？）
	virtual BOOL	IsRegExp(){ return( FALSE ); };

// 検索条件
	// 大文字小文字区別設定
	virtual BOOL	EnableCareCase(){ return( TRUE ); };

// 検索処理
	// 次を検索して選択
	virtual BOOL FindNextForSelect(
		CShitarabianDoc*	pDoc,
		CString&			strSubString,
		BOOL				bCaseCare,
		BOOL				bLoop,
		BOOL				bToken
	);

	// 次を検索IF
	virtual BOOL FindNext(
		CShitarabianDoc*	pDoc,
		CString&			strSubString,
		long*				pidxFoundCaretRow,
		long*				pidxFoundCaretColumn,
		long*				pnCaretColumn,
		BOOL				bLoop,
		BOOL				bCaseCare,
		BOOL				bToken
	);

	// 次を検索（文書全体）
	virtual BOOL FindNextAtDocument(
		CShitarabianDoc*	pDoc,
		CString&			strSubString,
		long*				pidxFoundCaretRow,
		long*				pidxFoundCaretColumn,
		long*				pnCaretColumn,
		BOOL				bLoop,
		BOOL				bCaseCare,
		BOOL				bToken
	);

	// 次を検索（文書一部分）
	virtual BOOL FindNextAtLinez(
		CShitarabianDoc*	pDoc,
		long				idxStartRow,
		long				idxStartColumn,
		long				idxEndRow,
		long				idxEndColumn,
		CString&			strSubString,
		long*				pidxFoundCaretRow,
		long*				pidxFoundCaretColumn,
		long*				pnCaretColumn,
		BOOL				bCaseCare,
		BOOL				bToken
	);

	// 次を検索（行）
	virtual BOOL FindAtLine(
		CString&			strTarget,
		long				idxStartColumn,
		long				idxEndColumn,
		CString&			strSubStringSrc,
		long*				pidxFoundCaretColumn,
		long*				pnCaretColumn,
		BOOL				bCaseCare,
		BOOL				bToken
	)=0;

	// 前を検索して選択
	virtual BOOL FindPrevForSelect(
		CShitarabianDoc*	pDoc,
		CString&			strSubString,
		BOOL				bCaseCare,
		BOOL				bLoop,
		BOOL				bToken
	);

	// 前を検索IF
	virtual BOOL FindPrev(
		CShitarabianDoc*	pDoc,
		CString&			strSubString,
		long*				pidxFoundCaretRow,
		long*				pidxFoundCaretColumn,
		long*				pnCaretColumn,
		BOOL				bLoop,
		BOOL				bCaseCare,
		BOOL				bToken
	);

	// 前を検索（文書全体）
	virtual BOOL FindPrevAtDocument(
		CShitarabianDoc*	pDoc,
		CString&			strSubString,
		long*				pidxFoundCaretRow,
		long*				pidxFoundCaretColumn,
		long*				pnCaretColumn,
		BOOL				bLoop,
		BOOL				bCaseCare,
		BOOL				bToken
	);

	// 前を検索（文書一部）
	virtual BOOL FindPrevAtLinez(
		CShitarabianDoc*	pDoc,
		long				idxStartRow,
		long				idxStartColumn,
		long				idxEndRow,
		long				idxEndColumn,
		CString&			strSubString,
		long*				pidxFoundCaretRow,
		long*				pidxFoundCaretColumn,
		long*				pnCaretColumn,
		BOOL				bCaseCare,
		BOOL				bToken
	);

	// 行中でマッチする最後のものを検索
	virtual BOOL FindLastAtLine(
		CShitarabianDoc*	pDoc,
		long				idxRow,
		long				idxStartColumn,
		long				idxEndColumn,
		CString&			strSubString,
		long*				pidxFoundCaretColumn,
		long*				pnCaretColumn,
		BOOL				bCaseCare,
		BOOL				bToken
	);

	// 置換（に使用する）文字列取得
	virtual CString GetReplaceWord(
		CShitarabianDoc*	pDoc,
		long				idxRow,
		long				idxStartColumn,
		long				idxEndColumn,
		CString&			strSubString,
		CString&			strReplaceFormat,
		BOOL				bCaseCare,
		BOOL				bToken
	)=0;

	// HIT部分置換
	long Replace(
		CShitarabianDoc*	pDoc,
		long				idxRow,
		long				idxStartColumn,
		long				idxEndColumn,
		CString&			strSubString,
		CString&			strReplaceFormat,
		BOOL				bCaseCare,
		BOOL				bToken
	);

	// マッチ情報取得（文字列）
	virtual long GetMatchz(
		CString&					strSrc,
		CString&					strSubString,
		CArray<TMatch, TMatch& >*	paMatchz,
		BOOL						bCaseCare,
		BOOL						bToken,
		BOOL						bNeedSubMatch = FALSE
	)=0;

	// 簡易文字列検索
	virtual BOOL QuickMatch(
		LPCTSTR						strSrc,
		CString&					strSubString,
		TMatch*						pMatch,
		BOOL						bCaseCare,
		BOOL						bToken
	)=0;

	// 正規表現補完
	static void RegexpChar( CComboBox* pCombo ) 		{ RegExpGuide( pCombo, ".", "" ); };
	static void RegexpRenge( CComboBox* pCombo )		{ RegExpGuide( pCombo, "[", "]" ); };
	static void RegexpRengeover( CComboBox* pCombo )	{ RegExpGuide( pCombo, "[^", "]" ); };
	static void RegexpHead( CComboBox* pCombo ) 		{ RegExpGuide( pCombo, "^", "" ); };
	static void RegexpLast( CComboBox* pCombo )			{ RegExpGuide( pCombo, "$", "" ); };

	static void RegexpToken( CComboBox* pCombo ) 		{ RegExpGuide( pCombo, "\\b", "" ); };
	static void RegexpNotToken( CComboBox* pCombo ) 	{ RegExpGuide( pCombo, "\\B", "" ); };
	static void RegexpSpace( CComboBox* pCombo ) 		{ RegExpGuide( pCombo, "\\s", "" ); };
	static void RegexpNotSpace( CComboBox* pCombo ) 	{ RegExpGuide( pCombo, "\\S", "" ); };

	static void RegexpTag( CComboBox* pCombo )			{ RegExpGuide( pCombo, "\\(", "\\)" ); };
	static void RegexpNot( CComboBox* pCombo )		 	{ RegExpGuide( pCombo, "\\~", "" ); };
	static void RegexpOr( CComboBox* pCombo ) 			{ RegExpGuide( pCombo, "\\!", "" ); };
	static void Regexp0match( CComboBox* pCombo )		{ RegExpGuide( pCombo, "*", "" ); };
	static void Regexp1match( CComboBox* pCombo )		{ RegExpGuide( pCombo, "+", "" ); };
	static void RegexpCount( CComboBox* pCombo ) 		{ RegExpGuide( pCombo, "{", "}" ); };
	static void RegexpGroup( CComboBox* pCombo )		{ RegExpGuide( pCombo, "\\{", "\\}" ); };
	static void RegExpGuide(
		CComboBox*	pCombo, 
		CString		strLeft,
		CString		strRight
	);

protected:

};

#endif // !defined(AFX_FINDER_H_INCLUDED_)
