?? cdlgreplace.cpp
字號:
// $Id: CDlgReplace.cpp,v 1.18 2003/01/01 01:58:15 Administrator Exp $
/*! @file
@brief 置換ダイアログ
@author Norio Nakatani
@date 2001/06/23 N.Nakatani 単語単位で検索する機能を実裝
$Revision: 1.18 $
*/
/*
Copyright (C) 1998-2001, Norio Nakatani
Copyright (C) 2001, genta, Stonee, hor, YAZAKI
Copyright (C) 2002, MIK, hor, novice, genta, aroka
This source code is designed for sakura editor.
Please contact the copyright holder to use this code for other purpose.
*/
#include "sakura_rc.h"
#include "CDlgReplace.h"
#include "debug.h"
#include "CEditView.h"
#include "etc_uty.h"
#include "global.h"
#include "funccode.h" // Stonee, 2001/03/12
#include "CLayout.h"/// 2002/2/3 aroka
#include "CEditDoc.h" // 2002/5/13 YAZAKI ヘッダ整理
//置換 CDlgReplace.cpp //@@@ 2002.01.07 add start MIK
#include "sakura.hh"
const DWORD p_helpids[] = { //11900
IDC_BUTTON_SEARCHNEXT, HIDC_REP_BUTTON_SEARCHNEXT, //下検索
IDC_BUTTON_SEARCHPREV, HIDC_REP_BUTTON_SEARCHPREV, //上検索
IDC_BUTTON_REPALCE, HIDC_REP_BUTTON_REPALCE, //置換
IDC_BUTTON_REPALCEALL, HIDC_REP_BUTTON_REPALCEALL, //全置換
IDCANCEL, HIDCANCEL_REP, //キャンセル
IDC_BUTTON_HELP, HIDC_REP_BUTTON_HELP, //ヘルプ
IDC_CHK_PASTE, HIDC_REP_CHK_PASTE, //クリップボードから貼り付け
IDC_CHK_WORD, HIDC_REP_CHK_WORD, //単語単位
IDC_CHK_LOHICASE, HIDC_REP_CHK_LOHICASE, //大文字小文字
IDC_CHK_REGULAREXP, HIDC_REP_CHK_REGULAREXP, //正規(guī)表現(xiàn)
IDC_CHECK_NOTIFYNOTFOUND, HIDC_REP_CHECK_NOTIFYNOTFOUND, //見つからないときに通知
IDC_CHECK_bAutoCloseDlgReplace, HIDC_REP_CHECK_bAutoCloseDlgReplace, //自動的に閉じる
IDC_COMBO_TEXT, HIDC_REP_COMBO_TEXT, //置換前
IDC_COMBO_TEXT2, HIDC_REP_COMBO_TEXT2, //置換後
IDC_RADIO_REPLACE, HIDC_REP_RADIO_REPLACE, //置換対象:置換
IDC_RADIO_INSERT, HIDC_REP_RADIO_INSERT, //置換対象:挿入
IDC_RADIO_ADD, HIDC_REP_RADIO_ADD, //置換対象:追加
IDC_RADIO_SELECTEDAREA, HIDC_REP_RADIO_SELECTEDAREA, //範囲:全體
IDC_RADIO_ALLAREA, HIDC_REP_RADIO_ALLAREA, //範囲:選択範囲
IDC_STATIC_JRE32VER, HIDC_REP_STATIC_JRE32VER, //正規(guī)表現(xiàn)バージョン
IDC_BUTTON_SETMARK, HIDC_REP_BUTTON_SETMARK, //2002.01.16 hor 検索該當行をマーク
IDC_CHECK_SEARCHALL, HIDC_REP_CHECK_SEARCHALL, //2002.01.26 hor 先頭(末尾)から再検索
// IDC_STATIC, -1,
0, 0
}; //@@@ 2002.01.07 add end MIK
CDlgReplace::CDlgReplace()
{
m_bLoHiCase = FALSE; /* 英大文字と英小文字を區(qū)別する */
m_bWordOnly = FALSE; /* 一致する?yún)g語のみ検索する */
m_bRegularExp = FALSE; /* 正規(guī)表現(xiàn) */
m_bSelectedArea = FALSE; /* 選択範囲內置換 */
m_szText[0] = '\0'; /* 検索文字列 */
m_szText2[0] = '\0'; /* 置換後文字列 */
m_nReplaceTarget = 0; /* 置換対象 */ // 2001.12.03 hor
m_nPaste = FALSE; /* 貼り付ける? */ // 2001.12.03 hor
m_nReplaceCnt = 0; //すべて置換の実行結果 // 2002.02.08 hor
m_bCanceled = false; //すべて置換を中斷したか // 2002.02.08 hor
return;
}
/* モードレスダイアログの表示 */
HWND CDlgReplace::DoModeless( HINSTANCE hInstance, HWND hwndParent, LPARAM lParam, BOOL bSelected )
{
m_bRegularExp = m_pShareData->m_Common.m_bRegularExp; /* 1==正規(guī)表現(xiàn) */
m_bLoHiCase = m_pShareData->m_Common.m_bLoHiCase; /* 1==英大文字小文字の區(qū)別 */
m_bWordOnly = m_pShareData->m_Common.m_bWordOnly; /* 1==単語のみ検索 */
m_bSelectedArea = m_pShareData->m_Common.m_bSelectedArea; /* 選択範囲內置換 */
m_bNOTIFYNOTFOUND = m_pShareData->m_Common.m_bNOTIFYNOTFOUND; /* 検索/置換 見つからないときメッセージを表示 */
m_bSelected = bSelected;
m_nEscCaretPosX_PHY = ((CEditView*)lParam)->m_nCaretPosX_PHY; /* 検索/置換開始時のカーソル位置退避 02/07/28 ai */
m_nEscCaretPosY_PHY = ((CEditView*)lParam)->m_nCaretPosY_PHY; /* 検索/置換開始時のカーソル位置退避 02/07/28 ai */
((CEditView*)lParam)->m_bSearch = TRUE; /* 検索/置換開始位置の登録有無 02/07/28 ai */
return CDialog::DoModeless( hInstance, hwndParent, IDD_REPLACE, lParam, SW_SHOW );
}
/* モードレス時:置換?検索対象となるビューの変更 */
void CDlgReplace::ChangeView( LPARAM pcEditView )
{
m_lParam = pcEditView;
return;
}
/* ダイアログデータの設定 */
void CDlgReplace::SetData( void )
{
int i;
HWND hwndCombo;
// m_hWnd = hwndDlg; /* このダイアログのハンドル */
/* 検索文字列 */
::SetDlgItemText( m_hWnd, IDC_COMBO_TEXT, m_szText );
hwndCombo = ::GetDlgItem( m_hWnd, IDC_COMBO_TEXT );
for( i = 0; i < m_pShareData->m_nSEARCHKEYArrNum; ++i ){
::SendMessage( hwndCombo, CB_ADDSTRING, 0, (LPARAM)m_pShareData->m_szSEARCHKEYArr[i] );
}
/* 置換後文字列 */
::SetDlgItemText( m_hWnd, IDC_COMBO_TEXT2, m_szText2 );
hwndCombo = ::GetDlgItem( m_hWnd, IDC_COMBO_TEXT2 );
for( i = 0; i < m_pShareData->m_nREPLACEKEYArrNum; ++i ){
::SendMessage( hwndCombo, CB_ADDSTRING, 0, (LPARAM)m_pShareData->m_szREPLACEKEYArr[i] );
}
/* 英大文字と英小文字を區(qū)別する */
::CheckDlgButton( m_hWnd, IDC_CHK_LOHICASE, m_bLoHiCase );
// 2001/06/23 N.Nakatani
/* 単語単位で探す */
::CheckDlgButton( m_hWnd, IDC_CHK_WORD, m_bWordOnly );
// From Here 2001.12.03 hor
// /* 選択範囲內置換 */
// if( m_pShareData->m_Common.m_bSelectedArea ){
// ::CheckDlgButton( m_hWnd, IDC_RADIO_SELECTEDAREA, TRUE );
// }else{
// ::CheckDlgButton( m_hWnd, IDC_RADIO_ALLAREA, TRUE );
// }
// To Here 2001.12.03 hor
// From Here Jun. 29, 2001 genta
// 正規(guī)表現(xiàn)ライブラリの差し替えに伴う処理の見直し
// 処理フロー及び判定條件の見直し。必ず正規(guī)表現(xiàn)のチェックと
// 無関係にCheckRegexpVersionを通過するようにした。
if( CheckRegexpVersion( m_hWnd, IDC_STATIC_JRE32VER, false )
&& m_bRegularExp){
/* 英大文字と英小文字を區(qū)別する */
::CheckDlgButton( m_hWnd, IDC_CHK_REGULAREXP, 1 );
// 正規(guī)表現(xiàn)のときも選択できるように。
// ::CheckDlgButton( m_hWnd, IDC_CHK_LOHICASE, 1 );
// ::EnableWindow( ::GetDlgItem( m_hWnd, IDC_CHK_LOHICASE ), FALSE );
// 2001/06/23 N.Nakatani
/* 単語単位で探す */
::EnableWindow( ::GetDlgItem( m_hWnd, IDC_CHK_WORD ), FALSE );
}
else {
::CheckDlgButton( m_hWnd, IDC_CHK_REGULAREXP, 0 );
}
// To Here Jun. 29, 2001 genta
/* 検索/置換 見つからないときメッセージを表示 */
::CheckDlgButton( m_hWnd, IDC_CHECK_NOTIFYNOTFOUND, m_bNOTIFYNOTFOUND );
/* 置換 ダイアログを自動的に閉じる */
::CheckDlgButton( m_hWnd, IDC_CHECK_bAutoCloseDlgReplace, m_pShareData->m_Common.m_bAutoCloseDlgReplace );
/* 先頭(末尾)から再検索 2002.01.26 hor */
::CheckDlgButton( m_hWnd, IDC_CHECK_SEARCHALL, m_pShareData->m_Common.m_bSearchAll );
// From Here 2001.12.03 hor
// クリップボードから貼り付ける?
::CheckDlgButton( m_hWnd, IDC_CHK_PASTE, m_nPaste );
// 置換対象
if(m_nReplaceTarget==0){
::CheckDlgButton( m_hWnd, IDC_RADIO_REPLACE, TRUE );
}else
if(m_nReplaceTarget==1){
::CheckDlgButton( m_hWnd, IDC_RADIO_INSERT, TRUE );
}else
if(m_nReplaceTarget==2){
::CheckDlgButton( m_hWnd, IDC_RADIO_ADD, TRUE );
}
// To Here 2001.12.03 hor
return;
}
/* ダイアログデータの取得 */
/* 0==條件未入力 0より大きい==正常 0より小さい==入力エラー */
int CDlgReplace::GetData( void )
{
// int i;
// int j;
// CMemory* pcmWork;
/* 英大文字と英小文字を區(qū)別する */
m_bLoHiCase = ::IsDlgButtonChecked( m_hWnd, IDC_CHK_LOHICASE );
// 2001/06/23 N.Nakatani
/* 単語単位で探す */
m_bWordOnly = ::IsDlgButtonChecked( m_hWnd, IDC_CHK_WORD );
/* 正規(guī)表現(xiàn) */
m_bRegularExp = ::IsDlgButtonChecked( m_hWnd, IDC_CHK_REGULAREXP );
/* 選択範囲內置換 */
m_bSelectedArea = ::IsDlgButtonChecked( m_hWnd, IDC_RADIO_SELECTEDAREA );
/* 検索/置換 見つからないときメッセージを表示 */
m_bNOTIFYNOTFOUND = ::IsDlgButtonChecked( m_hWnd, IDC_CHECK_NOTIFYNOTFOUND );
m_pShareData->m_Common.m_bRegularExp = m_bRegularExp; /* 1==正規(guī)表現(xiàn) */
m_pShareData->m_Common.m_bLoHiCase = m_bLoHiCase; /* 1==英大文字小文字の區(qū)別 */
m_pShareData->m_Common.m_bWordOnly = m_bWordOnly; /* 1==単語のみ検索 */
m_pShareData->m_Common.m_bSelectedArea = m_bSelectedArea; /* 選択範囲內置換 */
m_pShareData->m_Common.m_bNOTIFYNOTFOUND = m_bNOTIFYNOTFOUND; /* 検索/置換 見つからないときメッセージを表示 */
/* 検索文字列 */
::GetDlgItemText( m_hWnd, IDC_COMBO_TEXT, m_szText, sizeof( m_szText ));
/* 置換後文字列 */
::GetDlgItemText( m_hWnd, IDC_COMBO_TEXT2, m_szText2, sizeof( m_szText2 ));
/* 置換 ダイアログを自動的に閉じる */
m_pShareData->m_Common.m_bAutoCloseDlgReplace = ::IsDlgButtonChecked( m_hWnd, IDC_CHECK_bAutoCloseDlgReplace );
/* 先頭(末尾)から再検索 2002.01.26 hor */
m_pShareData->m_Common.m_bSearchAll = ::IsDlgButtonChecked( m_hWnd, IDC_CHECK_SEARCHALL );
if( 0 < lstrlen( m_szText ) ){
/* 正規(guī)表現(xiàn)? */
// From Here Jun. 26, 2001 genta
// 正規(guī)表現(xiàn)ライブラリの差し替えに伴う処理の見直し
int nFlag = 0x00;
nFlag |= m_bLoHiCase ? 0x01 : 0x00;
if( m_bRegularExp && !CheckRegexpSyntax( m_szText, m_hWnd, true, nFlag ) ){
return -1;
}
// To Here Jun. 26, 2001 genta 正規(guī)表現(xiàn)ライブラリ差し替え
/* 検索文字列 */
//@@@ 2002.2.2 YAZAKI CShareData.AddToSearchKeyArr()追加に伴う変更
CShareData::getInstance()->AddToSearchKeyArr( m_szText );
/* 置換後文字列 */
//@@@ 2002.2.2 YAZAKI CShareData.AddToReplaceKeyArr()追加に伴う変更
CShareData::getInstance()->AddToReplaceKeyArr( m_szText2 );
// From Here 2001.12.03 hor
// クリップボードから貼り付ける?
m_nPaste=IsDlgButtonChecked( m_hWnd, IDC_CHK_PASTE );
::EnableWindow( ::GetDlgItem( m_hWnd, IDC_COMBO_TEXT2 ), !m_nPaste );
// 置換対象
m_nReplaceTarget=0;
if(::IsDlgButtonChecked( m_hWnd, IDC_RADIO_INSERT )){
m_nReplaceTarget=1;
}else
if(::IsDlgButtonChecked( m_hWnd, IDC_RADIO_ADD )){
m_nReplaceTarget=2;
}
// To Here 2001.12.03 hor
return 1;
}else{
return 0;
}
}
BOOL CDlgReplace::OnInitDialog( HWND hwndDlg, WPARAM wParam, LPARAM lParam )
{
m_hWnd = hwndDlg;
// Jun. 26, 2001 genta
// この位置で正規(guī)表現(xiàn)の初期化をする必要はない
// 他との一貫性を保つため削除
/* ユーザーがコンボ ボックスのエディット コントロールに入力できるテキストの長さを制限する */
::SendMessage( ::GetDlgItem( m_hWnd, IDC_COMBO_TEXT ), CB_LIMITTEXT, (WPARAM)_MAX_PATH - 1, 0 );
::SendMessage( ::GetDlgItem( m_hWnd, IDC_COMBO_TEXT2 ), CB_LIMITTEXT, (WPARAM)_MAX_PATH - 1, 0 );
/* コンボボックスのユーザー インターフェイスを拡張インターフェースにする */
::SendMessage( ::GetDlgItem( m_hWnd, IDC_COMBO_TEXT ), CB_SETEXTENDEDUI, (WPARAM) (BOOL) TRUE, 0 );
::SendMessage( ::GetDlgItem( m_hWnd, IDC_COMBO_TEXT2 ), CB_SETEXTENDEDUI, (WPARAM) (BOOL) TRUE, 0 );
/* テキスト選択中か */
if( m_bSelected ){
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -