/*-----------------------------------------------------------------------------
[名称]	ShitarabianView.cpp
[概要]	ビュークラスの実装
[備考]	なし
[履歴]	2003-04-23	NC		コメント付加(moralog)
		2003-11-21	b031130 (3146)タグジャンプ 位置指定反映のスクロール(dincom)
		2003-11-26	b031130 (3145)ATOK16の手書き文字入力文字化け(moralog)
		2003-12-06	b031130 (3146)タグジャンプ機能起動時AccessViolation修正(moralog)
		2003-12-20	b031228 (3177)DCのマッピング廃止に伴う修正(moralog)
		2003-12-20	b031228 (3146)タグジャンプキー割り当て(moralog)
		2004-01-30	b031228 (3367)Grep検索(dincom)
		2004-05-10	b031228 (3751)文書名がショートファイルネームで表示される(moralog)
-----------------------------------------------------------------------------*/

//-----------------------------------------------------------------------------
// インクルード
//-----------------------------------------------------------------------------
#include "stdafx.h"
#include "Common.h"
#include "Shitarabian.h"
#include "MainFrm.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 "BoxSelection.h"
#include "FloatingSelection.h"
#include "CommandMultiEdit.h"
#include "Padding.h"
#include "TokenReader.h"
#include "ToolBarManager.h"
#include "ShitarabianPlugInManager.h"
#include "Unicoder.h"
// ▼ (3367) BGN 2004.1.30 (dincom)
#include "Grep.h"
// ▲ (3367) END

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


/*-----------------------------------------------------------------------------
[名称]	操作モード切替ハンドラ
[機能]	操作モード切替処理。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CShitarabianView::OnEditModeselect() 
{
	CShitarabianDoc*	pDoc = GetDocument();

	switch( pDoc->GetOperationMode() )
	{
	case OperationNormal:
		// BOX選択へ移行
		pDoc->SetOperationMode( OperationBoxSelect );
		break;

	case OperationFloating:
		// 定着する
		{
			CFloatingSelection*	pSelection;
			pSelection = pDoc->GetFloatingSelection();
			pSelection->Confirm();
		}
		// 通常編集へ移行
		pDoc->SetOperationMode( OperationNormal );
		break;

	case OperationBoxSelect:
	default:
		// 通常編集へ移行
		pDoc->SetOperationMode( OperationNormal );
		break;
	}

	// 選択範囲初期化
	CSelection*	pSelection;
	pSelection = pDoc->GetSelection();
	pSelection->SetSelectedNutral();

	// 再描画
	// キャレットのON/OFFをしたいので全描画
	OnSetFocus( NULL );
	pDoc->SetAllUpdate();
	pDoc->ReDraw();
}


/*-----------------------------------------------------------------------------
[名称]	キー押下ハンドラ
[機能]	操作モードに応じたキー押下処理への振り分け。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
BOOL CShitarabianView::OnKeyDown(
	UCHAR	unKey,				// I  :キー [仮想キーコード] (-) :-
	BOOL	bShift,				// I  :シフト状態 [-] (TRUE:押下、FALSE:なし) :-
	BOOL	bCtrl,				// I  :Ctrl状態 [-] (TRUE:押下、FALSE:なし) :-
	BOOL	bAlt				// I  :Alt状態 [-] (TRUE:押下、FALSE:なし) :-
)
{
	CShitarabianDoc* pDoc = GetDocument();

	if ( GetFocus() != this )
	{
		// フォーカスウィンドウでなくてもここに来る。
		// 正しい（フォーカスを持っている）ウィンドウにメッセージを転送する。
		return( FALSE );
	}

	BOOL	bBreak = FALSE;

// 前処理した場合は以降で処理しないように当たり障りのないコードに摩り替える
	// DLLによるキー前処理
	CShitarabianPlugInManager::GetInstance()->OnKeyDown( pDoc, &unKey, &bShift, &bCtrl, &bAlt );

	// アクセラレータキーチェック
	bBreak = ((CMainFrame*)AfxGetMainWnd())->AccelKeyDown( &unKey, &bShift, &bCtrl, &bAlt );

	// キー押下処理
	if ( !bBreak )
	switch( pDoc->GetOperationMode() )
	{
	case OperationROI:
		bBreak = PreTranslateKeyDownROIMode( unKey, bShift, bCtrl, bAlt );
		break;
	case OperationBoxSelect:
		bBreak = PreTranslateKeyDownBoxSelectMode( unKey, bShift, bCtrl, bAlt );
		break;
	case OperationFloating:
		bBreak = PreTranslateKeyDownFloatingMode( unKey, bShift, bCtrl, bAlt );
		break;
	case OperationNormal:
		bBreak = PreTranslateKeyDownNormalMode( unKey, bShift, bCtrl, bAlt );
		break;
	default:
		break;
	}

	return( bBreak );
}


/*-----------------------------------------------------------------------------
[名称]	文字入力ハンドラ
[機能]	操作モードに応じた文字入力処理への振り分け。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
BOOL CShitarabianView::OnChar(
	CString	strChar,			// I  :入力文字列　[-] (-) :-
	BOOL	bShift,				// I  :シフト状態 [-] (TRUE:押下、FALSE:なし) :-
	BOOL	bCtrl,				// I  :Ctrl状態 [-] (TRUE:押下、FALSE:なし) :-
	BOOL	bAlt,				// I  :Alt状態 [-] (TRUE:押下、FALSE:なし) :-
	BOOL	bTranslate			// I  :読み替え有無 [-] (TRUE:あり、FALSE:なし) :-
)
{
	CShitarabianDoc* pDoc = GetDocument();

// ▼ (3145) BGN 2003.11.26 (moralog) ATOK16の手書き文字入力文字化け
	// もともとは、フォーカスが（ツールバーの）コンボボックスにある時にも
	// この関数に飛んできていたので、処理責任の振り分けが必要だったはず。
	// しかしながらいま現在、編集領域以外での入力でここに来ることはないようだ。
	// 処理自体は念のため残しておくが、削除してかまわないのかもしれない。
	CWnd*	pWnd = GetFocus();
	CComboBox* pCombo = dynamic_cast < CComboBox* > ( pWnd );
	if ( pCombo != NULL )
// ▽
//	if ( GetFocus() != this )
// △
// ▲ (3145) END
	{
		// フォーカスウィンドウでなくてもここに来る。
		// 正しい（フォーカスを持っている）ウィンドウにメッセージを転送する。
		return( FALSE );
	}

	BOOL	bBreak = FALSE;

	// DLLによるキー前処理
	if ( bTranslate )
	{
		CShitarabianPlugInManager::GetInstance()->OnChar( pDoc, &strChar, &bShift, &bCtrl, &bAlt );
	}

	// キー入力処理
	switch( pDoc->GetOperationMode() )
	{
	case OperationROI:
		bBreak = PreTranslateCharROIMode( strChar, bShift, bCtrl, bAlt );
		break;
	case OperationBoxSelect:
		bBreak = PreTranslateCharBoxSelectMode( strChar, bShift, bCtrl, bAlt );
		break;
	case OperationFloating:
		bBreak = PreTranslateCharFloatingMode( strChar, bShift, bCtrl, bAlt );
		break;
	case OperationNormal:
		bBreak = PreTranslateCharNormalMode( strChar, bShift, bCtrl, bAlt );
		break;
	default:
		break;
	}
	
	return( bBreak );
}


/*-----------------------------------------------------------------------------
[名称]	メッセージハンドラ
[機能]	キー入力処理。
[戻値]	なし
[備考]	CView::PreTranslateMessage()のヘルプを参照。
-----------------------------------------------------------------------------*/
BOOL CShitarabianView::PreTranslateMessage( MSG* pMsg ) 
{
	CShitarabianDoc* pDoc = GetDocument();
	BOOL	bBreak = FALSE;

	// キー状態の取得
	BOOL	bShift = ::GetAsyncKeyState( VK_SHIFT ) &0x8000;
	BOOL	bCtrl = ::GetAsyncKeyState( VK_CONTROL ) &0x8000;
	BOOL	bAlt = ::GetAsyncKeyState( VK_MENU ) &0x8000;

	// キー押下を処理
	switch( pMsg->message )
	{
// ▼ (3146) BGN 2003.12.20 (moralog) タグジャンプのキー割り当て追加
	// AltとF10の押下は WM_SYSKEYDOWN で検知する（WM_KEYDOWNと同処理）
	case WM_SYSKEYDOWN:
// ▲ (3146) END
	case WM_KEYDOWN:
		{
			UCHAR	unKey = (UCHAR)pMsg->wParam;
			bBreak = OnKeyDown( unKey, bShift, bCtrl, bAlt );
			if ( !bBreak )
			{
//				bBreak = OnChar( unKey, bShift, bCtrl, bAlt, FALSE );
			}
		}
		break;

	case WM_CHAR:
		{
			CString		strChar;
			strChar = (CString)((char)pMsg->wParam);
			bBreak = OnChar( strChar, bShift, bCtrl, bAlt, TRUE );
			if ( !strChar.IsEmpty() )
			if ( !bBreak )
			{
				bBreak = OnKeyDown( strChar[0], bShift, bCtrl, bAlt );
			}
		}
		break;

	case WM_IME_COMPOSITION:
		{
			CString		strChar;
			{
				if ( pMsg->lParam & GCS_RESULTSTR )
				{
					HIMC hIMC = ::ImmGetContext( m_hWnd );

					// Shift-Jisで読み込む
					char*	pstr = NULL;
					{
						long nByte = ::ImmGetCompositionString( hIMC, GCS_RESULTSTR, NULL, 0 );
						long nChar = nByte / sizeof(char);
						pstr = new char [ nChar+1 ];
						ImmGetCompositionString( hIMC, GCS_RESULTSTR, (void*)pstr, nByte );
						ImmReleaseContext( m_hWnd, hIMC );
						pstr[nChar] = '\0';
					}

					// Unicodeで読み込む
					wchar_t*	pwstr;
					{
						long nByte = ::ImmGetCompositionStringW( hIMC, GCS_RESULTSTR, NULL, 0 );
						long nChar = nByte / sizeof(wchar_t);
						pwstr = new wchar_t[ nChar+1 ];
						ImmGetCompositionStringW( hIMC, GCS_RESULTSTR, (void*)pwstr, nByte );
						ImmReleaseContext( m_hWnd, hIMC );
						pwstr[nChar] = (L'\0');
					}

					// UnicodeをShift-Jisに変換
					strChar = CUnicoder::GetSJisString( pstr, pwstr );

					delete [] pwstr;
					delete [] pstr;

					// IMEのウィンドウがどこに表示されたかわからないのですべて再描画
					pDoc->SetAllUpdate();
				}
				else
				{
					break;
				}
			}
			bBreak = OnChar( strChar, bShift, bCtrl, bAlt, FALSE );
		}
		break;

	default:

// ▼ (3204) BGN 2004.05.10 (moralog) 外部アプリとのＩＦをWM_COPYDATAメッセージとする
/*
// ▽ original BGN
// ▼ (3367) BGN 2004.1.30 (dincom)
		// 文字列挿入要求を処理する
		if ( pMsg->message == ((CMainFrame*)AfxGetMainWnd())->m_UM_CommandMessageID )
		{
			switch( pMsg->wParam )
			{
			case COMMAND_MESSAGE_INSERT:
				// 文字列挿入
				{
					InsertString*	pInsert = (InsertString*)pMsg->lParam;

					bBreak = OnChar( (LPCTSTR)pInsert->strInsert, FALSE, FALSE, FALSE, FALSE );
					if( bBreak )
					{
						pInsert->bSuccess = TRUE;
					}
				}
				break;
			case COMMAND_MESSAGE_CARET_EOF:
				// キャレットを文末に移動する
				{
					BOOL*	pbSuccess = (BOOL*)pMsg->lParam;
					int		nRow	  = pDoc->GetLineCount();

					CCommandCaret	cmdCaret;
					cmdCaret.SetAttribute( 0x00, nRow-1, 0 );
					cmdCaret.Execute( pDoc );
					cmdCaret.SetAttribute( VK_END, 0, 0 );
					bBreak = cmdCaret.Execute( pDoc );

					*pbSuccess = TRUE;
				}
				break;
			case COMMAND_MESSAGE_INIT_SELECTION:
				// 選択状態の解除
				{
					BOOL* pbSuccess = (BOOL*)pMsg->lParam;
					pDoc->GetSelection()->SetSelectedNutral();

					*pbSuccess = TRUE;
				}
				break;
			default:
				break;
			}
			// メッセージがたまっていれば処理する
			MSG msg;
			while(::PeekMessage(&msg,NULL,0,0,PM_REMOVE))
			{
				::TranslateMessage(&msg);
				DispatchMessage(&msg);
			}
		}
// ▲ (3367) END
// △ original END
*/
// ▲ (3204) END
		break;
	}

	if ( bBreak )
	{
		// スクロールできそうであればスクロールバーを制御
		ScrollToCaret();

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

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

	// キー入力以外のイベント
// ▼ (3367) BGN 2004.03.13 (moralog)
	if ( !IsProgress() )
		// プログレスダイアログが表示されているときは
		// 自動処理中なので操作の必要は無い。
// ▲ (3367) END
	switch( pDoc->GetOperationMode() )
	{
	case OperationBoxSelect:
		{
			bBreak = PreTranslateBoxSelectMode( pMsg, bShift, bCtrl, bAlt );
			if ( !bBreak )
			{
				bBreak = PreTranslateNormalMode( pMsg, bShift, bCtrl, bAlt );
			}
			if ( !bBreak )
			{
				bBreak = CView::PreTranslateMessage( pMsg );
			}
		}
		break;

	case OperationFloating:
		{
			bBreak = PreTranslateFloatingMode( pMsg, bShift, bCtrl, bAlt );
			if ( !bBreak )
			{
				bBreak = CView::PreTranslateMessage( pMsg );
			}
		}
		break;

	case OperationROI:
		{
			bBreak = PreTranslateROIMode( pMsg, bShift, bCtrl, bAlt );
			if ( !bBreak )
			{
				bBreak = CView::PreTranslateMessage( pMsg );
			}
		}
		break;

	case OperationNormal:
	default:
		{
			bBreak = PreTranslateNormalMode( pMsg, bShift, bCtrl, bAlt );
			if ( !bBreak )
			{
				bBreak = CView::PreTranslateMessage( pMsg );
			}
		}
		break;
	}
	return( bBreak );
}


/*-----------------------------------------------------------------------------
[名称]	水平スクロールハンドラ
[機能]	スクロール処理。
[戻値]	なし
[備考]	CView::OnHScroll()のヘルプを参照。
-----------------------------------------------------------------------------*/
void CShitarabianView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	CRect		rcClient;
	GetClientRect( &rcClient );
	CPoint		ptOldScroll = GetDeviceScrollPosition();

	HScrollCore(
		nSBCode,
		nPos,
		pScrollBar,
		ptOldScroll
	);
}


/*-----------------------------------------------------------------------------
[名称]	垂直スクロールハンドラ
[機能]	スクロール処理。
[戻値]	なし
[備考]	CView::OnVScroll()のヘルプを参照。
-----------------------------------------------------------------------------*/
void CShitarabianView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	CRect		rcClient;
	GetClientRect( &rcClient );
	CPoint		ptOldScroll = GetDeviceScrollPosition();

	VScrollCore(
		nSBCode,
		nPos,
		pScrollBar,
		ptOldScroll
	);
}


/*-----------------------------------------------------------------------------
[名称]	サイズ変更ハンドラ
[機能]	再描画処理。
[戻値]	CView::OnSize() のヘルプを参照。
[備考]	なし
-----------------------------------------------------------------------------*/
void CShitarabianView::OnSize(UINT nType, int cx, int cy) 
{
	CView::OnSize(nType, cx, cy);

	// 横スクロールバー初期化
	m_lMaxXPixel = 0;
	
	CShitarabianDoc* pDoc = GetDocument();

// ▼ (3146) BGN 2003.12.06 (moralog) CMainFrame::OnShowWindow()へ移動
/*
// ▽ original BGN
	// ▼ (3146) BGN 2003.11.21 (dincom) 位置指定反映のスクロール
	{
		// 起動時の位置オプション指定を反映する。
		// （スプリッタにペインが追加された後でないとスクロールさせられないので
		// このタイミングを使用する）
		static bool sbFirstTime = true;

		if ( sbFirstTime )
		{
			// キャレット位置へのスクロール
			CShitarabianView* pView = pDoc->GetMainView();

			if ( pView != NULL )
			{
				pView->ScrollToCaret();
				sbFirstTime = false;
			}
		}
	} 
	// ▲ (3146) END
// △ original END
*/
// ▲ (3146) END

	pDoc->SetAllUpdate();
	pDoc->ReDraw();
}


/*-----------------------------------------------------------------------------
[名称]	DC用意ハンドラ
[機能]	スクロールを実現するためにDCのマッピングを変更する。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CShitarabianView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo) 
{
	// warning C4100:警告の無視
	pInfo;
// ▼ (ワーニング回避) BGN 2003.12.29 (moralog) warning C4100
	pDC;
// ▲ (ワーニング回避) END

// ▼ (3177) BGN 2003.12.20 (moralog) DCのマッピング廃止に伴う修正
// ▽ oridinal BGN
//	CPoint	ptScrollBox = GetDeviceScrollPosition();
//	pDC->SetViewportOrg( -ptScrollBox.x, -ptScrollBox.y );
//	pDC->OffsetClipRgn( -ptScrollBox.x, -ptScrollBox.y );
// △ oridinal END
// ▲ (3177) END
}


/*-----------------------------------------------------------------------------
[名称]	マウスホイールハンドラ
[機能]	スクロール処理。
[戻値]	CView::OnRegisteredMouseWheel()のヘルプを参照。
[備考]
	please! もしかして2000じゃ OnRegisteredMouseWheel をつかう？
	メモ OnRegisteredMouseWheel は Windows 95 および Windows NT 3.51 のメッセージを扱います。
	Windows NT 4.0 メッセージは、OnMouseWheel で処理します。
-----------------------------------------------------------------------------*/
LRESULT CShitarabianView::OnRegisteredMouseWheel( WPARAM wParam, LPARAM lParam ) 
{
	OnMouseWheel(
			(UINT)(((DWORD)wParam)&0x0FFFF),			// flag
			(short)(((DWORD)wParam)/0x10000),		// zDelta
			CPoint(
				(short)(((DWORD)lParam)&0xFFFF),		// x
				(short)(((DWORD)lParam)/0x10000)		// y
			)
	);
	return( 0 );
}


/*-----------------------------------------------------------------------------
[名称]	マウスホイールハンドラ
[機能]	スクロール処理。
[戻値]	CView::OnMouseWheel()のヘルプを参照。
[備考]
	XP用?
	XPだとマウスホイールの回転イベントでここを通る
	メモ OnRegisteredMouseWheel は Windows 95 および Windows NT 3.51 のメッセージを扱います。
		Windows NT 4.0 メッセージは、OnMouseWheel で処理します。
-----------------------------------------------------------------------------*/
BOOL CShitarabianView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) 
{
	// warning C4100:警告の無視
	pt; nFlags;

// please! もしかして2000じゃ OnRegisteredMouseWheel をつかう？
	CPoint		ptOldScroll = GetDeviceScrollPosition();
	CPoint		ptScroll = ptOldScroll;

	CEditDrawer*		pDrawer = GetDrawer();
	UINT		uiPixelY = pDrawer->CaretRowToPixelZoomed( CGeneralSetting::GetInstance()->GetWheelMove() );
	if ( zDelta < 0 )
	{
		ptScroll.y += uiPixelY;
	}
	else
	{
		ptScroll.y -= uiPixelY;
	}

	// スクロールボックス内の画像をずらす＆必要な領域を再描画
	ManualVScroll( ptScroll.y );

	return( TRUE );
}


/*-----------------------------------------------------------------------------
[名称]	ファイルドロップハンドラ
[機能]	ドロップされたファイルを別窓で開く。
[戻値]	なし
[備考]	CView::OnDropFiles() のヘルプを参照。
-----------------------------------------------------------------------------*/
void CShitarabianView::OnDropFiles(HDROP hDropInfo) 
{
	const	iMaxLength( 1028 );	// パス格納バッファ長さ

	// 実行ファイル名を得る
// ▼ (3751) BGN 2004.05.10 (moralog) 関数化
	CString	strExeShortPath = ::GetShortFilePath( ::GetExePathName() );
/*
// ▽ original BGN
	char	strExeShortPath[ iMaxLength ];
	{
		char	strExeLongPath[ iMaxLength ];
		::GetModuleFileName(
			NULL,
			strExeLongPath,
			iMaxLength
		);

		// ショートファイルのパスを得る
		::GetShortPathName( strExeLongPath, strExeShortPath, iMaxLength );
	}
// △ original END
*/
// ▲ (3751) END

	// ドラッグされたファイルの処理
	int nFile = DragQueryFile(
		hDropInfo,
		0xFFFFFFFF,
		NULL,
		0
	);
	for (int idxFile=0; idxFile<nFile; idxFile++)
	{
		char	strFilename[ iMaxLength ];

		// ドキュメントのファイル名を得る
		DragQueryFile( hDropInfo, idxFile, strFilename, iMaxLength );
		char	strDocumentShortPath[ iMaxLength ];
		::GetShortPathName( strFilename, strDocumentShortPath, iMaxLength );

		// 別窓で開く
		_spawnl( _P_NOWAIT, strExeShortPath, strExeShortPath, strDocumentShortPath, NULL );
	}
	DragFinish( hDropInfo );
}


/*-----------------------------------------------------------------------------
[名称]	カーソル設定ハンドラ
[機能]	カーソルアイコンの設定。
[戻値]	なし
[備考]	CView::OnSetCursor() のヘルプを参照。
-----------------------------------------------------------------------------*/
BOOL CShitarabianView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
{
	switch ( nHitTest )
	{
	case HTCLIENT:
		{
			if ( m_bInputMode )
			{
//				ShowCursor( FALSE );
			}
			else
			{
				CShitarabianDoc* pDoc = GetDocument();
				switch( pDoc->GetOperationMode() )
				{
				case OperationNormal:
					// 文書上にいるときはIビーム
					SetCursor( AfxGetApp()->LoadStandardCursor(IDC_IBEAM) );
					break;
				case OperationBoxSelect:
					// ドラッグ中は必ず＋カーソル
					if ( m_bDrag )
					{
						SetCursor( AfxGetApp()->LoadStandardCursor(IDC_CROSS) );
					}
					// 下へ
				case OperationFloating:
					// 選択範囲の上にいるときは移動矢印、そうでなければ＋
					{
						// カーソル位置を得る
						CPoint	ptScreen;
						GetCursorPos( &ptScreen );
						CPoint ptClient = ptScreen;
						ScreenToClient( &ptClient );

						CPoint		ptPixel = ScrollBoxToPixel( ptClient );


						CEditDrawer*	pDrawer = CEditDrawer::GetInstance();
						CShitarabianDoc*	pDoc = GetDocument();

						int	iRow = pDrawer->PixelToCaretRow( ptPixel.y, pDoc );
						if ( iRow < pDoc->GetLineCount() )
						{
							int	iColumn = 0;
							CEmphasisLine*	pEmphasisLine = pDoc->GetEmphasisLine( iRow );
							if ( pEmphasisLine != NULL )
							{
								iColumn = pEmphasisLine->PixelToCaretColumn( ptPixel.x, TRUE );
							}

							CSelection*			pSelection = pDoc->GetSelection();
							BOOL	bSelected = pSelection->IsSelected(
								iRow, iColumn
							);

							// その座標は選択されているか？
							if ( bSelected )
							{
								SetCursor( AfxGetApp()->LoadStandardCursor(IDC_SIZEALL) );
							}
							else
							{
								SetCursor( AfxGetApp()->LoadStandardCursor(IDC_CROSS) );
							}
						}
					}
					break;
				case OperationROI:
					SetCursor( AfxGetApp()->LoadStandardCursor(IDC_ARROW) );
					break;
				default:
					break;
				}
			}
			return TRUE;
		}
		break;

	default:
		return CView::OnSetCursor(pWnd, nHitTest, message);
		break;
	}
}


/*-----------------------------------------------------------------------------
[名称]	背景描画ハンドラ
[機能]	背景描画処理の廃止。
[戻値]	なし
[備考]	CView::OnEraseBkgnd() のヘルプを参照。
-----------------------------------------------------------------------------*/
BOOL CShitarabianView::OnEraseBkgnd(CDC* pDC) 
{
	// warning C4100:警告の無視
	pDC;

	return( TRUE );
}


/*-----------------------------------------------------------------------------
[名称]	フォーカス取得ハンドラ
[機能]	再描画処理。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CShitarabianView::OnSetFocus(CWnd* pOldWnd) 
{
	CView::OnSetFocus(pOldWnd);

	CShitarabianDoc* pDoc = GetDocument();
	pDoc->SetAllUpdate();

	m_bVisibleCaret = TRUE;

	m_bDrag = FALSE;
}


/*-----------------------------------------------------------------------------
[名称]	フォーカス喪失ハンドラ
[機能]	キャレットの破棄。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CShitarabianView::OnKillFocus(CWnd* pNewWnd) 
{
	CView::OnKillFocus(pNewWnd);
	DestroyCaret();
	m_bVisibleCaret = FALSE;
}


/*-----------------------------------------------------------------------------
[名称]	選択行末空白文字除去（メニューハンドラ）
[機能]	選択された行に対して、行末の空白文字を取り除く。
		一部でも選択されている行に対して処理する。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CShitarabianView::OnRButtonDown(UINT nFlags, CPoint point) 
{
	// warning C4100:警告の無視
	nFlags;

	CShitarabianDoc*	pDoc = GetDocument();

	CMenu menu;
	switch( pDoc->GetOperationMode() )
	{
	case OperationNormal:
		NormalPopUp( point );
		return;
		break;
	case OperationBoxSelect:
	default:
		VERIFY(menu.LoadMenu(IDR_POPUP));
		break;
	case OperationFloating:
		VERIFY(menu.LoadMenu(IDR_FLOATPOPUP));
		break;
	case OperationROI:
		ToNormal();
		pDoc->ReDraw();
		return;
		break;
	}

	CMenu* pPopup = menu.GetSubMenu(0);
	ASSERT(pPopup != NULL);


	ClientToScreen( &point );
	pPopup->TrackPopupMenu(
		TPM_LEFTALIGN | TPM_RIGHTBUTTON,
		point.x, point.y,
		AfxGetMainWnd()
	);
}

