static void SetGrepFolder( HWND hwndCtrl, LPCTSTR folder ) { if( auto_strchr( folder, _T(';')) ){ TCHAR szQuoteFolder[MAX_PATH]; szQuoteFolder[0] = _T('"'); auto_strcpy( szQuoteFolder + 1, folder ); auto_strcat( szQuoteFolder, _T("\"") ); ::SetWindowText( hwndCtrl, szQuoteFolder ); }else{ ::SetWindowText( hwndCtrl, folder ); } }
/*! アクセスキー付きの文字列の作成 @param sName ラベル @param sKey アクセスキー @return アクセスキー付きの文字列 @data 2013.12.09 novice アクセスキーと文字列の比較で小文字も有効にする @date 2014.05.04 sLabelのバッファ長を300 => _MAX_PATH*2 + 30 */ TCHAR* CKeyBind::MakeMenuLabel(const TCHAR* sName, const TCHAR* sKey) { const int MAX_LABEL_CCH = _MAX_PATH*2 + 30; static TCHAR sLabel[MAX_LABEL_CCH]; const TCHAR* p; if (sKey == NULL || sKey[0] == L'\0') { return const_cast<TCHAR*>( sName ); } else { if( !GetDllShareData().m_Common.m_sMainMenu.m_bMainMenuKeyParentheses && (((p = auto_strchr( sName, sKey[0])) != NULL) || ((p = auto_strchr( sName, _totlower(sKey[0]))) != NULL)) ){ // 欧文風、使用している文字をアクセスキーに auto_strcpy_s( sLabel, _countof(sLabel), sName ); sLabel[p-sName] = _T('&'); auto_strcpy_s( sLabel + (p-sName) + 1, _countof(sLabel), p ); } else if( (p = auto_strchr( sName, _T('(') )) != NULL && (p = auto_strchr( p, sKey[0] )) != NULL) { // (付その後にアクセスキー auto_strcpy_s( sLabel, _countof(sLabel), sName ); sLabel[p-sName] = _T('&'); auto_strcpy_s( sLabel + (p-sName) + 1, _countof(sLabel), p ); } else if (_tcscmp( sName + _tcslen(sName) - 3, _T("...") ) == 0) { // 末尾... auto_strcpy_s( sLabel, _countof(sLabel), sName ); sLabel[_tcslen(sName) - 3] = '\0'; // 末尾の...を取る auto_strcat_s( sLabel, _countof(sLabel), _T("(&") ); auto_strcat_s( sLabel, _countof(sLabel), sKey ); auto_strcat_s( sLabel, _countof(sLabel), _T(")...") ); } else { auto_sprintf_s( sLabel, _countof(sLabel), _T("%ts(&%ts)"), sName, sKey ); } return sLabel; } }
static void my_va_forward(va_list& v, const wchar_t* field, const wchar_t* prefix) { if(*field==0)return; const wchar_t* field_end=auto_strchr(field,0)-1; switch(*field_end){ case L's': case L'S': case L'p': va_arg(v,void*); break; case L'd': case L'i': case L'o': case L'u': case L'x': case L'X': // 2014.06.12 64bit値対応 { const wchar_t *p = prefix; if( p[0]==L'I' && p[1]==L'6' && p[2]==L'4' ){ va_arg(v,LONGLONG); }else{ va_arg(v,int); } } break; case 'c': if(field_end-1>=field && *(field_end-1)==L'h')va_arg(v,int); else va_arg(v,int); break; case 'C': if(field_end-1>=field && *(field_end-1)==L'l')va_arg(v,int); // wchar_t else if(field_end-1>=field && *(field_end-1)==L'w')va_arg(v,int); // wchar_t else va_arg(v,int); break; case L'e': case L'E': case L'f': case L'g': case L'G': case L'a': case L'A': va_arg(v,double); break; } }
/* TRUE==正常 FALSE==入力エラー */ int CDlgGrep::GetData( void ) { /* サブフォルダからも検索する*/ m_bSubFolder = ::IsDlgButtonChecked( GetHwnd(), IDC_CHK_SUBFOLDER ); m_pShareData->m_Common.m_sSearch.m_bGrepSubFolder = m_bSubFolder; /* Grep:サブフォルダも検索 */ /* この編集中のテキストから検索する */ m_bFromThisText = ::IsDlgButtonChecked( GetHwnd(), IDC_CHK_FROMTHISTEXT ); /* 英大文字と英小文字を区別する */ m_sSearchOption.bLoHiCase = (0!=::IsDlgButtonChecked( GetHwnd(), IDC_CHK_LOHICASE )); //2001/06/23 N.Nakatani /* 単語単位で検索 */ m_sSearchOption.bWordOnly = (0!=::IsDlgButtonChecked( GetHwnd(), IDC_CHK_WORD )); /* 正規表現 */ m_sSearchOption.bRegularExp = (0!=::IsDlgButtonChecked( GetHwnd(), IDC_CHK_REGULAREXP )); /* 文字コード自動判別 */ // m_bKanjiCode_AutoDetect = ::IsDlgButtonChecked( GetHwnd(), IDC_CHK_KANJICODEAUTODETECT ); /* 文字コードセット */ { int nIdx; HWND hWndCombo = ::GetDlgItem( GetHwnd(), IDC_COMBO_CHARSET ); nIdx = Combo_GetCurSel( hWndCombo ); m_nGrepCharSet = (ECodeType)Combo_GetItemData( hWndCombo, nIdx ); } /* 行を出力/該当部分/否マッチ行 を出力 */ if( ::IsDlgButtonChecked( GetHwnd(), IDC_RADIO_OUTPUTLINE ) ){ m_nGrepOutputLineType = 1; }else if( ::IsDlgButtonChecked( GetHwnd(), IDC_RADIO_NOHIT ) ){ m_nGrepOutputLineType = 2; }else{ m_nGrepOutputLineType = 0; } /* Grep: 出力形式 */ if( FALSE != ::IsDlgButtonChecked( GetHwnd(), IDC_RADIO_OUTPUTSTYLE1 ) ){ m_nGrepOutputStyle = 1; /* Grep: 出力形式 */ } if( FALSE != ::IsDlgButtonChecked( GetHwnd(), IDC_RADIO_OUTPUTSTYLE2 ) ){ m_nGrepOutputStyle = 2; /* Grep: 出力形式 */ } if( FALSE != ::IsDlgButtonChecked( GetHwnd(), IDC_RADIO_OUTPUTSTYLE3 ) ){ m_nGrepOutputStyle = 3; } m_bGrepOutputFileOnly = IsDlgButtonCheckedBool( GetHwnd(), IDC_CHECK_FILE_ONLY ); m_bGrepOutputBaseFolder = IsDlgButtonCheckedBool( GetHwnd(), IDC_CHECK_BASE_PATH ); m_bGrepSeparateFolder = IsDlgButtonCheckedBool( GetHwnd(), IDC_CHECK_SEP_FOLDER ); /* 検索文字列 */ int nBufferSize = ::GetWindowTextLength( GetItemHwnd(IDC_COMBO_TEXT) ) + 1; std::vector<TCHAR> vText(nBufferSize); ::DlgItem_GetText( GetHwnd(), IDC_COMBO_TEXT, &vText[0], nBufferSize); m_strText = to_wchar(&vText[0]); m_bSetText = true; /* 検索ファイル */ ::DlgItem_GetText( GetHwnd(), IDC_COMBO_FILE, m_szFile, _countof2(m_szFile) ); /* 検索フォルダ */ ::DlgItem_GetText( GetHwnd(), IDC_COMBO_FOLDER, m_szFolder, _countof2(m_szFolder) ); m_pShareData->m_Common.m_sSearch.m_nGrepCharSet = m_nGrepCharSet; // 文字コード自動判別 m_pShareData->m_Common.m_sSearch.m_nGrepOutputLineType = m_nGrepOutputLineType; // 行を出力/該当部分/否マッチ行 を出力 m_pShareData->m_Common.m_sSearch.m_nGrepOutputStyle = m_nGrepOutputStyle; // Grep: 出力形式 m_pShareData->m_Common.m_sSearch.m_bGrepOutputFileOnly = m_bGrepOutputFileOnly; m_pShareData->m_Common.m_sSearch.m_bGrepOutputBaseFolder = m_bGrepOutputBaseFolder; m_pShareData->m_Common.m_sSearch.m_bGrepSeparateFolder = m_bGrepSeparateFolder; //やめました // if( 0 == wcslen( m_szText ) ){ // WarningMessage( GetHwnd(), _T("検索のキーワードを指定してください。") ); // return FALSE; // } if( 0 != auto_strlen( m_szFile ) ){ CGrepEnumKeys enumKeys; int nErrorNo = enumKeys.SetFileKeys( m_szFile ); if( 1 == nErrorNo ){ WarningMessage( GetHwnd(), LS(STR_DLGGREP2) ); return FALSE; }else if( nErrorNo == 2 ){ WarningMessage( GetHwnd(), LS(STR_DLGGREP3) ); return FALSE; } } /* この編集中のテキストから検索する */ if( m_szFile[0] == _T('\0') ){ // Jun. 16, 2003 Moca // 検索パターンが指定されていない場合のメッセージ表示をやめ、 // 「*.*」が指定されたものと見なす. _tcscpy( m_szFile, _T("*.*") ); } if( m_szFolder[0] == _T('\0') ){ WarningMessage( GetHwnd(), LS(STR_DLGGREP4) ); return FALSE; } { //カレントディレクトリを保存。このブロックから抜けるときに自動でカレントディレクトリは復元される。 CCurrentDirectoryBackupPoint cCurDirBackup; // 2011.11.24 Moca 複数フォルダ指定 std::vector<std::tstring> vPaths; CGrepAgent::CreateFolders( m_szFolder, vPaths ); int nFolderLen = 0; TCHAR szFolder[_MAX_PATH]; szFolder[0] = _T('\0'); for( int i = 0 ; i < (int)vPaths.size(); i ++ ){ // 相対パス→絶対パス if( !::SetCurrentDirectory( vPaths[i].c_str() ) ){ WarningMessage( GetHwnd(), LS(STR_DLGGREP5) ); return FALSE; } TCHAR szFolderItem[_MAX_PATH]; ::GetCurrentDirectory( _MAX_PATH, szFolderItem ); // ;がフォルダ名に含まれていたら""で囲う if( auto_strchr( szFolderItem, _T(';') ) ){ szFolderItem[0] = _T('"'); ::GetCurrentDirectory( _MAX_PATH, szFolderItem + 1 ); auto_strcat(szFolderItem, _T("\"")); } int nFolderItemLen = auto_strlen( szFolderItem ); if( _MAX_PATH < nFolderLen + nFolderItemLen + 1 ){ WarningMessage( GetHwnd(), LS(STR_DLGGREP6) ); return FALSE; } if( i ){ auto_strcat( szFolder, _T(";") ); } auto_strcat( szFolder, szFolderItem ); nFolderLen = auto_strlen( szFolder ); } auto_strcpy( m_szFolder, szFolder ); } //@@@ 2002.2.2 YAZAKI CShareData.AddToSearchKeyArr()追加に伴う変更 /* 検索文字列 */ if( 0 < m_strText.size() ){ // From Here Jun. 26, 2001 genta // 正規表現ライブラリの差し替えに伴う処理の見直し int nFlag = 0; nFlag |= m_sSearchOption.bLoHiCase ? 0x01 : 0x00; if( m_sSearchOption.bRegularExp && !CheckRegexpSyntax( m_strText.c_str(), GetHwnd(), true, nFlag) ){ return FALSE; } // To Here Jun. 26, 2001 genta 正規表現ライブラリ差し替え if( m_strText.size() < _MAX_PATH ){ CSearchKeywordManager().AddToSearchKeyArr( m_strText.c_str() ); m_pShareData->m_Common.m_sSearch.m_sSearchOption = m_sSearchOption; // 検索オプション } }else{ // 2014.07.01 空キーも登録する CSearchKeywordManager().AddToSearchKeyArr( L"" ); } // この編集中のテキストから検索する場合、履歴に残さない Uchi 2008/5/23 if (!m_bFromThisText) { /* 検索ファイル */ CSearchKeywordManager().AddToGrepFileArr( m_szFile ); /* 検索フォルダ */ CSearchKeywordManager().AddToGrepFolderArr( m_szFolder ); } return TRUE; }
BOOL CDlgGrep::OnBnClicked( int wID ) { switch( wID ){ case IDC_BUTTON_HELP: /* 「Grep」のヘルプ */ //Stonee, 2001/03/12 第四引数を、機能番号からヘルプトピック番号を調べるようにした MyWinHelp( GetHwnd(), HELP_CONTEXT, ::FuncID_To_HelpContextID(F_GREP_DIALOG) ); // 2006.10.10 ryoji MyWinHelpに変更に変更 return TRUE; case IDC_CHK_FROMTHISTEXT: /* この編集中のテキストから検索する */ // 2010.05.30 関数化 SetDataFromThisText( 0 != ::IsDlgButtonChecked( GetHwnd(), IDC_CHK_FROMTHISTEXT ) ); return TRUE; case IDC_BUTTON_CURRENTFOLDER: /* 現在編集中のファイルのフォルダ */ /* ファイルを開いているか */ if( m_szCurrentFilePath[0] != _T('\0') ){ TCHAR szWorkFolder[MAX_PATH]; TCHAR szWorkFile[MAX_PATH]; SplitPath_FolderAndFile( m_szCurrentFilePath, szWorkFolder, szWorkFile ); SetGrepFolder( GetItemHwnd(IDC_COMBO_FOLDER), szWorkFolder ); } else{ /* 現在のプロセスのカレントディレクトリを取得します */ TCHAR szWorkFolder[MAX_PATH]; ::GetCurrentDirectory( _countof( szWorkFolder ) - 1, szWorkFolder ); SetGrepFolder( GetItemHwnd(IDC_COMBO_FOLDER), szWorkFolder ); } return TRUE; case IDC_BUTTON_FOLDER_UP: { HWND hwnd = GetItemHwnd( IDC_COMBO_FOLDER ); TCHAR szFolder[_MAX_PATH]; ::GetWindowText( hwnd, szFolder, _countof(szFolder) ); std::vector<std::tstring> vPaths; CGrepAgent::CreateFolders( szFolder, vPaths ); if( 0 < vPaths.size() ){ // 最後のパスが操作対象 auto_strncpy( szFolder, vPaths.rbegin()->c_str(), _MAX_PATH ); szFolder[_MAX_PATH-1] = _T('\0'); if( DirectoryUp( szFolder ) ){ *(vPaths.rbegin()) = szFolder; szFolder[0] = _T('\0'); for( int i = 0 ; i < (int)vPaths.size(); i++ ){ TCHAR szFolderItem[_MAX_PATH]; auto_strncpy( szFolderItem, vPaths[i].c_str(), _MAX_PATH ); szFolderItem[_MAX_PATH-1] = _T('\0'); if( auto_strchr( szFolderItem, _T(';') ) ){ szFolderItem[0] = _T('"'); auto_strncpy( szFolderItem + 1, vPaths[i].c_str(), _MAX_PATH - 1 ); szFolderItem[_MAX_PATH-1] = _T('\0'); auto_strcat( szFolderItem, _T("\"") ); szFolderItem[_MAX_PATH-1] = _T('\0'); } if( i ){ auto_strcat( szFolder, _T(";") ); szFolder[_MAX_PATH-1] = _T('\0'); } auto_strcat_s( szFolder, _MAX_PATH, szFolderItem ); } ::SetWindowText( hwnd, szFolder ); } } } return TRUE; // case IDC_CHK_LOHICASE: /* 英大文字と英小文字を区別する */ // MYTRACE( _T("IDC_CHK_LOHICASE\n") ); // return TRUE; case IDC_CHK_REGULAREXP: /* 正規表現 */ // MYTRACE( _T("IDC_CHK_REGULAREXP ::IsDlgButtonChecked( GetHwnd(), IDC_CHK_REGULAREXP ) = %d\n"), ::IsDlgButtonChecked( GetHwnd(), IDC_CHK_REGULAREXP ) ); if( ::IsDlgButtonChecked( GetHwnd(), IDC_CHK_REGULAREXP ) ){ // From Here Jun. 26, 2001 genta // 正規表現ライブラリの差し替えに伴う処理の見直し if( !CheckRegexpVersion( GetHwnd(), IDC_STATIC_JRE32VER, true ) ){ ::CheckDlgButton( GetHwnd(), IDC_CHK_REGULAREXP, 0 ); }else{ // To Here Jun. 26, 2001 genta /* 英大文字と英小文字を区別する */ // 正規表現のときも選択できるように。 // ::CheckDlgButton( GetHwnd(), IDC_CHK_LOHICASE, 1 ); // ::EnableWindow( ::GetDlgItem( GetHwnd(), IDC_CHK_LOHICASE ), FALSE ); //2001/06/23 N.Nakatani /* 単語単位で検索 */ ::EnableWindow( ::GetDlgItem( GetHwnd(), IDC_CHK_WORD ), FALSE ); } }else{ /* 英大文字と英小文字を区別する */ // 正規表現のときも選択できるように。 // ::EnableWindow( ::GetDlgItem( GetHwnd(), IDC_CHK_LOHICASE ), TRUE ); // ::CheckDlgButton( GetHwnd(), IDC_CHK_LOHICASE, 0 ); //2001/06/23 N.Nakatani //単語単位のgrepが実装されたらコメントを外すと思います //2002/03/07実装してみた。 /* 単語単位で検索 */ ::EnableWindow( ::GetDlgItem( GetHwnd(), IDC_CHK_WORD ), TRUE ); } return TRUE; case IDC_BUTTON_FOLDER: /* フォルダ参照ボタン */ { TCHAR szFolder[MAX_PATH]; /* 検索フォルダ */ ::DlgItem_GetText( GetHwnd(), IDC_COMBO_FOLDER, szFolder, _MAX_PATH - 1 ); if( szFolder[0] == _T('\0') ){ ::GetCurrentDirectory( _countof( szFolder ), szFolder ); } if( SelectDir( GetHwnd(), LS(STR_DLGGREP1), szFolder, szFolder ) ){ SetGrepFolder( GetItemHwnd(IDC_COMBO_FOLDER), szFolder ); } } return TRUE; case IDC_CHECK_CP: { if( IsDlgButtonChecked( GetHwnd(), IDC_CHECK_CP ) ){ ::EnableWindow( ::GetDlgItem( GetHwnd(), IDC_CHECK_CP ), FALSE ); HWND combo = ::GetDlgItem( GetHwnd(), IDC_COMBO_CHARSET ); CCodePage::AddComboCodePages(GetHwnd(), combo, -1); } } return TRUE; case IDC_CHK_DEFAULTFOLDER: /* フォルダの初期値をカレントフォルダにする */ { m_pShareData->m_Common.m_sSearch.m_bGrepDefaultFolder = ::IsDlgButtonChecked( GetHwnd(), IDC_CHK_DEFAULTFOLDER ); } return TRUE; case IDC_RADIO_OUTPUTSTYLE3: { ::EnableWindow( ::GetDlgItem( GetHwnd(), IDC_CHECK_BASE_PATH ), FALSE ); ::EnableWindow( ::GetDlgItem( GetHwnd(), IDC_CHECK_SEP_FOLDER ),FALSE ); } break; case IDC_RADIO_OUTPUTSTYLE1: case IDC_RADIO_OUTPUTSTYLE2: { ::EnableWindow( ::GetDlgItem( GetHwnd(), IDC_CHECK_BASE_PATH ), TRUE ); ::EnableWindow( ::GetDlgItem( GetHwnd(), IDC_CHECK_SEP_FOLDER ),TRUE ); } break; case IDOK: /* ダイアログデータの取得 */ if( GetData() ){ // ::EndDialog( hwndDlg, TRUE ); CloseDialog( TRUE ); } return TRUE; case IDCANCEL: // ::EndDialog( hwndDlg, FALSE ); CloseDialog( FALSE ); return TRUE; } /* 基底クラスメンバ */ return CDialog::OnBnClicked( wID ); }