/** 機能に対応するキー名のサーチ(補助関数) 与えられたシフト状態に対して,指定された範囲のキーエリアから 当該機能に対応するキーがあるかを調べ,見つかったら 対応するキー文字列をセットする. 関数から出るときには検索開始位置(nKeyNameArrBegin)に 次に処理するindexを設定する. @param[in,out] nKeyNameArrBegin 調査開始INDEX (終了時には次回の開始INDEXに書き換えられる) @param[in] nKeyNameArrBegin 調査終了INDEX + 1 @param[in] pKeyNameArr キー配列 @param[in] nShiftState シフト状態 @param[out] cMemList キー文字列設定先 @param[in] nFuncId 検索対象機能ID @param[in] bGetDefFuncCode 標準機能を取得するかどうか */ bool CKeyBind::GetKeyStrSub( int& nKeyNameArrBegin, int nKeyNameArrEnd, KEYDATA* pKeyNameArr, int nShiftState, CNativeT& cMemList, int nFuncId, BOOL bGetDefFuncCode /* = TRUE */ ) { const TCHAR* pszSHIFT = _T("Shift+"); const TCHAR* pszCTRL = _T("Ctrl+"); const TCHAR* pszALT = _T("Alt+"); int i; for( i = nKeyNameArrBegin; i < nKeyNameArrEnd; ++i ){ if( nFuncId == GetFuncCodeAt( pKeyNameArr[i], nShiftState, bGetDefFuncCode ) ){ if( nShiftState & _SHIFT ){ cMemList.AppendString( pszSHIFT ); } if( nShiftState & _CTRL ){ cMemList.AppendString( pszCTRL ); } if( nShiftState & _ALT ){ cMemList.AppendString( pszALT ); } cMemList.AppendString( pKeyNameArr[i].m_szKeyName ); nKeyNameArrBegin = i + 1; return true; } } nKeyNameArrBegin = i; return false; }
/** 機能に対応するキー名の取得 @date 2007.02.22 ryoji デフォルト機能割り当てに関する処理を追加 @date 2007.11.04 genta マウスクリックよりキー割り当ての優先度を上げる @date 2007.11.04 genta 共通機能のサブルーチン化 */ int CKeyBind::GetKeyStr( HINSTANCE hInstance, int nKeyNameArrNum, KEYDATA* pKeyNameArr, CNativeT& cMemList, int nFuncId, BOOL bGetDefFuncCode /* = TRUE */ ) { int i; int j; cMemList.SetString(_T("")); // 先にキー部分を調査する for( j = 0; j < 8; ++j ){ for( i = MOUSEFUNCTION_KEYBEGIN; i < nKeyNameArrNum; /* 1を加えてはいけない */ ){ if( GetKeyStrSub( i, nKeyNameArrNum, pKeyNameArr, j, cMemList, nFuncId, bGetDefFuncCode )){ return 1; } } } // 後にマウス部分を調査する for( j = 0; j < 8; ++j ){ for( i = 0; i < MOUSEFUNCTION_KEYBEGIN; /* 1を加えてはいけない */ ){ if( GetKeyStrSub( i, nKeyNameArrNum, pKeyNameArr, j, cMemList, nFuncId, bGetDefFuncCode )){ return 1; } } } return 0; }
/*! メニューラベルの作成 @date 2007.02.22 ryoji デフォルト機能割り当てに関する処理を追加 2010/5/17 アクセスキーの追加 @date 2014.05.04 Moca LABEL_MAX=256 => nLabelSize */ TCHAR* CKeyBind::GetMenuLabel( HINSTANCE hInstance, int nKeyNameArrNum, KEYDATA* pKeyNameArr, int nFuncId, TCHAR* pszLabel, //!< [in,out] バッファは256以上と仮定 const TCHAR* pszKey, BOOL bKeyStr, int nLabelSize, BOOL bGetDefFuncCode /* = TRUE */ ) { const unsigned int LABEL_MAX = nLabelSize; if( _T('\0') == pszLabel[0] ){ _tcsncpy( pszLabel, LS( nFuncId ), LABEL_MAX - 1 ); pszLabel[ LABEL_MAX - 1 ] = _T('\0'); } if( _T('\0') == pszLabel[0] ){ _tcscpy( pszLabel, _T("-- undefined name --") ); } // アクセスキーの追加 2010/5/17 Uchi _tcsncpy_s( pszLabel, LABEL_MAX, MakeMenuLabel( pszLabel, pszKey ), _TRUNCATE ); /* 機能に対応するキー名を追加するか */ if( bKeyStr ){ CNativeT cMemAccessKey; // 2010.07.11 Moca メニューラベルの「\t」の付加条件変更 // [ファイル/フォルダ/ウィンドウ一覧以外]から[アクセスキーがあるときのみ]に付加するように変更 /* 機能に対応するキー名の取得 */ if( GetKeyStr( hInstance, nKeyNameArrNum, pKeyNameArr, cMemAccessKey, nFuncId, bGetDefFuncCode ) ){ // バッファが足りないときは入れない if( _tcslen( pszLabel ) + (Int)cMemAccessKey.GetStringLength() + 1 < LABEL_MAX ){ _tcscat( pszLabel, _T("\t") ); _tcscat( pszLabel, cMemAccessKey.GetStringPtr() ); } } } return pszLabel; }
/*! GREP置換実行 */ void CViewCommander::Command_GREP_REPLACE( void ) { CNativeW cmWork1; CNativeT cmWork2; CNativeT cmWork3; CNativeW cmWork4; CDlgGrepReplace& cDlgGrepRep = GetEditWindow()->m_cDlgGrepReplace; cmWork1.SetString( cDlgGrepRep.m_strText.c_str() ); cmWork2.SetString( cDlgGrepRep.m_szFile ); cmWork3.SetString( cDlgGrepRep.m_szFolder ); cmWork4.SetString( cDlgGrepRep.m_strText2.c_str() ); /* 今のEditViewにGrep結果を表示する。 Grepモードのとき、または未編集で無題かつアウトプットでない場合。 自ウィンドウがGrep実行中も、(異常終了するので)別ウィンドウにする */ if( ( CEditApp::getInstance()->m_pcGrepAgent->m_bGrepMode && !CEditApp::getInstance()->m_pcGrepAgent->m_bGrepRunning ) || ( !GetDocument()->m_cDocEditor.IsModified() && !GetDocument()->m_cDocFile.GetFilePathClass().IsValidPath() && /* 現在編集中のファイルのパス */ !CAppMode::getInstance()->IsDebugMode() ) ){ CEditApp::getInstance()->m_pcGrepAgent->DoGrep( m_pCommanderView, true, &cmWork1, &cmWork4, &cmWork2, &cmWork3, false, cDlgGrepRep.m_bSubFolder, false, // Stdout true, // Header cDlgGrepRep.m_sSearchOption, cDlgGrepRep.m_nGrepCharSet, cDlgGrepRep.m_nGrepOutputLineType, cDlgGrepRep.m_nGrepOutputStyle, cDlgGrepRep.m_bGrepOutputFileOnly, cDlgGrepRep.m_bGrepOutputBaseFolder, cDlgGrepRep.m_bGrepSeparateFolder, cDlgGrepRep.m_bPaste, cDlgGrepRep.m_bBackup ); } else{ // 編集ウィンドウの上限チェック if( GetDllShareData().m_sNodes.m_nEditArrNum >= MAX_EDITWINDOWS ){ //最大値修正 //@@@ 2003.05.31 MIK OkMessage( m_pCommanderView->GetHwnd(), _T("編集ウィンドウ数の上限は%dです。\nこれ以上は同時に開けません。"), MAX_EDITWINDOWS ); return; } /*======= Grepの実行 =============*/ /* Grep結果ウィンドウの表示 */ cmWork1.Replace( L"\"", L"\"\"" ); cmWork2.Replace( _T("\""), _T("\"\"") ); cmWork3.Replace( _T("\""), _T("\"\"") ); cmWork4.Replace( L"\"", L"\"\"" ); // -GREPMODE -GKEY="1" -GREPR="2" -GFILE="*.*;*.c;*.h" -GFOLDER="c:\" -GCODE=0 -GOPT=S CNativeT cCmdLine; TCHAR szTemp[20]; cCmdLine.AppendString(_T("-GREPMODE -GKEY=\"")); cCmdLine.AppendStringW(cmWork1.GetStringPtr()); cCmdLine.AppendString(_T("\" -GREPR=\"")); cCmdLine.AppendStringW(cmWork4.GetStringPtr()); cCmdLine.AppendString(_T("\" -GFILE=\"")); cCmdLine.AppendString(cmWork2.GetStringPtr()); cCmdLine.AppendString(_T("\" -GFOLDER=\"")); cCmdLine.AppendString(cmWork3.GetStringPtr()); cCmdLine.AppendString(_T("\" -GCODE=")); auto_sprintf( szTemp, _T("%d"), cDlgGrepRep.m_nGrepCharSet ); cCmdLine.AppendString(szTemp); //GOPTオプション TCHAR pOpt[64]; pOpt[0] = _T('\0'); if( cDlgGrepRep.m_bSubFolder )_tcscat( pOpt, _T("S") ); // サブフォルダからも検索する if( cDlgGrepRep.m_sSearchOption.bWordOnly )_tcscat( pOpt, _T("W") ); // 単語単位で探す if( cDlgGrepRep.m_sSearchOption.bLoHiCase )_tcscat( pOpt, _T("L") ); // 英大文字と英小文字を区別する if( cDlgGrepRep.m_sSearchOption.bRegularExp )_tcscat( pOpt, _T("R") ); // 正規表現 if( cDlgGrepRep.m_nGrepOutputLineType == 1 )_tcscat( pOpt, _T("P") ); // 行を出力する // if( cDlgGrepRep.m_nGrepOutputLineType == 2 )_tcscat( pOpt, _T("N") ); // 否ヒット行を出力する 2014.09.23 if( 1 == cDlgGrepRep.m_nGrepOutputStyle )_tcscat( pOpt, _T("1") ); // Grep: 出力形式 if( 2 == cDlgGrepRep.m_nGrepOutputStyle )_tcscat( pOpt, _T("2") ); // Grep: 出力形式 if( 3 == cDlgGrepRep.m_nGrepOutputStyle )_tcscat( pOpt, _T("3") ); if( cDlgGrepRep.m_bGrepOutputFileOnly )_tcscat( pOpt, _T("F") ); if( cDlgGrepRep.m_bGrepOutputBaseFolder )_tcscat( pOpt, _T("B") ); if( cDlgGrepRep.m_bGrepSeparateFolder )_tcscat( pOpt, _T("D") ); if( cDlgGrepRep.m_bPaste )_tcscat( pOpt, _T("C") ); // クリップボードから貼り付け if( cDlgGrepRep.m_bBackup )_tcscat( pOpt, _T("O") ); // バックアップ作成 if( 0 < _tcslen( pOpt ) ){ cCmdLine.AppendString( _T(" -GOPT=") ); cCmdLine.AppendString( pOpt ); } SLoadInfo sLoadInfo; sLoadInfo.cFilePath = _T(""); sLoadInfo.eCharCode = CODE_NONE; sLoadInfo.bViewMode = false; CControlTray::OpenNewEditor( G_AppInstance(), m_pCommanderView->GetHwnd(), sLoadInfo, cCmdLine.GetStringPtr(), false, NULL, GetDllShareData().m_Common.m_sTabBar.m_bNewWindow? true : false ); } return; }
//2007.10.17 kobake 重複するコードを整理 void CCaret::ShowCaretPosInfo() { //必要なインターフェース const CLayoutMgr* pLayoutMgr=&m_pEditDoc->m_cLayoutMgr; const STypeConfig* pTypes=&m_pEditDoc->m_cDocType.GetDocumentAttribute(); if( !m_pEditView->GetDrawSwitch() ){ return; } // ステータスバーハンドルを取得 HWND hwndStatusBar = m_pEditDoc->m_pcEditWnd->m_cStatusBar.GetStatusHwnd(); // カーソル位置の文字列を取得 const CLayout* pcLayout; CLogicInt nLineLen; const wchar_t* pLine = pLayoutMgr->GetLineStr( GetCaretLayoutPos().GetY2(), &nLineLen, &pcLayout ); // -- -- -- -- 文字コード情報 -> pszCodeName -- -- -- -- // const TCHAR* pszCodeName; CNativeT cmemCodeName; if (hwndStatusBar) { TCHAR szCodeName[100]; CCodePage::GetNameNormal(szCodeName, m_pEditDoc->GetDocumentEncoding()); cmemCodeName.AppendString(szCodeName); if (m_pEditDoc->GetDocumentBomExist()) { cmemCodeName.AppendString( LS(STR_CARET_WITHBOM) ); } } else { TCHAR szCodeName[100]; CCodePage::GetNameShort(szCodeName, m_pEditDoc->GetDocumentEncoding()); cmemCodeName.AppendString(szCodeName); if (m_pEditDoc->GetDocumentBomExist()) { cmemCodeName.AppendString( _T("#") ); // BOM付(メニューバーなので小さく) // 2013/4/17 Uchi } } pszCodeName = cmemCodeName.GetStringPtr(); // -- -- -- -- 改行モード -> szEolMode -- -- -- -- // // May 12, 2000 genta // 改行コードの表示を追加 CEol cNlType = m_pEditDoc->m_cDocEditor.GetNewLineCode(); const TCHAR* szEolMode = cNlType.GetName(); // -- -- -- -- キャレット位置 -> ptCaret -- -- -- -- // // bool bCaretHabaMode = GetDllShareData().m_Common.m_sStatusbar.m_bDispColByChar == 0; CMyPoint ptCaret; //行番号をロジック単位で表示 if(pTypes->m_bLineNumIsCRLF){ if( bCaretHabaMode ){ ptCaret.y = GetCaretLogicPos().GetPOINT().y; if( pcLayout ){ // 新レイアウト桁数を計算(1行のデータが長いと重い) int nPosX = 0; const CLayout* pcLayoutCalc = pcLayout; while( pcLayoutCalc->GetPrevLayout() ){ if( pcLayoutCalc->GetLogicOffset() == 0 ){ break; // 先頭行 } pcLayoutCalc = pcLayoutCalc->GetPrevLayout(); nPosX += Int((m_pEditView->LineIndexToColumn(pcLayoutCalc, pcLayoutCalc->GetLengthWithoutEOL()) - pcLayoutCalc->GetIndent()) / (Int)m_pEditView->GetTextMetrics().GetLayoutXDefault()); } ptCaret.x = nPosX + (Int)(GetCaretLayoutPos().GetX() - pcLayout->GetIndent()) / (Int)m_pEditView->GetTextMetrics().GetLayoutXDefault(); }else{ ptCaret.x = 0; } }else{ ptCaret = GetCaretLogicPos().GetPOINT(); } } //行番号をレイアウト単位で表示 else { if( bCaretHabaMode ){ // ルーラー基準 ptCaret.x = (Int)GetCaretLayoutPos().GetX() / (Int)m_pEditView->GetTextMetrics().GetLayoutXDefault(); }else{ // 文字単位 if( pcLayout ){ ptCaret.x = (Int)GetCaretLogicPos().GetX() - pcLayout->GetLogicOffset(); }else{ ptCaret.x = (Int)GetCaretLogicPos().GetX(); } } ptCaret.y = (Int)GetCaretLayoutPos().GetY(); } //表示値が1から始まるように補正 ptCaret.x++; ptCaret.y++; // -- -- -- -- キャレット位置の文字情報 -> szCaretChar -- -- -- -- // // TCHAR szCaretChar[32]=_T(""); if( pLine ){ // 指定された桁に対応する行のデータ内の位置を調べる CLogicInt nIdx = GetCaretLogicPos().GetX2() - pcLayout->GetLogicOffset(); if( nIdx < nLineLen ){ if( nIdx < nLineLen - (pcLayout->GetLayoutEol().GetLen()?1:0) ){ //auto_sprintf( szCaretChar, _T("%04x"), ); //任意の文字コードからUnicodeへ変換する 2008/6/9 Uchi CCodeBase* pCode = CCodeFactory::CreateCodeBase(m_pEditDoc->GetDocumentEncoding(), false); CommonSetting_Statusbar* psStatusbar = &GetDllShareData().m_Common.m_sStatusbar; EConvertResult ret = pCode->UnicodeToHex(&pLine[nIdx], nLineLen - nIdx, szCaretChar, psStatusbar); delete pCode; if (ret != RESULT_COMPLETE) { // うまくコードが取れなかった(Unicodeで表示) pCode = CCodeFactory::CreateCodeBase(CODE_UNICODE, false); /* EConvertResult ret = */ pCode->UnicodeToHex(&pLine[nIdx], nLineLen - nIdx, szCaretChar, psStatusbar); delete pCode; } } else{ _tcscpy_s(szCaretChar, _countof(szCaretChar), pcLayout->GetLayoutEol().GetName()); } } } // -- -- -- -- ステータス情報を書き出す -- -- -- -- // // // ウィンドウ右上に書き出す if( !hwndStatusBar ){ TCHAR szText[64]; TCHAR szFormat[64]; TCHAR szLeft[64]; TCHAR szRight[64]; int nLen; { // メッセージの左側文字列(「行:列」を除いた表示) nLen = _tcslen(pszCodeName) + _tcslen(szEolMode) + _tcslen(szCaretChar); // これは %s(%s)%6s%s%s 等になる。%6ts表記は使えないので注意 auto_sprintf( szFormat, _T("%%s(%%s)%%%ds%%s%%s"), // 「キャレット位置の文字情報」を右詰で配置(足りないときは左詰になって右に伸びる) (nLen < 15)? 15 - nLen: 1 ); auto_sprintf( szLeft, szFormat, pszCodeName, szEolMode, szCaretChar[0]? _T("["): _T(" "), // 文字情報無しなら括弧も省略(EOFやフリーカーソル位置) szCaretChar, szCaretChar[0]? _T("]"): _T(" ") // 文字情報無しなら括弧も省略(EOFやフリーカーソル位置) ); } szRight[0] = _T('\0'); nLen = MENUBAR_MESSAGE_MAX_LEN - _tcslen(szLeft); // 右側に残っている文字長 if( nLen > 0 ){ // メッセージの右側文字列(「行:列」表示) TCHAR szRowCol[32]; auto_sprintf( szRowCol, _T("%d:%-4d"), // 「列」は最小幅を指定して左寄せ(足りないときは右に伸びる) ptCaret.y, ptCaret.x ); auto_sprintf( szFormat, _T("%%%ds"), // 「行:列」を右詰で配置(足りないときは左詰になって右に伸びる) nLen ); auto_sprintf( szRight, szFormat, szRowCol ); } auto_sprintf( szText, _T("%s%s"), szLeft, szRight ); m_pEditDoc->m_pcEditWnd->PrintMenubarMessage( szText ); } // ステータスバーに状態を書き出す else{ TCHAR szText_1[64]; auto_sprintf( szText_1, LS( STR_STATUS_ROW_COL ), ptCaret.y, ptCaret.x ); //Oct. 30, 2000 JEPRO 千万行も要らん TCHAR szText_6[16]; if( m_pEditView->IsInsMode() /* Oct. 2, 2005 genta */ ){ _tcscpy( szText_6, LS( STR_INS_MODE_INS ) ); // "挿入" }else{ _tcscpy( szText_6, LS( STR_INS_MODE_OVR ) ); // "上書" } auto& statusBar = m_pEditDoc->m_pcEditWnd->m_cStatusBar; if( m_bClearStatus ){ statusBar.SetStatusText( 0, SBT_NOBORDERS, _T("") ); } statusBar.SetStatusText( 1, 0, szText_1 ); // May 12, 2000 genta // 改行コードの表示を追加.後ろの番号を1つずつずらす // From Here statusBar.SetStatusText( 2, 0, szEolMode ); // To Here statusBar.SetStatusText( 3, 0, szCaretChar ); statusBar.SetStatusText( 4, 0, pszCodeName ); statusBar.SetStatusText( 5, SBT_OWNERDRAW, _T("") ); statusBar.SetStatusText( 6, 0, szText_6 ); } }