#pragma once

#include "refIInputDevice.h"

namespace FDK
{
	
	// ！！！　ジョイスティックに関しては未実装。　！！！


	public ref class CInput管理
	{
	public:
		static int n通常音量 = 110;

		// どのウィンドウが今入力管理を行っているかは、このプロパティで確認する。
		property IntPtr hWnd
		{
			IntPtr get()
			{
				this->Disposed->tDispose済みまたは実行中なら例外発生( "CInput管理" );
				return this->_hWnd;
			}
		protected:
			void set( IntPtr value )
			{
				this->Disposed->tDispose済みまたは実行中なら例外発生( "CInput管理" );
				this->_hWnd = value;
			}
		}
		property List<IInputDevice^>^ list入力デバイス
		{
			List<IInputDevice^>^ get() 
			{
				this->Disposed->tDispose済みまたは実行中なら例外発生( "CInput管理" );
				return this->_list入力デバイス;
			}
		protected:
			void set( List<IInputDevice^>^ value )
			{
				this->Disposed->tDispose済みまたは実行中なら例外発生( "CInput管理" );
				this->_list入力デバイス = value;
			}
		}
		property IInputDevice^ Keyboard
		{
			IInputDevice^ get()
			{
				this->Disposed->tDispose済みまたは実行中なら例外発生( "CInput管理" );

				if( this->_Keyboard != nullptr )
				{
					return this->_Keyboard;
				}
				for each( IInputDevice^ device in this->list入力デバイス )
				{
					if( device->e入力デバイス種別 == E入力デバイス種別::キーボード )
					{
						this->_Keyboard = device;
						return device;
					}
				}
				return nullptr;
			}
		}
		property IInputDevice^ Mouse
		{
			IInputDevice^ get()
			{
				this->Disposed->tDispose済みまたは実行中なら例外発生( "CInput管理" );

				if( this->_Mouse != nullptr )
				{
					return this->_Mouse;
				}
				for each( IInputDevice^ device in this->list入力デバイス )
				{
					if( device->e入力デバイス種別 == E入力デバイス種別::マウス )
					{
						this->_Mouse = device;
						return device;
					}
				}
				return nullptr;
			}
		}
		property UInt32 nMidiIn数
		{
			UInt32 get()
			{
				this->Disposed->tDispose済みまたは実行中なら例外発生( "CInput管理" );
				return this->_nMIDIデバイス数;
			}
		protected:
			void set( UInt32 value )
			{
				this->Disposed->tDispose済みまたは実行中なら例外発生( "CInput管理" );
				this->_nMIDIデバイス数 = value;
			}
		}
		IInputDevice^ MidiIn( int ID );

		delegate void MidiInProcDelegate( HMIDIIN hMidiIn, UINT wMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2 );

		CInput管理( IntPtr hWnd );
		~CInput管理();
		!CInput管理();

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

	protected:
		IDirectInput8		*pDI;
		CTimer^				timer;
		GCHandle			gchMidiInProc;
		MidiInProcDelegate^	dgMidiInProc;

		// MIDI入力コールバック
		void midiInProc( HMIDIIN hMidiIn, UINT wMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2 );

	private:
		CDisposed^ Disposed;
		IntPtr _hWnd;
		List<IInputDevice^>^ _list入力デバイス;
		IInputDevice^ _Keyboard;		// _list入力デバイスに含まれる
		IInputDevice^ _Mouse;			// _list入力デバイスに含まれる
		UInt32 _nMIDIデバイス数;
	};
}
