Esempio n. 1
0
/**
 * @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;
}
Esempio n. 2
0
/**
 * @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;
}
Esempio n. 3
0
/**
 * @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;
		}

		
	}
}