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: }