/** * @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 指定した行以降のオフセット値と実際の行番号を設定するルーチン * @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; }
/** * @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; } } }