📄 ceditview_cmdisrch.cpp
字号:
// $Id: CEditView_Cmdisrch.cpp,v 1.4 2005/02/04 14:19:57 genta Exp $
/*! @file
@brief CEditViewクラスのインクリメンタルサーチ関連コマンド処理系関数群
@date 2005/01/10 作成
$Revision: 1.4 $
*/
/*
Copyright (C) 2004, isearch
Copyright (C) 2005, genta
This source code is designed for sakura editor.
Please contact the copyright holders to use this code for other purpose.
*/
#include "sakura_rc.h"
#include "CEditView.h"
#include "CEditDoc.h"
#include "CDocLine.h"
#include "CMigemo.h"
#include "etc_uty.h"
/*!
コマンドコードの変換(ISearch時)及び
インクリメンタルサーチモードを抜ける判定
@return true: コマンド処理済み / false: コマンド処理継続
@date 2004.09.14 isearch 新規作成
@date 2005.01.10 genta 関数化, UNINDENT追加
@note UNINDENTを通常文字として扱うのは,
SHIFT+文字の後でSPACEを入力するようなケースで
SHIFTの解放が遅れても文字が入らなくなることを防ぐため.
*/
void CEditView::TranslateCommand_isearch(
int& nCommand,
BOOL& bRedraw,
LPARAM& lparam1,
LPARAM& lparam2,
LPARAM& lparam3,
LPARAM& lparam4
)
{
if (m_nISearchMode <= 0 )
return;
switch (nCommand){
//これらの機能のとき、インクリメンタルサーチに入る
case F_ISEARCH_NEXT:
case F_ISEARCH_PREV:
case F_ISEARCH_REGEXP_NEXT:
case F_ISEARCH_REGEXP_PREV:
case F_ISEARCH_MIGEMO_NEXT:
case F_ISEARCH_MIGEMO_PREV:
break;
//以下の機能のとき、インクリメンタルサーチ中は検索文字入力として処理
case F_CHAR:
case F_IME_CHAR:
nCommand = F_ISEARCH_ADD_CHAR;
break;
case F_INSTEXT:
nCommand = F_ISEARCH_ADD_STR;
break;
case F_INDENT_TAB: // TABはインデントではなく単なるTAB文字と見なす
case F_UNINDENT_TAB: // genta追加
nCommand = F_ISEARCH_ADD_CHAR;
lparam1 = '\t';
break;
case F_INDENT_SPACE: // スペースはインデントではなく単なるTAB文字と見なす
case F_UNINDENT_SPACE: // genta追加
nCommand = F_ISEARCH_ADD_CHAR;
lparam1 = ' ';
break;
case F_DELETE_BACK:
nCommand = F_ISEARCH_DEL_BACK;
break;
default:
//上記以外のコマンドの場合はインクリメンタルサーチを抜ける
ISearchExit();
}
}
/*!
ISearch コマンド処理
@date 2005.01.10 genta 各コマンドに入っていた処理を1カ所に移動
*/
bool CEditView::ProcessCommand_isearch(
int nCommand,
BOOL bRedraw,
LPARAM lparam1,
LPARAM lparam2,
LPARAM lparam3,
LPARAM lparam4
)
{
switch( nCommand ){
// 検索文字列の変更操作
case F_ISEARCH_ADD_CHAR:
ISearchExec((WORD)lparam1);
return true;
case F_ISEARCH_DEL_BACK:
ISearchBack();
return true;
case F_ISEARCH_ADD_STR:
ISearchExec((const char*)lparam1);
return true;
// 検索モードへの移行
case F_ISEARCH_NEXT:
ISearchEnter(1,1); //前方インクリメンタルサーチ //2004.10.13 isearch
return true;
case F_ISEARCH_PREV:
ISearchEnter(1,0); //後方インクリメンタルサーチ //2004.10.13 isearch
return true;
case F_ISEARCH_REGEXP_NEXT:
ISearchEnter(2,1); //前方正規表現インクリメンタルサーチ //2004.10.13 isearch
return true;
case F_ISEARCH_REGEXP_PREV:
ISearchEnter(2,0); //後方正規表現インクリメンタルサーチ //2004.10.13 isearch
return true;
case F_ISEARCH_MIGEMO_NEXT:
ISearchEnter(3,1); //前方MIGEMOインクリメンタルサーチ //2004.10.13 isearch
return true;
case F_ISEARCH_MIGEMO_PREV:
ISearchEnter(3,0); //後方MIGEMOインクリメンタルサーチ //2004.10.13 isearch
return true;
}
return false;
}
/*!
インクリメンタルサーチモードに入る
@param mode [in] 検索方法 1:通常, 2:正規表現, 3:MIGEMO
@param direction [in] 検索方向 0:後方(上方), 1:前方(下方)
@author isearch
*/
void CEditView::ISearchEnter( int mode ,int direction)
{
if (m_nISearchMode == mode ) {
//再実行
m_nISearchDirection = direction;
if ( m_bISearchFirst ){
m_bISearchFirst = false;
}
//ちょっと修正
ISearchExec(true);
}else{
//インクリメンタルサーチモードに入るだけ.
//選択範囲の解除
if(IsTextSelected())
DisableSelectArea( TRUE );
if(m_pcmigemo==NULL){
m_pcmigemo = CMigemo::getInstance();
m_pcmigemo->Init();
}
switch( mode ) {
case 1: // 通常インクリメンタルサーチ
m_bCurSrchRegularExp = FALSE;
m_pShareData->m_Common.m_bRegularExp = FALSE;
//SendStatusMessage("I-Search: ");
break;
case 2: // 正規表現インクリメンタルサーチ
if (!m_CurRegexp.IsAvailable()){
MessageBeep(MB_ICONEXCLAMATION);
SendStatusMessage("BREGREP.DLLが使用できません。");
return;
}
m_bCurSrchRegularExp = TRUE;
m_pShareData->m_Common.m_bRegularExp = TRUE;
//SendStatusMessage("[RegExp] I-Search: ");
break;
case 3: // MIGEMOインクリメンタルサーチ
if (!m_CurRegexp.IsAvailable()){
MessageBeep(MB_ICONEXCLAMATION);
SendStatusMessage("BREGREP.DLLが使用できません。");
return;
}
//migemo dll チェック
// Jan. 10, 2005 genta 設定変更で使えるようになっている
// 可能性があるので,使用可能でなければ一応初期化を試みる
if ( ! m_pcmigemo->IsAvailable() && ! m_pcmigemo->Init() ){
MessageBeep(MB_ICONEXCLAMATION);
SendStatusMessage("MIGEMO.DLLが使用できません。");
return;
}
m_pcmigemo->migemo_load_all();
if (m_pcmigemo->migemo_is_enable()) {
m_bCurSrchRegularExp = TRUE;
m_pShareData->m_Common.m_bRegularExp = TRUE;
//SendStatusMessage("[MIGEMO] I-Search: ");
}else{
MessageBeep(MB_ICONEXCLAMATION);
SendStatusMessage("MIGEMOは使用できません。 ");
return;
}
break;
}
// Feb. 04, 2005 genta 検索開始位置を記録
// インクリメンタルサーチ間でモードを切り替える場合には開始と見なさない
if( m_nISearchMode == 0 ){
m_nSrchStartPosX_PHY = m_nCaretPosX_PHY;
m_nSrchStartPosY_PHY = m_nCaretPosY_PHY;
}
//m_szCurSrchKey[0] = '\0';
m_bCurSrchKeyMark = FALSE;
m_nISearchDirection = direction;
m_nISearchMode = mode;
m_nISearchHistoryCount = 0;
m_nISearchX1History[m_nISearchHistoryCount] = m_nCaretPosX;
m_nISearchY1History[m_nISearchHistoryCount] = m_nCaretPosY;
m_nISearchX2History[m_nISearchHistoryCount] = m_nCaretPosX;
m_nISearchY2History[m_nISearchHistoryCount] = m_nCaretPosY;
Redraw();
CMemory msg;
ISearchSetStatusMsg(&msg);
SendStatusMessage(msg.GetPtr());
m_bISearchWrap = false;
m_bISearchFirst = true;
}
//マウスカーソル変更
if (direction == 1){
::SetCursor( ::LoadCursor( m_hInstance,MAKEINTRESOURCE(IDC_CURSOR_ISEARCH_F)));
}else{
::SetCursor( ::LoadCursor( m_hInstance,MAKEINTRESOURCE(IDC_CURSOR_ISEARCH_B)));
}
}
//! インクリメンタルサーチモードから抜ける
void CEditView::ISearchExit()
{
CShareData::getInstance()->AddToSearchKeyArr( m_szCurSrchKey );
m_nISearchDirection = 0;
m_nISearchMode = 0;
if (m_nISearchHistoryCount == 0){
m_szCurSrchKey[0] = '\0';
}
//マウスカーソルを元に戻す
POINT point1;
GetCursorPos(&point1);
OnMOUSEMOVE(0,point1.x,point1.y);
//ステータス表示エリアをクリア
SendStatusMessage("");
}
/*!
@brief インクリメンタルサーチの実行(1文字追加)
@param wChar [in] 追加する文字 (1byte or 2byte)
*/
void CEditView::ISearchExec(WORD wChar)
{
//特殊文字は処理しない
switch ( wChar){
case '\r':
case '\n':
ISearchExit();
return;
//case '\t':
// break;
}
int l;
if (m_bISearchFirst){
m_bISearchFirst = false;
l = 0 ;
}else
l = strlen(m_szCurSrchKey) ;
if (wChar <= 255 ) {
if ( l < sizeof(m_szCurSrchKey) - 1) {
m_szCurSrchKey[l] =(char)wChar;
m_szCurSrchKey[l+1] = '\0';
}
}else{
if ( l < sizeof(m_szCurSrchKey) - 2) {
m_szCurSrchKey[l] =(char)(wChar>>8);
m_szCurSrchKey[l+1] =(char)wChar;
m_szCurSrchKey[l+2] = '\0';
}
}
ISearchExec(false);
return ;
}
/*!
@brief インクリメンタルサーチの実行(文字列追加)
@param pszText [in] 追加する文字列
*/
void CEditView::ISearchExec(const char* pszText)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -