⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ceditview_cmdisrch.cpp

📁 日本的开源编辑器源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
{
	//一文字ずつ分解して実行

	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 + -