예제 #1
0
/**
 * 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;
}
예제 #2
0
/**
 * @brief 強調表示を確定します。
 */
void CFootyDoc::FlushEmphasis()
{
	for (LinePt pLine = m_lsLines.begin();pLine != m_lsLines.end();pLine++)
	{
		pLine->SetEmphasisChached(false);
	}
}
예제 #3
0
/**
 * @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;
}
예제 #4
0
/**
 * 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)++;
}
예제 #5
0
/**
 * 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;
}
예제 #6
0
/**
 * @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();
}
예제 #7
0
/**
 * @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();
}
예제 #8
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;
}
예제 #9
0
/**
 * @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;
}
예제 #10
0
/**
 * @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);
	}	
}
예제 #11
0
/**
 * @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;
	}
}
예제 #12
0
/*-------------------------------------------------------------------
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;
}
예제 #13
0
/**
 * @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);
}
예제 #14
0
/**
 * @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);
}
예제 #15
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;
}
예제 #16
0
/**
 * 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;
		}
	}
}
예제 #17
0
/**
 * 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);
		}
	}
}
예제 #18
0
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*/);
}
예제 #19
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;
		}

		
	}
}