/*-----------------------------------------------------------------------------
[名称]	LinkDefine.h
[概要]	リンク管理クラスの実装
[備考]	なし
[履歴]	2003-02-12	NC		コメント付加(moralog)
-----------------------------------------------------------------------------*/

//-----------------------------------------------------------------------------
// インクルード
//-----------------------------------------------------------------------------
#include "stdafx.h"
#include "shitarabian.h"
#include "LinkDefine.h"
#include "Finder.h"
#include "ExeCommon.h"
#include "ShitarabianDoc.h"

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


/*-----------------------------------------------------------------------------
[名称]	コンストラクタ
[機能]	インスタンスの生成。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
CLinkDefine::CLinkDefine()
{
	CLink	tmp;

	// ファイル名
	tmp.m_bEnable = TRUE;
	tmp.m_strLinkPattern = "\\\"(.*?)\\\"";
	tmp.m_eLink = LinkTxt;
	m_aLinkz.Add( tmp );

	// http://
	tmp.m_bEnable = TRUE;
	tmp.m_strLinkPattern = "http:\\/\\/.*";
	tmp.m_eLink = LinkOpenAction;
	m_aLinkz.Add( tmp );

	// ftp://
	tmp.m_bEnable = TRUE;
	tmp.m_strLinkPattern = "ftp:\\/\\/.*";
	tmp.m_eLink = LinkOpenAction;
	m_aLinkz.Add( tmp );

	// mailto://
	tmp.m_bEnable = TRUE;
	tmp.m_strLinkPattern = "mailto:.*";
	tmp.m_eLink = LinkOpenAction;
	m_aLinkz.Add( tmp );

	// レス番
	tmp.m_bEnable = TRUE;
	tmp.m_strLinkPattern = "[>＞]([0-9]+)";
	tmp.m_eLink = LinkJump;
	m_aLinkz.Add( tmp );

	// 引用
	tmp.m_bEnable = TRUE;
	tmp.m_strLinkPattern = "[>＞]([^>＞]+)";
	tmp.m_eLink = LinkJump;
	m_aLinkz.Add( tmp );

}


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

}


/*-----------------------------------------------------------------------------
[名称]	唯一インスタンスの取得
[機能]	唯一インスタンスの取得。
[戻値]	CLinkDefine*	唯一インスタンス [-] (-)
[備考]	Singletonパターン
-----------------------------------------------------------------------------*/
CLinkDefine*	CLinkDefine::GetInstance()
{
	static CLinkDefine s_Instance;
	return( &s_Instance );
}


/*-----------------------------------------------------------------------------
[名称]	リンク判別（取得）
[機能]	任意の行、列がリンクを指定しているかを判別する。
		リンクであれば情報を取得する。
[戻値]	BOOL	リンク判定 [-] (TRUE:リンク、FALSE:リンクでない)
[備考]	正規表現検索必須。
-----------------------------------------------------------------------------*/
BOOL	CLinkDefine::IsLink(
	long			idxRow,			// I  :行 [-] (-) :-
	long			idxColumn,		// I  :列 [キャレット] (-) :-
	CString*		pstrLink,		//   O:リンク名称 [ファイル名など] (-) :-
	ELinkType*		peLink,			//   O:リンク動作種類 [-] (-) :-
	long*			pidxStartColumn,//   O:開始カラム [-] (-) :-
	long*			pnColumn		//   O:カラム数 [-] (-) :-
)
{
	CShitarabianDoc*	pDoc = GetDocument();
	CFinder*	pFinder = ::GetFinder( TRUE );

	// 登録されているリンク種類についてループ
	for( int idxLink=0 ; idxLink<m_aLinkz.GetSize() ; idxLink++ )
	if ( m_aLinkz[idxLink].m_bEnable )
	{
		// regexpでパターンを検索し、
		// 指定されたカラムが含まれるかを調べる
		// 含まれれば グループにヒットした部分をリンク名称とみなす
		CString*	pstrSrc = pDoc->GetLine( idxRow );
		CArray<TMatch,TMatch&>	aMatchz;
		pFinder->GetMatchz(
			*pstrSrc,
			m_aLinkz[idxLink].m_strLinkPattern,
			&aMatchz,
			FALSE,			// bCaseCare
			FALSE,			// bToken
			TRUE			// サブマッチの取得アリ
		);

		// 位置から該当するマッチパターンを特定
		for( int idxMatch=0 ; idxMatch<aMatchz.GetSize() ; idxMatch++ )
		{
			if ( aMatchz[idxMatch].idxStartColumn <= idxColumn )
			if ( aMatchz[idxMatch].nColumn + aMatchz[idxMatch].idxStartColumn > idxColumn )
			{
				// リンク先として登録
				*pstrLink = aMatchz[idxMatch].strSubMatch;
				*peLink = m_aLinkz[idxLink].m_eLink;
				*pidxStartColumn = aMatchz[idxMatch].idxStartColumn;
				*pnColumn = aMatchz[idxMatch].nColumn;

				return( TRUE );
			}
		}
	}
	return( FALSE );
}
