📄 cdlggrep.cpp
字号:
// $Id: CDlgGrep.cpp,v 1.20 2003/09/19 16:41:16 genta Exp $
/*! @file
@brief GREPダイアログボックス
@author Norio Nakatani
$Revision: 1.20 $
*/
/*
Copyright (C) 1998-2001, Norio Nakatani
Copyright (C) 2001, Stonee, genta
Copyright (C) 2002, MIK
This source code is designed for sakura editor.
Please contact the copyright holder to use this code for other purpose.
*/
#include <windows.h>
#include "sakura_rc.h"
#include "CDlgGrep.h"
#include "debug.h"
#include "etc_uty.h"
#include "global.h"
#include "funccode.h" // Stonee, 2001/03/12
//GREP CDlgGrep.cpp //@@@ 2002.01.07 add start MIK
#include "sakura.hh"
const DWORD p_helpids[] = { //12000
IDC_BUTTON_FOLDER, HIDC_GREP_BUTTON_FOLDER, //フォルダ
IDC_BUTTON_CURRENTFOLDER, HIDC_GREP_BUTTON_CURRENTFOLDER, //現フォルダ
IDOK, HIDOK_GREP, //検索
IDCANCEL, HIDCANCEL_GREP, //キャンセル
IDC_BUTTON_HELP, HIDC_GREP_BUTTON_HELP, //ヘルプ
IDC_CHK_WORD, HIDC_GREP_CHK_WORD, //単語単位
IDC_CHK_SUBFOLDER, HIDC_GREP_CHK_SUBFOLDER, //サブフォルダも検索
IDC_CHK_FROMTHISTEXT, HIDC_GREP_CHK_FROMTHISTEXT, //このファイルから
IDC_CHK_LOHICASE, HIDC_GREP_CHK_LOHICASE, //大文字小文字
IDC_CHK_REGULAREXP, HIDC_GREP_CHK_REGULAREXP, //正規表現
IDC_COMBO_CHARSET, HIDC_GREP_COMBO_CHARSET, //文字コードセット
IDC_COMBO_TEXT, HIDC_GREP_COMBO_TEXT, //条件
IDC_COMBO_FILE, HIDC_GREP_COMBO_FILE, //ファイル
IDC_COMBO_FOLDER, HIDC_GREP_COMBO_FOLDER, //フォルダ
IDC_RADIO_OUTPUTLINE, HIDC_GREP_RADIO_OUTPUTLINE, //結果出力:行単位
IDC_RADIO_OUTPUTMARKED, HIDC_GREP_RADIO_OUTPUTMARKED, //結果出力:該当部分
IDC_RADIO_OUTPUTSTYLE1, HIDC_GREP_RADIO_OUTPUTSTYLE1, //結果出力形式:ノーマル
IDC_RADIO_OUTPUTSTYLE2, HIDC_GREP_RADIO_OUTPUTSTYLE2, //結果出力形式:ファイル毎
IDC_STATIC_JRE32VER, HIDC_GREP_STATIC_JRE32VER, //正規表現バージョン
IDC_CHK_DEFAULTFOLDER, HIDC_GREP_CHK_DEFAULTFOLDER, //フォルダの初期値をカレントフォルダにする
// IDC_STATIC, -1,
0, 0
}; //@@@ 2002.01.07 add end MIK
CDlgGrep::CDlgGrep()
{
m_bSubFolder = FALSE; /* サブフォルダからも検索する */
m_bFromThisText = FALSE; /* この編集中のテキストから検索する */
m_bLoHiCase = FALSE; /* 英大文字と英小文字を区別する */
m_bRegularExp = FALSE; /* 正規表現 */
m_nGrepCharSet = CODE_SJIS; /* 文字コードセット */
m_bGrepOutputLine = TRUE; /* 行を出力するか該当部分だけ出力するか */
m_nGrepOutputStyle = 1; /* Grep: 出力形式 */
strcpy( m_szText, m_pShareData->m_szSEARCHKEYArr[0] ); /* 検索文字列 */
strcpy( m_szFile, m_pShareData->m_szGREPFILEArr[0] ); /* 検索ファイル */
strcpy( m_szFolder, m_pShareData->m_szGREPFOLDERArr[0] ); /* 検索フォルダ */
return;
}
/* モーダルダイアログの表示 */
int CDlgGrep::DoModal( HINSTANCE hInstance, HWND hwndParent, const char* pszCurrentFilePath )
{
m_bSubFolder = m_pShareData->m_Common.m_bGrepSubFolder; /* Grep: サブフォルダも検索 */
m_bRegularExp = m_pShareData->m_Common.m_bRegularExp; /* 1==正規表現 */
m_nGrepCharSet = m_pShareData->m_Common.m_nGrepCharSet; /* 文字コードセット */
m_bLoHiCase = m_pShareData->m_Common.m_bLoHiCase; /* 1==大文字小文字の区別 */
m_bGrepOutputLine = m_pShareData->m_Common.m_bGrepOutputLine; /* 行を出力するか該当部分だけ出力するか */
m_nGrepOutputStyle = m_pShareData->m_Common.m_nGrepOutputStyle; /* Grep: 出力形式 */
//2001/06/23 N.Nakatani add
m_bWordOnly = m_pShareData->m_Common.m_bWordOnly; /* 単語単位で検索 */
lstrcpy( m_szCurrentFilePath, pszCurrentFilePath );
return (int)CDialog::DoModal( hInstance, hwndParent, IDD_GREP, NULL );
}
// /* モードレスダイアログの表示 */
// HWND CDlgGrep::DoModeless( HINSTANCE hInstance, HWND hwndParent, const char* pszCurrentFilePath )
// {
// m_bSubFolder = m_pShareData->m_Common.m_bGrepSubFolder; /* Grep: サブフォルダも検索 */
// m_bRegularExp = m_pShareData->m_Common.m_bRegularExp; /* 1==正規表現 */
// m_nGrepCharSet = m_pShareData->m_Common.m_nGrepCharSet; /* 文字コードセット */
// m_bLoHiCase = m_pShareData->m_Common.m_bLoHiCase; /* 1==英大文字小文字の区別 */
// m_bGrepOutputLine = m_pShareData->m_Common.m_bGrepOutputLine; /* 行を出力するか該当部分だけ出力するか */
// m_nGrepOutputStyle = m_pShareData->m_Common.m_nGrepOutputStyle; /* Grep: 出力形式 */
// lstrcpy( m_szCurrentFilePath, pszCurrentFilePath );
//
// return CDialog::DoModeless( hInstance, hwndParent, IDD_GREP, NULL );
// }
BOOL CDlgGrep::OnInitDialog( HWND hwndDlg, WPARAM wParam, LPARAM lParam )
{
m_hWnd = hwndDlg;
/* ユーザーがコンボボックスのエディット コントロールに入力できるテキストの長さを制限する */
::SendMessage( ::GetDlgItem( m_hWnd, IDC_COMBO_TEXT ), CB_LIMITTEXT, (WPARAM)_MAX_PATH - 1, 0 );
::SendMessage( ::GetDlgItem( m_hWnd, IDC_COMBO_FILE ), CB_LIMITTEXT, (WPARAM)_MAX_PATH - 1, 0 );
::SendMessage( ::GetDlgItem( m_hWnd, IDC_COMBO_FOLDER ), 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_FILE ), CB_SETEXTENDEDUI, (WPARAM) (BOOL) TRUE, 0 );
::SendMessage( ::GetDlgItem( m_hWnd, IDC_COMBO_FOLDER ), CB_SETEXTENDEDUI, (WPARAM) (BOOL) TRUE, 0 );
// ::SendMessage( ::GetDlgItem( m_hWnd, IDC_COMBO_CHARSET ), CB_SETEXTENDEDUI, (WPARAM) (BOOL) TRUE, 0 );
/* ダイアログのアイコン */
// ::SendMessage( m_hWnd, WM_SETICON, ICON_BIG, (LPARAM)::LoadIcon( m_hInstance, IDI_QUESTION ) );
//2002.02.08 Grepアイコンも大きいアイコンと小さいアイコンを別々にする。
HICON hIconBig, hIconSmall;
// Dec, 2, 2002 genta アイコン読み込み方法変更
hIconBig = GetAppIcon( m_hInstance, ICON_DEFAULT_GREP, FN_GREP_ICON, false );
hIconSmall = GetAppIcon( m_hInstance, ICON_DEFAULT_GREP, FN_GREP_ICON, true );
::SendMessage( m_hWnd, WM_SETICON, ICON_SMALL, (LPARAM)hIconSmall );
::SendMessage( m_hWnd, WM_SETICON, ICON_BIG, (LPARAM)hIconBig );
// 2002/09/22 Moca Add
int i;
/* 文字コードセット選択コンボボックス初期化 */
for( i = 0; i < gm_nCodeComboNameArrNum; ++i ){
int idx = ::SendMessage( ::GetDlgItem( m_hWnd, IDC_COMBO_CHARSET ), CB_ADDSTRING, 0, (LPARAM)gm_pszCodeComboNameArr[i] );
::SendMessage( ::GetDlgItem( m_hWnd, IDC_COMBO_CHARSET ), CB_SETITEMDATA, idx, gm_nCodeComboValueArr[i] );
}
/* 基底クラスメンバ */
// CreateSizeBox();
return CDialog::OnInitDialog( hwndDlg, wParam, lParam );
}
BOOL CDlgGrep::OnBnClicked( int wID )
{
switch( wID ){
case IDC_BUTTON_HELP:
/* 「Grep」のヘルプ */
//Stonee, 2001/03/12 第四引数を、機能番号からヘルプトピック番号を調べるようにした
::WinHelp( m_hWnd, m_szHelpFile, HELP_CONTEXT, ::FuncID_To_HelpContextID(F_GREP_DIALOG) );
return TRUE;
case IDC_CHK_FROMTHISTEXT: /* この編集中のテキストから検索する */
if( 0 < (int)lstrlen(m_szCurrentFilePath ) ){
if( ::IsDlgButtonChecked( m_hWnd, IDC_CHK_FROMTHISTEXT ) ){
::EnableWindow( ::GetDlgItem( m_hWnd, IDC_COMBO_FILE ), FALSE );
::EnableWindow( ::GetDlgItem( m_hWnd, IDC_COMBO_FOLDER ), FALSE );
::EnableWindow( ::GetDlgItem( m_hWnd, IDC_BUTTON_FOLDER ), FALSE );
::EnableWindow( ::GetDlgItem( m_hWnd, IDC_CHK_SUBFOLDER ), FALSE );
::CheckDlgButton( m_hWnd, IDC_CHK_SUBFOLDER, 0 );
}else{
::EnableWindow( ::GetDlgItem( m_hWnd, IDC_COMBO_FILE ), TRUE );
::EnableWindow( ::GetDlgItem( m_hWnd, IDC_COMBO_FOLDER ), TRUE );
::EnableWindow( ::GetDlgItem( m_hWnd, IDC_BUTTON_FOLDER ), TRUE );
::EnableWindow( ::GetDlgItem( m_hWnd, IDC_CHK_SUBFOLDER ), TRUE );
}
char szWorkFolder[MAX_PATH];
char szWorkFile[MAX_PATH];
// 2003.08.01 Moca ファイル名はスペースなどは区切り記号になるので、""で囲い、エスケープする
szWorkFile[0] = '"';
SplitPath_FolderAndFile( m_szCurrentFilePath, szWorkFolder, szWorkFile + 1 );
strcat( szWorkFile, "\"" ); // 2003.08.01 Moca
::SetDlgItemText( m_hWnd, IDC_COMBO_FOLDER, szWorkFolder );
::SetDlgItemText( m_hWnd, IDC_COMBO_FILE, szWorkFile );
}
return TRUE;
case IDC_BUTTON_CURRENTFOLDER: /* 現在編集中のファイルのフォルダ */
/* ファイルを開いているか */
if( 0 < lstrlen( m_szCurrentFilePath ) ){
char szWorkFolder[MAX_PATH];
char szWorkFile[MAX_PATH];
SplitPath_FolderAndFile( m_szCurrentFilePath, szWorkFolder, szWorkFile );
::SetDlgItemText( m_hWnd, IDC_COMBO_FOLDER, szWorkFolder );
}else{
/* 現在のプロセスのカレントディレクトリを取得します */
char szWorkFolder[MAX_PATH];
::GetCurrentDirectory( sizeof( szWorkFolder ) - 1, szWorkFolder );
::SetDlgItemText( m_hWnd, IDC_COMBO_FOLDER, szWorkFolder );
// ::MessageBeep( MB_ICONEXCLAMATION );
}
return TRUE;
// case IDC_CHK_LOHICASE: /* 英大文字と英小文字を区別する */
// MYTRACE( "IDC_CHK_LOHICASE\n" );
// return TRUE;
case IDC_CHK_REGULAREXP: /* 正規表現 */
// MYTRACE( "IDC_CHK_REGULAREXP ::IsDlgButtonChecked( m_hWnd, IDC_CHK_REGULAREXP ) = %d\n", ::IsDlgButtonChecked( m_hWnd, IDC_CHK_REGULAREXP ) );
if( ::IsDlgButtonChecked( m_hWnd, IDC_CHK_REGULAREXP ) ){
// From Here Jun. 26, 2001 genta
// 正規表現ライブラリの差し替えに伴う処理の見直し
if( !CheckRegexpVersion( m_hWnd, IDC_STATIC_JRE32VER, true ) ){
::CheckDlgButton( m_hWnd, IDC_CHK_REGULAREXP, 0 );
}else{
// To Here Jun. 26, 2001 genta
/* 英大文字と英小文字を区別する */
// 正規表現のときも選択できるように。
// ::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{
/* 英大文字と英小文字を区別する */
// 正規表現のときも選択できるように。
// ::EnableWindow( ::GetDlgItem( m_hWnd, IDC_CHK_LOHICASE ), TRUE );
// ::CheckDlgButton( m_hWnd, IDC_CHK_LOHICASE, 0 );
//2001/06/23 N.Nakatani
//単語単位のgrepが実装されたらコメントを外すと思います
//2002/03/07実装してみた。
/* 単語単位で検索 */
::EnableWindow( ::GetDlgItem( m_hWnd, IDC_CHK_WORD ), TRUE );
}
return TRUE;
case IDC_BUTTON_FOLDER:
/* フォルダ参照ボタン */
{
char szFolder[MAX_PATH];
/* 検索フォルダ */
::GetDlgItemText( m_hWnd, IDC_COMBO_FOLDER, szFolder, _MAX_PATH - 1 );
if( 0 == lstrlen( szFolder ) ){
::GetCurrentDirectory( sizeof( szFolder ), szFolder );
}
if( SelectDir( m_hWnd, "検索するフォルダを選んでください", szFolder, szFolder ) ){
::SetDlgItemText( m_hWnd, IDC_COMBO_FOLDER, szFolder );
}
}
return TRUE;
case IDC_CHK_DEFAULTFOLDER:
/* フォルダの初期値をカレントフォルダにする */
{
m_pShareData->m_Common.m_bGrepDefaultFolder = ::IsDlgButtonChecked( m_hWnd, IDC_CHK_DEFAULTFOLDER );
}
return TRUE;
case IDOK:
/* ダイアログデータの取得 */
if( GetData() ){
// ::EndDialog( hwndDlg, TRUE );
CloseDialog( TRUE );
}
return TRUE;
case IDCANCEL:
// ::EndDialog( hwndDlg, FALSE );
CloseDialog( FALSE );
return TRUE;
}
/* 基底クラスメンバ */
return CDialog::OnBnClicked( wID );
}
/* ダイアログデータの設定 */
void CDlgGrep::SetData( void )
{
int i;
HWND hwndCombo;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -