/*-----------------------------------------------------------------------------
[名称]	ShitarabianViewROI.cpp
[概要]	Viewクラス（ROI選択時）の実装
[備考]	なし
[履歴]	2003-02-25	NC		コメント付加(moralog)
-----------------------------------------------------------------------------*/


//-----------------------------------------------------------------------------
// インクルード
//-----------------------------------------------------------------------------
#include "stdafx.h"
#include "Common.h"
#include "Shitarabian.h"
#include "ShitarabianDoc.h"
#include "ShitarabianView.h"
#include "imm.h"
#include "EditDrawer.h"
#include "CommandManager.h"
#include "CommandInput.h"
#include "CommandCaret.h"
#include "CommandDelete.h"
#include "GeneralSetting.h"
#include <process.h>
#include "Selection.h"
#include "ROISelection.h"
#include "CommandMultiEdit.h"
#include "Padding.h"
#include "TokenReader.h"


//-----------------------------------------------------------------------------
// ファイル内関数
//-----------------------------------------------------------------------------

/*-----------------------------------------------------------------------------
[名称]	描画オブジェクト取得
[機能]	描画オブジェクト取得処理。
[戻値]	CEditDrawer*	描画オブジェクト [-] (-)
[備考]	なし
-----------------------------------------------------------------------------*/
static CEditDrawer*	GetDrawer()
{
	return( CEditDrawer::GetInstance() );
}


//-----------------------------------------------------------------------------
// クラスメンバ関数
//-----------------------------------------------------------------------------

/*-----------------------------------------------------------------------------
[名称]	イベントハンドラ
[機能]	主にマウスイベント処理。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
BOOL CShitarabianView::PreTranslateROIMode(
	MSG*	pMsg,				// I  :メッセージ [-] (-)
	BOOL	bShift,				// I  :シフト状態 [-] (TRUE:押下、FALSE:なし)
	BOOL	bCtrl,				// I  :Ctrl状態 [-] (TRUE:押下、FALSE:なし)
	BOOL	bAlt				// I  :Alt状態 [-] (TRUE:押下、FALSE:なし)
) 
{
	// warning C4100:警告の無視
	bAlt; bCtrl; bShift;

	CEditDrawer*	pDrawer = GetDrawer();
	CShitarabianDoc* pDoc = GetDocument();

	CFloatingSelection*	pSelection;
	pSelection = pDoc->GetFloatingSelection();

	BOOL	bBreak = FALSE;
	BOOL	bRedraw = FALSE;

	switch( pMsg->message )
	{
	case WM_LBUTTONUP:
		ReleaseCapture();
		m_bDrag = FALSE;
		bBreak = TRUE;
		break;

	case WM_MOUSEMOVE:
		DrawStatusBar();
		if ( m_bDrag )
		{
			POINTS	pt = MAKEPOINTS( pMsg->lParam );
			CPoint posCursor( pt.x, pt.y );
			posCursor = ScrollBoxToPixel( posCursor );

			CRect	rcOldROI = pDoc->GetROISelection()->GetROI();
			CRect	rcNewROI = pDoc->GetROISelection()->GetROI();

			rcNewROI.right = posCursor.x;
			rcNewROI.bottom = posCursor.y;
			pDoc->GetROISelection()->SetROI( rcNewROI );

			rcOldROI.NormalizeRect();
			rcNewROI.NormalizeRect();
			pDoc->SetUpdateStartRow( min( pDrawer->PixelToCaretRow( rcOldROI.top, pDoc ), pDrawer->PixelToCaretRow( rcNewROI.bottom, pDoc ) ) );
			pDoc->SetUpdateEndRow( max( pDrawer->PixelToCaretRow( rcOldROI.bottom, pDoc ), pDrawer->PixelToCaretRow( rcNewROI.bottom, pDoc ) ) );

			// オートスクロール
			{
				// ScrollToCaret() でカタをつけるためにキャレットを移動させる
				// 該当行計算
				int idxRow = pDrawer->PixelToCaretRow( posCursor.y, pDoc );
				idxRow = min( idxRow, pDoc->GetLineCount()-1 );

				CString*	pstrCurrentLine = pDoc->GetLine( idxRow );
				if ( pstrCurrentLine != NULL )
				{
					int	idxColumn = 0;
					CEmphasisLine*	pEmphasisLine = pDoc->GetEmphasisLine( idxRow );
					if ( pEmphasisLine != NULL )
					{
						idxColumn = pEmphasisLine->PixelToCaretColumn( posCursor.x );
					}

					// キャレットの移動
					CCommandCaret	cmdCaret;
					cmdCaret.SetAttribute( 0x00, idxRow, idxColumn );
					cmdCaret.Execute( pDoc );

					ScrollToCaret();
				}
			}

			bRedraw = TRUE;
			bBreak = TRUE;
		}
		break;

	case WM_LBUTTONDOWN:
		{
			m_bDrag = TRUE;
			SetCapture( );

			// ピクセル座標を得る
			POINTS	pt = MAKEPOINTS( pMsg->lParam );
			CPoint posCursor( pt.x, pt.y );
			posCursor = ScrollBoxToPixel( posCursor );

			CRect	rcOldROI = pDoc->GetROISelection()->GetROI();
			rcOldROI.NormalizeRect();
			CRect	rcROI;
			rcROI.left = posCursor.x;
			rcROI.top = posCursor.y;
			rcROI.right = posCursor.x;
			rcROI.bottom = posCursor.y;
			pDoc->GetROISelection()->SetROI( rcROI );
			pDoc->SetUpdateStartRow( min( pDrawer->PixelToCaretRow( rcOldROI.top, pDoc ), pDrawer->PixelToCaretRow( rcROI.top, pDoc ) ) );
			pDoc->SetUpdateEndRow( max( pDrawer->PixelToCaretRow( rcOldROI.bottom, pDoc ), pDrawer->PixelToCaretRow( rcROI.bottom, pDoc ) ) );
		}
		bRedraw = TRUE;
		bBreak = TRUE;
		break;

	default:
		break;
	}

	if ( bRedraw )
	{
		// 再描画
		pDoc->ReDraw();
	}

	return( bBreak );
}


/*-----------------------------------------------------------------------------
[名称]	キー押下ハンドラ
[機能]	押下されたキーに応じた処理。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
BOOL CShitarabianView::PreTranslateKeyDownROIMode(
	UCHAR	unKey,				// I  :キー [仮想キーコード] (-)
	BOOL	bShift,				// I  :シフト状態 [-] (TRUE:押下、FALSE:なし)
	BOOL	bCtrl,				// I  :Ctrl状態 [-] (TRUE:押下、FALSE:なし)
	BOOL	bAlt				// I  :Alt状態 [-] (TRUE:押下、FALSE:なし)
)
{
	// warning C4100:警告の無視
	bAlt; bCtrl; bShift;

	CShitarabianDoc*	pDoc = GetDocument();
	CFloatingSelection*	pSelection;
	pSelection = pDoc->GetFloatingSelection();

	BOOL	bBreak = FALSE;

	switch( unKey )
	{
	case VK_F4:
		// 選択状態の解除
		// モードの取り消し
		ToNormal();
		bBreak = TRUE;
		break;

	default:
		return( FALSE );
		break;
	}

	return( TRUE );
}


/*-----------------------------------------------------------------------------
[名称]	文字入力ハンドラ
[機能]	入力された文字に応じた処理。
[戻値]	なし
[備考]	VK_ESCAPE:	選択の解除、通常編集への移行
-----------------------------------------------------------------------------*/
BOOL CShitarabianView::PreTranslateCharROIMode(
	CString	strChar,			// I  :入力文字列　[-] (-)
	BOOL	bShift,				// I  :シフト状態 [-] (TRUE:押下、FALSE:なし)
	BOOL	bCtrl,				// I  :Ctrl状態 [-] (TRUE:押下、FALSE:なし)
	BOOL	bAlt				// I  :Alt状態 [-] (TRUE:押下、FALSE:なし)
)
{
	// warning C4100:警告の無視
	bAlt; bCtrl; bShift;

	CShitarabianDoc*	pDoc = GetDocument();
	CFloatingSelection*	pSelection;
	pSelection = pDoc->GetFloatingSelection();

	BOOL	bBreak = FALSE;

	if ( strChar == VK_ESCAPE )
	{
		// 選択状態の解除
		// モードの取り消し
		{
			ToNormal();
			bBreak = TRUE;
		}
	}
	else
	if ( strChar == VK_RETURN )
	{
		bBreak = TRUE;
	}
	else
	{
		return( FALSE );
	}

	{
		// 再描画
		pDoc->ReDraw();

		// ここでDrawCaret()すると描画が全くされない。
		// キャレットの描画はDrawPage()内でする。

		GetDocument()->SetMainView( this );
		return( TRUE );
	}
}

