📄 ceditview_cmdisrch.cpp
字号:
{
//一文字ずつ分解して実行
const char* p;
WORD c;
p = pszText;
while(*p!='\0'){
if (IsDBCSLeadByte(*p)){
c =( ((WORD)*p) * 256) | (unsigned char)*(p+1);
p++;
}else
c =*p;
ISearchExec(c);
p++;
}
return ;
}
/*!
@brief インクリメンタルサーチの実行
@param bNext [in] true:次の候補を検索, false:現在のカーソル位置のまま検索
*/
void CEditView::ISearchExec(bool bNext)
{
//検索を実行する.
int nLineFrom, nColmFrom, nColmTo, nLineTo;
if ( (m_szCurSrchKey[0] == '\0') || (m_nISearchMode == 0)){
//ステータスの表示
CMemory msg;
ISearchSetStatusMsg(&msg);
SendStatusMessage(msg.GetPtr());
return ;
}
ISearchWordMake();
int nLine, nIdx,nIdx1;
if ( bNext && m_bISearchWrap ) {
switch (m_nISearchDirection)
{
case 1:
nLine = 0;
nIdx1 = 0;
break;
case 0:
//最後から検索
int nLineP, nIdxP;
nLineP = m_pcEditDoc->m_cDocLineMgr.GetLineCount() -1 ;
CDocLine* pDocLine = m_pcEditDoc->m_cDocLineMgr.GetLineInfo( nLineP );
nIdxP = pDocLine->GetLength() -1;
m_pcEditDoc->m_cLayoutMgr.CaretPos_Phys2Log(nIdxP,nLineP,&nIdx1,&nLine);
}
}else if (IsTextSelected()){
switch( m_nISearchDirection * 2 + (bNext ? 1: 0)){
case 2 : //前方検索で現在位置から検索のとき
case 1 : //後方検索で次を検索のとき
//選択範囲の先頭を検索開始位置に
nLine = m_nSelectLineFrom;
nIdx1 = m_nSelectColmFrom;
break;
case 0 : //前方検索で次を検索
case 3 : //後方検索で現在位置から検索
//選択範囲の後ろから
nLine = m_nSelectLineTo;
nIdx1 = m_nSelectColmTo;
break;
}
}else{
nLine = m_nCaretPosY;
nIdx1 = m_nCaretPosX;
}
//桁位置からindexに変換
CLayout* pCLayout = m_pcEditDoc->m_cLayoutMgr.Search( nLine );
nIdx = LineColmnToIndex( pCLayout, nIdx1 );
m_nISearchHistoryCount ++ ;
CMemory msg;
ISearchSetStatusMsg(&msg);
if (m_nISearchHistoryCount >= 256) {
m_nISearchHistoryCount = 156;
for(int i = 100 ; i<= 255 ; i++){
m_bISearchFlagHistory[i-100] = m_bISearchFlagHistory[i];
m_nISearchX1History[i-100] = m_nISearchX1History[i] ;
m_nISearchY1History[i-100] = m_nISearchY1History[i] ;
m_nISearchX2History[i-100] = m_nISearchX2History[i] ;
m_nISearchY2History[i-100] = m_nISearchY2History[i] ;
}
}
m_bISearchFlagHistory[m_nISearchHistoryCount] = bNext;
if (m_pcEditDoc->m_cLayoutMgr.SearchWord(
nLine, /* 検索開始行 */
nIdx, /* 検索開始位置 */
m_szCurSrchKey, /* 検索条件 */
m_nISearchDirection, /* 0==前方検索 1==後方検索 */
m_bCurSrchRegularExp, /* 1==正規表現 */
FALSE, /* 1==英大文字小文字の区別 */
FALSE, /* 1==単語のみ検索 */
&nLineFrom, /* マッチレイアウト行from */
&nColmFrom, /* マッチレイアウト位置from */
&nLineTo, /* マッチレイアウト行to */
&nColmTo, /* マッチレイアウト位置to */
&m_CurRegexp ) == 0 )
{
/*検索結果がない*/
msg.AppendSz(" (見つかりません)");
SendStatusMessage(msg.GetPtr());
if (bNext) m_bISearchWrap = true;
if (IsTextSelected()){
m_nISearchX1History[m_nISearchHistoryCount] = m_nSelectColmFrom;
m_nISearchY1History[m_nISearchHistoryCount] = m_nSelectLineFrom;
m_nISearchX2History[m_nISearchHistoryCount] = m_nSelectColmTo;
m_nISearchY2History[m_nISearchHistoryCount] = m_nSelectLineTo;
}else{
m_nISearchX1History[m_nISearchHistoryCount] = m_nCaretPosX;
m_nISearchY1History[m_nISearchHistoryCount] = m_nCaretPosY;
m_nISearchX2History[m_nISearchHistoryCount] = m_nCaretPosX;
m_nISearchY2History[m_nISearchHistoryCount] = m_nCaretPosY;
}
}else{
//検索結果あり
//キャレット移動
MoveCursor( nColmFrom, nLineFrom , TRUE, _CARETMARGINRATE / 3 );
m_nSelectLineBgnFrom = nLineFrom; /* 範囲選択開始行(原点) */
m_nSelectColmBgnFrom = nColmFrom; /* 範囲選択開始桁(原点) */
m_nSelectLineBgnTo = nLineFrom; /* 範囲選択開始行(原点) */
m_nSelectColmBgnTo = nColmFrom; /* 範囲選択開始桁(原点) */
m_nSelectLineFrom = nLineFrom;
m_nSelectColmFrom = nColmFrom;
m_nSelectLineTo = nLineTo;
m_nSelectColmTo = nColmTo;
m_bISearchWrap = false;
m_nISearchX1History[m_nISearchHistoryCount] = nColmFrom;
m_nISearchY1History[m_nISearchHistoryCount] = nLineFrom;
m_nISearchX2History[m_nISearchHistoryCount] = nColmTo;
m_nISearchY2History[m_nISearchHistoryCount] = nLineTo;
}
m_bCurSrchKeyMark = TRUE;
Redraw();
SendStatusMessage(msg.GetPtr());
return ;
}
//! バックスペースを押されたときの処理
void CEditView::ISearchBack(void) {
if(m_nISearchHistoryCount==0) return;
if(m_nISearchHistoryCount==1){
m_bCurSrchKeyMark = FALSE;
m_bISearchFirst = true;
}else if( m_bISearchFlagHistory[m_nISearchHistoryCount] == false){
//検索文字をへらす
long l = strlen(m_szCurSrchKey);
if (l > 0 ){
//最後の文字の一つ前
char* p = CharPrev(m_szCurSrchKey,&m_szCurSrchKey[l]);
*p = '\0';
//m_szCurSrchKey[l-1] = '\0';
if ( (p - m_szCurSrchKey) > 0 )
ISearchWordMake();
else
m_bCurSrchKeyMark = FALSE;
}else{
MessageBeep(MB_ICONEXCLAMATION);
}
}
m_nISearchHistoryCount --;
int nLineFrom, nColmFrom, nColmTo, nLineTo;
nColmFrom = m_nISearchX1History[m_nISearchHistoryCount];
nLineFrom = m_nISearchY1History[m_nISearchHistoryCount];
nColmTo = m_nISearchX2History[m_nISearchHistoryCount];
nLineTo = m_nISearchY2History[m_nISearchHistoryCount];
if(m_nISearchHistoryCount == 0){
DisableSelectArea( TRUE );
nColmTo = nColmFrom;
}
MoveCursor( nColmFrom , nLineFrom , TRUE, _CARETMARGINRATE / 3 );
if(m_nISearchHistoryCount != 0){
m_nSelectLineBgnFrom = nLineFrom; /* 範囲選択開始行(原点) */
m_nSelectColmBgnFrom = nColmFrom; /* 範囲選択開始桁(原点) */
m_nSelectLineBgnTo = nLineFrom; /* 範囲選択開始行(原点) */
m_nSelectColmBgnTo = nColmFrom; /* 範囲選択開始桁(原点) */
m_nSelectLineFrom = nLineFrom;
m_nSelectColmFrom = nColmFrom;
m_nSelectLineTo = nLineTo;
m_nSelectColmTo = nColmTo;
}
Redraw();
//ステータス表示
CMemory msg;
ISearchSetStatusMsg(&msg);
SendStatusMessage(msg.GetPtr());
}
//! 入力文字から、検索文字を生成する。
void CEditView::ISearchWordMake(void) {
int nFlag = 0x00;
switch ( m_nISearchMode ) {
case 1: // 通常インクリメンタルサーチ
break;
case 2: // 正規表現インクリメンタルサーチ
if( !InitRegexp( m_hWnd, m_CurRegexp, true ) ){
return ;
}
nFlag |= m_bCurSrchLoHiCase ? 0x01 : 0x00;
/* 検索パターンのコンパイル */
m_CurRegexp.Compile(m_szCurSrchKey , nFlag );
break;
case 3: // MIGEMOインクリメンタルサーチ
if( !InitRegexp( m_hWnd, m_CurRegexp, true ) ){
return ;
}
nFlag |= m_bCurSrchLoHiCase ? 0x01 : 0x00;
//migemoで捜す
m_pszMigemoWord = (char*)m_pcmigemo->migemo_query((unsigned char*)m_szCurSrchKey);
/* 検索パターンのコンパイル */
m_CurRegexp.Compile(m_pszMigemoWord , nFlag );
m_pcmigemo->migemo_release((unsigned char*)m_pszMigemoWord);
break;
}
}
/*! @brief ISearchメッセージ構築
現在のサーチモード及び検索中文字列から
メッセージエリアに表示する文字列を構築する
@param msg [out] メッセージバッファ
@author isearch
@date 2004/10/13
@date 2005.01.13 genta 文字列修正
*/
void CEditView::ISearchSetStatusMsg(CMemory* msg) const
{
switch ( m_nISearchMode){
case 1 :
msg->SetDataSz("I-Search" );
break;
case 2 :
msg->SetDataSz("[RegExp] I-Search" );
break;
case 3 :
msg->SetDataSz("[Migemo] I-Search" );
break;
default:
msg->SetDataSz("");
return;
}
if (m_nISearchDirection == 0){
msg->AppendSz(" Backward: ");
}else{
msg->AppendSz(": ");
}
if(m_nISearchHistoryCount > 0)
msg->AppendSz(m_szCurSrchKey);
}
/*!
ISearch状態をツールバーに反映させる.
@sa CEditWnd::IsFuncChecked()
@param nCommand [in] 調べたいコマンドのID
@return true:チェック有り / false: チェック無し
@date 2005.01.10 genta 新規作成
*/
bool CEditView::IsISearchEnabled(int nCommand) const
{
switch( nCommand )
{
case F_ISEARCH_NEXT:
return m_nISearchMode == 1 && m_nISearchDirection == 1;
case F_ISEARCH_PREV:
return m_nISearchMode == 1 && m_nISearchDirection == 0;
case F_ISEARCH_REGEXP_NEXT:
return m_nISearchMode == 2 && m_nISearchDirection == 1;
case F_ISEARCH_REGEXP_PREV:
return m_nISearchMode == 2 && m_nISearchDirection == 0;
case F_ISEARCH_MIGEMO_NEXT:
return m_nISearchMode == 3 && m_nISearchDirection == 1;
case F_ISEARCH_MIGEMO_PREV:
return m_nISearchMode == 3 && m_nISearchDirection == 0;
}
return false;
}
/*[EOF]*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -