File Annotation

Not logged in
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: #include "stdafx.h"
dcdd144598 2011-02-23        kinaba: #include "rsrc/resource.h"
dcdd144598 2011-02-23        kinaba: #include "Search.h"
dcdd144598 2011-02-23        kinaba: #include "NSearch.h"
dcdd144598 2011-02-23        kinaba: #include "RSearch.h"
dcdd144598 2011-02-23        kinaba: using namespace ki;
dcdd144598 2011-02-23        kinaba: using namespace editwing;
dcdd144598 2011-02-23        kinaba: using view::VPos;
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: //-------------------------------------------------------------------------
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: SearchManager::SearchManager( ki::Window& w, editwing::EwEdit& e )
dcdd144598 2011-02-23        kinaba: 	: searcher_( NULL )
dcdd144598 2011-02-23        kinaba: 	, edit_( e )
dcdd144598 2011-02-23        kinaba: 	, DlgImpl( IDD_FINDREPLACE )
dcdd144598 2011-02-23        kinaba: 	, bIgnoreCase_( true ) // 1.08 default true
dcdd144598 2011-02-23        kinaba: 	, bRegExp_( false )
dcdd144598 2011-02-23        kinaba: 	, bDownSearch_( true )
dcdd144598 2011-02-23        kinaba: 	, mainWnd_( w )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: SearchManager::~SearchManager()
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void SearchManager::SaveToINI( ki::IniFile& ini )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	ini.SetSectionAsUserName();
dcdd144598 2011-02-23        kinaba: 	ini.PutBool( TEXT("SearchIgnoreCase"), bIgnoreCase_ );
dcdd144598 2011-02-23        kinaba: 	ini.PutBool( TEXT("SearchRegExp"), bRegExp_ );
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void SearchManager::LoadFromINI( ki::IniFile& ini )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	ini.SetSectionAsUserName();
dcdd144598 2011-02-23        kinaba: 	bIgnoreCase_ = ini.GetBool( TEXT("SearchIgnoreCase"), bIgnoreCase_ );
dcdd144598 2011-02-23        kinaba: 	bRegExp_     = ini.GetBool( TEXT("SearchRegExp"), bRegExp_ );
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: //-------------------------------------------------------------------------
dcdd144598 2011-02-23        kinaba: // ダイアログ関係
dcdd144598 2011-02-23        kinaba: //-------------------------------------------------------------------------
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void SearchManager::ShowDlg()
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: //	GoModal( ::GetParent(edit_.hwnd()) );
dcdd144598 2011-02-23        kinaba: 	if( isAlive() )
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		SetFront();
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: 	else
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		GoModeless( ::GetParent(edit_.hwnd()) );
dcdd144598 2011-02-23        kinaba: 		ShowUp();
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: bool SearchManager::TrapMsg(MSG* msg)
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	if( ! isAlive() || type()==MODAL )
dcdd144598 2011-02-23        kinaba: 		return false;
dcdd144598 2011-02-23        kinaba: 	return DlgImpl::PreTranslateMessage(msg);
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void SearchManager::on_init()
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	if( bIgnoreCase_ )
dcdd144598 2011-02-23        kinaba: 		SendMsgToItem( IDC_IGNORECASE, BM_SETCHECK, BST_CHECKED );
dcdd144598 2011-02-23        kinaba: 	if( bRegExp_ )
dcdd144598 2011-02-23        kinaba: 		SendMsgToItem( IDC_REGEXP, BM_SETCHECK, BST_CHECKED );
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	if( edit_.getCursor().isSelected() )
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		// 選択されている状態では、基本的にそれをボックスに表示
dcdd144598 2011-02-23        kinaba: 		ulong dmy;
dcdd144598 2011-02-23        kinaba: 		aarr<unicode> str = edit_.getCursor().getSelectedStr();
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 		ulong len=0;
dcdd144598 2011-02-23        kinaba: 		for( ; str[len]!=L'\0' && str[len]!=L'\n'; ++len );
dcdd144598 2011-02-23        kinaba: 		str[len] = L'\0';
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 		if( searcher_.isValid() &&
dcdd144598 2011-02-23        kinaba: 		    searcher_->Search( str.get(), len, 0, &dmy, &dmy ) )
dcdd144598 2011-02-23        kinaba: 		{
dcdd144598 2011-02-23        kinaba: 			SendMsgToItem( IDC_FINDBOX, WM_SETTEXT, 0,
dcdd144598 2011-02-23        kinaba: 				reinterpret_cast<LPARAM>(findStr_.c_str()) );
dcdd144598 2011-02-23        kinaba: 		}
dcdd144598 2011-02-23        kinaba: 		else
dcdd144598 2011-02-23        kinaba: 		{
dcdd144598 2011-02-23        kinaba: 		#ifdef _UNICODE
dcdd144598 2011-02-23        kinaba: 			SendMsgToItem( IDC_FINDBOX, WM_SETTEXT, 0,
dcdd144598 2011-02-23        kinaba: 				reinterpret_cast<LPARAM>(str.get()) );
dcdd144598 2011-02-23        kinaba: 		#else
dcdd144598 2011-02-23        kinaba: 			ki::aarr<char> ab( new TCHAR[(len+1)*3] );
dcdd144598 2011-02-23        kinaba: 			::WideCharToMultiByte( CP_ACP, 0, str.get(), -1,
dcdd144598 2011-02-23        kinaba: 				ab.get(), (len+1)*3, NULL, NULL );
dcdd144598 2011-02-23        kinaba: 			SendMsgToItem( IDC_FINDBOX, WM_SETTEXT, 0,
dcdd144598 2011-02-23        kinaba: 				reinterpret_cast<LPARAM>(ab.get()) );
dcdd144598 2011-02-23        kinaba: 		#endif
dcdd144598 2011-02-23        kinaba: 		}
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: 	else
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		SendMsgToItem( IDC_FINDBOX, WM_SETTEXT, 0,
dcdd144598 2011-02-23        kinaba: 			reinterpret_cast<LPARAM>(findStr_.c_str()) );
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	SendMsgToItem( IDC_REPLACEBOX, WM_SETTEXT, 0,
dcdd144598 2011-02-23        kinaba: 		reinterpret_cast<LPARAM>(replStr_.c_str()) );
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	::SetFocus( item(IDC_FINDBOX) );
dcdd144598 2011-02-23        kinaba: 	SendMsgToItem( IDC_FINDBOX, EM_SETSEL, 0,
dcdd144598 2011-02-23        kinaba: 		::GetWindowTextLength(item(IDC_FINDBOX)) );
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void SearchManager::on_destroy()
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	bChanged_ = false;
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: bool SearchManager::on_command( UINT cmd, UINT id, HWND ctrl )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	if( cmd==EN_CHANGE )
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		// 文字列変更があったことを記憶
dcdd144598 2011-02-23        kinaba: 		bChanged_ = true;
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: 	else if( cmd==BN_CLICKED )
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		switch( id )
dcdd144598 2011-02-23        kinaba: 		{
dcdd144598 2011-02-23        kinaba: 		// チェックボックスの変更があったことを記憶
dcdd144598 2011-02-23        kinaba: 		case IDC_IGNORECASE:
dcdd144598 2011-02-23        kinaba: 		case IDC_REGEXP:
dcdd144598 2011-02-23        kinaba: 			bChanged_ = true;
dcdd144598 2011-02-23        kinaba: 			break;
dcdd144598 2011-02-23        kinaba: 		// ボタンが押された場合
dcdd144598 2011-02-23        kinaba: 		case ID_FINDNEXT:
dcdd144598 2011-02-23        kinaba: 			on_findnext();
dcdd144598 2011-02-23        kinaba: 			break;
dcdd144598 2011-02-23        kinaba: 		case ID_FINDPREV:
dcdd144598 2011-02-23        kinaba: 			on_findprev();
dcdd144598 2011-02-23        kinaba: 			break;
dcdd144598 2011-02-23        kinaba: 		case ID_REPLACENEXT:
dcdd144598 2011-02-23        kinaba: 			on_replacenext();
dcdd144598 2011-02-23        kinaba: 			break;
dcdd144598 2011-02-23        kinaba: 		case ID_REPLACEALL:
dcdd144598 2011-02-23        kinaba: 			on_replaceall();
dcdd144598 2011-02-23        kinaba: 			break;
dcdd144598 2011-02-23        kinaba: 		}
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: 	else
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		return false;
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: 	return true;
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void SearchManager::on_findnext()
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	UpdateData();
dcdd144598 2011-02-23        kinaba: 	ConstructSearcher();
dcdd144598 2011-02-23        kinaba: 	if( isReady() )
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		FindNextImpl();
dcdd144598 2011-02-23        kinaba: //		End( IDOK );
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void SearchManager::on_findprev()
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	UpdateData();
dcdd144598 2011-02-23        kinaba: 	ConstructSearcher( false );
dcdd144598 2011-02-23        kinaba: 	if( isReady() )
dcdd144598 2011-02-23        kinaba: 		FindPrevImpl();
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void SearchManager::on_replacenext()
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	UpdateData();
dcdd144598 2011-02-23        kinaba: 	ConstructSearcher();
dcdd144598 2011-02-23        kinaba: 	if( isReady() )
dcdd144598 2011-02-23        kinaba: 		ReplaceImpl();
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void SearchManager::on_replaceall()
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	UpdateData();
dcdd144598 2011-02-23        kinaba: 	ConstructSearcher();
dcdd144598 2011-02-23        kinaba: 	if( isReady() )
dcdd144598 2011-02-23        kinaba: 		ReplaceAllImpl();
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void SearchManager::UpdateData()
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	// ダイアログから変更点を取り込み
dcdd144598 2011-02-23        kinaba: 	bIgnoreCase_ =
dcdd144598 2011-02-23        kinaba: 		(BST_CHECKED==SendMsgToItem( IDC_IGNORECASE, BM_GETCHECK ));
dcdd144598 2011-02-23        kinaba: 	bRegExp_ =
dcdd144598 2011-02-23        kinaba: 		(BST_CHECKED==SendMsgToItem( IDC_REGEXP, BM_GETCHECK ));
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	TCHAR* str;
dcdd144598 2011-02-23        kinaba: 	LRESULT n = SendMsgToItem( IDC_FINDBOX, WM_GETTEXTLENGTH );
dcdd144598 2011-02-23        kinaba: 	str = new TCHAR[n+1];
dcdd144598 2011-02-23        kinaba: 	SendMsgToItem( IDC_FINDBOX, WM_GETTEXT,
dcdd144598 2011-02-23        kinaba: 		n+1, reinterpret_cast<LPARAM>(str) );
dcdd144598 2011-02-23        kinaba: 	findStr_ = str;
dcdd144598 2011-02-23        kinaba: 	delete [] str;
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	n = SendMsgToItem( IDC_REPLACEBOX, WM_GETTEXTLENGTH );
dcdd144598 2011-02-23        kinaba: 	str = new TCHAR[n+1];
dcdd144598 2011-02-23        kinaba: 	SendMsgToItem( IDC_REPLACEBOX, WM_GETTEXT,
dcdd144598 2011-02-23        kinaba: 		n+1, reinterpret_cast<LPARAM>(str) );
dcdd144598 2011-02-23        kinaba: 	replStr_ = str;
dcdd144598 2011-02-23        kinaba: 	delete [] str;
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void SearchManager::ConstructSearcher( bool down )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	bChanged_ = (bChanged_ || (bDownSearch_ != down));
dcdd144598 2011-02-23        kinaba: 	if( (bChanged_ || !isReady()) && findStr_.len()!=0 )
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		// 検索者作成
dcdd144598 2011-02-23        kinaba: 		bDownSearch_ = down;
dcdd144598 2011-02-23        kinaba: 		const unicode *u = findStr_.ConvToWChar();
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 		if( bRegExp_ )
dcdd144598 2011-02-23        kinaba: 			searcher_ = new RSearch( u, !bIgnoreCase_, bDownSearch_ );
dcdd144598 2011-02-23        kinaba: 		else
dcdd144598 2011-02-23        kinaba: 			if( bDownSearch_ )
dcdd144598 2011-02-23        kinaba: 				if( bIgnoreCase_ )
dcdd144598 2011-02-23        kinaba: 					searcher_ = new NSearch<IgnoreCase>(u);
dcdd144598 2011-02-23        kinaba: 				else
dcdd144598 2011-02-23        kinaba: 					searcher_ = new NSearch<CaseSensitive>(u);
dcdd144598 2011-02-23        kinaba: 			else
dcdd144598 2011-02-23        kinaba: 				if( bIgnoreCase_ )
dcdd144598 2011-02-23        kinaba: 					searcher_ = new NSearchRev<IgnoreCase>(u);
dcdd144598 2011-02-23        kinaba: 				else
dcdd144598 2011-02-23        kinaba: 					searcher_ = new NSearchRev<CaseSensitive>(u);
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 		findStr_.FreeWCMem(u);
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 		// 変更終了フラグ
dcdd144598 2011-02-23        kinaba: 		bChanged_ = false;
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: //-------------------------------------------------------------------------
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void SearchManager::FindNext()
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	if( !isReady() )
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		ShowDlg();
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: 	else
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		ConstructSearcher();
dcdd144598 2011-02-23        kinaba: 		if( isReady() )
dcdd144598 2011-02-23        kinaba: 			FindNextImpl();
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void SearchManager::FindPrev()
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	if( !isReady() )
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		ShowDlg();
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: 	else
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		ConstructSearcher( false );
dcdd144598 2011-02-23        kinaba: 		if( isReady() )
dcdd144598 2011-02-23        kinaba: 			FindPrevImpl();
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: //-------------------------------------------------------------------------
dcdd144598 2011-02-23        kinaba: // 実際の処理の実装
dcdd144598 2011-02-23        kinaba: //-------------------------------------------------------------------------
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void SearchManager::FindNextImpl()
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	// カーソル位置取得
dcdd144598 2011-02-23        kinaba: 	const VPos *stt, *end;
dcdd144598 2011-02-23        kinaba: 	edit_.getCursor().getCurPos( &stt, &end );
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	// 選択範囲ありなら、選択範囲先頭の1文字先から検索
dcdd144598 2011-02-23        kinaba: 	// そうでなければカーソル位置から検索
dcdd144598 2011-02-23        kinaba: 	DPos s = *stt;
dcdd144598 2011-02-23        kinaba: 	if( *stt != *end )
dcdd144598 2011-02-23        kinaba: 		if( stt->ad == edit_.getDoc().len(stt->tl) )
dcdd144598 2011-02-23        kinaba: 			s = DPos( stt->tl+1, 0 );
dcdd144598 2011-02-23        kinaba: 		else
dcdd144598 2011-02-23        kinaba: 			s = DPos( stt->tl, stt->ad+1 );
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	// 検索
dcdd144598 2011-02-23        kinaba: 	DPos b, e;
dcdd144598 2011-02-23        kinaba: 	if( FindNextFromImpl( s, &b, &e ) )
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		// 見つかったら選択
dcdd144598 2011-02-23        kinaba: 		edit_.getCursor().MoveCur( b, false );
dcdd144598 2011-02-23        kinaba: 		edit_.getCursor().MoveCur( e, true );
dcdd144598 2011-02-23        kinaba: 		return;
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	// 見つからなかった場合
dcdd144598 2011-02-23        kinaba: 	NotFound();
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void SearchManager::NotFound()
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	//MsgBox( String(IDS_NOTFOUND).c_str() );
dcdd144598 2011-02-23        kinaba: 	::MessageBox( NULL, String(IDS_NOTFOUND).c_str(), NULL, MB_OK|MB_TASKMODAL );
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void SearchManager::FindPrevImpl()
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	// カーソル位置取得
dcdd144598 2011-02-23        kinaba: 	const VPos *stt, *end;
dcdd144598 2011-02-23        kinaba: 	edit_.getCursor().getCurPos( &stt, &end );
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	if( stt->ad!=0 || stt->tl!=0 )
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		// 選択範囲先頭の1文字前から検索
dcdd144598 2011-02-23        kinaba: 		DPos s;
dcdd144598 2011-02-23        kinaba: 		if( stt->ad == 0 )
dcdd144598 2011-02-23        kinaba: 			s = DPos( stt->tl-1, edit_.getDoc().len(stt->tl-1) );
dcdd144598 2011-02-23        kinaba: 		else
dcdd144598 2011-02-23        kinaba: 			s = DPos( stt->tl, stt->ad-1 );
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 		// 検索
dcdd144598 2011-02-23        kinaba: 		DPos b, e;
dcdd144598 2011-02-23        kinaba: 		if( FindPrevFromImpl( s, &b, &e ) )
dcdd144598 2011-02-23        kinaba: 		{
dcdd144598 2011-02-23        kinaba: 			// 見つかったら選択
dcdd144598 2011-02-23        kinaba: 			edit_.getCursor().MoveCur( b, false );
dcdd144598 2011-02-23        kinaba: 			edit_.getCursor().MoveCur( e, true );
dcdd144598 2011-02-23        kinaba: 			return;
dcdd144598 2011-02-23        kinaba: 		}
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	// 見つからなかった場合
dcdd144598 2011-02-23        kinaba: 	NotFound();
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: bool SearchManager::FindNextFromImpl( DPos s, DPos* beg, DPos* end )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	// 1行ずつサーチ
dcdd144598 2011-02-23        kinaba: 	doc::Document& d = edit_.getDoc();
dcdd144598 2011-02-23        kinaba: 	for( ulong mbg,med,e=d.tln(); s.tl<e; ++s.tl, s.ad=0 )
dcdd144598 2011-02-23        kinaba: 		if( searcher_->Search(
dcdd144598 2011-02-23        kinaba: 			d.tl(s.tl), d.len(s.tl), s.ad, &mbg, &med ) )
dcdd144598 2011-02-23        kinaba: 		{
dcdd144598 2011-02-23        kinaba: 			beg->tl = end->tl = s.tl;
dcdd144598 2011-02-23        kinaba: 			beg->ad = mbg;
dcdd144598 2011-02-23        kinaba: 			end->ad = med;
dcdd144598 2011-02-23        kinaba: 			return true; // 発見
dcdd144598 2011-02-23        kinaba: 		}
dcdd144598 2011-02-23        kinaba: 	return false;
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: bool SearchManager::FindPrevFromImpl( DPos s, DPos* beg, DPos* end )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	// 1行ずつサーチ
dcdd144598 2011-02-23        kinaba: 	doc::Document& d = edit_.getDoc();
dcdd144598 2011-02-23        kinaba: 	for( ulong mbg,med; ; s.ad=d.len(--s.tl) )
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		if( searcher_->Search(
dcdd144598 2011-02-23        kinaba: 			d.tl(s.tl), d.len(s.tl), s.ad, &mbg, &med ) )
dcdd144598 2011-02-23        kinaba: 		{
dcdd144598 2011-02-23        kinaba: 			beg->tl = end->tl = s.tl;
dcdd144598 2011-02-23        kinaba: 			beg->ad = mbg;
dcdd144598 2011-02-23        kinaba: 			end->ad = med;
dcdd144598 2011-02-23        kinaba: 			return true; // 発見
dcdd144598 2011-02-23        kinaba: 		}
dcdd144598 2011-02-23        kinaba: 		if( s.tl==0 )
dcdd144598 2011-02-23        kinaba: 			break;
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: 	return false;
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void SearchManager::ReplaceImpl()
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	// カーソル位置取得
dcdd144598 2011-02-23        kinaba: 	const VPos *stt, *end;
dcdd144598 2011-02-23        kinaba: 	edit_.getCursor().getCurPos( &stt, &end );
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	// 選択範囲先頭から検索
dcdd144598 2011-02-23        kinaba: 	DPos b, e;
dcdd144598 2011-02-23        kinaba: 	if( FindNextFromImpl( *stt, &b, &e ) )
dcdd144598 2011-02-23        kinaba: 		if( e == *end )
dcdd144598 2011-02-23        kinaba: 		{
dcdd144598 2011-02-23        kinaba: 			const wchar_t* ustr = replStr_.ConvToWChar();
dcdd144598 2011-02-23        kinaba: 			const ulong ulen = my_lstrlenW( ustr );
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 			// 置換
dcdd144598 2011-02-23        kinaba: 			edit_.getDoc().Execute( doc::Replace(
dcdd144598 2011-02-23        kinaba: 				b, e, ustr, ulen
dcdd144598 2011-02-23        kinaba: 			) );
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 			replStr_.FreeWCMem( ustr );
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 			if( FindNextFromImpl( DPos(b.tl,b.ad+ulen), &b, &e ) )
dcdd144598 2011-02-23        kinaba: 			{
dcdd144598 2011-02-23        kinaba: 				// 次を選択
dcdd144598 2011-02-23        kinaba: 				edit_.getCursor().MoveCur( b, false );
dcdd144598 2011-02-23        kinaba: 				edit_.getCursor().MoveCur( e, true );
dcdd144598 2011-02-23        kinaba: 				return;
dcdd144598 2011-02-23        kinaba: 			}
dcdd144598 2011-02-23        kinaba: 		}
dcdd144598 2011-02-23        kinaba: 		else
dcdd144598 2011-02-23        kinaba: 		{
dcdd144598 2011-02-23        kinaba: 			// そうでなければとりあえず選択
dcdd144598 2011-02-23        kinaba: 			edit_.getCursor().MoveCur( b, false );
dcdd144598 2011-02-23        kinaba: 			edit_.getCursor().MoveCur( e, true );
dcdd144598 2011-02-23        kinaba: 			return;
dcdd144598 2011-02-23        kinaba: 		}
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	// 見つからなかった場合
dcdd144598 2011-02-23        kinaba: 	NotFound();
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void SearchManager::ReplaceAllImpl()
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	// まず、実行する置換を全てここに登録する
dcdd144598 2011-02-23        kinaba: 	doc::MacroCommand mcr;
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	// 置換後文字列
dcdd144598 2011-02-23        kinaba: 	const wchar_t* ustr = replStr_.ConvToWChar();
dcdd144598 2011-02-23        kinaba: 	const ulong ulen = my_lstrlenW( ustr );
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	// 文書の頭から検索
dcdd144598 2011-02-23        kinaba: 	int dif=0;
dcdd144598 2011-02-23        kinaba: 	DPos s(0,0), b, e;
dcdd144598 2011-02-23        kinaba: 	while( FindNextFromImpl( s, &b, &e ) )
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		if( s.tl != b.tl ) dif = 0;
dcdd144598 2011-02-23        kinaba: 		s = e;
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 		// 置換コマンドを登録
dcdd144598 2011-02-23        kinaba: 		b.ad += dif, e.ad += dif;
dcdd144598 2011-02-23        kinaba: 		mcr.Add( new doc::Replace(b,e,ustr,ulen) );
dcdd144598 2011-02-23        kinaba: 		dif -= e.ad-b.ad-ulen;
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	if( mcr.size() > 0 )
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		// ここで連続置換
dcdd144598 2011-02-23        kinaba: 		edit_.getDoc().Execute( mcr );
dcdd144598 2011-02-23        kinaba: 		// カーソル移動
dcdd144598 2011-02-23        kinaba: 		e.ad = b.ad + ulen;
dcdd144598 2011-02-23        kinaba: 		edit_.getCursor().MoveCur( e, false );
dcdd144598 2011-02-23        kinaba: 		// 閉じる?
dcdd144598 2011-02-23        kinaba: 		End( IDOK );
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	TCHAR str[255];
dcdd144598 2011-02-23        kinaba: 	::wsprintf( str, String(IDS_REPLACEALLDONE).c_str(), mcr.size() );
dcdd144598 2011-02-23        kinaba: 	MsgBox( str, String(IDS_APPNAME).c_str(), MB_ICONINFORMATION );
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	replStr_.FreeWCMem( ustr );
dcdd144598 2011-02-23        kinaba: }