Ejemplo n.º 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;
}
Ejemplo n.º 2
0
int CEthicLine::GetDifference(CEthicLine &lnEthic,LsLines *pLines){
	int nRetValue;
	CEthicLine lnWork = *this;
	if (lnWork <= lnEthic){
		for (nRetValue=0;lnWork != lnEthic;nRetValue++){
			lnWork.MoveEthicNext(pLines,1);
		}
	}
	else{
		for (nRetValue=0;lnWork != lnEthic;nRetValue--){
			lnWork.MoveEthicBack(1);
		}
	}
	return nRetValue;
}
Ejemplo n.º 3
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;
	}
}
Ejemplo n.º 4
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;
}
Ejemplo n.º 5
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);
		}
	}
}