/** * CFootyView::AdjustVisibleLine * @brief 見える位置をキャレット位置から調整する処理 * @return 位置が変更されたときtrue */ bool CFootyView::AdjustVisibleLine(){ const LinePt pLine = m_pDocuments->GetCaretPosition()->GetLinePointer(); CEthicLine *pFirstVisible = m_pDocuments->GetFirstVisible(m_nViewID); // 倫理行オフセット位置を取得する size_t nFirstOffset = pFirstVisible->GetLinePointer()->GetOffset() + pFirstVisible->GetEthicNum(); CFootyLine::EthicInfo stEthicInfo = m_pDocuments->GetCaretPosition()->GetLinePointer()->CalcEthicLine (m_pDocuments->GetCaretPosition()->GetPosition(),m_pDocuments->GetLapelColumn(), m_pDocuments->GetTabLen(),m_pDocuments->GetLapelMode()); size_t nEthicOffset = pLine->GetOffset() + stEthicInfo.m_nEthicLine; //現在の位置の中に入っていないとき、調整 if (nEthicOffset < nFirstOffset){ // 現在位置より前に存在する pFirstVisible->MoveEthicBack (nFirstOffset - nEthicOffset + m_nVisibleLines / 2); return true; } if (nFirstOffset + m_nVisibleLines <= nEthicOffset){ // 現在位置より後ろに存在する pFirstVisible->MoveEthicNext(m_pDocuments->GetLineList(), nEthicOffset - nFirstOffset - m_nVisibleLines / 2); return true; } return false; }
/** * @brief 強調表示を確定します。 */ void CFootyDoc::FlushEmphasis() { for (LinePt pLine = m_lsLines.begin();pLine != m_lsLines.end();pLine++) { pLine->SetEmphasisChached(false); } }
/** * @brief 現在のキャレット位置の一行上に空行を挿入します。 * @param bIndentMode [in] オートインデント処理を行うかどうか */ CFootyDoc::RedrawType CFootyDoc::InsertReturnUp( bool bIndentMode ) { if ( IsReadOnly() ) return REDRAW_FAILED; // 選択状態の解除 m_nSelectType = SELECT_NONE; // 状況によって処理を分ける if (m_cCaretPos.GetLineNum() == 0) { // 一番上の行の時は、その位置の先頭で改行したことにする m_cCaretPos.SetPosition(m_cCaretPos.GetLinePointer(),0); InsertReturn( bIndentMode ); m_cCaretPos.SetPosition(m_lsLines.begin(),0); } else { // それ以外の時は、その位置の一つ上で改行したことにする LinePt pLine = m_cCaretPos.GetLinePointer(); pLine--; m_cCaretPos.SetPosition(pLine,pLine->GetLineLength()); InsertReturn( bIndentMode ); } return REDRAW_ALL; }
/** * CFootyDoc::ReturnLine * @brief InsertStringのサブルーチンで、改行処理を行います。 */ void CFootyDoc::ReturnLine(LinePt *pNowLine,const wchar_t **pString,const wchar_t *pWork, size_t nPos,std::wstring *pRestStr,int n,bool bFirst) { // 宣言 LinePt pLine = *pNowLine; CFootyLine cInsertLine; // データ挿入 if (!bFirst) // 最初でないときはコピーする pLine->m_strLineData = std::wstring(*pString,(size_t)(pWork - *pString)); else // 最初の位置の時はバックアップ { if (nPos == pLine->GetLineLength()) { *pRestStr = L""; } else { *pRestStr = pLine->m_strLineData.substr(nPos); pLine->m_strLineData.erase(nPos,pLine->GetLineLength()-nPos); } pLine->m_strLineData += std::wstring(*pString,(size_t)(pWork - *pString)); } //次の行を生成する pLine++; m_lsLines.insert(pLine,cInsertLine); // ポインタ操作 *pString = pWork + n; (*pNowLine)++; }
/** * CFootyDoc::InsertChar * @brief ワイド文字一つを挿入します * @param wChar 挿入する文字 * @return 描画範囲 */ CFootyDoc::RedrawType CFootyDoc::InsertChar(wchar_t wChar) { // 宣言 LinePt pLine; size_t nPos; CUndoBuffer cUndo; CEditPosition cEditPosition = m_cCaretPos; RedrawType nRetRedraw = REDRAW_LINE; if ( IsReadOnly() ) return REDRAW_FAILED; // 選択文字列を削除、アンドゥ情報を格納 if ( IsSelecting() ) { DeleteSelected(&cUndo); cUndo.m_nUndoType = CUndoBuffer::UNDOTYPE_REPLACE; nRetRedraw = REDRAW_ALL; } else if (m_bInsertMode || m_cCaretPos.GetPosition() == m_cCaretPos.GetLinePointer()->GetLineLength()) { cUndo.m_nUndoType = CUndoBuffer::UNDOTYPE_INSERT; } else { // 上書きされるときは、アンドゥ情報を書き換える必要がある cUndo.m_cBeforeStart = cEditPosition; cEditPosition.MoveColumnForward(&m_lsLines,1); cUndo.m_cBeforeEnd = cEditPosition; cUndo.m_strBefore += m_cCaretPos.GetLinePointer()->GetLineData() [m_cCaretPos.GetPosition()]; cUndo.m_nUndoType = CUndoBuffer::UNDOTYPE_REPLACE; } cUndo.m_strAfter += wChar; // 文字を入れる pLine = m_cCaretPos.GetLinePointer(); nPos = m_cCaretPos.GetPosition(); if (m_bInsertMode || nPos == pLine->GetLineLength()) pLine->m_strLineData.insert(nPos,1,wChar); else pLine->m_strLineData[nPos] = wChar; // 倫理行何行になるかチェック size_t nBeforeEthic = pLine->GetEthicLine(); if (SetLineInfo(pLine, false/*改行を含むか by Tetr@pod*/)) nRetRedraw = REDRAW_ALL; if (nBeforeEthic != pLine->GetEthicLine()) nRetRedraw = REDRAW_ALL; // 桁を増加させる cUndo.m_cAfterStart = m_cCaretPos; m_cCaretPos.MoveColumnForward(&m_lsLines,1); cUndo.m_cAfterEnd = m_cCaretPos; // アンドゥ情報を挿入 PushBackUndo(&cUndo); SendMoveCaretCallBack(); return nRetRedraw; }
/** * @brief キャレット位置を単語すっ飛ばして前に */ void CFootyDoc::MoveWordForward() { LinePt pLine = m_cCaretPos.GetLinePointer(); size_t nPos = m_cCaretPos.GetPosition(); if (m_cCaretPos.GetPosition() != pLine->GetLineLength()) { CFootyLine::WordInfo wiWord = pLine->GetWordInfo(nPos,false); m_cCaretPos.MoveColumnForward(&m_lsLines,wiWord.m_nEndPos - nPos); } else m_cCaretPos.MoveColumnForward(&m_lsLines,1); SendMoveCaretCallBack(); }
/** * @brief キャレット位置を単語すっ飛ばして後に */ void CFootyDoc::MoveWordBack() { LinePt pLine = m_cCaretPos.GetLinePointer(); size_t nPos = m_cCaretPos.GetPosition(); if (m_cCaretPos.GetPosition() != 0) { CFootyLine::WordInfo wiWord = pLine->GetWordInfo(nPos); m_cCaretPos.MoveColumnBackward(&m_lsLines,nPos - wiWord.m_nBeginPos); } else m_cCaretPos.MoveColumnBackward(&m_lsLines,1); SendMoveCaretCallBack(); }
/** * @brief 行の内容が変更されたとき、その情報を収集していく処理です。 * @param pBegin 変更領域最初の行 * @param pEnd 変更領域の最後の行 * @return 全ての再描画を要求するときtrue */ bool CFootyDoc::SetLineInfo(LinePt pBegin, LinePt pEnd, bool ForceListUpdate/*改行を含むか by Tetr@pod*/) { LinePt pLine; bool bAllRedraw = false; bool bPrevLineInfoChanged = false; bool bEmphasisChanged = false; // 変更された領域は常に見ておく for (pLine = pBegin; ;pLine++) { // それがすでに文書の最後の行のときは関数を終了 if (pLine == m_lsLines.end()) { return bAllRedraw; } // 現在の行を調査する bPrevLineInfoChanged = pLine->FlushString(m_nGlobalID/*by Tetr@pod*/, m_nTabLen,m_nLapelColumns,m_nLapelMode, &bAllRedraw/*by Tetr@pod*/, ForceListUpdate/*改行を含むか by Tetr@pod*/); if (pLine == m_lsLines.begin()) bEmphasisChanged = pLine->SearchEmphasis(NULL,&m_lsEmphasisWord); else { LinePt pPrevLine = pLine; pPrevLine--; bEmphasisChanged = pLine->SearchEmphasis(pPrevLine->GetBetweenNext(),&m_lsEmphasisWord); bPrevLineInfoChanged = pLine->SetPrevLineInfo(pPrevLine); } bAllRedraw = bAllRedraw/*by Tetr@pod*/ || bEmphasisChanged || bPrevLineInfoChanged; // 常に見る領域を抜けるかどうかの判定 if (pLine == pEnd)break; } // ループさせて最後まで取っていく for (pLine++ ; pLine != m_lsLines.end(); pLine++) { if (pLine != m_lsLines.end()) { // 前の情報を入れておく if (bPrevLineInfoChanged && pLine != m_lsLines.begin()) { LinePt pPrevLine = pLine; pPrevLine--; bPrevLineInfoChanged = pLine->SetPrevLineInfo(pPrevLine); bAllRedraw = bAllRedraw || bPrevLineInfoChanged; } } // 強調が変わったときは全てフラグをおろしておく if (bEmphasisChanged) pLine->SetEmphasisChached(false); } return bAllRedraw; }
/** * @brief 行番号表示領域をクリックされたと仮定してy座標から位置を割り出すルーチンです。 */ bool CFootyView::CalcLineCount(int y,CEditPosition *pStart,CEditPosition *pEnd) { // 宣言 size_t nPosition; size_t nLineFromTop; CEthicLine cMouseLine; LinePt pLine; // 適合範囲外 if (!pStart || !pEnd)return false; // 行位置の計算 cMouseLine = *m_pDocuments->GetFirstVisible(m_nViewID); if (y < m_nRulerHeight) { nLineFromTop = (size_t) (m_nRulerHeight - y) / (m_pFonts->GetHeight() + m_nHeightMargin); if (!cMouseLine.MoveEthicBack(nLineFromTop)) return false; } else { nLineFromTop = (size_t) (y - m_nRulerHeight) / (m_pFonts->GetHeight() + m_nHeightMargin); cMouseLine.MoveEthicNext(m_pDocuments->GetLineList(),nLineFromTop); } pLine = cMouseLine.GetLinePointer(); // 開始位置割り出し nPosition = pLine->CalcRealPosition (cMouseLine.GetEthicNum(),0, m_pDocuments->GetLapelColumn(), m_pDocuments->GetTabLen(), m_pDocuments->GetLapelMode()); pStart->SetPosition(pLine,nPosition); // 終了位置割り出し nPosition = pLine->CalcRealPosition (cMouseLine.GetEthicNum() + 1,0, m_pDocuments->GetLapelColumn(), m_pDocuments->GetTabLen(), m_pDocuments->GetLapelMode()); //if (nPosition == pLine->GetLineLength()) //{ // if (cMouseLine.MoveRealNext(m_pDocuments->GetLineList(),1)) // nPosition = 0; //} pEnd->SetPosition(cMouseLine.GetLinePointer(),nPosition); return true; }
/** * @brief 折り返し設定 * @param nColumn 桁数 * @param nMode 折り返しモード */ void CFootyDoc::SetLapel(size_t nColumn,int nMode) { // 状態を設定する m_nLapelColumns = nColumn; m_nLapelMode = nMode; // ループさせて収集 LinePt pLine = m_lsLines.begin(); LinePt pPrevLine = m_lsLines.begin(); pLine->FlushString(m_nGlobalID, m_nTabLen,m_nLapelColumns,m_nLapelMode, NULL, false/*改行を含むか by Tetr@pod*/); for (pLine++;pLine != m_lsLines.end();pLine++,pPrevLine++) { pLine->FlushString(m_nGlobalID, m_nTabLen,m_nLapelColumns,m_nLapelMode, NULL, false/*改行を含むか by Tetr@pod*/); pLine->SetPrevLineInfo(pPrevLine); } }
/** * @brief エディタ上におけるポジションを割り出す関数です。 * @param x [in] マウスのx座標 * @param y [in] マウスのy座標 * @return 範囲を超えているときはfalseが返りますが、xがエディタ内にありかつ * yが最終行を超えているときはfalseを返しつつポジションも割り出されます。 */ bool CFootyView::CalcInfoFromMouse(int x,int y,CEditPosition *pPos) { FOOTY2_ASSERT( pPos ); // 宣言 size_t nEthicColumn = 0; size_t nPosition; size_t nLineFromTop; CEthicLine cMouseLine; // 適合範囲外 if (x < m_nLineCountWidth) return false; if (y < m_nRulerHeight) return false; // 計算する nLineFromTop = (size_t) (y - m_nRulerHeight) / (m_pFonts->GetHeight() + m_nHeightMargin); nEthicColumn = (size_t)m_nFirstVisibleColumn + (x - m_nLineCountWidth + (m_pFonts->GetWidth() + m_nWidthMargin) / 2) / (m_pFonts->GetWidth() + m_nWidthMargin); // そこからポジションの割り出し cMouseLine = *m_pDocuments->GetFirstVisible(m_nViewID); if (cMouseLine.MoveEthicNext(m_pDocuments->GetLineList(),nLineFromTop)) { nPosition = cMouseLine.GetLinePointer()->CalcRealPosition (cMouseLine.GetEthicNum(),nEthicColumn, m_pDocuments->GetLapelColumn(), m_pDocuments->GetTabLen(), m_pDocuments->GetLapelMode()); pPos->SetPosition(cMouseLine.GetLinePointer(),nPosition); return true; } else // 最終行超えてる { LinePt pLast = m_pDocuments->GetLastLine(); nPosition = pLast->CalcRealPosition (pLast->GetEthicLine() - 1,nEthicColumn, m_pDocuments->GetLapelColumn(), m_pDocuments->GetTabLen(), m_pDocuments->GetLapelMode()); pPos->SetPosition(pLast,nPosition); return false; } }
/*------------------------------------------------------------------- CFootyView::AdjustVisiblePos 見える位置をキャレット位置から調整する処理 <戻り値>位置が変更されたときtrue -------------------------------------------------------------------*/ bool CFootyView::AdjustVisiblePos(){ /*宣言*/ CFootyLine::EthicInfo stEthicInfo; const LinePt pLine = m_pDocuments->GetCaretPosition()->GetLinePointer(); const size_t nPosition = m_pDocuments->GetCaretPosition()->GetPosition(); /*倫理桁情報を取得する*/ stEthicInfo = pLine->CalcEthicLine (nPosition,m_pDocuments->GetLapelColumn(), m_pDocuments->GetTabLen(),m_pDocuments->GetLapelMode()); /*移動する必要がある*/ if ((size_t)m_nFirstVisibleColumn + m_nVisibleColumns < stEthicInfo.m_nEthicColumn || stEthicInfo.m_nEthicColumn < (size_t)m_nFirstVisibleColumn){ if (stEthicInfo.m_nEthicColumn > m_nVisibleColumns / 2) m_nFirstVisibleColumn = (int)(stEthicInfo.m_nEthicColumn - m_nVisibleColumns / 2); else m_nFirstVisibleColumn = 0; return true; } return false; }
/** * @brief 一行だけ削除する処理です。 * @param pLine 削除する行 */ void CFootyDoc::DeleteLine(LinePt pLine) { if ( IsReadOnly() ) return; for (int i=0;i<4;i++) { if (m_cFirstVisibleLine[i].GetLineNum() == pLine->GetRealLineNum()){ m_cFirstVisibleLine[i].MoveRealBack(1); } } m_lsLines.erase(pLine); }
/** * @brief 指定された間の行を一気に削除する処理 * @param pStart 開始行(これも削除される) * @param pEnd 終了行(これは削除されない) */ void CFootyDoc::DeleteLine(LinePt pStart,LinePt pEnd) { if ( IsReadOnly() ) return; // 削除するデータの行番号を取得する size_t nRealStart = pStart->GetRealLineNum(); LinePt pDelEnd = pEnd; pDelEnd--; size_t nRealEnd = pDelEnd->GetRealLineNum(); // 最初に表示されている行と被っていたら調整してやる for (int i=0;i<4;i++) { if (nRealStart <= m_cFirstVisibleLine[i].GetLineNum() && m_cFirstVisibleLine[i].GetLineNum() <= nRealEnd) { m_cFirstVisibleLine[i].SetPosition(pStart); m_cFirstVisibleLine[i].MoveRealBack(1); } } // 実際に削除する処理 m_lsLines.erase(pStart,pEnd); }
/** * @brief 指定した行以降のオフセット値と実際の行番号を設定するルーチン * @param pBegin 設定するための開始位置 * @return 全ての再描画を要求するときtrue * @note pBeginは文字列が変更されているのでURLとメールアドレスを再検索。 * 以降の行は強調表示文字列を全て検索します。 */ bool CFootyDoc::SetLineInfo(LinePt pBegin, bool ForceListUpdate/*改行を含むか by Tetr@pod*/) { bool bAllRedraw = false; bool bPrevLineInfoChanged = false; bool bEmphasisChanged = false; // 最初の行だけを確定させる bPrevLineInfoChanged = pBegin->FlushString(m_nGlobalID/*by Tetr@pod*/, m_nTabLen,m_nLapelColumns,m_nLapelMode, &bAllRedraw/*by Tetr@pod*/, ForceListUpdate/*改行を含むか by Tetr@pod*/); if (pBegin == m_lsLines.begin()) bEmphasisChanged = pBegin->SearchEmphasis(NULL,&m_lsEmphasisWord); else { LinePt pPrevLine = pBegin; pPrevLine--; bEmphasisChanged = pBegin->SearchEmphasis(pPrevLine->GetBetweenNext(),&m_lsEmphasisWord); } bAllRedraw = bAllRedraw/*by Tetr@pod*/ || bEmphasisChanged || bPrevLineInfoChanged; // ループさせて収集(pBeginの次の行から最後までループ) pBegin++; for (LinePt pLine = pBegin; pLine != m_lsLines.end(); pLine++) { // 前の情報を入れておく if (bPrevLineInfoChanged && pLine != m_lsLines.begin()) { LinePt pPrevLine = pLine; pPrevLine--; bPrevLineInfoChanged = pLine->SetPrevLineInfo(pPrevLine); bAllRedraw = bAllRedraw || bPrevLineInfoChanged; } // 強調が変わったときは全てフラグをおろしておく if (bEmphasisChanged) pLine->SetEmphasisChached(false); } return bAllRedraw; }
/** * CFootyDoc::OnBackSpace * @brief BackSpaceキーが押されたときの処理を行います。 * @return どのように再描画するのか * @note 適切な位置へキャレットが移動します。 */ CFootyDoc::RedrawType CFootyDoc::OnBackSpace() { // 宣言 LinePt pLine = m_cCaretPos.GetLinePointer(); size_t nPos = m_cCaretPos.GetPosition(); CUndoBuffer cUndo; RedrawType nType; if ( IsReadOnly() ) return REDRAW_FAILED; // 場合分け if (IsSelecting()) { nType = DeleteSelected(&cUndo); PushBackUndo(&cUndo); return nType; } else // 選択していないとき { if (nPos != 0) // 文字を削除 { bool bIsSurrogatePair = CFootyLine::IsSurrogateTail(pLine->GetLineData()[nPos-1]); RedrawType nNeedRedraw = REDRAW_LINE; // アンドゥ情報を代入する cUndo.m_nUndoType = CUndoBuffer::UNDOTYPE_DELETE; if (bIsSurrogatePair) cUndo.m_strBefore = pLine->m_strLineData.substr(nPos-2,2); else cUndo.m_strBefore = pLine->m_strLineData.substr(nPos-1,1); cUndo.m_cBeforeEnd = m_cCaretPos; // 文字列を削除する if (bIsSurrogatePair) pLine->m_strLineData.erase(nPos-2,2); else pLine->m_strLineData.erase(nPos-1,1); size_t nBeforeEthic = pLine->GetEthicLine(); if (SetLineInfo(pLine, false/*改行を含むか by Tetr@pod*/)) nNeedRedraw = REDRAW_ALL; if (nBeforeEthic != pLine->GetEthicLine()) nNeedRedraw = REDRAW_ALL; // ポジションを移動して if (bIsSurrogatePair) m_cCaretPos.MoveColumnBackward(&m_lsLines,2); else m_cCaretPos.MoveColumnBackward(&m_lsLines,1); // アンドゥ情報を格納する cUndo.m_cBeforeStart = m_cCaretPos; PushBackUndo(&cUndo); SendMoveCaretCallBack(); return nNeedRedraw; } else // 改行を削除 { if (pLine != m_lsLines.begin()) { // 次の行ポインタ取得 LinePt pPrevLine = pLine; pPrevLine--; // アンドゥ情報を代入しつつキャレット位置を移動する cUndo.m_nUndoType = CUndoBuffer::UNDOTYPE_DELETE; cUndo.m_strBefore = L"\r\n"; cUndo.m_cBeforeEnd = m_cCaretPos; m_cCaretPos.MoveColumnBackward(&m_lsLines,1); cUndo.m_cBeforeStart = m_cCaretPos; PushBackUndo(&cUndo); // 行の結合 pPrevLine->m_strLineData += pLine->GetLineData(); // 現在の位置を削除する DeleteLine(pLine); // 情報を更新する LinePt pNextLine = pPrevLine; pNextLine++; SetLineInfo(pPrevLine,pNextLine, false); SendMoveCaretCallBack(); return REDRAW_ALL; } else return REDRAW_NONE; } } }
/** * CFootyView::CaretMove * @brief キャレットの位置とIMEポジションの位置を設定する */ void CFootyView::CaretMove(){ /*宣言*/ const LinePt pLine = m_pDocuments->GetCaretPosition()->GetLinePointer(); const size_t nPosition = m_pDocuments->GetCaretPosition()->GetPosition(); CEthicLine cFirstVisible = *m_pDocuments->GetFirstVisible(m_nViewID); CFootyLine::EthicInfo stEthicInfo; int nCaretX,nCaretY; /*キャレット位置を計算する*/ int nOffset = (int)pLine->GetOffset(); stEthicInfo = pLine->CalcEthicLine (nPosition,m_pDocuments->GetLapelColumn(), m_pDocuments->GetTabLen(),m_pDocuments->GetLapelMode()); nCaretX = GetTextPosX((int)stEthicInfo.m_nEthicColumn); nCaretY = m_nRulerHeight + (int)(nOffset - cFirstVisible.GetLinePointer()->GetOffset() - cFirstVisible.GetEthicNum() + stEthicInfo.m_nEthicLine) * (m_pFonts->GetHeight() + m_nHeightMargin); /*キャレットの太さを決定する*/ if (!m_pDocuments->IsInsertMode()){ if (nPosition == pLine->GetLineLength()) m_nCaretWidth = 2; else{ stEthicInfo = pLine->CalcEthicLine (nPosition + 1,m_pDocuments->GetLapelColumn(), m_pDocuments->GetTabLen(),m_pDocuments->GetLapelMode()); m_nCaretWidth = GetTextPosX((int)stEthicInfo.m_nEthicColumn) - nCaretX; } } else m_nCaretWidth = 2; /*キャレットを再構築*/ if (m_bIsFocused){ m_cCaret.ReCreate(m_nCaretWidth,m_pFonts->GetHeight()); m_cCaret.Move(nCaretX,nCaretY); } int nHeightScroll = GetSystemMetrics(SM_CYHSCROLL); int nWidthScroll = GetSystemMetrics(SM_CXVSCROLL); if (nCaretX < m_nLineCountWidth || m_nWidth - nWidthScroll < nCaretX || nCaretY < m_nRulerHeight || m_nHeight - nHeightScroll < nCaretY){ nCaretX = 0; nCaretY = 0; m_cCaret.Hide(); } else{ if (m_bIsFocused)m_cCaret.Show(); } // IMEを設定する if (m_bIsFocused) { LOGFONT lFont; COMPOSITIONFORM cf; HIMC hImc=ImmGetContext(m_hWnd); if (hImc) { // フォントを設定する GetObject(m_pFonts->GetKanjiFont(),sizeof(LOGFONT),&lFont); ImmSetCompositionFont(hImc,&lFont); // IME表示領域を設定する cf.dwStyle = CFS_POINT; cf.ptCurrentPos.x = (long)nCaretX; cf.ptCurrentPos.y = (long)nCaretY; cf.rcArea.left = cf.ptCurrentPos.x; cf.rcArea.top = cf.ptCurrentPos.y; cf.rcArea.right = m_nWidth; cf.rcArea.bottom = m_nHeight; ImmSetCompositionWindow(hImc, &cf); // ハンドルの解放 ImmReleaseContext(m_hWnd,hImc); } } }
bool CFootyDoc::FlushString2(LinePt pLine)// by Tetr@pod { return pLine->FlushString(m_nGlobalID/*by Tetr@pod*/, m_nTabLen,m_nLapelColumns,m_nLapelMode, NULL/*by Tetr@pod*/, false/*改行を含むか by Tetr@pod*/); }
/** * @brief 強調表示のキャッシュを作成する処理 * @param pLine キャッシュ計算を開始する位置 */ void CFootyDoc::SetChacheCommand(LinePt pLine) { // 表示位置を更新する //SYSTEMTIME st; if (pLine == m_lsLines.begin()) { pLine->SearchEmphasis(NULL,&m_lsEmphasisWord); //GetLocalTime(&st); //FOOTY2_PRINTF( L"SearchEmphasis! %d年%d月%d日%d時%d分%d秒%dms\n", st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond, st.wMilliseconds); } else { // キャッシュされている行を取得する(現在行からさかのぼって検索・マイナス方向) LinePt pStartLine; for (pStartLine = pLine;pStartLine != m_lsLines.begin();pStartLine--) { if (pStartLine->EmphasisChached()){ //GetLocalTime(&st); //FOOTY2_PRINTF( L"キャッシュされている行がみつかった! %d年%d月%d日%d時%d分%d秒%dms\n", st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond, st.wMilliseconds); break; } //GetLocalTime(&st); //FOOTY2_PRINTF( L"キャッシュ行検索ナウ! %d行 : %d年%d月%d日%d時%d分%d秒%dms\n", pStartLine, st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond, st.wMilliseconds); } // 一行もキャッシュされていないとき if (pStartLine == m_lsLines.begin() && !pStartLine->EmphasisChached()) { pStartLine->SearchEmphasis(NULL,&m_lsEmphasisWord); //GetLocalTime(&st); //FOOTY2_PRINTF( L"一行もキャッシュされていない %d年%d月%d日%d時%d分%d秒%dms\n", st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond, st.wMilliseconds); } //FOOTY2_PRINTF( L"キャッシュ開始行??? %d\n",pStartLine->GetRealLineNum()); /* LinePt pNowLine; LinePt pPrevLine; int i = 0; for (pNowLine = pLine, i = 0;pNowLine != m_lsLines.begin();pNowLine--,pPrevLine--,i++) { if (i == 30)break; pNowLine->SearchEmphasis(pPrevLine->GetBetweenNext(),&m_lsEmphasisWord); } */ // 高速描画が有効な場合 by inovia if (f_SpeedDraw != 0){ // キャッシュされている行を取得する(現在行からさかのぼって検索・マイナス方向) int i = 0; for (pStartLine = pLine;pStartLine != m_lsLines.begin();pStartLine--) { if (i == 30)break; if (pStartLine->EmphasisChached()){ break; } i++; } } // 開始行から基準点までキャッシュする LinePt pPrevLine = pStartLine;//pStartLine; LinePt pNowLine = pStartLine;//pStartLine; for (pNowLine++;;pNowLine++,pPrevLine++) { // FOOTY2_PRINTF( L"キャッシュカレント行 追加中 %d\n",pNowLine->GetRealLineNum()); //GetLocalTime(&st); //FOOTY2_PRINTF( L"キャッシュ追加ナウ! %d行%d行%d行 : %d年%d月%d日%d時%d分%d秒%dms\n", pPrevLine,pPrevLine,pLine, st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond, st.wMilliseconds); pNowLine->SearchEmphasis(pPrevLine->GetBetweenNext(),&m_lsEmphasisWord); if (pNowLine == pLine)break; } } }