//=========== Copyright Valve Corporation, All rights reserved. ===============//
//
// Purpose: 
//=============================================================================//

#ifndef PANORAMA_TEXTINPUT_H
#define PANORAMA_TEXTINPUT_H

#include "panorama/controls/panel2d.h"
#include "panorama/input/iuiinput.h"

namespace panorama
{

class ITextInputControl;
class CTextInputHandlerSettings;

// When text input finished, bool = true for Done, = false for Cancel; char const * = string that user typed
// Dispatched to ITextInputControl::GetAssociatedPanel()
DECLARE_PANEL_EVENT2( TextInputFinished, bool, char const * );

// When the handler is up and sees gamepad right-stick input, it passes it through to the containing
// control, so the control can do something with it. Dispatched to ITextInputControl::GetAssociatedPanel()
DECLARE_PANEL_EVENT1( TextInputAnalogStickPassthrough, GamePadData_t );

panorama::ETextInputHandlerType_t ETextInputHandlerType_tFromName( const char *pchName );
const char *PchNameFromETextInputHandlerType_t( int eType );

//
// Input submodes for text input handlers, used also by textentry
//
enum ETextInputMode_t
{
	k_ETextInputModeNormal,
	k_ETextInputModeNormalLower,
	k_ETextInputModePassword,
	k_ETextInputModeEmail,
	k_ETextInputModeNumeric,
	k_ETextInputModeNumericPassword,
	k_ETextInputModeURL,
	k_ETextInputModeSteamCode,
	k_ETextInputModePhoneNumber,
};

ETextInputMode_t ETextInputMode_tFromName( const char *pchName );
const char *PchNameFromETextInputMode_t( int eMode );

//-----------------------------------------------------------------------------
// Purpose: an interface that the text input uses to feed and be fed text
//-----------------------------------------------------------------------------
class ITextInputControl
{
public:
	virtual ~ITextInputControl() {}

	virtual bool OnKeyDown( const KeyData_t &code ) = 0;
	virtual bool OnKeyUp( const KeyData_t & code ) = 0;
	virtual bool OnKeyTyped( const KeyData_t &unichar ) = 0;
	
	// return true if you own the backing store of the text and can return it immediately on request,
	// 	false otherwise (html returns false here) 
	virtual bool BSupportsImmediateTextReturn() = 0;

	virtual int32 GetCursorOffset() const = 0;
	virtual uint GetCharCount() const = 0;

	virtual const char *PchGetText() const = 0;
	virtual const wchar_t *PwchGetText() const = 0;

	virtual void InsertCharacterAtCursor( const wchar_t &unichar ) = 0;
	virtual void InsertCharactersAtCursor( const wchar_t *pwch, size_t cwch ) = 0;

	virtual CPanel2D *GetAssociatedPanel() = 0;

	// request string the control now contains
	virtual void RequestControlString() = 0;
};


//-----------------------------------------------------------------------------
// Purpose: The interface over a text input handler. Derives from CPanel2D
//			for convenience.
//-----------------------------------------------------------------------------
class CTextInputHandler : public panorama::CPanel2D
{
public:
	CTextInputHandler( panorama::IUIWindow *pParent, const char *pchID );
	CTextInputHandler( panorama::CPanel2D *pParent, const char *pchID );
	virtual ~CTextInputHandler();

	virtual void OpenHandler() = 0;
	void CloseHandler( bool bCommitText );
	virtual ETextInputHandlerType_t GetType() = 0;
	virtual ITextInputControl *GetControlInterface() = 0;
	virtual void SuggestWord( const wchar_t *pwch, int ich ) = 0;
	virtual void SetYButtonAction( const char *pchLabel, IUIEvent *pEvent ) = 0;

protected:
	virtual void CloseHandlerImpl( bool bCommitText ) = 0;
};

// Factory methods
CTextInputHandler *CreateTextInputHandler( panorama::IUIWindow *pParent, const CTextInputHandlerSettings &settings, ITextInputControl *pControl );
CTextInputHandler *CreateTextInputHandler( panorama::CPanel2D *pParent, const CTextInputHandlerSettings &settings, ITextInputControl *pControl );

} // namespace panorama

#endif // PANORAMA_TEXTINPUT_H