#pragma once

#include "refIInputDevice.h"
#include "enumKey.h"

namespace FDK
{
	public ref class CInputMouse : IInputDevice
	{
	public:
		static const int nマウスの最大ボタン数 = 8;

		CInputMouse( IntPtr hWnd, IDirectInput8 *pDI );
		~CInputMouse();
		!CInputMouse();

		#pragma region [ IInputDevice 実装 ]
		//-----------------
		property E入力デバイス種別 e入力デバイス種別
		{
			virtual E入力デバイス種別 get()
			{ 
				this->Disposed->tDispose済みまたは実行中なら例外発生( "CInputMouse" );
				return this->_e入力デバイス種別;
			}
		protected:
			void set( E入力デバイス種別 value )
			{
				this->Disposed->tDispose済みまたは実行中なら例外発生( "CInputMouse" );
				this->_e入力デバイス種別 = value;
			}
		}
		property Guid^ guid
		{
			virtual Guid^ get()
			{
				this->Disposed->tDispose済みまたは実行中なら例外発生( "CInputMouse" );
				return this->_guid;
			}
		protected:
			void set( Guid^ value )
			{
				this->Disposed->tDispose済みまたは実行中なら例外発生( "CInputMouse" );
				this->_guid = value;
			}
		}
		property int ID 
		{
			virtual int get()
			{
				this->Disposed->tDispose済みまたは実行中なら例外発生( "CInputMouse" );
				return this->_ID;
			}
		protected:
			void set( int value )
			{
				this->Disposed->tDispose済みまたは実行中なら例外発生( "CInputMouse" );
				this->_ID = value;
			}
		}
		property List<CInputEvent^>^ list入力イベント
		{
			virtual List<CInputEvent^>^ get()
			{
				this->Disposed->tDispose済みまたは実行中なら例外発生( "CInputMouse" );
				return this->_list入力イベント;
			}
		protected:
			void set( List<CInputEvent^>^ value )
			{
				this->Disposed->tDispose済みまたは実行中なら例外発生( "CInputMouse" );
				this->_list入力イベント = value;
			}
		}
		property String^ strデバイス名
		{
			virtual String^ get()
			{
				this->Disposed->tDispose済みまたは実行中なら例外発生( "CInputMouse" );
				return this->_strデバイス名;
			}
			virtual void set( String^ value ) 
			{
				this->Disposed->tDispose済みまたは実行中なら例外発生( "CInputMouse" );
				this->_strデバイス名 = value;
			}
		}

		virtual void tポーリング( bool bWindowがアクティブ中, bool bバッファ入力を使用する );

		virtual bool bキーが押された( int nButton )
		{
			this->Disposed->tDispose済みまたは実行中なら例外発生( "CInputMouse" );
			return ( ( ( 0 <= nButton ) && ( nButton < CInputMouse::nマウスの最大ボタン数 ) ) && this->bKeyPushDown[ nButton ] );
		}
		virtual bool bキーが押された( Key key )
		{
			return this->bキーが押された( (int) key );
		}
		
		virtual bool bキーが押されている( int nButton )
		{
			this->Disposed->tDispose済みまたは実行中なら例外発生( "CInputMouse" );
			return ( ( ( 0 <= nButton ) && ( nButton < CInputMouse::nマウスの最大ボタン数 ) ) && this->bKeyState[ nButton ] );
		}
		virtual bool bキーが押されている( Key key )
		{
			return this->bキーが押されている( (int) key );
		}
		
		virtual bool bキーが離された( int nButton )
		{
			this->Disposed->tDispose済みまたは実行中なら例外発生( "CInputMouse" );
			return ( ( ( 0 <= nButton ) && ( nButton < CInputMouse::nマウスの最大ボタン数 ) ) && this->bKeyPullUp[ nButton ] );
		}
		virtual bool bキーが離された( Key key )
		{
			return this->bキーが離された( (int) key );
		}

		virtual bool bキーが離されている( int nButton )
		{
			this->Disposed->tDispose済みまたは実行中なら例外発生( "CInputMouse" );
			return ( ( ( 0 <= nButton ) && ( nButton < CInputMouse::nマウスの最大ボタン数 ) ) && !this->bKeyState[ nButton ] );
		}
		virtual bool bキーが離されている( Key key )
		{
			return this->bキーが離されている( (int) key );
		}
		//-----------------
		#pragma endregion

	protected:
		IDirectInputDevice8 *pDevice;
		array<bool>^ bKeyPullUp;
		array<bool>^ bKeyPushDown;
		array<bool>^ bKeyState;
		CTimer^ timer;

	private:
		CDisposed^ Disposed;
		E入力デバイス種別 _e入力デバイス種別;
		Guid^ _guid;
		int _ID;
		List<CInputEvent^>^ _list入力イベント;
		String^ _strデバイス名;
		Object^ _lock入力イベント;
	};
}
