Beispiel #1
0
/**
 * @brief ダブルクリックしたときに呼び出されます。
 */
void CFootyView::OnMouseDouble(int x,int y)
{
	// 宣言
	CEditPosition cNowPosition;
	CUrlInfo cUrlInfo;
	RetOnUrl nRetURL;
	std::wstring strShellCommand;

	// フォーカスを合わせる
	::SetFocus(m_hWnd);
	
	// 通常のエディタ領域
	if (y > m_nRulerHeight && x > m_nLineCountWidth)
	{
		// キャレット位置を移動する
		CalcInfoFromMouse(x,y,&cNowPosition);
		// クリッカブル?
		nRetURL = IsOnUrl(&cNowPosition,&cUrlInfo);
		if (nRetURL == ONURL_URL)				// URL
		{
			strShellCommand = cNowPosition.GetLinePointer()->
				m_strLineData.substr(cUrlInfo.m_nStartPos,cUrlInfo.GetLength());
			StartApplication(strShellCommand.c_str());
		}
		else if (nRetURL == ONURL_MAIL)			// メールアドレス
		{
			strShellCommand = L"mailto:";
			strShellCommand += cNowPosition.GetLinePointer()->
				m_strLineData.substr(cUrlInfo.m_nStartPos,cUrlInfo.GetLength());
			StartApplication(strShellCommand.c_str());
		}
		else									// 何もない(単語の選択処理)
		{
			m_pDocuments->SelectWord();
			Refresh();
		}
	}
}
Beispiel #2
0
/**
 * @brief 水平スクロールタイマーが実行されたときの処理
 */
void CFootyView::OnAutoHorizontalTimer()
{
	CEditPosition cNowPosition;
	int x = m_nNowMousePosX;
	int y = m_nNowMousePosY;
	if ( x < m_nLineCountWidth )	// 行番号表示領域より左
	{
		StartHorizontalScrollTimer((int)((x - m_nLineCountWidth) / PIXEL_PER_COLUMNSPEED) - 1);
		x = m_nLineCountWidth;
	}
	else if	( m_nWidth < x )		// 行番号表示領域より左
	{
		StartHorizontalScrollTimer((int)((x - m_nWidth) / PIXEL_PER_COLUMNSPEED) + 1);
		x = m_nWidth;
	}
	else
	{
		StopHorizontalScrollTimer();
	}
	
	// マウス位置におけるエディタ上の位置を算出します。ルーラー上だと計算できないので、最低でもルーラー上と仮定
	if (y < m_nRulerHeight) y = m_nRulerHeight;
	CalcInfoFromMouse( x, y, &cNowPosition );

	// 最初に見える桁数を調整します
	int nMax = max( 0, min
	(
		(int)m_pDocuments->GetLapelColumn(),
		(int)(cNowPosition.GetLinePointer()->GetLineLength() - m_nVisibleColumns / 2)
	));
	
	m_nFirstVisibleColumn += m_nAutoScrollNumHorizontal;
	if (m_nFirstVisibleColumn < 0)
	{
		m_nFirstVisibleColumn = 0;
	}
	if ( m_nFirstVisibleColumn > nMax )
	{
		m_nFirstVisibleColumn = nMax;
	}
	FOOTY2_PRINTF( L"OnAutoHorizontalTimer first visible column = %d", m_nFirstVisibleColumn );
	
	// 現在の位置をキャレットに
	m_pDocuments->SetSelectEndNormal(&cNowPosition);
	*m_pDocuments->GetCaretPosition() = cNowPosition;
	
	// 再描画
	Refresh();
}
Beispiel #3
0
/**
 * @brief マウスが動かされたときに呼び出されます。
 * @param x マウス座標x
 * @param y マウス座標y
 * @param bFromScrollTimer スクロールタイマーから呼ばれたらtrue、ウィンドウメッセージから呼ばれたらfalse
 */
void CFootyView::OnMouseMove(int x, int y, bool bFromScrollTimer)
{
	// 宣言
	CEditPosition cNowPosition;
	CEditPosition cSelStart,cSelEnd;
	
	// 現在のマウス位置を設定
	m_nNowMousePosX = x;
	m_nNowMousePosY = y;
	
	// ドラッグしている情報に応じて分岐
	switch(m_nDragMode)
	{
//ドラッグしていない
	case DRAGMODE_NONE:
		// マウスカーソルを変更する
		if (m_nRulerHeight < y)
		{
			if (m_nLineCountWidth < x)
			{
				if (CalcInfoFromMouse(x,y,&cNowPosition) &&
					IsOnUrl(&cNowPosition,NULL) != ONURL_NONE)
					CCursor::UseUrlCursor();	// URL上
				else CCursor::UseIBeam();		// Iビーム
			}
			else CCursor::UseLineCount();		// 行番号表示領域
		}
		else CCursor::UseArrow();
		break;

//行番号表示領域をドラッグ中
	case DRAGMODE_LINE:
		if (y < m_nRulerHeight)
		{
			StartVerticalScrollTimer( (int)((y - m_nRulerHeight) / PIXEL_PER_LINESPEED) - 1 );
		}
		else if (y > m_nHeight)
		{
			StartVerticalScrollTimer( (int)((y - m_nHeight) / PIXEL_PER_LINESPEED) + 1 );
		}
		else
		{
			StopVerticalScrollTimer();
		}
		
		if (CalcLineCount(y,&cSelStart,&cSelEnd))		// きちんと取得できたときのみ選択
		{
			if (cSelStart < *m_pDocuments->GetLineSelStartA())
			{
				m_pDocuments->SetSelectStart(&cSelStart);
				m_pDocuments->SetSelectEndNormal(m_pDocuments->GetLineSelStartB());
				*m_pDocuments->GetCaretPosition() = cSelStart;
			}
			else 
			{
				m_pDocuments->SetSelectStart(m_pDocuments->GetLineSelStartA());
				m_pDocuments->SetSelectEndNormal(&cSelEnd);
				*m_pDocuments->GetCaretPosition() = cSelEnd;
			}
		}
		m_pDocuments->SendMoveCaretCallBack();

		// 再描画処理
		Refresh();
		m_cCaret.Hide();
		break;

//マウスでエディタ上をドラッグ中
	case DRAGMODE_MOUSE:
		// 水平方向
		if ( x < m_nLineCountWidth )	// 行番号表示領域より左
		{
			StartHorizontalScrollTimer((int)((x - m_nLineCountWidth) / PIXEL_PER_COLUMNSPEED) - 1);
			x = m_nLineCountWidth;
		}
		else if	( m_nWidth < x )		// 行番号表示領域より左
		{
			StartHorizontalScrollTimer((int)((x - m_nWidth) / PIXEL_PER_COLUMNSPEED) + 1);
			x = m_nWidth;
		}
		else
		{
			StopHorizontalScrollTimer();
		}
		// 垂直方向
		if ( y < m_nRulerHeight )		// ルーラーより上
		{
			StartVerticalScrollTimer((int)((y - m_nRulerHeight) / PIXEL_PER_LINESPEED) - 1);
			y = m_nRulerHeight;
		}
		else if ( y > m_nHeight )		// 画面より下
		{
			StartVerticalScrollTimer((int)((y - m_nHeight) / PIXEL_PER_LINESPEED) + 1);
			y = m_nHeight;
		}
		else
		{
			StopVerticalScrollTimer();
		}
		
		CalcInfoFromMouse( x, y, &cNowPosition );
		
		// キャレット位置が移動したときに再描画する
		if (cNowPosition != *m_pDocuments->GetCaretPosition())
		{
			m_pDocuments->SetSelectEndNormal(&cNowPosition);
			
			// 現在の位置をキャレットに
			LinePt pRenderStart = m_pDocuments->GetCaretPosition()->GetLinePointer();
			*m_pDocuments->GetCaretPosition() = cNowPosition;

			// 再描画をかける
			if (bFromScrollTimer)
			{
				ScrollRefresh();
			}
			else
			{
				LineChangedRefresh(pRenderStart,cNowPosition.GetLinePointer());
			}

			// キャレットは非表示に
			m_cCaret.Hide();
			m_pDocuments->SendMoveCaretCallBack();
		}
		break;
	}
}