/*!
 	@file
 	@brief IME クラス
 */

#ifndef CInputMethodDriver_h
#define CInputMethodDriver_h

#include"../../Setup/CompileMode.h"
#include"../../Auxiliary/Macro.h"
#include"../../Auxiliary/mstring.h"

#include<boost/smart_ptr.hpp>
#include<boost/function.hpp>

namespace Maid
{
	/*!
	 	@class	IInputMethodDriver CInputMethodDriver.h
	 	@brief	IME クラス
	\n			いわゆるＦＥＰを管理するクラス
	\n			このクラスは描画を行わないのでほかのクラスで行う必要があります。
	 */

	class IInputMethodDriver
	{
	public:
		virtual ~IInputMethodDriver(){}

		//! FEP の起動
		/*!
		 */
		virtual void Open() =0;

		//! FEP の終了
		/*!
		 */
		virtual void Close()=0;


		//! FEP がうごいているか？
		/*!
		 	@return ＦＥＰが動いているなら true
		 \n			うごいていないなら false
		 */
		virtual bool IsOpen() const=0;

		//! 現在入力中か？
		/*!
		 	ＦＥＰが起動しても、まだ一文字も入力していないときは入力中でないとみなします
		 	この関数、廃止するかも
		 
		 	@return	入力中なら true
		 */
		virtual bool IsInput() const=0;

		//! 変換位置の取得
		/*!
		 	@return	変換位置
		 */
		virtual int GetConvertPos() const=0;

		//! カーソル位置の取得
		/*!
		 	@return	カーソル位置
		 */
		virtual int GetCursorPos() const=0;

		//! 変換候補数の取得
		/*!
		 	@return 変換候補数
		 */
		virtual int GetCandidateCount() const=0;

		//! 現在選択中の変換候補の取得
		/*!
		 	@return 変換候補位置
		 */
		virtual int GetCandidateSelect() const=0;

		//! 指定されたインデックスの変換候補を取得
		/*!
		 	@return 変換候補文字
		 */
		virtual mstring GetCandidateString( int Index) const=0;

		//! FEP入力文字列の取得
		/*!
		 	@return	入力中の文字列
		 */
		virtual mstring GetCompString() const=0;


		typedef boost::function1<void, const mstring&>	RESULTCODEFUNCTION;

		//! 文字が確定された場合、コールバックされる関数の設定
		/*!
		 	@param	Function	[i ]	設定する関数 void XXXX( STR ) の形であること
		\n								STR が確定された文字列になります
		 */
		virtual void SetResultCodeFunction( const RESULTCODEFUNCTION& Function )=0;

	};

	#define MakeResultCodeFunctionObject(pFunc,pObject) boost::bind( pFunc, pObject, _1 )

	typedef boost::shared_ptr<IInputMethodDriver> SPINPUTMETHODDRIVER;

}

#endif
