/** Erlang アウトライン解析 @par 主な仮定と方針 関数宣言は1カラム目から記載されている. @par 解析アルゴリズム 1カラム目がアルファベットの場合: 関数らしいとして解析開始 / 関数名を保存 スペースは読み飛ばす ( を発見したら ) まで引数を数える.その場合入れ子の括弧と文字列を考慮 -> または when があれば関数定義と見なす(次の行にまたがっても良い) 途中 % (コメント) が現れたら行末まで読み飛ばす */ void CDocOutline::MakeFuncList_Erlang( CFuncInfoArr* pcFuncInfoArr ) { COutlineErlang erl_state_machine; CLogicInt nLineCount; for( nLineCount = CLogicInt(0); nLineCount < m_pcDocRef->m_cDocLineMgr.GetLineCount(); ++nLineCount ){ CLogicInt nLineLen; const wchar_t* pLine = m_pcDocRef->m_cDocLineMgr.GetLine(nLineCount)->GetDocLineStrWithEOL(&nLineLen); if( erl_state_machine.parse( pLine, nLineLen, nLineCount )){ /* カーソル位置変換 物理位置(行頭からのバイト数、折り返し無し行位置) → レイアウト位置(行頭からの表示桁位置、折り返しあり行位置) */ CLayoutPoint ptPosXY; m_pcDocRef->m_cLayoutMgr.LogicToLayout( CLogicPoint(CLogicInt(0), erl_state_machine.GetFuncLine()), &ptPosXY ); pcFuncInfoArr->AppendData( erl_state_machine.GetFuncLine() + CLogicInt(1), ptPosXY.GetY2() + CLayoutInt(1), erl_state_machine.GetFuncName(), 0, 0 ); } } }
/*! @date 2003/02/18 ai @param flag [in] モード(true:登録, false:解除) */ void CEditView::SetBracketPairPos( bool flag ) { int mode; // 03/03/06 ai すべて置換、すべて置換後のUndo&Redoがかなり遅い問題に対応 if( m_bDoing_UndoRedo || !GetDrawSwitch() ){ return; } if( !m_pTypeData->m_ColorInfoArr[COLORIDX_BRACKET_PAIR].m_bDisp ){ return; } // 対括弧の検索&登録 /* bit0(in) : 表示領域外を調べるか? 0:調べない 1:調べる bit1(in) : 前方文字を調べるか? 0:調べない 1:調べる bit2(out) : 見つかった位置 0:後ろ 1:前 */ mode = 2; CLayoutPoint ptColLine; if( flag && !GetSelectionInfo().IsTextSelected() && !GetSelectionInfo().m_bDrawSelectArea && SearchBracket( GetCaret().GetCaretLayoutPos(), &ptColLine, &mode ) ) { // 登録指定(flag=true) && // テキストが選択されていない && // 選択範囲を描画していない && // 対応する括弧が見つかった 場合 if ( ( ptColLine.x >= GetTextArea().GetViewLeftCol() ) && ( ptColLine.x <= GetTextArea().GetRightCol() ) && ( ptColLine.y >= GetTextArea().GetViewTopLine() ) && ( ptColLine.y <= GetTextArea().GetBottomLine() ) ) { // 表示領域内の場合 // レイアウト位置から物理位置へ変換(強調表示位置を登録) m_pcEditDoc->m_cLayoutMgr.LayoutToLogic( ptColLine, &m_ptBracketPairPos_PHY ); m_ptBracketCaretPos_PHY.y = GetCaret().GetCaretLogicPos().y; if( 0 == ( mode & 4 ) ){ // カーソルの後方文字位置 m_ptBracketCaretPos_PHY.x = GetCaret().GetCaretLogicPos().x; }else{ // カーソルの前方文字位置 m_ptBracketCaretPos_PHY.x = GetCaret().GetCaretLogicPos().x - 1; } return; } } // 括弧の強調表示位置情報初期化 m_ptBracketPairPos_PHY.Set(CLogicInt(-1), CLogicInt(-1)); m_ptBracketCaretPos_PHY.Set(CLogicInt(-1), CLogicInt(-1)); return; }
//! 指定した位置の文字がwchar_t何個分かを返す CLogicInt CNativeW::GetSizeOfChar( const wchar_t* pData, int nDataLen, int nIdx ) { if( nIdx >= nDataLen ) return CLogicInt(0); // サロゲートチェック 2008/7/5 Uchi if (IsUTF16High(pData[nIdx])) { if (nIdx + 1 < nDataLen && IsUTF16Low(pData[nIdx + 1])) { // サロゲートペア 2個分 return CLogicInt(2); } } return CLogicInt(1); }
bool CLayoutMgr::_DoKinsokuSkip(SLayoutWork* pWork, PF_OnLine pfOnLine) { if( KINSOKU_TYPE_NONE != pWork->eKinsokuType ) { //禁則処理の最後尾に達したら禁則処理中を解除する if( pWork->nPos >= pWork->nWordBgn + pWork->nWordLen ) { if( pWork->eKinsokuType == KINSOKU_TYPE_KINSOKU_KUTO && pWork->nPos == pWork->nWordBgn + pWork->nWordLen ) { int nEol = pWork->pcDocLine->GetEol().GetLen(); if( ! (m_pTypeConfig->m_bKinsokuRet && (pWork->nPos == pWork->cLineStr.GetLength() - nEol) && nEol ) ) //改行文字をぶら下げる //@@@ 2002.04.14 MIK { (this->*pfOnLine)(pWork); } } pWork->nWordLen = CLogicInt(0); pWork->eKinsokuType = KINSOKU_TYPE_NONE; //@@@ 2002.04.20 MIK } return true; } else{ return false; } }
//2008.07.27 kobake static bool _GetKeywordLength( const CLayoutMgr& cLayoutMgr, const CStringRef& cLineStr, //!< [in] CLogicInt nPos, //!< [in] CLogicInt* p_nWordBgn, //!< [out] CLogicInt* p_nWordLen, //!< [out] CLayoutInt* p_nWordKetas //!< [out] ) { //キーワード長をカウントする CLogicInt nWordBgn = nPos; CLogicInt nWordLen = CLogicInt(0); CLayoutInt nWordKetas = CLayoutInt(0); while(nPos<cLineStr.GetLength() && IS_KEYWORD_CHAR(cLineStr.At(nPos))){ CLayoutInt k = cLayoutMgr.GetLayoutXOfChar(cLineStr, nPos); if(0 == k)k = CLayoutInt(1); nWordLen+=1; nWordKetas+=k; nPos++; } //結果 if(nWordLen>0){ *p_nWordBgn = nWordBgn; *p_nWordLen = nWordLen; *p_nWordKetas = nWordKetas; return true; } else{ return false; } }
int CColor_Quote::Match_QuoteStr( const wchar_t* pszQuote, int nQuoteLen, int nPos, const CStringRef& cLineStr, bool bEscape ) { int nCharChars; int i; const int nCompLen = cLineStr.GetLength() - nQuoteLen + 1; const WCHAR quote1 = pszQuote[0]; const WCHAR* pLine = cLineStr.GetPtr(); for( i = nPos; i < nCompLen; i += nCharChars ){ if( quote1 == pLine[i] && wmemcmp( pszQuote + 1, pLine + i + 1, nQuoteLen - 1 ) == 0 ){ return i + nQuoteLen; } nCharChars = (Int)t_max(CLogicInt(1), CNativeW::GetSizeOfChar( pLine, cLineStr.GetLength(), i )); if( bEscape && pLine[i] == L'\\' ){ i += (Int)t_max(CLogicInt(1), CNativeW::GetSizeOfChar( pLine, cLineStr.GetLength(), i + nCharChars )); } } return cLineStr.GetLength(); }
static bool MakeDiffTmpFile_core(CTextOutputStream& out, HWND hwnd, CEditView& view, bool bBom) { CLogicInt y = CLogicInt(0); const wchar_t* pLineData; if( !hwnd ){ const CDocLineMgr& docMgr = view.m_pcEditDoc->m_cDocLineMgr; for(;;){ CLogicInt nLineLen; pLineData = docMgr.GetLine(y)->GetDocLineStrWithEOL(&nLineLen); // 正常終了 if( 0 == nLineLen || NULL == pLineData ) break; if( bBom ){ CNativeW cLine2(L"\ufeff"); cLine2.AppendString(pLineData, nLineLen); out.WriteString(cLine2.GetStringPtr(), cLine2.GetStringLength()); bBom = false; }else{ out.WriteString(pLineData,nLineLen); } y++; } }else if( IsSakuraMainWindow(hwnd) ) { const int max_size = (int)GetDllShareData().m_sWorkBuffer.GetWorkBufferCount<const EDIT_CHAR>(); pLineData = GetDllShareData().m_sWorkBuffer.GetWorkBuffer<const EDIT_CHAR>(); for(;;){ int nLineOffset = 0; int nLineLen = 0; //初回用仮値 do{ // m_sWorkBuffer#m_Workの排他制御。外部コマンド出力/TraceOut/Diffが対象 LockGuard<CMutex> guard( CShareData::GetMutexShareWork() ); { nLineLen = ::SendMessageAny( hwnd, MYWM_GETLINEDATA, y, nLineOffset ); if( nLineLen == 0 ){ return true; } // EOF => 正常終了 if( nLineLen < 0 ){ return false; } // 何かエラー if( bBom ){ CNativeW cLine2(L"\ufeff"); cLine2.AppendString(pLineData, t_min(nLineLen, max_size)); out.WriteString(cLine2.GetStringPtr(), cLine2.GetStringLength()); bBom = false; }else{ out.WriteString(pLineData, t_min(nLineLen, max_size)); } } nLineOffset += max_size; }while(max_size < nLineLen); y++; } }else{ return false; } if( bBom ){ out.WriteString(L"\ufeff", 1); } return true; }
const wchar_t* CDocReader::GetLineStr( CLogicInt nLine, CLogicInt* pnLineLen ) { const CDocLine* pDocLine; pDocLine = m_pcDocLineMgr->GetLine( nLine ); if( NULL == pDocLine ){ *pnLineLen = CLogicInt(0); return NULL; } // 2002/2/10 aroka CMemory のメンバ変数に直接アクセスしない(inline化されているので速度的な問題はない) return pDocLine->GetDocLineStrWithEOL( pnLineLen ); }
void CFuncInfoArr::AppendData( CLogicInt nFuncLineCRLF, //!< 関数のある行(CRLF単位) CLayoutInt nFuncLineLAYOUT, //!< 関数のある行(折り返し単位) const TCHAR* pszFuncName, //!< 関数名 int nInfo, //!< 付加情報 int nDepth //!< 深さ ) { AppendData(nFuncLineCRLF,CLogicInt(1),nFuncLineLAYOUT,CLayoutInt(1),pszFuncName,NULL,nInfo,nDepth); return; }
//折り返す場合はtrueを返す bool CLayoutMgr::_DoTab(SLayoutWork* pWork, PF_OnLine pfOnLine) { // Sep. 23, 2002 genta せっかく作ったので関数を使う CLayoutInt nCharKetas = GetActualTabSpace( pWork->nPosX ); if( pWork->nPosX + nCharKetas > GetMaxLineLayout() ){ (this->*pfOnLine)(pWork); return true; } pWork->nPosX += nCharKetas; pWork->nPos += CLogicInt(1); return false; }
/*! 順アクセスモード:先頭行を得る @param pnLineLen [out] 行の長さが返る。 @return 1行目の先頭へのポインタ。 データが1行もないときは、長さ0、ポインタNULLが返る。 */ const wchar_t* CDocReader::GetFirstLinrStr( int* pnLineLen ) { const wchar_t* pszLine; if( CLogicInt(0) == m_pcDocLineMgr->GetLineCount() ){ pszLine = NULL; *pnLineLen = 0; }else{ pszLine = m_pcDocLineMgr->GetDocLineTop()->GetDocLineStrWithEOL( pnLineLen ); m_pcDocLineMgr->m_pDocLineCurrent = const_cast<CDocLine*>(m_pcDocLineMgr->GetDocLineTop()->GetNextLine()); } return pszLine; }
/* 指定された桁に対応する行のデータ内の位置を調べる Ver1 @@@ 2002.09.28 YAZAKI CLayoutが必要になりました。 */ CLogicInt CViewCalc::LineColumnToIndex( const CLayout* pcLayout, CLayoutInt nColumn ) const { CLogicInt i2 = CLogicInt(0); CMemoryIterator it = m_pOwner->m_pcEditDoc->m_cLayoutMgr.CreateCMemoryIterator(pcLayout); while( !it.end() ){ it.scanNext(); if ( it.getColumn() + it.getColumnDelta() > nColumn ){ break; } it.addDelta(); } i2 += it.getIndex(); return i2; }
/* 指定された桁に対応する行のデータ内の位置を調べる Ver1 @@@ 2002.09.28 YAZAKI CDocLine版 */ CLogicInt CViewCalc::LineColumnToIndex( const CDocLine* pcDocLine, CLayoutInt nColumn ) const { CLogicInt i2 = CLogicInt(0); CMemoryIterator it( pcDocLine, GetTabSpace(), GetTsvMode(), m_pOwner->m_pcEditDoc->m_cLayoutMgr.GetWidthPerKeta(), GetCharSpacing() ); while( !it.end() ){ it.scanNext(); if ( it.getColumn() + it.getColumnDelta() > nColumn ){ break; } it.addDelta(); } i2 += it.getIndex(); return i2; }
int CColor_Quote::Match_Quote( wchar_t wcQuote, int nPos, const CStringRef& cLineStr, int escapeType, bool* pbEscapeEnd ) { int nCharChars; int i; for( i = nPos; i < cLineStr.GetLength(); ++i ){ // 2005-09-02 D.S.Koba GetSizeOfChar nCharChars = (Int)t_max(CLogicInt(1), CNativeW::GetSizeOfChar( cLineStr.GetPtr(), cLineStr.GetLength(), i )); if( escapeType == STRING_LITERAL_CPP ){ // エスケープ \" if( 1 == nCharChars && cLineStr.At(i) == L'\\' ){ ++i; if( i < cLineStr.GetLength() && WCODE::IsLineDelimiter(cLineStr.At(i), GetDllShareData().m_Common.m_sEdit.m_bEnableExtEol) ){ if( pbEscapeEnd ){ *pbEscapeEnd = true; } } }else if( 1 == nCharChars && cLineStr.At(i) == wcQuote ){ return i + 1; } }else if( escapeType == STRING_LITERAL_PLSQL ){ // エスケープ "" if( 1 == nCharChars && cLineStr.At(i) == wcQuote ){ if( i + 1 < cLineStr.GetLength() && cLineStr.At(i + 1) == wcQuote ){ ++i; }else{ return i + 1; } } }else{ // エスケープなし if( 1 == nCharChars && cLineStr.At(i) == wcQuote ){ return i + 1; } } if( 2 == nCharChars ){ ++i; } } return cLineStr.GetLength() + 1; // 終端なしはLength + 1 }
/* それ以外の場合はpnLineAllColLenに0をセットする @@@ 2002.09.28 YAZAKI CLayoutが必要になりました。 */ CLogicInt CViewCalc::LineColumnToIndex2( const CLayout* pcLayout, CLayoutInt nColumn, CLayoutInt* pnLineAllColLen ) const { *pnLineAllColLen = CLayoutInt(0); CLogicInt i2 = CLogicInt(0); CLayoutInt nPosX2 = CLayoutInt(0); CMemoryIterator it = m_pOwner->m_pcEditDoc->m_cLayoutMgr.CreateCMemoryIterator(pcLayout); while( !it.end() ){ it.scanNext(); if ( it.getColumn() + it.getColumnDelta() > nColumn ){ break; } it.addDelta(); } i2 += it.getIndex(); if( i2 >= pcLayout->GetLengthWithEOL() ){ nPosX2 += it.getColumn(); *pnLineAllColLen = nPosX2; } return i2; }
/*! 対括弧の強調表示 @date 2002/09/18 ai @date 2003/02/18 ai 再描画対応の為大改造 */ void CEditView::DrawBracketPair( bool bDraw ) { // 03/03/06 ai すべて置換、すべて置換後のUndo&Redoがかなり遅い問題に対応 if( m_bDoing_UndoRedo || !GetDrawSwitch() ){ return; } if( !m_pTypeData->m_ColorInfoArr[COLORIDX_BRACKET_PAIR].m_bDisp ){ return; } // 括弧の強調表示位置が未登録の場合は終了 if( m_ptBracketPairPos_PHY.HasNegative() || m_ptBracketCaretPos_PHY.HasNegative() ){ return; } // 描画指定(bDraw=true) かつ // ( テキストが選択されている 又は // 選択範囲を描画している 又は // フォーカスを持っていない 又は // アクティブなペインではない ) 場合は終了 if( bDraw &&( GetSelectionInfo().IsTextSelected() || GetSelectionInfo().m_bDrawSelectArea || !m_bDrawBracketPairFlag || ( m_pcEditWnd->GetActivePane() != m_nMyIndex ) ) ){ return; } CGraphics gr; gr.Init(::GetDC(GetHwnd())); bool bCaretChange = false; gr.SetTextBackTransparent(true); for( int i = 0; i < 2; i++ ) { // i=0:対括弧,i=1:カーソル位置の括弧 // 2011.11.23 ryoji 対括弧 -> カーソル位置の括弧 の順に処理順序を変更 // # { と } が異なる行にある場合に { を BS で消すと } の強調表示が解除されない問題(Wiki BugReport/89)の対策 // # この順序変更によりカーソル位置が括弧でなくなっていても対括弧があれば対括弧側の強調表示は解除される CLayoutPoint ptColLine; if( i == 0 ){ m_pcEditDoc->m_cLayoutMgr.LogicToLayout( m_ptBracketPairPos_PHY, &ptColLine ); }else{ m_pcEditDoc->m_cLayoutMgr.LogicToLayout( m_ptBracketCaretPos_PHY, &ptColLine ); } if ( ( ptColLine.x >= GetTextArea().GetViewLeftCol() ) && ( ptColLine.x <= GetTextArea().GetRightCol() ) && ( ptColLine.y >= GetTextArea().GetViewTopLine() ) && ( ptColLine.y <= GetTextArea().GetBottomLine() ) ) { // 表示領域内の場合 if( !bDraw && GetSelectionInfo().m_bDrawSelectArea && ( 0 == IsCurrentPositionSelected( ptColLine ) ) ) { // 選択範囲描画済みで消去対象の括弧が選択範囲内の場合 continue; } const CLayout* pcLayout; CLogicInt nLineLen; const wchar_t* pLine = m_pcEditDoc->m_cLayoutMgr.GetLineStr( ptColLine.GetY2(), &nLineLen, &pcLayout ); if( pLine ) { EColorIndexType nColorIndex; CLogicInt OutputX = LineColumnToIndex( pcLayout, ptColLine.GetX2() ); if( bDraw ) { nColorIndex = COLORIDX_BRACKET_PAIR; } else{ if( IsBracket( pLine, OutputX, CLogicInt(1) ) ){ DispPos _sPos(0,0); // 注意:この値はダミー。CheckChangeColorでの参照位置は不正確 SColorStrategyInfo _sInfo; SColorStrategyInfo* pInfo = &_sInfo; pInfo->m_pDispPos = &_sPos; pInfo->m_pcView = this; // 03/10/24 ai 折り返し行のColorIndexが正しく取得できない問題に対応 // 2009.02.07 ryoji GetColorIndex に渡すインデックスの仕様変更(元はこっちの仕様だった模様) CColor3Setting cColor = GetColorIndex( pcLayout, ptColLine.GetY2(), OutputX, pInfo ); nColorIndex = cColor.eColorIndex2; } else{ SetBracketPairPos( false ); break; } } CTypeSupport cCuretLineBg(this,COLORIDX_CARETLINEBG); EColorIndexType nColorIndexBg = (cCuretLineBg.IsDisp() && ptColLine.GetY2() == GetCaret().GetCaretLayoutPos().GetY2() ? COLORIDX_CARETLINEBG : CTypeSupport(this,COLORIDX_EVENLINEBG).IsDisp() && ptColLine.GetY2() % 2 == 1 ? COLORIDX_EVENLINEBG : COLORIDX_TEXT); // 03/03/03 ai カーソルの左に括弧があり括弧が強調表示されている状態でShift+←で選択開始すると // 選択範囲内に反転表示されない部分がある問題の修正 CLayoutInt caretX = GetCaret().GetCaretLayoutPos().GetX2(); bool bCaretHide = (!bCaretChange && (ptColLine.x == caretX || ptColLine.x + 1 == caretX) && GetCaret().GetCaretShowFlag()); if( bCaretHide ){ bCaretChange = true; GetCaret().HideCaret_( GetHwnd() ); // キャレットが一瞬消えるのを防止 } { int nWidth = GetTextMetrics().GetHankakuDx(); int nHeight = GetTextMetrics().GetHankakuDy(); int nLeft = (GetTextArea().GetDocumentLeftClientPointX()) + GetTextMetrics().GetCharPxWidth(ptColLine.x); int nTop = (Int)( ptColLine.GetY2() - GetTextArea().GetViewTopLine() ) * nHeight + GetTextArea().GetAreaTop(); CLayoutXInt charsWidth = m_pcEditDoc->m_cLayoutMgr.GetLayoutXOfChar(pLine, nLineLen, OutputX); //色設定 CTypeSupport cTextType(this,COLORIDX_TEXT); cTextType.SetGraphicsState_WhileThisObj(gr); // 2013.05.24 背景色がテキストの背景色と同じならカーソル行の背景色を適用 CTypeSupport cColorIndexType(this,nColorIndex); CTypeSupport cColorIndexBgType(this,nColorIndexBg); CTypeSupport* pcColorBack = &cColorIndexType; if( cColorIndexType.GetBackColor() == cTextType.GetBackColor() && nColorIndexBg != COLORIDX_TEXT ){ pcColorBack = &cColorIndexBgType; } SetCurrentColor( gr, nColorIndex, nColorIndex, nColorIndexBg ); bool bTrans = false; // DEBUG_TRACE( _T("DrawBracket %d %d ") , ptColLine.y, ptColLine.x ); if( IsBkBitmap() && cTextType.GetBackColor() == pcColorBack->GetBackColor() ){ bTrans = true; RECT rcChar; rcChar.left = nLeft; rcChar.top = nTop; rcChar.right = nLeft + GetTextMetrics().GetCharPxWidth(charsWidth); rcChar.bottom = nTop + nHeight; HDC hdcBgImg = ::CreateCompatibleDC(gr); HBITMAP hBmpOld = (HBITMAP)::SelectObject(hdcBgImg, m_pcEditDoc->m_hBackImg); DrawBackImage(gr, rcChar, hdcBgImg); ::SelectObject(hdcBgImg, hBmpOld); ::DeleteDC(hdcBgImg); } DispPos sPos(nWidth, nHeight); sPos.InitDrawPos(CMyPoint(nLeft, nTop)); GetTextDrawer().DispText(gr, &sPos, 0, &pLine[OutputX], 1, bTrans); GetTextDrawer().DispNoteLine(gr, nTop, nTop + nHeight, nLeft, nLeft + (Int)charsWidth * nWidth); // 2006.04.30 Moca 対括弧の縦線対応 GetTextDrawer().DispVerticalLines(gr, nTop, nTop + nHeight, ptColLine.x, ptColLine.x + charsWidth); //※括弧が全角幅である場合を考慮 cTextType.RewindGraphicsState(gr); } if( ( m_pcEditWnd->GetActivePane() == m_nMyIndex ) && ( ( ptColLine.y == GetCaret().GetCaretLayoutPos().GetY() ) || ( ptColLine.y - 1 == GetCaret().GetCaretLayoutPos().GetY() ) ) ){ // 03/02/27 ai 行の間隔が"0"の時にアンダーラインが欠ける事がある為修正 GetCaret().m_cUnderLine.CaretUnderLineON( true, false ); } } } } if( bCaretChange ){ GetCaret().ShowCaret_( GetHwnd() ); // キャレットが一瞬消えるのを防止 } ::ReleaseDC( GetHwnd(), gr ); }
/*! 単純に /^\\s*sub\\s+(\\w+)/ に一致したら $1を取り出す動作を行う。 ネストとかは面倒くさいので考えない。 package{ }を使わなければこれで十分.無いよりはまし。 @par nModeの意味 @li 0: はじめ @li 2: subを見つけた後 @li 1: 単語読み出し中 @date 2005.06.18 genta パッケージ区切りを表す ::と'を考慮するように */ void CDocOutline::MakeFuncList_Perl( CFuncInfoArr* pcFuncInfoArr ) { const wchar_t* pLine; CLogicInt nLineLen; int i; int nCharChars; wchar_t szWord[100]; int nWordIdx = 0; int nMaxWordLeng = 70; int nMode; bool bExtEol = GetDllShareData().m_Common.m_sEdit.m_bEnableExtEol; CLogicInt nLineCount; for( nLineCount = CLogicInt(0); nLineCount < m_pcDocRef->m_cDocLineMgr.GetLineCount(); ++nLineCount ){ pLine = m_pcDocRef->m_cDocLineMgr.GetLine(nLineCount)->GetDocLineStrWithEOL(&nLineLen); nMode = 0; for( i = 0; i < nLineLen; ++i ){ /* 1バイト文字だけを処理する */ // 2005-09-02 D.S.Koba GetSizeOfChar nCharChars = CNativeW::GetSizeOfChar( pLine, nLineLen, i ); if( 1 < nCharChars ){ break; } /* 単語読み込み中 */ if( 0 == nMode ){ /* 空白やタブ記号等を飛ばす */ if( L'\t' == pLine[i] || L' ' == pLine[i] || WCODE::IsLineDelimiter(pLine[i], bExtEol) ){ continue; } if( 's' != pLine[i] ) break; // sub の一文字目かもしれない if( nLineLen - i < 4 ) break; if( wcsncmp_literal( pLine + i, L"sub" ) ) break; int c = pLine[ i + 3 ]; if( c == L' ' || c == L'\t' ){ nMode = 2; // 発見 i += 3; } else break; } else if( 2 == nMode ){ if( L'\t' == pLine[i] || L' ' == pLine[i] || WCODE::IsLineDelimiter(pLine[i], bExtEol) ){ continue; } if( L'_' == pLine[i] || (L'a' <= pLine[i] && pLine[i] <= L'z' )|| (L'A' <= pLine[i] && pLine[i] <= L'Z' )|| (L'0' <= pLine[i] && pLine[i] <= L'9' ) ){ // 関数名の始まり nWordIdx = 0; szWord[nWordIdx] = pLine[i]; szWord[nWordIdx + 1] = L'\0'; nMode = 1; continue; } else break; } else if( 1 == nMode ){ if( L'_' == pLine[i] || (L'a' <= pLine[i] && pLine[i] <= L'z' )|| (L'A' <= pLine[i] && pLine[i] <= L'Z' )|| (L'0' <= pLine[i] && pLine[i] <= L'9' )|| // Jun. 18, 2005 genta パッケージ修飾子を考慮 // コロンは2つ連続しないといけないのだが,そこは手抜き L':' == pLine[i] || L'\'' == pLine[i] ){ ++nWordIdx; if( nWordIdx >= nMaxWordLeng ){ break; }else{ szWord[nWordIdx] = pLine[i]; szWord[nWordIdx + 1] = L'\0'; } }else{ // 関数名取得 /* カーソル位置変換 物理位置(行頭からのバイト数、折り返し無し行位置) → レイアウト位置(行頭からの表示桁位置、折り返しあり行位置) */ CLayoutPoint ptPosXY; m_pcDocRef->m_cLayoutMgr.LogicToLayout( CLogicPoint(CLogicInt(0), nLineCount), &ptPosXY ); // Mar. 9, 2001 pcFuncInfoArr->AppendData( nLineCount + CLogicInt(1), ptPosXY.GetY2() + CLayoutInt(1), szWord, 0 ); break; } } } } #ifdef _DEBUG pcFuncInfoArr->DUMP(); #endif return; }
/*! アセンブラ アウトライン解析 @author MIK @date 2004.04.12 作り直し */ void CDocOutline::MakeTopicList_asm( CFuncInfoArr* pcFuncInfoArr ) { CLogicInt nTotalLine; nTotalLine = m_pcDocRef->m_cDocLineMgr.GetLineCount(); for( CLogicInt nLineCount = CLogicInt(0); nLineCount < nTotalLine; nLineCount++ ){ const WCHAR* pLine; CLogicInt nLineLen; WCHAR* pTmpLine; int length; int offset; #define MAX_ASM_TOKEN 2 WCHAR* token[MAX_ASM_TOKEN]; int j; WCHAR* p; //1行取得する。 pLine = m_pcDocRef->m_cDocLineMgr.GetLine(nLineCount)->GetDocLineStrWithEOL(&nLineLen); if( pLine == NULL ) break; //作業用にコピーを作成する。バイナリがあったらその後ろは知らない。 pTmpLine = wcsdup( pLine ); if( pTmpLine == NULL ) break; if( wcslen( pTmpLine ) >= (unsigned int)nLineLen ){ //バイナリを含んでいたら短くなるので... pTmpLine[ nLineLen ] = L'\0'; //指定長で切り詰め } //行コメント削除 p = wcsstr( pTmpLine, L";" ); if( p ) *p = L'\0'; length = wcslen( pTmpLine ); offset = 0; //トークンに分割 for( j = 0; j < MAX_ASM_TOKEN; j++ ) token[ j ] = NULL; for( j = 0; j < MAX_ASM_TOKEN; j++ ){ token[ j ] = my_strtok<WCHAR>( pTmpLine, length, &offset, L" \t\r\n" ); if( token[ j ] == NULL ) break; //トークンに含まれるべき文字でないか? if( wcsstr( token[ j ], L"\"") != NULL || wcsstr( token[ j ], L"\\") != NULL || wcsstr( token[ j ], L"'" ) != NULL ){ token[ j ] = NULL; break; } } if( token[ 0 ] != NULL ){ //トークンが1個以上ある int nFuncId = -1; WCHAR* entry_token = NULL; length = wcslen( token[ 0 ] ); if( length >= 2 && token[ 0 ][ length - 1 ] == L':' ){ //ラベル token[ 0 ][ length - 1 ] = L'\0'; nFuncId = 51; entry_token = token[ 0 ]; } else if( token[ 1 ] != NULL ){ //トークンが2個以上ある if( wcsicmp( token[ 1 ], L"proc" ) == 0 ){ //関数 nFuncId = 50; entry_token = token[ 0 ]; }else if( wcsicmp( token[ 1 ], L"endp" ) == 0 ){ //関数終了 nFuncId = 52; entry_token = token[ 0 ]; //}else //if( my_stricmp( token[ 1 ], _T("macro") ) == 0 ){ //マクロ // nFuncId = -1; // entry_token = token[ 0 ]; //}else //if( my_stricmp( token[ 1 ], _T("struc") ) == 0 ){ //構造体 // nFuncId = -1; // entry_token = token[ 0 ]; } } if( nFuncId >= 0 ){ /* カーソル位置変換 物理位置(行頭からのバイト数、折り返し無し行位置) → レイアウト位置(行頭からの表示桁位置、折り返しあり行位置) */ CLayoutPoint ptPos; m_pcDocRef->m_cLayoutMgr.LogicToLayout( CLogicPoint(0, nLineCount), &ptPos ); pcFuncInfoArr->AppendData( nLineCount + CLogicInt(1), ptPos.GetY2() + CLayoutInt(1), entry_token, nFuncId ); } } free( pTmpLine ); } return; }
/*! 行のテキスト/選択状態の描画 1回で1ロジック行分を作画する。 @return EOFを作画したらtrue @date 2001.02.17 MIK @date 2001.12.21 YAZAKI 改行記号の描きかたを変更 @date 2007.08.31 kobake 引数 bDispBkBitmap を削除 */ bool CEditView::DrawLogicLine( HDC _hdc, //!< [in] 作画対象 DispPos* _pDispPos, //!< [in,out] 描画する箇所、描画元ソース CLayoutInt nLineTo //!< [in] 作画終了するレイアウト行番号 ) { // MY_RUNNINGTIMER( cRunningTimer, "CEditView::DrawLogicLine" ); bool bDispEOF = false; SColorStrategyInfo _sInfo; SColorStrategyInfo* pInfo = &_sInfo; pInfo->m_gr.Init(_hdc); pInfo->m_pDispPos = _pDispPos; pInfo->m_pcView = this; //CColorStrategyPool初期化 CColorStrategyPool* pool = CColorStrategyPool::getInstance(); pool->SetCurrentView(this); pool->NotifyOnStartScanLogic(); bool bSkipBeforeLayout = pool->IsSkipBeforeLayout(); //DispPosを保存しておく pInfo->m_sDispPosBegin = *pInfo->m_pDispPos; //処理する文字位置 pInfo->m_nPosInLogic = CLogicInt(0); //☆開始 // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- // // 論理行データの取得 -> pLine, pLineLen // // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- // // 前行の最終設定色 { const CLayout* pcLayout = pInfo->m_pDispPos->GetLayoutRef(); if( bSkipBeforeLayout ){ EColorIndexType eRet = COLORIDX_TEXT; const CLayoutColorInfo* colorInfo = NULL; if( pcLayout ){ eRet = pcLayout->GetColorTypePrev(); // COLORIDX_TEXTのはず colorInfo = pcLayout->GetColorInfo(); } pInfo->m_pStrategy = pool->GetStrategyByColor(eRet); if( pInfo->m_pStrategy ){ pInfo->m_pStrategy->InitStrategyStatus(); pInfo->m_pStrategy->SetStrategyColorInfo(colorInfo); } }else{ CColor3Setting cColor = GetColorIndex(pcLayout, pInfo->m_pDispPos->GetLayoutLineRef(), 0, pInfo, true); SetCurrentColor(pInfo->m_gr, cColor.eColorIndex, cColor.eColorIndex2, cColor.eColorIndexBg); } } //開始ロジック位置を算出 { const CLayout* pcLayout = pInfo->m_pDispPos->GetLayoutRef(); pInfo->m_nPosInLogic = pcLayout?pcLayout->GetLogicOffset():CLogicInt(0); } for (;;) { //対象行が描画範囲外だったら終了 if( GetTextArea().GetBottomLine() < pInfo->m_pDispPos->GetLayoutLineRef() ){ pInfo->m_pDispPos->SetLayoutLineRef(nLineTo + CLayoutInt(1)); break; } if( nLineTo < pInfo->m_pDispPos->GetLayoutLineRef() ){ break; } //レイアウト行を1行描画 bDispEOF = DrawLayoutLine(pInfo); //行を進める CLogicInt nOldLogicLineNo = pInfo->m_pDispPos->GetLayoutRef()->GetLogicLineNo(); pInfo->m_pDispPos->ForwardDrawLine(1); //描画Y座標++ pInfo->m_pDispPos->ForwardLayoutLineRef(1); //レイアウト行++ // ロジック行を描画し終わったら抜ける if(pInfo->m_pDispPos->GetLayoutRef()->GetLogicLineNo()!=nOldLogicLineNo){ break; } // nLineToを超えたら抜ける if(pInfo->m_pDispPos->GetLayoutLineRef() >= nLineTo + CLayoutInt(1)){ break; } } return bDispEOF; }
void CLayoutMgr::_MakeOneLine(SLayoutWork* pWork, PF_OnLine pfOnLine) { int nEol = pWork->pcDocLine->GetEol().GetLen(); //########そのうち不要になる int nEol_1 = nEol - 1; if( 0 > nEol_1 ){ nEol_1 = 0; } CLogicInt nLength = pWork->cLineStr.GetLength() - CLogicInt(nEol_1); if(pWork->pcColorStrategy)pWork->pcColorStrategy->InitStrategyStatus(); CColorStrategyPool& color = *CColorStrategyPool::getInstance(); //1ロジック行を消化するまでループ while( pWork->nPos < nLength ){ // インデント幅は_OnLineで計算済みなのでここからは削除 //禁則処理中ならスキップする @@@ 2002.04.20 MIK if(_DoKinsokuSkip(pWork, pfOnLine)){ } else{ // 英文ワードラップをする if( m_pTypeConfig->m_bWordWrap ){ _DoWordWrap(pWork, pfOnLine); } // 句読点のぶらさげ if( m_pTypeConfig->m_bKinsokuKuto ){ _DoKutoBurasage(pWork); } // 行頭禁則 if( m_pTypeConfig->m_bKinsokuHead ){ _DoGyotoKinsoku(pWork, pfOnLine); } // 行末禁則 if( m_pTypeConfig->m_bKinsokuTail ){ _DoGyomatsuKinsoku(pWork, pfOnLine); } } //@@@ 2002.09.22 YAZAKI color.CheckColorMODE( &pWork->pcColorStrategy, pWork->nPos, pWork->cLineStr ); if( pWork->cLineStr.At(pWork->nPos) == WCODE::TAB ){ if(_DoTab(pWork, pfOnLine)){ continue; } } else{ if( pWork->nPos >= pWork->cLineStr.GetLength() ){ break; } // 2007.09.07 kobake ロジック幅とレイアウト幅を区別 CLayoutInt nCharKetas = GetLayoutXOfChar( pWork->cLineStr, pWork->nPos ); // if( 0 == nCharKetas ){ // 削除 サロゲートペア対策 2008/7/5 Uchi // nCharKetas = CLayoutInt(1); // } if( pWork->nPosX + nCharKetas > GetMaxLineLayout() ){ if( pWork->eKinsokuType != KINSOKU_TYPE_KINSOKU_KUTO ) { if( ! (m_pTypeConfig->m_bKinsokuRet && (pWork->nPos == pWork->cLineStr.GetLength() - nEol) && nEol) ) //改行文字をぶら下げる //@@@ 2002.04.14 MIK { (this->*pfOnLine)(pWork); continue; } } } pWork->nPos += 1; pWork->nPosX += nCharKetas; } } }
/*! コマンドコードによる処理振り分け @param nCommand コマンドコード @param lparam1 parameter1(内容はコマンドコードによって変わります) @param lparam2 parameter2(内容はコマンドコードによって変わります) @param lparam3 parameter3(内容はコマンドコードによって変わります) @param lparam4 parameter4(内容はコマンドコードによって変わります) */ BOOL CViewCommander::HandleCommand( EFunctionCode nCommand, bool bRedraw, LPARAM lparam1, LPARAM lparam2, LPARAM lparam3, LPARAM lparam4 ) { BOOL bRet = TRUE; bool bRepeat = false; int nFuncID; // May. 19, 2006 genta 上位16bitに送信元の識別子が入るように変更したので // 下位16ビットのみを取り出す // Jul. 7, 2007 genta 定数と比較するためにシフトしないで使う int nCommandFrom = nCommand & ~0xffff; nCommand = (EFunctionCode)LOWORD( nCommand ); if( m_pCommanderView->m_nAutoScrollMode && F_AUTOSCROLL != nCommand ){ m_pCommanderView->AutoScrollExit(); } m_pCommanderView->GetCaret().m_bClearStatus = true; // ------------------------------------- // Jan. 10, 2005 genta // Call message translators // ------------------------------------- m_pCommanderView->TranslateCommand_grep( nCommand, bRedraw, lparam1, lparam2, lparam3, lparam4 ); m_pCommanderView->TranslateCommand_isearch( nCommand, bRedraw, lparam1, lparam2, lparam3, lparam4 ); // 2013.09.23 novice 機能が利用可能か調べる if( !IsFuncEnable( GetDocument(), &GetDllShareData(), nCommand ) ){ return TRUE; } ++GetDocument()->m_nCommandExecNum; /* コマンド実行回数 */ // if( nCommand != F_COPY ){ /* 辞書Tipを消す */ m_pCommanderView->m_cTipWnd.Hide(); m_pCommanderView->m_dwTipTimer = ::GetTickCount(); /* 辞書Tip起動タイマー */ // } /* 印刷プレビューモードか */ //@@@ 2002.01.14 YAZAKI 印刷プレビューをCPrintPreviewに独立させたことによる変更 if( GetEditWindow()->m_pPrintPreview && F_PRINT_PREVIEW != nCommand ){ ErrorBeep(); return -1; } /* キーリピート状態 */ if( m_bPrevCommand == nCommand ){ bRepeat = true; } m_bPrevCommand = nCommand; if( GetDllShareData().m_sFlags.m_bRecordingKeyMacro && /* キーボードマクロの記録中 */ GetDllShareData().m_sFlags.m_hwndRecordingKeyMacro == GetMainWindow() && /* キーボードマクロを記録中のウィンドウ */ ( nCommandFrom & FA_NONRECORD ) != FA_NONRECORD /* 2007.07.07 genta 記録抑制フラグ off */ ){ /* キーリピート状態をなくする */ bRepeat = false; /* キーマクロに記録可能な機能かどうかを調べる */ //@@@ 2002.2.2 YAZAKI マクロをCSMacroMgrに統一 //F_EXECEXTMACROコマンドはファイルを選択した後にマクロ文が確定するため個別に記録する。 if( CSMacroMgr::CanFuncIsKeyMacro( nCommand ) && nCommand != F_EXECEXTMACRO //F_EXECEXTMACROは個別で記録します ){ /* キーマクロのバッファにデータ追加 */ //@@@ 2002.1.24 m_CKeyMacroMgrをCEditDocへ移動 LPARAM lparams[] = {lparam1, lparam2, lparam3, lparam4}; m_pcSMacroMgr->Append( STAND_KEYMACRO, nCommand, lparams, m_pCommanderView ); } } // 2007.07.07 genta マクロ実行中フラグの設定 // マクロからのコマンドかどうかはnCommandFromでわかるが // nCommandFromを引数で浸透させるのが大変なので,従来のフラグにも値をコピーする m_pCommanderView->m_bExecutingKeyMacro = ( nCommandFrom & FA_FROMMACRO ) ? true : false; /* キーボードマクロの実行中 */ if( m_pCommanderView->m_bExecutingKeyMacro ){ /* キーリピート状態をなくする */ bRepeat = false; } // From Here Sep. 29, 2001 genta マクロの実行機能追加 if( F_USERMACRO_0 <= nCommand && nCommand < F_USERMACRO_0 + MAX_CUSTMACRO ){ //@@@ 2002.2.2 YAZAKI マクロをCSMacroMgrに統一(インターフェースの変更) if( !m_pcSMacroMgr->Exec( nCommand - F_USERMACRO_0, G_AppInstance(), m_pCommanderView, nCommandFrom & FA_NONRECORD )){ InfoMessage( this->m_pCommanderView->m_hwndParent, LS(STR_ERR_MACRO1), nCommand - F_USERMACRO_0, m_pcSMacroMgr->GetFile( nCommand - F_USERMACRO_0 ) ); } return TRUE; } // To Here Sep. 29, 2001 genta マクロの実行機能追加 // ------------------------------------- // Jan. 10, 2005 genta // Call mode basis message handler // ------------------------------------- m_pCommanderView->PreprocessCommand_hokan(nCommand); if( m_pCommanderView->ProcessCommand_isearch( nCommand, bRedraw, lparam1, lparam2, lparam3, lparam4 )) return TRUE; // ------------------------------------- // Jan. 10, 2005 genta コメント // ここより前ではUndoバッファの準備ができていないので // 文書の操作を行ってはいけない //@@@ 2002.2.2 YAZAKI HandleCommand内でHandleCommandを呼び出せない問題に対処(何か副作用がある?) if( NULL == GetOpeBlk() ){ /* 操作ブロック */ SetOpeBlk(new COpeBlk); } GetOpeBlk()->AddRef(); //参照カウンタ増加 // Jan. 10, 2005 genta コメント // ここより後ではswitchの後ろでUndoを正しく登録するため, // 途中で処理の打ち切りを行ってはいけない // ------------------------------------- switch( nCommand ){ case F_WCHAR: /* 文字入力 */ { Command_WCHAR( (wchar_t)lparam1 ); } break; /* ファイル操作系 */ case F_FILENEW: Command_FILENEW();break; /* 新規作成 */ case F_FILENEW_NEWWINDOW: Command_FILENEW_NEWWINDOW();break; // Oct. 2, 2001 genta マクロ用機能拡張 case F_FILEOPEN: Command_FILEOPEN((const WCHAR*)lparam1);break; /* ファイルを開く */ case F_FILEOPEN2: Command_FILEOPEN((const WCHAR*)lparam1, (ECodeType)lparam2, lparam3 != 0, (const WCHAR*)lparam4);break; //ファイルを開く2 case F_FILEOPEN_DROPDOWN: Command_FILEOPEN((const WCHAR*)lparam1);break; /* ファイルを開く(ドロップダウン) */ //@@@ 2002.06.15 MIK case F_FILESAVE: bRet = Command_FILESAVE();break; /* 上書き保存 */ case F_FILESAVEAS_DIALOG: bRet = Command_FILESAVEAS_DIALOG((const WCHAR*)lparam1, (ECodeType)lparam2, (EEolType)lparam3);break; /* 名前を付けて保存 */ case F_FILESAVEAS: bRet = Command_FILESAVEAS((const WCHAR*)lparam1,(EEolType)lparam3);break; /* 名前を付けて保存 */ case F_FILESAVEALL: bRet = Command_FILESAVEALL();break; /* 全ての編集ウィンドウで上書き保存 */ // Jan. 23, 2005 genta case F_FILESAVE_QUIET: bRet = Command_FILESAVE(false,false); break; /* 静かに上書き保存 */ // Jan. 24, 2005 genta case F_FILESAVECLOSE: // Feb. 28, 2004 genta 保存&閉じる // 保存が不要なら単に閉じる { // Command_FILESAVE()とは別に保存不要をチェック //### Command_FILESAVE() は実際に保存した場合だけ true を返すようになった(仕様変更?) if( !GetDllShareData().m_Common.m_sFile.m_bEnableUnmodifiedOverwrite && !GetDocument()->m_cDocEditor.IsModified() ){ Command_WINCLOSE(); break; } } if( Command_FILESAVE( false, true )){ Command_WINCLOSE(); } break; case F_FILECLOSE: //閉じて(無題) //Oct. 17, 2000 jepro 「ファイルを閉じる」というキャプションを変更 Command_FILECLOSE(); break; case F_FILECLOSE_OPEN: /* 閉じて開く */ Command_FILECLOSE_OPEN(); break; case F_FILE_REOPEN: Command_FILE_REOPEN( GetDocument()->GetDocumentEncoding(), lparam1!=0 );break;// Dec. 4, 2002 genta case F_FILE_REOPEN_SJIS: Command_FILE_REOPEN( CODE_SJIS, lparam1!=0 );break; //SJISで開き直す case F_FILE_REOPEN_JIS: Command_FILE_REOPEN( CODE_JIS, lparam1!=0 );break; //JISで開き直す case F_FILE_REOPEN_EUC: Command_FILE_REOPEN( CODE_EUC, lparam1!=0 );break; //EUCで開き直す case F_FILE_REOPEN_LATIN1: Command_FILE_REOPEN( CODE_LATIN1, lparam1!=0 );break; //Latin1で開きなおす // 2010/3/20 Uchi case F_FILE_REOPEN_UNICODE: Command_FILE_REOPEN( CODE_UNICODE, lparam1!=0 );break; //Unicodeで開き直す case F_FILE_REOPEN_UNICODEBE: Command_FILE_REOPEN( CODE_UNICODEBE, lparam1!=0 );break; //UnicodeBEで開き直す case F_FILE_REOPEN_UTF8: Command_FILE_REOPEN( CODE_UTF8, lparam1!=0 );break; //UTF-8で開き直す case F_FILE_REOPEN_CESU8: Command_FILE_REOPEN( CODE_CESU8, lparam1!=0 );break; //CESU-8で開きなおす case F_FILE_REOPEN_UTF7: Command_FILE_REOPEN( CODE_UTF7, lparam1!=0 );break; //UTF-7で開き直す case F_PRINT: Command_PRINT();break; /* 印刷 */ case F_PRINT_PREVIEW: Command_PRINT_PREVIEW();break; /* 印刷プレビュー */ case F_PRINT_PAGESETUP: Command_PRINT_PAGESETUP();break; /* 印刷ページ設定 */ //Sept. 14, 2000 jepro 「印刷のページレイアウトの設定」から変更 case F_OPEN_HfromtoC: bRet = Command_OPEN_HfromtoC( (BOOL)lparam1 );break; /* 同名のC/C++ヘッダ(ソース)を開く */ //Feb. 7, 2001 JEPRO 追加 // case F_OPEN_HHPP: bRet = Command_OPEN_HHPP( (BOOL)lparam1, TRUE );break; /* 同名のC/C++ヘッダファイルを開く */ //Feb. 9, 2001 jepro「.cまたは.cppと同名の.hを開く」から変更 del 2008/6/23 Uchi // case F_OPEN_CCPP: bRet = Command_OPEN_CCPP( (BOOL)lparam1, TRUE );break; /* 同名のC/C++ソースファイルを開く */ //Feb. 9, 2001 jepro「.hと同名の.c(なければ.cpp)を開く」から変更 del 2008/6/23 Uchi case F_ACTIVATE_SQLPLUS: Command_ACTIVATE_SQLPLUS();break; /* Oracle SQL*Plusをアクティブ表示 */ case F_PLSQL_COMPILE_ON_SQLPLUS: /* Oracle SQL*Plusで実行 */ Command_PLSQL_COMPILE_ON_SQLPLUS(); break; case F_BROWSE: Command_BROWSE();break; /* ブラウズ */ case F_VIEWMODE: Command_VIEWMODE();break; /* ビューモード */ case F_PROPERTY_FILE: Command_PROPERTY_FILE();break; /* ファイルのプロパティ */ case F_PROFILEMGR: Command_PROFILEMGR();break; // プロファイルマネージャ case F_EXITALLEDITORS: Command_EXITALLEDITORS();break; /* 編集の全終了 */ // 2007.02.13 ryoji 追加 case F_EXITALL: Command_EXITALL();break; /* サクラエディタの全終了 */ //Dec. 26, 2000 JEPRO 追加 case F_PUTFILE: Command_PUTFILE((LPCWSTR)lparam1, (ECodeType)lparam2, (int)lparam3);break; /* 作業中ファイルの一時出力 */ //maru 2006.12.10 case F_INSFILE: Command_INSFILE((LPCWSTR)lparam1, (ECodeType)lparam2, (int)lparam3);break; /* キャレット位置にファイル挿入 */ //maru 2006.12.10 /* 編集系 */ case F_UNDO: Command_UNDO();break; /* 元に戻す(Undo) */ case F_REDO: Command_REDO();break; /* やり直し(Redo) */ case F_DELETE: Command_DELETE(); break; //削除 case F_DELETE_BACK: Command_DELETE_BACK(); break; //カーソル前を削除 case F_WordDeleteToStart: Command_WordDeleteToStart(); break; //単語の左端まで削除 case F_WordDeleteToEnd: Command_WordDeleteToEnd(); break; //単語の右端まで削除 case F_WordDelete: Command_WordDelete(); break; //単語削除 case F_WordCut: Command_WordCut(); break; //単語切り取り case F_LineCutToStart: Command_LineCutToStart(); break; //行頭まで切り取り(改行単位) case F_LineCutToEnd: Command_LineCutToEnd(); break; //行末まで切り取り(改行単位) case F_LineDeleteToStart: Command_LineDeleteToStart(); break; //行頭まで削除(改行単位) case F_LineDeleteToEnd: Command_LineDeleteToEnd(); break; //行末まで削除(改行単位) case F_CUT_LINE: Command_CUT_LINE();break; //行切り取り(折り返し単位) case F_DELETE_LINE: Command_DELETE_LINE();break; //行削除(折り返し単位) case F_DUPLICATELINE: Command_DUPLICATELINE();break; //行の二重化(折り返し単位) case F_INDENT_TAB: Command_INDENT( WCODE::TAB, INDENT_TAB );break; //TABインデント case F_UNINDENT_TAB: Command_UNINDENT( WCODE::TAB );break; //逆TABインデント case F_INDENT_SPACE: Command_INDENT( WCODE::SPACE, INDENT_SPACE );break; //SPACEインデント case F_UNINDENT_SPACE: Command_UNINDENT( WCODE::SPACE );break; //逆SPACEインデント // case F_WORDSREFERENCE: Command_WORDSREFERENCE();break; /* 単語リファレンス */ case F_LTRIM: Command_TRIM(TRUE);break; // 2001.12.03 hor case F_RTRIM: Command_TRIM(FALSE);break; // 2001.12.03 hor case F_SORT_ASC: Command_SORT(TRUE);break; // 2001.12.06 hor case F_SORT_DESC: Command_SORT(FALSE);break; // 2001.12.06 hor case F_MERGE: Command_MERGE();break; // 2001.12.06 hor case F_RECONVERT: Command_Reconvert();break; /* メニューからの再変換対応 minfu 2002.04.09 */ /* カーソル移動系 */ case F_IME_CHAR: Command_IME_CHAR( (WORD)lparam1 ); break; //全角文字入力 case F_MOVECURSOR: Command_MOVECURSOR(CLogicPoint(CLogicInt((int)lparam2), CLogicInt((int)lparam1)), (int)lparam3); break; case F_MOVECURSORLAYOUT: Command_MOVECURSORLAYOUT(CLayoutPoint(CLayoutInt((int)lparam2), CLayoutInt((int)lparam1)), (int)lparam3); break; case F_UP: Command_UP( m_pCommanderView->GetSelectionInfo().m_bSelectingLock, bRepeat ); break; //カーソル上移動 case F_DOWN: Command_DOWN( m_pCommanderView->GetSelectionInfo().m_bSelectingLock, bRepeat ); break; //カーソル下移動 case F_LEFT: Command_LEFT( m_pCommanderView->GetSelectionInfo().m_bSelectingLock, bRepeat ); break; //カーソル左移動 case F_RIGHT: Command_RIGHT( m_pCommanderView->GetSelectionInfo().m_bSelectingLock, false, bRepeat ); break; //カーソル右移動 case F_UP2: Command_UP2( m_pCommanderView->GetSelectionInfo().m_bSelectingLock ); break; //カーソル上移動(2行づつ) case F_DOWN2: Command_DOWN2( m_pCommanderView->GetSelectionInfo().m_bSelectingLock ); break; //カーソル下移動(2行づつ) case F_WORDLEFT: Command_WORDLEFT( m_pCommanderView->GetSelectionInfo().m_bSelectingLock ); break; /* 単語の左端に移動 */ case F_WORDRIGHT: Command_WORDRIGHT( m_pCommanderView->GetSelectionInfo().m_bSelectingLock ); break; /* 単語の右端に移動 */ // 0ct. 29, 2001 genta マクロ向け機能拡張 case F_GOLINETOP: Command_GOLINETOP( m_pCommanderView->GetSelectionInfo().m_bSelectingLock, lparam1 ); break; //行頭に移動(折り返し単位/改行単位) case F_GOLINEEND: Command_GOLINEEND( m_pCommanderView->GetSelectionInfo().m_bSelectingLock, 0, lparam1 ); break; //行末に移動(折り返し単位) // case F_ROLLDOWN: Command_ROLLDOWN( m_pCommanderView->GetSelectionInfo().m_bSelectingLock ); break; //スクロールダウン // case F_ROLLUP: Command_ROLLUP( m_pCommanderView->GetSelectionInfo().m_bSelectingLock ); break; //スクロールアップ case F_HalfPageUp: Command_HalfPageUp( m_pCommanderView->GetSelectionInfo().m_bSelectingLock, CLayoutYInt(lparam1) ); break; //半ページアップ //Oct. 6, 2000 JEPRO 名称をPC-AT互換機系に変更(ROLL→PAGE) //Oct. 10, 2000 JEPRO 名称変更 case F_HalfPageDown: Command_HalfPageDown( m_pCommanderView->GetSelectionInfo().m_bSelectingLock, CLayoutYInt(lparam1) ); break; //半ページダウン //Oct. 6, 2000 JEPRO 名称をPC-AT互換機系に変更(ROLL→PAGE) //Oct. 10, 2000 JEPRO 名称変更 case F_1PageUp: Command_1PageUp( m_pCommanderView->GetSelectionInfo().m_bSelectingLock, CLayoutYInt(lparam1) ); break; //1ページアップ //Oct. 10, 2000 JEPRO 従来のページアップを半ページアップと名称変更し1ページアップを追加 case F_1PageDown: Command_1PageDown( m_pCommanderView->GetSelectionInfo().m_bSelectingLock, CLayoutYInt(lparam1) ); break; //1ページダウン //Oct. 10, 2000 JEPRO 従来のページダウンを半ページダウンと名称変更し1ページダウンを追加 case F_GOFILETOP: Command_GOFILETOP( m_pCommanderView->GetSelectionInfo().m_bSelectingLock ); break; //ファイルの先頭に移動 case F_GOFILEEND: Command_GOFILEEND( m_pCommanderView->GetSelectionInfo().m_bSelectingLock ); break; //ファイルの最後に移動 case F_CURLINECENTER: Command_CURLINECENTER(); break; /* カーソル行をウィンドウ中央へ */ case F_JUMPHIST_PREV: Command_JUMPHIST_PREV(); break; //移動履歴: 前へ case F_JUMPHIST_NEXT: Command_JUMPHIST_NEXT(); break; //移動履歴: 次へ case F_JUMPHIST_SET: Command_JUMPHIST_SET(); break; //現在位置を移動履歴に登録 case F_WndScrollDown: Command_WndScrollDown(); break; //テキストを1行下へスクロール // 2001/06/20 asa-o case F_WndScrollUp: Command_WndScrollUp(); break; //テキストを1行上へスクロール // 2001/06/20 asa-o case F_GONEXTPARAGRAPH: Command_GONEXTPARAGRAPH( m_pCommanderView->GetSelectionInfo().m_bSelectingLock ); break; //次の段落へ進む case F_GOPREVPARAGRAPH: Command_GOPREVPARAGRAPH( m_pCommanderView->GetSelectionInfo().m_bSelectingLock ); break; //前の段落へ戻る case F_AUTOSCROLL: Command_AUTOSCROLL(); break; //オートスクロール case F_WHEELUP: Command_WHEELUP(lparam1); break; case F_WHEELDOWN: Command_WHEELDOWN(lparam1); break; case F_WHEELLEFT: Command_WHEELLEFT(lparam1); break; case F_WHEELRIGHT: Command_WHEELRIGHT(lparam1); break; case F_WHEELPAGEUP: Command_WHEELPAGEUP(lparam1); break; case F_WHEELPAGEDOWN: Command_WHEELPAGEDOWN(lparam1); break; case F_WHEELPAGELEFT: Command_WHEELPAGELEFT(lparam1); break; case F_WHEELPAGERIGHT: Command_WHEELPAGERIGHT(lparam1); break; case F_MODIFYLINE_NEXT: Command_MODIFYLINE_NEXT( m_pCommanderView->GetSelectionInfo().m_bSelectingLock ); break; // 次の変更行へ case F_MODIFYLINE_PREV: Command_MODIFYLINE_PREV( m_pCommanderView->GetSelectionInfo().m_bSelectingLock ); break; // 前の変更行へ /* 選択系 */ case F_SELECTWORD: Command_SELECTWORD();break; //現在位置の単語選択 case F_SELECTALL: Command_SELECTALL();break; //すべて選択 case F_SELECTLINE: Command_SELECTLINE( lparam1 );break; //1行選択 // 2007.10.13 nasukoji case F_BEGIN_SEL: Command_BEGIN_SELECT();break; /* 範囲選択開始 */ case F_UP_SEL: Command_UP( true, bRepeat, lparam1 ); break; //(範囲選択)カーソル上移動 case F_DOWN_SEL: Command_DOWN( true, bRepeat ); break; //(範囲選択)カーソル下移動 case F_LEFT_SEL: Command_LEFT( true, bRepeat ); break; //(範囲選択)カーソル左移動 case F_RIGHT_SEL: Command_RIGHT( true, false, bRepeat ); break; //(範囲選択)カーソル右移動 case F_UP2_SEL: Command_UP2( true ); break; //(範囲選択)カーソル上移動(2行ごと) case F_DOWN2_SEL: Command_DOWN2( true );break; //(範囲選択)カーソル下移動(2行ごと) case F_WORDLEFT_SEL: Command_WORDLEFT( true );break; //(範囲選択)単語の左端に移動 case F_WORDRIGHT_SEL: Command_WORDRIGHT( true );break; //(範囲選択)単語の右端に移動 case F_GOLINETOP_SEL: Command_GOLINETOP( true, lparam1 );break; //(範囲選択)行頭に移動(折り返し単位/改行単位) case F_GOLINEEND_SEL: Command_GOLINEEND( true, 0, lparam1 );break; //(範囲選択)行末に移動(折り返し単位) // case F_ROLLDOWN_SEL: Command_ROLLDOWN( TRUE ); break; //(範囲選択)スクロールダウン // case F_ROLLUP_SEL: Command_ROLLUP( TRUE ); break; //(範囲選択)スクロールアップ case F_HalfPageUp_Sel: Command_HalfPageUp( true, CLayoutYInt(lparam1) ); break; //(範囲選択)半ページアップ case F_HalfPageDown_Sel:Command_HalfPageDown( true, CLayoutYInt(lparam1) ); break; //(範囲選択)半ページダウン case F_1PageUp_Sel: Command_1PageUp( true, CLayoutYInt(lparam1) ); break; //(範囲選択)1ページアップ case F_1PageDown_Sel: Command_1PageDown( true, CLayoutYInt(lparam1) ); break; //(範囲選択)1ページダウン case F_GOFILETOP_SEL: Command_GOFILETOP( true );break; //(範囲選択)ファイルの先頭に移動 case F_GOFILEEND_SEL: Command_GOFILEEND( true );break; //(範囲選択)ファイルの最後に移動 case F_GONEXTPARAGRAPH_SEL: Command_GONEXTPARAGRAPH( true ); break; //次の段落へ進む case F_GOPREVPARAGRAPH_SEL: Command_GOPREVPARAGRAPH( true ); break; //前の段落へ戻る case F_MODIFYLINE_NEXT_SEL: Command_MODIFYLINE_NEXT( true ); break; //(範囲選択)次の変更行へ case F_MODIFYLINE_PREV_SEL: Command_MODIFYLINE_PREV( true ); break; //(範囲選択)前の変更行へ /* 矩形選択系 */ // case F_BOXSELALL: Command_BOXSELECTALL();break; //矩形ですべて選択 case F_BEGIN_BOX: Command_BEGIN_BOXSELECT( true );break; /* 矩形範囲選択開始 */ case F_UP_BOX: Sub_BoxSelectLock(lparam1); this->Command_UP( true, bRepeat ); break; //(矩形選択)カーソル上移動 case F_DOWN_BOX: Sub_BoxSelectLock(lparam1); this->Command_DOWN( true, bRepeat ); break; //(矩形選択)カーソル下移動 case F_LEFT_BOX: Sub_BoxSelectLock(lparam1); this->Command_LEFT( true, bRepeat ); break; //(矩形選択)カーソル左移動 case F_RIGHT_BOX: Sub_BoxSelectLock(lparam1); this->Command_RIGHT( true, false, bRepeat ); break; //(矩形選択)カーソル右移動 case F_UP2_BOX: Sub_BoxSelectLock(lparam1); this->Command_UP2( true ); break; //(矩形選択)カーソル上移動(2行ごと) case F_DOWN2_BOX: Sub_BoxSelectLock(lparam1); this->Command_DOWN2( true );break; //(矩形選択)カーソル下移動(2行ごと) case F_WORDLEFT_BOX: Sub_BoxSelectLock(lparam1); this->Command_WORDLEFT( true );break; //(矩形選択)単語の左端に移動 case F_WORDRIGHT_BOX: Sub_BoxSelectLock(lparam1); this->Command_WORDRIGHT( true );break; //(矩形選択)単語の右端に移動 case F_GOLOGICALLINETOP_BOX:Sub_BoxSelectLock(lparam2); this->Command_GOLINETOP( true, 8 | lparam1 );break; //(矩形選択)行頭に移動(改行単位) // case F_GOLOGICALLINEEND_BOX:Sub_BoxSelectLock(lparam2); this->Command_GOLINEEND( true, 0, 8 | lparam1 );break; //(矩形選択)行末に移動(改行単位) case F_GOLINETOP_BOX: Sub_BoxSelectLock(lparam2); this->Command_GOLINETOP( true, lparam1 );break; //(矩形選択)行頭に移動(折り返し単位/改行単位) case F_GOLINEEND_BOX: Sub_BoxSelectLock(lparam2); this->Command_GOLINEEND( true, 0, lparam1 );break; //(矩形選択)行末に移動(折り返し単位/改行単位) case F_HalfPageUp_BOX: Sub_BoxSelectLock(lparam2); this->Command_HalfPageUp( true, CLayoutYInt(lparam1) ); break; //(矩形選択)半ページアップ case F_HalfPageDown_BOX:Sub_BoxSelectLock(lparam2); this->Command_HalfPageDown( true, CLayoutYInt(lparam1) ); break; //(矩形選択)半ページダウン case F_1PageUp_BOX: Sub_BoxSelectLock(lparam2); this->Command_1PageUp( true, CLayoutYInt(lparam1) ); break; //(矩形選択)1ページアップ case F_1PageDown_BOX: Sub_BoxSelectLock(lparam2); this->Command_1PageDown( true, CLayoutYInt(lparam1) ); break; //(矩形選択)1ページダウン case F_GOFILETOP_BOX: Sub_BoxSelectLock(lparam1); this->Command_GOFILETOP( true );break; //(矩形選択)ファイルの先頭に移動 case F_GOFILEEND_BOX: Sub_BoxSelectLock(lparam1); this->Command_GOFILEEND( true );break; //(矩形選択)ファイルの最後に移動 /* クリップボード系 */ case F_CUT: Command_CUT();break; //切り取り(選択範囲をクリップボードにコピーして削除) case F_COPY: Command_COPY( false, GetDllShareData().m_Common.m_sEdit.m_bAddCRLFWhenCopy );break; //コピー(選択範囲をクリップボードにコピー) case F_COPY_ADDCRLF: Command_COPY( false, true );break; //折り返し位置に改行をつけてコピー(選択範囲をクリップボードにコピー) case F_COPY_CRLF: Command_COPY( false, GetDllShareData().m_Common.m_sEdit.m_bAddCRLFWhenCopy, EOL_CRLF );break; //CRLF改行でコピー(選択範囲をクリップボードにコピー) case F_PASTE: Command_PASTE( (int)lparam1 );break; //貼り付け(クリップボードから貼り付け) case F_PASTEBOX: Command_PASTEBOX( (int)lparam1 );break; //矩形貼り付け(クリップボードから矩形貼り付け) case F_INSBOXTEXT: Command_INSBOXTEXT((const wchar_t*)lparam1, (int)lparam2 );break; //矩形テキスト挿入 case F_INSTEXT_W: Command_INSTEXT( bRedraw, (const wchar_t*)lparam1, (CLogicInt)lparam2, lparam3!=FALSE );break;/* テキストを貼り付け */ // 2004.05.14 Moca 長さを示す引数追加 case F_ADDTAIL_W: Command_ADDTAIL( (const wchar_t*)lparam1, (int)lparam2 );break; /* 最後にテキストを追加 */ case F_COPYFNAME: Command_COPYFILENAME();break; //このファイル名をクリップボードにコピー / /2002/2/3 aroka case F_COPYPATH: Command_COPYPATH();break; //このファイルのパス名をクリップボードにコピー case F_COPYTAG: Command_COPYTAG();break; //このファイルのパス名とカーソル位置をコピー //Sept. 15, 2000 jepro 上と同じ説明になっていたのを修正 case F_COPYLINES: Command_COPYLINES();break; //選択範囲内全行コピー case F_COPYLINESASPASSAGE: Command_COPYLINESASPASSAGE();break; //選択範囲内全行引用符付きコピー case F_COPYLINESWITHLINENUMBER: Command_COPYLINESWITHLINENUMBER();break;//選択範囲内全行行番号付きコピー case F_COPY_COLOR_HTML: Command_COPY_COLOR_HTML();break; //選択範囲内色付きHTMLコピー case F_COPY_COLOR_HTML_LINENUMBER: Command_COPY_COLOR_HTML_LINENUMBER();break; //選択範囲内行番号色付きHTMLコピー case F_CREATEKEYBINDLIST: Command_CREATEKEYBINDLIST();break; //キー割り当て一覧をコピー //Sept. 15, 2000 JEPRO 追加 //Dec. 25, 2000 復活 /* 挿入系 */ case F_INS_DATE: Command_INS_DATE();break; //日付挿入 case F_INS_TIME: Command_INS_TIME();break; //時刻挿入 case F_CTRL_CODE_DIALOG: Command_CtrlCode_Dialog();break; /* コントロールコードの入力(ダイアログ) */ //@@@ 2002.06.02 MIK case F_CTRL_CODE: Command_WCHAR( (wchar_t)lparam1, false );break; /* 変換 */ case F_TOLOWER: Command_TOLOWER();break; /* 小文字 */ case F_TOUPPER: Command_TOUPPER();break; /* 大文字 */ case F_TOHANKAKU: Command_TOHANKAKU();break; /* 全角→半角 */ case F_TOHANKATA: Command_TOHANKATA();break; /* 全角カタカナ→半角カタカナ */ //Aug. 29, 2002 ai case F_TOZENEI: Command_TOZENEI();break; /* 全角→半角 */ //July. 30, 2001 Misaka case F_TOHANEI: Command_TOHANEI();break; /* 半角→全角 */ case F_TOZENKAKUKATA: Command_TOZENKAKUKATA();break; /* 半角+全ひら→全角・カタカナ */ //Sept. 17, 2000 jepro 説明を「半角→全角カタカナ」から変更 case F_TOZENKAKUHIRA: Command_TOZENKAKUHIRA();break; /* 半角+全カタ→全角・ひらがな */ //Sept. 17, 2000 jepro 説明を「半角→全角ひらがな」から変更 case F_HANKATATOZENKATA: Command_HANKATATOZENKAKUKATA();break; /* 半角カタカナ→全角カタカナ */ case F_HANKATATOZENHIRA: Command_HANKATATOZENKAKUHIRA();break; /* 半角カタカナ→全角ひらがな */ case F_TABTOSPACE: Command_TABTOSPACE();break; /* TAB→空白 */ case F_SPACETOTAB: Command_SPACETOTAB();break; /* 空白→TAB */ //---- Stonee, 2001/05/27 case F_CODECNV_AUTO2SJIS: Command_CODECNV_AUTO2SJIS();break; /* 自動判別→SJISコード変換 */ case F_CODECNV_EMAIL: Command_CODECNV_EMAIL();break; /* E-Mail(JIS→SJIS)コード変換 */ case F_CODECNV_EUC2SJIS: Command_CODECNV_EUC2SJIS();break; /* EUC→SJISコード変換 */ case F_CODECNV_UNICODE2SJIS: Command_CODECNV_UNICODE2SJIS();break; /* Unicode→SJISコード変換 */ case F_CODECNV_UNICODEBE2SJIS: Command_CODECNV_UNICODEBE2SJIS();break; /* UnicodeBE→SJISコード変換 */ case F_CODECNV_UTF82SJIS: Command_CODECNV_UTF82SJIS();break; /* UTF-8→SJISコード変換 */ case F_CODECNV_UTF72SJIS: Command_CODECNV_UTF72SJIS();break; /* UTF-7→SJISコード変換 */ case F_CODECNV_SJIS2JIS: Command_CODECNV_SJIS2JIS();break; /* SJIS→JISコード変換 */ case F_CODECNV_SJIS2EUC: Command_CODECNV_SJIS2EUC();break; /* SJIS→EUCコード変換 */ case F_CODECNV_SJIS2UTF8: Command_CODECNV_SJIS2UTF8();break; /* SJIS→UTF-8コード変換 */ case F_CODECNV_SJIS2UTF7: Command_CODECNV_SJIS2UTF7();break; /* SJIS→UTF-7コード変換 */ case F_BASE64DECODE: Command_BASE64DECODE();break; /* Base64デコードして保存 */ case F_UUDECODE: Command_UUDECODE();break; /* uudecodeして保存 */ //Oct. 17, 2000 jepro 説明を「選択部分をUUENCODEデコード」から変更 /* 検索系 */ case F_SEARCH_DIALOG: Command_SEARCH_DIALOG();break; //検索(単語検索ダイアログ) case F_SEARCH_BOX: Command_SEARCH_BOX();break; // Jan. 13, 2003 MIK //検索(ボックス) // 2006.06.04 yukihane Command_SEARCH_BOX() case F_SEARCH_NEXT: Command_SEARCH_NEXT( true, bRedraw, false, (HWND)lparam1, (const WCHAR*)lparam2 );break; //次を検索 case F_SEARCH_PREV: Command_SEARCH_PREV( bRedraw, (HWND)lparam1 );break; //前を検索 case F_REPLACE_DIALOG: //置換(置換ダイアログ) Command_REPLACE_DIALOG(); //@@@ 2002.2.2 YAZAKI ダイアログ呼び出しと、実行を分離 break; case F_REPLACE: Command_REPLACE( (HWND)lparam1 );break; //置換実行 @@@ 2002.2.2 YAZAKI case F_REPLACE_ALL: Command_REPLACE_ALL();break; //すべて置換実行(通常) 2002.2.8 hor 2006.04.02 かろと case F_SEARCH_CLEARMARK: Command_SEARCH_CLEARMARK();break; //検索マークのクリア case F_GREP_DIALOG: //Grepダイアログの表示 /* 再帰処理対策 */ m_pCommanderView->SetUndoBuffer( true ); Command_GREP_DIALOG(); return bRet; case F_GREP: Command_GREP();break; //Grep case F_GREP_REPLACE_DLG: //Grep置換ダイアログの表示 /* 再帰処理対策 */ m_pCommanderView->SetUndoBuffer( true ); Command_GREP_REPLACE_DLG(); return bRet; case F_GREP_REPLACE: Command_GREP_REPLACE();break; //Grep置換 case F_JUMP_DIALOG: Command_JUMP_DIALOG();break; //指定行ヘジャンプダイアログの表示 case F_JUMP: Command_JUMP();break; //指定行ヘジャンプ case F_OUTLINE: bRet = Command_FUNCLIST( (int)lparam1, OUTLINE_DEFAULT );break; //アウトライン解析 case F_OUTLINE_TOGGLE: bRet = Command_FUNCLIST( SHOW_TOGGLE, OUTLINE_DEFAULT );break; //アウトライン解析(toggle) // 20060201 aroka case F_FILETREE: bRet = Command_FUNCLIST( (BOOL)lparam1 ,OUTLINE_FILETREE );break; //ファイルツリー case F_TAGJUMP: Command_TAGJUMP(lparam1 != 0);break; /* タグジャンプ機能 */ // Apr. 03, 2003 genta 引数追加 case F_TAGJUMP_CLOSE: Command_TAGJUMP(true);break; /* タグジャンプ(元ウィンドウClose) */// Apr. 03, 2003 genta case F_TAGJUMPBACK: Command_TAGJUMPBACK();break; /* タグジャンプバック機能 */ case F_TAGS_MAKE: Command_TagsMake();break; //タグファイルの作成 //@@@ 2003.04.13 MIK case F_DIRECT_TAGJUMP: Command_TagJumpByTagsFileMsg( true );break; /* ダイレクトタグジャンプ機能 */ //@@@ 2003.04.15 MIK case F_TAGJUMP_KEYWORD: Command_TagJumpByTagsFileKeyword( (const wchar_t*)lparam1 );break; /* @@ 2005.03.31 MIK キーワードを指定してダイレクトタグジャンプ機能 */ case F_COMPARE: Command_COMPARE();break; /* ファイル内容比較 */ case F_DIFF_DIALOG: Command_Diff_Dialog();break; /* DIFF差分表示(ダイアログ) */ //@@@ 2002.05.25 MIK case F_DIFF: Command_Diff( (const WCHAR*)lparam1, (int)lparam2 );break; /* DIFF差分表示 */ //@@@ 2002.05.25 MIK // 2005.10.03 maru case F_DIFF_NEXT: Command_Diff_Next();break; /* DIFF差分表示(次へ) */ //@@@ 2002.05.25 MIK case F_DIFF_PREV: Command_Diff_Prev();break; /* DIFF差分表示(前へ) */ //@@@ 2002.05.25 MIK case F_DIFF_RESET: Command_Diff_Reset();break; /* DIFF差分表示(全解除) */ //@@@ 2002.05.25 MIK case F_BRACKETPAIR: Command_BRACKETPAIR(); break; //対括弧の検索 // From Here 2001.12.03 hor case F_BOOKMARK_SET: Command_BOOKMARK_SET();break; /* ブックマーク設定・解除 */ case F_BOOKMARK_NEXT: Command_BOOKMARK_NEXT();break; /* 次のブックマークへ */ case F_BOOKMARK_PREV: Command_BOOKMARK_PREV();break; /* 前のブックマークへ */ case F_BOOKMARK_RESET: Command_BOOKMARK_RESET();break; /* ブックマークの全解除 */ case F_BOOKMARK_VIEW: bRet = Command_FUNCLIST( (BOOL)lparam1 ,OUTLINE_BOOKMARK );break; //アウトライン解析 // To Here 2001.12.03 hor case F_BOOKMARK_PATTERN:Command_BOOKMARK_PATTERN();break; // 2002.01.16 hor 指定パターンに一致する行をマーク case F_JUMP_SRCHSTARTPOS: Command_JUMP_SRCHSTARTPOS();break; // 検索開始位置へ戻る 02/06/26 ai case F_FUNCLIST_NEXT: Command_FUNCLIST_NEXT();break; // 次の関数リストマーク 2014.01.05 case F_FUNCLIST_PREV: Command_FUNCLIST_PREV();break; // 前の関数リストマーク 2014.01.05 /* モード切り替え系 */ case F_CHGMOD_INS: Command_CHGMOD_INS();break; //挿入/上書きモード切り替え case F_CHG_CHARSET: Command_CHG_CHARSET( (ECodeType)lparam1, lparam2 != 0 );break; //文字コードセット指定 2010/6/14 Uchi // From Here 2003.06.23 Moca // F_CHGMOD_EOL_xxx はマクロに記録されないが、F_CHGMOD_EOLはマクロに記録されるので、マクロ関数を統合できるという手はず case F_CHGMOD_EOL_CRLF: HandleCommand( F_CHGMOD_EOL, bRedraw, EOL_CRLF, 0, 0, 0 );break; //入力する改行コードをCRLFに設定 case F_CHGMOD_EOL_LF: HandleCommand( F_CHGMOD_EOL, bRedraw, EOL_LF, 0, 0, 0 );break; //入力する改行コードをLFに設定 case F_CHGMOD_EOL_CR: HandleCommand( F_CHGMOD_EOL, bRedraw, EOL_CR, 0, 0, 0 );break; //入力する改行コードをCRに設定 // 2006.09.03 Moca F_CHGMOD_EOLで break 忘れの修正 case F_CHGMOD_EOL: Command_CHGMOD_EOL( (EEolType)lparam1 );break; //入力する改行コードを設定 // To Here 2003.06.23 Moca case F_CANCEL_MODE: Command_CANCEL_MODE();break; //各種モードの取り消し /* 設定系 */ case F_SHOWTOOLBAR: Command_SHOWTOOLBAR();break; /* ツールバーの表示/非表示 */ case F_SHOWFUNCKEY: Command_SHOWFUNCKEY();break; /* ファンクションキーの表示/非表示 */ case F_SHOWTAB: Command_SHOWTAB();break; /* タブの表示/非表示 */ //@@@ 2003.06.10 MIK case F_SHOWSTATUSBAR: Command_SHOWSTATUSBAR();break; /* ステータスバーの表示/非表示 */ case F_SHOWMINIMAP: Command_SHOWMINIMAP();break; // ミニマップの表示/非表示 case F_TYPE_LIST: Command_TYPE_LIST();break; /* タイプ別設定一覧 */ case F_CHANGETYPE: Command_CHANGETYPE((int)lparam1);break; // タイプ別設定一時適用 case F_OPTION_TYPE: Command_OPTION_TYPE();break; /* タイプ別設定 */ case F_OPTION: Command_OPTION();break; /* 共通設定 */ case F_FONT: Command_FONT();break; /* フォント設定 */ case F_SETFONTSIZE: Command_SETFONTSIZE((int)lparam1, (int)lparam2, (int)lparam3);break; /* フォントサイズ設定 */ case F_SETFONTSIZEUP: HandleCommand( F_SETFONTSIZE, bRedraw, 0, 1, 2, 0);break; /* フォントサイズ拡大 */ case F_SETFONTSIZEDOWN: HandleCommand( F_SETFONTSIZE, bRedraw, 0, -1, 2, 0);break; /* フォントサイズ縮小 */ case F_WRAPWINDOWWIDTH: Command_WRAPWINDOWWIDTH();break;/* 現在のウィンドウ幅で折り返し */ //Oct. 7, 2000 JEPRO WRAPWINDIWWIDTH を WRAPWINDOWWIDTH に変更 case F_FAVORITE: Command_Favorite();break; //履歴の管理 //@@@ 2003.04.08 MIK // Jan. 29, 2005 genta 引用符の設定 case F_SET_QUOTESTRING: Command_SET_QUOTESTRING((const WCHAR*)lparam1); break; case F_TMPWRAPNOWRAP: HandleCommand( F_TEXTWRAPMETHOD, bRedraw, WRAP_NO_TEXT_WRAP, 0, 0, 0 );break; // 折り返さない(一時設定) // 2008.05.30 nasukoji case F_TMPWRAPSETTING: HandleCommand( F_TEXTWRAPMETHOD, bRedraw, WRAP_SETTING_WIDTH, 0, 0, 0 );break; // 指定桁で折り返す(一時設定) // 2008.05.30 nasukoji case F_TMPWRAPWINDOW: HandleCommand( F_TEXTWRAPMETHOD, bRedraw, WRAP_WINDOW_WIDTH, 0, 0, 0 );break; // 右端で折り返す(一時設定) // 2008.05.30 nasukoji case F_TEXTWRAPMETHOD: Command_TEXTWRAPMETHOD( (int)lparam1 );break; // テキストの折り返し方法 // 2008.05.30 nasukoji case F_SELECT_COUNT_MODE: Command_SELECT_COUNT_MODE( (int)lparam1 );break; // 文字カウントの方法 // 2009.07.06 syat /* マクロ系 */ case F_RECKEYMACRO: Command_RECKEYMACRO();break; /* キーマクロの記録開始/終了 */ case F_SAVEKEYMACRO: Command_SAVEKEYMACRO();break; /* キーマクロの保存 */ case F_LOADKEYMACRO: Command_LOADKEYMACRO();break; /* キーマクロの読み込み */ case F_EXECKEYMACRO: /* キーマクロの実行 */ /* 再帰処理対策 */ m_pCommanderView->SetUndoBuffer( true ); Command_EXECKEYMACRO(); return bRet; case F_EXECEXTMACRO: /* 再帰処理対策 */ m_pCommanderView->SetUndoBuffer( true ); /* 名前を指定してマクロ実行 */ Command_EXECEXTMACRO( (const WCHAR*)lparam1, (const WCHAR*)lparam2 ); return bRet; // From Here Sept. 20, 2000 JEPRO 名称CMMANDをCOMMANDに変更 // case F_EXECCMMAND: Command_EXECCMMAND();break; /* 外部コマンド実行 */ case F_EXECMD_DIALOG: //Command_EXECCOMMAND_DIALOG((const char*)lparam1); /* 外部コマンド実行 */ Command_EXECCOMMAND_DIALOG(); /* 外部コマンド実行 */ // 引数つかってないみたいなので break; // To Here Sept. 20, 2000 case F_EXECMD: //Command_EXECCOMMAND((const char*)lparam1); Command_EXECCOMMAND((LPCWSTR)lparam1, (int)lparam2, (LPCWSTR)lparam3); // 2006.12.03 maru 引数の拡張のため break; /* カスタムメニュー */ case F_MENU_RBUTTON: /* 右クリックメニュー */ /* 再帰処理対策 */ m_pCommanderView->SetUndoBuffer( true ); Command_MENU_RBUTTON(); return bRet; case F_CUSTMENU_1: /* カスタムメニュー1 */ case F_CUSTMENU_2: /* カスタムメニュー2 */ case F_CUSTMENU_3: /* カスタムメニュー3 */ case F_CUSTMENU_4: /* カスタムメニュー4 */ case F_CUSTMENU_5: /* カスタムメニュー5 */ case F_CUSTMENU_6: /* カスタムメニュー6 */ case F_CUSTMENU_7: /* カスタムメニュー7 */ case F_CUSTMENU_8: /* カスタムメニュー8 */ case F_CUSTMENU_9: /* カスタムメニュー9 */ case F_CUSTMENU_10: /* カスタムメニュー10 */ case F_CUSTMENU_11: /* カスタムメニュー11 */ case F_CUSTMENU_12: /* カスタムメニュー12 */ case F_CUSTMENU_13: /* カスタムメニュー13 */ case F_CUSTMENU_14: /* カスタムメニュー14 */ case F_CUSTMENU_15: /* カスタムメニュー15 */ case F_CUSTMENU_16: /* カスタムメニュー16 */ case F_CUSTMENU_17: /* カスタムメニュー17 */ case F_CUSTMENU_18: /* カスタムメニュー18 */ case F_CUSTMENU_19: /* カスタムメニュー19 */ case F_CUSTMENU_20: /* カスタムメニュー20 */ case F_CUSTMENU_21: /* カスタムメニュー21 */ case F_CUSTMENU_22: /* カスタムメニュー22 */ case F_CUSTMENU_23: /* カスタムメニュー23 */ case F_CUSTMENU_24: /* カスタムメニュー24 */ /* 再帰処理対策 */ m_pCommanderView->SetUndoBuffer( true ); nFuncID = Command_CUSTMENU( nCommand - F_CUSTMENU_1 + 1 ); if( 0 != nFuncID ){ /* コマンドコードによる処理振り分け */ // HandleCommand( nFuncID, true, 0, 0, 0, 0 ); ::PostMessageCmd( GetMainWindow(), WM_COMMAND, MAKELONG( nFuncID, 0 ), (LPARAM)NULL ); } return bRet; /* ウィンドウ系 */ case F_SPLIT_V: Command_SPLIT_V();break; /* 上下に分割 */ //Sept. 17, 2000 jepro 説明の「縦」を「上下に」に変更 case F_SPLIT_H: Command_SPLIT_H();break; /* 左右に分割 */ //Sept. 17, 2000 jepro 説明の「横」を「左右に」に変更 case F_SPLIT_VH: Command_SPLIT_VH();break; /* 縦横に分割 */ //Sept. 17, 2000 jepro 説明に「に」を追加 case F_WINCLOSE: Command_WINCLOSE();break; //ウィンドウを閉じる case F_WIN_CLOSEALL: /* すべてのウィンドウを閉じる */ //Oct. 7, 2000 jepro 「編集ウィンドウの全終了」を左記のように変更 //Oct. 17, 2000 JEPRO 名前を変更(F_FILECLOSEALL→F_WIN_CLOSEALL) Command_FILECLOSEALL(); break; case F_BIND_WINDOW: Command_BIND_WINDOW();break; //結合して表示 2004.07.14 Kazika 新規追加 case F_CASCADE: Command_CASCADE();break; //重ねて表示 case F_TILE_V: Command_TILE_V();break; //上下に並べて表示 case F_TILE_H: Command_TILE_H();break; //左右に並べて表示 case F_MAXIMIZE_V: Command_MAXIMIZE_V();break; //縦方向に最大化 case F_MAXIMIZE_H: Command_MAXIMIZE_H();break; //横方向に最大化 //2001.02.10 by MIK case F_MINIMIZE_ALL: Command_MINIMIZE_ALL();break; /* すべて最小化 */ // Sept. 17, 2000 jepro 説明の「全て」を「すべて」に統一 case F_REDRAW: Command_REDRAW();break; /* 再描画 */ case F_WIN_OUTPUT: Command_WIN_OUTPUT();break; //アウトプットウィンドウ表示 case F_TRACEOUT: Command_TRACEOUT((const wchar_t*)lparam1, (int)lparam2, (int)lparam3);break; //マクロ用アウトプットウィンドウに表示 maru 2006.04.26 case F_TOPMOST: Command_WINTOPMOST( lparam1 );break; //常に手前に表示 Moca case F_WINLIST: Command_WINLIST( nCommandFrom );break; /* ウィンドウ一覧ポップアップ表示処理 */ // 2006.03.23 fon // 2006.05.19 genta 引数追加 case F_GROUPCLOSE: Command_GROUPCLOSE();break; /* グループを閉じる */ // 2007.06.20 ryoji 追加 case F_NEXTGROUP: Command_NEXTGROUP();break; /* 次のグループ */ // 2007.06.20 ryoji 追加 case F_PREVGROUP: Command_PREVGROUP();break; /* 前のグループ */ // 2007.06.20 ryoji 追加 case F_TAB_MOVERIGHT: Command_TAB_MOVERIGHT();break; /* タブを右に移動 */ // 2007.06.20 ryoji 追加 case F_TAB_MOVELEFT: Command_TAB_MOVELEFT();break; /* タブを左に移動 */ // 2007.06.20 ryoji 追加 case F_TAB_SEPARATE: Command_TAB_SEPARATE();break; /* 新規グループ */ // 2007.06.20 ryoji 追加 case F_TAB_JOINTNEXT: Command_TAB_JOINTNEXT();break; /* 次のグループに移動 */ // 2007.06.20 ryoji 追加 case F_TAB_JOINTPREV: Command_TAB_JOINTPREV();break; /* 前のグループに移動 */ // 2007.06.20 ryoji 追加 case F_TAB_CLOSEOTHER: Command_TAB_CLOSEOTHER();break; /* このタブ以外を閉じる */ // 2008.11.22 syat 追加 case F_TAB_CLOSELEFT: Command_TAB_CLOSELEFT();break; /* 左をすべて閉じる */ // 2008.11.22 syat 追加 case F_TAB_CLOSERIGHT: Command_TAB_CLOSERIGHT();break; /* 右をすべて閉じる */ // 2008.11.22 syat 追加 /* 支援 */ case F_HOKAN: Command_HOKAN();break; //入力補完 case F_HELP_CONTENTS: Command_HELP_CONTENTS();break; /* ヘルプ目次 */ //Nov. 25, 2000 JEPRO 追加 case F_HELP_SEARCH: Command_HELP_SEARCH();break; /* ヘルプトキーワード検索 */ //Nov. 25, 2000 JEPRO 追加 case F_TOGGLE_KEY_SEARCH: Command_ToggleKeySearch((int)lparam1);break; /* キャレット位置の単語を辞書検索する機能ON-OFF */ // 2006.03.24 fon case F_MENU_ALLFUNC: /* コマンド一覧 */ /* 再帰処理対策 */ m_pCommanderView->SetUndoBuffer( true ); Command_MENU_ALLFUNC();return bRet; case F_EXTHELP1: Command_EXTHELP1();break; /* 外部ヘルプ1 */ case F_EXTHTMLHELP: /* 外部HTMLヘルプ */ // Jul. 5, 2002 genta Command_EXTHTMLHELP( (const WCHAR*)lparam1, (const WCHAR*)lparam2 ); break; case F_ABOUT: Command_ABOUT();break; /* バージョン情報 */ //Dec. 24, 2000 JEPRO 追加 /* その他 */ case F_0: break; // F_0でプラグインが実行されるバグ対策 // ← rev1886 の問題は呼び元で対策したが安全弁として残す default: //プラグインコマンドを実行する { m_pCommanderView->SetUndoBuffer( true ); // 2013.05.01 追加。再帰対応 CPlug::Array plugs; CJackManager::getInstance()->GetUsablePlug( PP_COMMAND, nCommand, &plugs ); if( plugs.size() > 0 ){ assert_warning( 1 == plugs.size() ); //インタフェースオブジェクト準備 CWSHIfObj::List params; //プラグイン呼び出し ( *plugs.begin() )->Invoke( m_pCommanderView, params ); return bRet; } } } /* アンドゥバッファの処理 */ m_pCommanderView->SetUndoBuffer( true ); return bRet; }
/*! DIFF差分情報を解析しマーク登録 @param pszDiffInfo [in] 新ファイル名 @param nFlgFile12 [in] 編集中ファイルは... 0 ファイル1(旧ファイル) 1 ファイル2(新ファイル) @author MIK @date 2002/05/25 */ void CEditView::AnalyzeDiffInfo( const char* pszDiffInfo, int nFlgFile12 ) { /* * 99a99 旧ファイル99行の次行に新ファイル99行が追加された。 * 99a99,99 旧ファイル99行の次行に新ファイル99~99行が追加された。 * 99c99 旧ファイル99行が新ファイル99行に変更された。 * 99,99c99,99 旧ファイル99~99行が新ファイル99~99行に変更された。 * 99d99 旧ファイル99行が新ファイル99行の次行から削除された。 * 99,99d99 旧ファイル99~99行が新ファイル99行の次行から削除された。 * s1,e1 mode s2,e2 * 先頭の場合0の次行となることもある */ const char *q; int s1, e1, s2, e2; char mode; //前半ファイルの開始行 s1 = 0; for( q = pszDiffInfo; *q; q++ ) { if( *q == ',' ) break; if( *q == 'a' || *q == 'c' || *q == 'd' ) break; //行番号を抽出 if( *q >= '0' && *q <= '9' ) s1 = s1 * 10 + (*q - '0'); else return; } if( ! *q ) return; //前半ファイルの終了行 if( *q != ',' ) { //開始・終了行番号は同じ e1 = s1; } else { e1 = 0; for( q++; *q; q++ ) { if( *q == 'a' || *q == 'c' || *q == 'd' ) break; //行番号を抽出 if( *q >= '0' && *q <= '9' ) e1 = e1 * 10 + (*q - '0'); else return; } } if( ! *q ) return; //DIFFモードを取得 mode = *q; //後半ファイルの開始行 s2 = 0; for( q++; *q; q++ ) { if( *q == ',' ) break; //行番号を抽出 if( *q >= '0' && *q <= '9' ) s2 = s2 * 10 + (*q - '0'); else return; } //後半ファイルの終了行 if( *q != ',' ) { //開始・終了行番号は同じ e2 = s2; } else { e2 = 0; for( q++; *q; q++ ) { //行番号を抽出 if( *q >= '0' && *q <= '9' ) e2 = e2 * 10 + (*q - '0'); else return; } } //行末に達してなければエラー if( *q ) return; //抽出したDIFF情報から行番号に差分マークを付ける if( 0 == nFlgFile12 ) //編集中ファイルは旧ファイル { if ( mode == 'a' ) CDiffLineMgr(&m_pcEditDoc->m_cDocLineMgr).SetDiffMarkRange( MARK_DIFF_DELETE, CLogicInt(s1 ), CLogicInt(e1 ) ); else if( mode == 'c' ) CDiffLineMgr(&m_pcEditDoc->m_cDocLineMgr).SetDiffMarkRange( MARK_DIFF_CHANGE, CLogicInt(s1 - 1), CLogicInt(e1 - 1) ); else if( mode == 'd' ) CDiffLineMgr(&m_pcEditDoc->m_cDocLineMgr).SetDiffMarkRange( MARK_DIFF_APPEND, CLogicInt(s1 - 1), CLogicInt(e1 - 1) ); } else //編集中ファイルは新ファイル { if ( mode == 'a' ) CDiffLineMgr(&m_pcEditDoc->m_cDocLineMgr).SetDiffMarkRange( MARK_DIFF_APPEND, CLogicInt(s2 - 1), CLogicInt(e2 - 1) ); else if( mode == 'c' ) CDiffLineMgr(&m_pcEditDoc->m_cDocLineMgr).SetDiffMarkRange( MARK_DIFF_CHANGE, CLogicInt(s2 - 1), CLogicInt(e2 - 1) ); else if( mode == 'd' ) CDiffLineMgr(&m_pcEditDoc->m_cDocLineMgr).SetDiffMarkRange( MARK_DIFF_DELETE, CLogicInt(s2 ), CLogicInt(e2 ) ); } return; }
/* 指定行ヘジャンプ */ void CViewCommander::Command_JUMP( void ) { const wchar_t* pLine; int nMode; int bValidLine; int nCurrentLine; int nCommentBegin = 0; if( 0 == GetDocument()->m_cLayoutMgr.GetLineCount() ){ ErrorBeep(); return; } /* 行番号 */ int nLineNum; //$$ 単位混在 nLineNum = GetEditWindow()->m_cDlgJump.m_nLineNum; if( !GetEditWindow()->m_cDlgJump.m_bPLSQL ){ /* PL/SQLソースの有効行か */ /* 行番号の表示 false=折り返し単位/true=改行単位 */ if( GetDllShareData().m_bLineNumIsCRLF_ForJump ){ if( CLogicInt(0) >= nLineNum ){ nLineNum = CLogicInt(1); } /* カーソル位置変換 ロジック位置(行頭からのバイト数、折り返し無し行位置) → レイアウト位置(行頭からの表示桁位置、折り返しあり行位置) */ CLayoutPoint ptPosXY; GetDocument()->m_cLayoutMgr.LogicToLayout( CLogicPoint(0, nLineNum - 1), &ptPosXY ); nLineNum = (Int)ptPosXY.y + 1; } else{ if( 0 >= nLineNum ){ nLineNum = 1; } if( nLineNum > GetDocument()->m_cLayoutMgr.GetLineCount() ){ nLineNum = (Int)GetDocument()->m_cLayoutMgr.GetLineCount(); } } // Sep. 8, 2000 genta m_pCommanderView->AddCurrentLineToHistory(); // 2006.07.09 genta 選択状態を解除しないように m_pCommanderView->MoveCursorSelecting( CLayoutPoint(0, nLineNum - 1), m_pCommanderView->GetSelectionInfo().m_bSelectingLock, _CARETMARGINRATE / 3 ); return; } if( 0 >= nLineNum ){ nLineNum = 1; } nMode = 0; nCurrentLine = GetEditWindow()->m_cDlgJump.m_nPLSQL_E2 - 1; int nLineCount; //$$ 単位混在 nLineCount = GetEditWindow()->m_cDlgJump.m_nPLSQL_E1 - 1; /* 行番号の表示 false=折り返し単位/true=改行単位 */ if( !m_pCommanderView->m_pTypeData->m_bLineNumIsCRLF ){ //レイアウト単位 /* カーソル位置変換 レイアウト位置(行頭からの表示桁位置、折り返しあり行位置) → 物理位置(行頭からのバイト数、折り返し無し行位置) */ CLogicPoint ptPosXY; GetDocument()->m_cLayoutMgr.LayoutToLogic( CLayoutPoint(0,nLineCount), &ptPosXY ); nLineCount = ptPosXY.y; } for( ; nLineCount < GetDocument()->m_cDocLineMgr.GetLineCount(); ++nLineCount ){ CLogicInt nLineLen; CLogicInt nBgn = CLogicInt(0); CLogicInt i; pLine = GetDocument()->m_cDocLineMgr.GetLine(CLogicInt(nLineCount))->GetDocLineStrWithEOL(&nLineLen); bValidLine = FALSE; for( i = CLogicInt(0); i < nLineLen; ++i ){ if( L' ' != pLine[i] && WCODE::TAB != pLine[i] ){ break; } } nBgn = i; for( i = nBgn; i < nLineLen; ++i ){ /* シングルクォーテーション文字列読み込み中 */ if( 20 == nMode ){ bValidLine = TRUE; if( L'\'' == pLine[i] ){ if( i > 0 && L'\\' == pLine[i - 1] ){ }else{ nMode = 0; continue; } }else{ } }else /* ダブルクォーテーション文字列読み込み中 */ if( 21 == nMode ){ bValidLine = TRUE; if( L'"' == pLine[i] ){ if( i > 0 && L'\\' == pLine[i - 1] ){ }else{ nMode = 0; continue; } }else{ } }else /* コメント読み込み中 */ if( 8 == nMode ){ if( i < nLineLen - 1 && L'*' == pLine[i] && L'/' == pLine[i + 1] ){ if( /*nCommentBegin != nLineCount &&*/ nCommentBegin != 0){ bValidLine = TRUE; } ++i; nMode = 0; continue; }else{ } }else /* ノーマルモード */ if( 0 == nMode ){ /* 空白やタブ記号等を飛ばす */ if( L'\t' == pLine[i] || L' ' == pLine[i] || WCODE::IsLineDelimiter( pLine[i], GetDllShareData().m_Common.m_sEdit.m_bEnableExtEol ) ){ continue; }else if( i < nLineLen - 1 && L'-' == pLine[i] && L'-' == pLine[i + 1] ){ bValidLine = TRUE; break; }else if( i < nLineLen - 1 && L'/' == pLine[i] && L'*' == pLine[i + 1] ){ ++i; nMode = 8; nCommentBegin = nLineCount; continue; }else if( L'\'' == pLine[i] ){ nMode = 20; continue; }else if( L'"' == pLine[i] ){ nMode = 21; continue; }else{ bValidLine = TRUE; } } } /* コメント読み込み中 */ if( 8 == nMode ){ if( nCommentBegin != 0){ bValidLine = TRUE; } /* コメントブロック内の改行だけの行 */ if( WCODE::IsLineDelimiter(pLine[nBgn], GetDllShareData().m_Common.m_sEdit.m_bEnableExtEol) ){ bValidLine = FALSE; } } if( bValidLine ){ ++nCurrentLine; if( nCurrentLine >= nLineNum ){ break; } } } /* カーソル位置変換 物理位置(行頭からのバイト数、折り返し無し行位置) → レイアウト位置(行頭からの表示桁位置、折り返しあり行位置) */ CLayoutPoint ptPos; GetDocument()->m_cLayoutMgr.LogicToLayout( CLogicPoint(0, nLineCount), &ptPos ); // Sep. 8, 2000 genta m_pCommanderView->AddCurrentLineToHistory(); // 2006.07.09 genta 選択状態を解除しないように m_pCommanderView->MoveCursorSelecting( ptPos, m_pCommanderView->GetSelectionInfo().m_bSelectingLock, _CARETMARGINRATE / 3 ); }
/*! 現在の折り返し文字数に合わせて全データのレイアウト情報を再生成します @date 2004.04.03 Moca TABが使われると折り返し位置がずれるのを防ぐため, nPosXがインデントを含む幅を保持するように変更.m_nMaxLineKetasは 固定値となったが,既存コードの置き換えは避けて最初に値を代入するようにした. */ void CLayoutMgr::_DoLayout(bool bBlockingHook) { MY_RUNNINGTIMER( cRunningTimer, "CLayoutMgr::_DoLayout" ); /* 表示上のX位置 2004.03.28 Moca nPosXはインデント幅を含むように変更(TAB位置調整のため) */ int nAllLineNum; if( GetListenerCount() != 0 ){ NotifyProgress(0); /* 処理中のユーザー操作を可能にする */ if( bBlockingHook ){ if( !::BlockingHook( NULL ) )return; } } _Empty(); Init(); // Nov. 16, 2002 genta // 折り返し幅 <= TAB幅のとき無限ループするのを避けるため, // TABが折り返し幅以上の時はTAB=4としてしまう // 折り返し幅の最小値=10なのでこの値は問題ない if( GetTabSpace() >= GetMaxLineKetas() ){ m_nTabSpace = CKetaXInt(4); } nAllLineNum = m_pcDocLineMgr->GetLineCount(); SLayoutWork _sWork; SLayoutWork* pWork = &_sWork; pWork->pcDocLine = m_pcDocLineMgr->GetDocLineTop(); // 2002/2/10 aroka CDocLineMgr変更 pWork->pLayout = NULL; pWork->pcColorStrategy = NULL; pWork->colorPrev = COLORIDX_DEFAULT; pWork->nCurLine = CLogicInt(0); while( NULL != pWork->pcDocLine ){ pWork->cLineStr = pWork->pcDocLine->GetStringRefWithEOL(); pWork->eKinsokuType = KINSOKU_TYPE_NONE; //@@@ 2002.04.20 MIK pWork->nBgn = CLogicInt(0); pWork->nPos = CLogicInt(0); pWork->nWordBgn = CLogicInt(0); pWork->nWordLen = CLogicInt(0); pWork->nPosX = CLayoutInt(0); // 表示上のX位置 pWork->nIndent = CLayoutInt(0); // インデント幅 _MakeOneLine(pWork, &CLayoutMgr::_OnLine1); if( pWork->nPos - pWork->nBgn > 0 ){ // 2002/03/13 novice AddLineBottom( pWork->_CreateLayout(this) ); pWork->colorPrev = pWork->pcColorStrategy->GetStrategyColorSafe(); pWork->exInfoPrev.SetColorInfo(pWork->pcColorStrategy->GetStrategyColorInfoSafe()); } // 次の行へ pWork->nCurLine++; pWork->pcDocLine = pWork->pcDocLine->GetNextLine(); // 処理中のユーザー操作を可能にする if( GetListenerCount()!=0 && 0 < nAllLineNum && 0 == ( pWork->nCurLine % 1024 ) ){ NotifyProgress(::MulDiv( pWork->nCurLine, 100 , nAllLineNum ) ); if( bBlockingHook ){ if( !::BlockingHook( NULL ) )return; } } // 2002/03/13 novice } // 2011.12.31 Botの色分け情報は最後に設定 m_nLineTypeBot = pWork->pcColorStrategy->GetStrategyColorSafe(); m_cLayoutExInfoBot.SetColorInfo(pWork->pcColorStrategy->GetStrategyColorInfoSafe()); m_nPrevReferLine = CLayoutInt(0); m_pLayoutPrevRefer = NULL; if( GetListenerCount()!=0 ){ NotifyProgress(0); /* 処理中のユーザー操作を可能にする */ if( bBlockingHook ){ if( !::BlockingHook( NULL ) )return; } } }
/*! 指定レイアウト行に対応する論理行の次の論理行から指定論理行数だけ再レイアウトする @date 2002.10.07 YAZAKI rename from "DoLayout3_New" @date 2004.04.03 Moca TABが使われると折り返し位置がずれるのを防ぐため, pWork->nPosXがインデントを含む幅を保持するように変更.m_nMaxLineKetasは 固定値となったが,既存コードの置き換えは避けて最初に値を代入するようにした. @date 2009.08.28 nasukoji テキスト最大幅の算出に対応 @note 2004.04.03 Moca _DoLayoutとは違ってレイアウト情報がリスト中間に挿入されるため, 挿入後にm_nLineTypeBotへコメントモードを指定してはならない 代わりに最終行のコメントモードを終了間際に確認している. */ CLayoutInt CLayoutMgr::DoLayout_Range( CLayout* pLayoutPrev, CLogicInt nLineNum, CLogicPoint _ptDelLogicalFrom, EColorIndexType nCurrentLineType, CLayoutColorInfo* colorInfo, const CalTextWidthArg* pctwArg, CLayoutInt* _pnExtInsLineNum ) { *_pnExtInsLineNum = CLayoutInt(0); CLogicInt nLineNumWork = CLogicInt(0); // 2006.12.01 Moca 途中にまで再構築した場合にEOF位置がずれたまま // 更新されないので,範囲にかかわらず必ずリセットする. m_nEOFColumn = CLayoutInt(-1); m_nEOFLine = CLayoutInt(-1); SLayoutWork _sWork; SLayoutWork* pWork = &_sWork; pWork->pLayout = pLayoutPrev; pWork->pcColorStrategy = CColorStrategyPool::getInstance()->GetStrategyByColor(nCurrentLineType); pWork->colorPrev = nCurrentLineType; pWork->exInfoPrev.SetColorInfo(colorInfo); pWork->bNeedChangeCOMMENTMODE = false; if( NULL == pWork->pLayout ){ pWork->nCurLine = CLogicInt(0); }else{ pWork->nCurLine = pWork->pLayout->GetLogicLineNo() + CLogicInt(1); } pWork->pcDocLine = m_pcDocLineMgr->GetLine( pWork->nCurLine ); pWork->nModifyLayoutLinesNew = CLayoutInt(0); //引数 pWork->ptDelLogicalFrom = _ptDelLogicalFrom; pWork->pnExtInsLineNum = _pnExtInsLineNum; if(pWork->pcColorStrategy){ pWork->pcColorStrategy->InitStrategyStatus(); pWork->pcColorStrategy->SetStrategyColorInfo(colorInfo); } while( NULL != pWork->pcDocLine ){ pWork->cLineStr = pWork->pcDocLine->GetStringRefWithEOL(); pWork->eKinsokuType = KINSOKU_TYPE_NONE; //@@@ 2002.04.20 MIK pWork->nBgn = CLogicInt(0); pWork->nPos = CLogicInt(0); pWork->nWordBgn = CLogicInt(0); pWork->nWordLen = CLogicInt(0); pWork->nPosX = CLayoutInt(0); // 表示上のX位置 pWork->nIndent = CLayoutInt(0); // インデント幅 _MakeOneLine(pWork, &CLayoutMgr::_OnLine2); if( pWork->nPos - pWork->nBgn > 0 ){ // 2002/03/13 novice //@@@ 2002.09.23 YAZAKI 最適化 _OnLine2(pWork); } nLineNumWork++; pWork->nCurLine++; /* 目的の行数(nLineNum)に達したか、または通り過ぎた(=行数が増えた)か確認 */ //@@@ 2002.09.23 YAZAKI 最適化 if( nLineNumWork >= nLineNum ){ if( pWork->pLayout && pWork->pLayout->GetNextLayout() ){ if( pWork->colorPrev != pWork->pLayout->GetNextLayout()->GetColorTypePrev() ){ // COMMENTMODEが異なる行が増えましたので、次の行→次の行と更新していきます。 pWork->bNeedChangeCOMMENTMODE = true; }else if( pWork->exInfoPrev.GetColorInfo() && pWork->pLayout->GetNextLayout()->GetColorInfo() && !pWork->exInfoPrev.GetColorInfo()->IsEqual(pWork->pLayout->GetNextLayout()->GetColorInfo()) ){ pWork->bNeedChangeCOMMENTMODE = true; }else if( pWork->exInfoPrev.GetColorInfo() && NULL == pWork->pLayout->GetNextLayout()->GetColorInfo() ){ pWork->bNeedChangeCOMMENTMODE = true; }else if( NULL == pWork->exInfoPrev.GetColorInfo() && pWork->pLayout->GetNextLayout()->GetColorInfo() ){ pWork->bNeedChangeCOMMENTMODE = true; }else{ break; } }else{ break; // while( NULL != pWork->pcDocLine ) 終了 } } pWork->pcDocLine = pWork->pcDocLine->GetNextLine(); // 2002/03/13 novice } // 2004.03.28 Moca EOFだけの論理行の直前の行の色分けが確認・更新された if( pWork->nCurLine == m_pcDocLineMgr->GetLineCount() ){ m_nLineTypeBot = pWork->pcColorStrategy->GetStrategyColorSafe(); m_cLayoutExInfoBot.SetColorInfo(pWork->pcColorStrategy->GetStrategyColorInfoSafe()); } // 2009.08.28 nasukoji テキストが編集されたら最大幅を算出する CalculateTextWidth_Range(pctwArg); // 1999.12.22 レイアウト情報がなくなる訳ではないので // m_nPrevReferLine = 0; // m_pLayoutPrevRefer = NULL; // m_pLayoutCurrent = NULL; return pWork->nModifyLayoutLinesNew; }
/* 指定ファイルの指定位置にタグジャンプする。 @author MIK @date 2003.04.13 新規作成 @date 2003.04.21 genta bClose追加 @date 2004.05.29 Moca 0以下が指定されたときは、善処する @date 2007.02.17 genta 相対パスの基準ディレクトリ指示を追加 */ bool CEditView::TagJumpSub( const TCHAR* pszFileName, CMyPoint ptJumpTo, //!< ジャンプ位置(1開始) bool bClose, //!< [in] true: 元ウィンドウを閉じる / false: 元ウィンドウを閉じない bool bRelFromIni, bool* pbJumpToSelf //!< [out] オプションNULL可。自分にジャンプしたか ) { HWND hwndOwner; POINT poCaret; // 2004/06/21 novice タグジャンプ機能追加 TagJump tagJump; if( pbJumpToSelf ){ *pbJumpToSelf = false; } // 参照元ウィンドウ保存 tagJump.hwndReferer = CEditWnd::getInstance()->GetHwnd(); // Feb. 17, 2007 genta 実行ファイルからの相対指定の場合は // 予め絶対パスに変換する.(キーワードヘルプジャンプで用いる) // 2007.05.19 ryoji 相対パスは設定ファイルからのパスを優先 TCHAR szJumpToFile[1024]; if( bRelFromIni && _IS_REL_PATH( pszFileName ) ){ GetInidirOrExedir( szJumpToFile, pszFileName ); } else { _tcscpy( szJumpToFile, pszFileName ); } /* ロングファイル名を取得する */ TCHAR szWork[1024]; if( FALSE != ::GetLongFileName( szJumpToFile, szWork ) ) { _tcscpy( szJumpToFile, szWork ); } // 2004/06/21 novice タグジャンプ機能追加 // 2004/07/05 みちばな // 同一ファイルだとSendMesssageで GetCaret().GetCaretLayoutPos().GetX2(),GetCaret().GetCaretLayoutPos().GetY2()が更新されてしまい、 // ジャンプ先の場所がジャンプ元として保存されてしまっているので、 // その前で保存するように変更。 /* カーソル位置変換 */ GetDocument()->m_cLayoutMgr.LayoutToLogic( GetCaret().GetCaretLayoutPos(), &tagJump.point ); // タグジャンプ情報の保存 CTagJumpManager().PushTagJump(&tagJump); /* 指定ファイルが開かれているか調べる */ /* 開かれている場合は開いているウィンドウのハンドルも返す */ /* ファイルを開いているか */ if( CShareData::getInstance()->IsPathOpened( szJumpToFile, &hwndOwner ) ) { // 2004.05.13 Moca マイナス値は無効 if( 0 < ptJumpTo.y ){ /* カーソルを移動させる */ poCaret.y = ptJumpTo.y - 1; if( 0 < ptJumpTo.x ){ poCaret.x = ptJumpTo.x - 1; }else{ poCaret.x = 0; } GetDllShareData().m_sWorkBuffer.m_LogicPoint.Set(CLogicInt(poCaret.x), CLogicInt(poCaret.y)); ::SendMessageAny( hwndOwner, MYWM_SETCARETPOS, 0, 0 ); } /* アクティブにする */ ActivateFrameWindow( hwndOwner ); if( tagJump.hwndReferer == hwndOwner ){ if( pbJumpToSelf ){ *pbJumpToSelf = true; } } } else{ /* 新しく開く */ EditInfo inf; bool bSuccess; _tcscpy( inf.m_szPath, szJumpToFile ); inf.m_ptCursor.Set(CLogicInt(ptJumpTo.x - 1), CLogicInt(ptJumpTo.y - 1)); inf.m_nViewLeftCol = CLayoutInt(-1); inf.m_nViewTopLine = CLayoutInt(-1); inf.m_nCharCode = CODE_AUTODETECT; bSuccess = CControlTray::OpenNewEditor2( G_AppInstance(), this->GetHwnd(), &inf, false, /* ビューモードか */ true // 同期モードで開く ); if( ! bSuccess ) // ファイルが開けなかった return false; // Apr. 23, 2001 genta // hwndOwnerに値が入らなくなってしまったために // Tag Jump Backが動作しなくなっていたのを修正 if( !CShareData::getInstance()->IsPathOpened( szJumpToFile, &hwndOwner ) ) return false; } // 2006.12.30 ryoji 閉じる処理は最後に(処理位置移動) // Apr. 2003 genta 閉じるかどうかは引数による // grep結果からEnterでジャンプするところにCtrl判定移動 if( bClose ) { GetCommander().Command_WINCLOSE(); // 挑戦するだけ。 } return true; }
/* 文字列置換 */ void CLayoutMgr::ReplaceData_CLayoutMgr( LayoutReplaceArg* pArg ) { CLayoutInt nWork_nLines = m_nLines; //変更前の全行数の保存 @@@ 2002.04.19 MIK /* 置換先頭位置のレイアウト情報 */ EColorIndexType nCurrentLineType = COLORIDX_DEFAULT; CLayoutColorInfo* colorInfo = NULL; CLayoutInt nLineWork = pArg->sDelRange.GetFrom().GetY2(); CLayout* pLayoutWork = SearchLineByLayoutY( pArg->sDelRange.GetFrom().GetY2() ); if( pLayoutWork ){ while( 0 != pLayoutWork->GetLogicOffset() ){ pLayoutWork = pLayoutWork->GetPrevLayout(); nLineWork--; } nCurrentLineType = pLayoutWork->GetColorTypePrev(); colorInfo = pLayoutWork->GetLayoutExInfo()->DetachColorInfo(); }else if( GetLineCount() == pArg->sDelRange.GetFrom().GetY2() ){ // 2012.01.05 最終行のRedo/Undoでの色分けが正しくないのを修正 nCurrentLineType = m_nLineTypeBot; colorInfo = m_cLayoutExInfoBot.DetachColorInfo(); } /* || カーソル位置変換 || レイアウト位置(行頭からの表示桁位置、折り返しあり行位置) → || 物理位置(行頭からのバイト数、折り返し無し行位置) */ CLogicPoint ptFrom; CLogicPoint ptTo; LayoutToLogic( pArg->sDelRange.GetFrom(), &ptFrom ); LayoutToLogic( pArg->sDelRange.GetTo(), &ptTo ); /* 指定範囲のデータを置換(削除 & データを挿入) Fromを含む位置からToの直前を含むデータを削除する Fromの位置へテキストを挿入する */ DocLineReplaceArg DLRArg; DLRArg.sDelRange.SetFrom(ptFrom); //削除範囲from DLRArg.sDelRange.SetTo(ptTo); //削除範囲to DLRArg.pcmemDeleted = pArg->pcmemDeleted; // 削除されたデータを保存 DLRArg.pInsData = pArg->pInsData; // 挿入するデータ DLRArg.nDelSeq = pArg->nDelSeq; CSearchAgent(m_pcDocLineMgr).ReplaceData( &DLRArg ); pArg->nInsSeq = DLRArg.nInsSeq; /*--- 変更された行のレイアウト情報を再生成 ---*/ /* 論理行の指定範囲に該当するレイアウト情報を削除して */ /* 削除した範囲の直前のレイアウト情報のポインタを返す */ CLayoutInt nModifyLayoutLinesOld = CLayoutInt(0); CLayout* pLayoutPrev; CLogicInt nWork; nWork = t_max( DLRArg.nDeletedLineNum, DLRArg.nInsLineNum ); if( pLayoutWork ){ pLayoutPrev = DeleteLayoutAsLogical( pLayoutWork, nLineWork, ptFrom.GetY2(), ptFrom.GetY2() + nWork, ptFrom, &nModifyLayoutLinesOld ); /* 指定行より後の行のレイアウト情報について、論理行番号を指定行数だけシフトする */ /* 論理行が削除された場合は0より小さい行数 */ /* 論理行が挿入された場合は0より大きい行数 */ if( 0 != DLRArg.nInsLineNum - DLRArg.nDeletedLineNum ){ ShiftLogicalLineNum( pLayoutPrev, DLRArg.nInsLineNum - DLRArg.nDeletedLineNum ); } }else{ pLayoutPrev = m_pLayoutBot; } /* 指定レイアウト行に対応する論理行の次の論理行から指定論理行数だけ再レイアウトする */ CLogicInt nRowNum; if( NULL == pLayoutPrev ){ if( NULL == m_pLayoutTop ){ nRowNum = m_pcDocLineMgr->GetLineCount(); }else{ nRowNum = m_pLayoutTop->GetLogicLineNo(); } } else{ if( NULL == pLayoutPrev->GetNextLayout() ){ nRowNum = m_pcDocLineMgr->GetLineCount() - pLayoutPrev->GetLogicLineNo() - CLogicInt(1); }else{ nRowNum = pLayoutPrev->m_pNext->GetLogicLineNo() - pLayoutPrev->GetLogicLineNo() - CLogicInt(1); } } // 2009.08.28 nasukoji テキスト最大幅算出用の引数を設定 CalTextWidthArg ctwArg; ctwArg.ptLayout = pArg->sDelRange.GetFrom(); // 編集開始位置 ctwArg.nDelLines = pArg->sDelRange.GetTo().GetY2() - pArg->sDelRange.GetFrom().GetY2(); // 削除行数 - 1 ctwArg.nAllLinesOld = nWork_nLines; // 編集前のテキスト行数 ctwArg.bInsData = (pArg->pInsData && pArg->pInsData->size()) ? TRUE : FALSE; // 追加文字列の有無 /* 指定レイアウト行に対応する論理行の次の論理行から指定論理行数だけ再レイアウトする */ CLayoutInt nAddInsLineNum; pArg->nModLineTo = DoLayout_Range( pLayoutPrev, nRowNum, ptFrom, nCurrentLineType, colorInfo, &ctwArg, &nAddInsLineNum ); pArg->nAddLineNum = m_nLines - nWork_nLines; //変更後の全行数との差分 @@@ 2002.04.19 MIK if( 0 == pArg->nAddLineNum ) pArg->nAddLineNum = nModifyLayoutLinesOld - pArg->nModLineTo; /* 再描画ヒント レイアウト行の増減 */ pArg->nModLineFrom = pArg->sDelRange.GetFrom().GetY2(); /* 再描画ヒント 変更されたレイアウト行From */ pArg->nModLineTo += ( pArg->nModLineFrom - CLayoutInt(1) ) ; /* 再描画ヒント 変更されたレイアウト行To */ //2007.10.18 kobake LayoutReplaceArg::ptLayoutNewはここで算出するのが正しい LogicToLayout(DLRArg.ptNewPos, &pArg->ptLayoutNew); // 挿入された部分の次の位置 }
/* カーソル直前の単語を取得 単語の長さを返します 単語区切り */ int CViewParser::GetLeftWord( CNativeW* pcmemWord, int nMaxWordLen ) const { const wchar_t* pLine; CLogicInt nLineLen; CLogicInt nIdx; CLogicInt nIdxTo; CNativeW cmemWord; CLayoutInt nCurLine; int nCharChars; const CLayout* pcLayout; nCurLine = m_pEditView->GetCaret().GetCaretLayoutPos().GetY2(); pLine = m_pEditView->m_pcEditDoc->m_cLayoutMgr.GetLineStr( nCurLine, &nLineLen, &pcLayout ); if( NULL == pLine ){ // return 0; nIdxTo = CLogicInt(0); }else{ /* 指定された桁に対応する行のデータ内の位置を調べる Ver1 */ nIdxTo = m_pEditView->LineColumnToIndex( pcLayout, m_pEditView->GetCaret().GetCaretLayoutPos().GetX2() ); } if( 0 == nIdxTo || NULL == pLine ){ if( nCurLine <= 0 ){ return 0; } nCurLine--; pLine = m_pEditView->m_pcEditDoc->m_cLayoutMgr.GetLineStr( nCurLine, &nLineLen ); if( NULL == pLine ){ return 0; } bool bExtEol = GetDllShareData().m_Common.m_sEdit.m_bEnableExtEol; if( WCODE::IsLineDelimiter(pLine[nLineLen - 1], bExtEol) ){ return 0; } nCharChars = &pLine[nLineLen] - CNativeW::GetCharPrev( pLine, nLineLen, &pLine[nLineLen] ); if( 0 == nCharChars ){ return 0; } nIdxTo = nLineLen; nIdx = nIdxTo - CLogicInt(nCharChars); } else{ nCharChars = &pLine[nIdxTo] - CNativeW::GetCharPrev( pLine, nLineLen, &pLine[nIdxTo] ); if( 0 == nCharChars ){ return 0; } nIdx = nIdxTo - CLogicInt(nCharChars); } if( 1 == nCharChars ){ if( WCODE::IsWordDelimiter(pLine[nIdx]) ){ return 0; } } /* 現在位置の単語の範囲を調べる */ CLayoutRange sRange; bool bResult = m_pEditView->m_pcEditDoc->m_cLayoutMgr.WhereCurrentWord( nCurLine, nIdx, &sRange, &cmemWord, pcmemWord ); if( bResult ){ pcmemWord->AppendString( &pLine[nIdx], nCharChars ); return pcmemWord->GetStringLength(); }else{ return 0; } }