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

#ifndef UITOPLEVELWINDOWOVERLAY_H
#define UITOPLEVELWINDOWOVERLAY_H

#ifdef _WIN32
#pragma once
#endif

// bad reach
#include "../../../panorama/input/controller.h"

class CSharedMemStream;
namespace IPC
{
	class IEvent;
	class ISharedMem;
}

namespace panorama
{
class CTopLevelWindowOverlay;
class COverlayInterface;


class CTopLevelWindowOverlay : public CTopLevelWindow
{
	typedef CTopLevelWindow BaseClass;
public:
	CTopLevelWindowOverlay( CUIEngine *pUIEngineParent );
	virtual ~CTopLevelWindowOverlay();

	// Access overlay window interface for this window, NULL on non Steam Overlay windows
	virtual IUIOverlayWindow *GetOverlayInterface();

	// Initialize backing surface for window
	virtual bool BInitializeSurface( const char *pchWindowTitle, int nWidth, int nHeight, IUIEngine::ERenderTarget eRenderTarget, bool bFixedSurfaceSize, bool bEnforceWindowAspectRatio, bool bUseCustomMouseCursor, const char *pchTargetMonitor );

	// Run any per window frame func logic
	virtual void RunPlatformFrame();

	// Resize the window to specified dimensions
	virtual void OnWindowResize( uint32 nWidth, uint32 nHeight );

	// Window position management
	virtual void SetWindowPosition( float x, float y );
	virtual void GetWindowPosition( float &x, float &y );
	virtual void GetWindowBounds( float &left, float &top, float &right, float &bottom );
	virtual void GetClientDimensions( float &width, float &height );
	virtual void Activate( bool bForceful );
	virtual bool BHasFocus() { return m_bFocus; } 
	virtual bool BIsFullscreen() { return m_bFullScreen; }
	virtual void* GetNativeWindowHandle() { return 0; }

	virtual bool BAllowInput( InputMessage_t &msg );
	virtual bool BIsVisible() { return m_bVisible; }
	virtual void SetVisible( bool bVisible ) { AssertMsg( false, "SetVisible not implemented on CTopLevelWindowOverlay" ); }

	void SetInputEnabled( bool bEnabled ) { m_bInputEnabled = bEnabled; }

	// Clear color for the window, normally black, transparent for overlay
	virtual Color GetClearColor() { return Color( 0, 0, 0, 0 ); }

	// Necessary for generating mouse enter & leave events on windows
	bool IsMouseOver() { return m_bMouseOverWindow; }
	void OnMouseEnter();
	void OnMouseLeave() { m_bMouseOverWindow = false; }

	void SetMouseCursor( EMouseCursors eCursor );
	
	bool SetGameProcessInfo( AppId_t nAppId, bool bCanSharedSurfaces, int32 eTextureFormat );
	void ProcessInputEvents();

	bool BVisiblityChanged() const { return m_bVisibleThisFrame != m_bVisibleLastFrame; }

	void PushOverlayRenderCmdStream( CSharedMemStream *pRenderStream, unsigned long dwPID, float flOpacity, EOverlayWindowAlignment alignment );

	void SetGameWindowSize( uint32 nWidth, uint32 nHeight );
	void SetFixedSurfaceSize( uint32 unSurfaceWidth, uint32 unSurfaceHeight );

	void OnMouseMove( float x, float y );

	void SetFocus( bool bFocus ); 

	void SetLetterboxColor( Color c );

#ifdef DBGFLAG_VALIDATE
	virtual void Validate( CValidator &validator, const tchar *pchName );
#endif
protected:
	virtual void Shutdown();

private:

	COverlayInterface *m_pOverlayInterface;
	IUI3DSurface *m_p3DSurface;
	bool m_bMouseOverWindow;
	AppId_t m_nAppId;

	bool m_bInputEnabled;
	bool m_bFocus;
	bool m_bCanShareSurfaces;

	bool m_bVisibleThisFrame;
	bool m_bVisibleLastFrame;

	uint32 m_unGameWidth;
	uint32 m_unGameHeight;

	bool m_bFullScreen;
	
	bool m_bVisible;
};

class COverlayInterface : public IUIOverlayWindow
{
public:
	COverlayInterface( CTopLevelWindowOverlay *pWindow )
	{
		m_pWindow = pWindow;
	}

	virtual void PushOverlayRenderCmdStream( CSharedMemStream *pRenderStream, unsigned long dwPID, float flOpacity, EOverlayWindowAlignment alignment ) OVERRIDE
	{
		return m_pWindow->PushOverlayRenderCmdStream( pRenderStream, dwPID, flOpacity, alignment );
	}

	virtual void SetFocus( bool bFocus ) OVERRIDE
	{
		return m_pWindow->SetFocus( bFocus );
	}

	virtual bool SetGameProcessInfo( AppId_t nAppId, bool bCanSharedSurfaces, int32 eTextureFormat ) OVERRIDE
	{
		return m_pWindow->SetGameProcessInfo( nAppId, bCanSharedSurfaces, eTextureFormat );
	}

	virtual void SetInputEnabled( bool bEnabled ) OVERRIDE
	{
		return m_pWindow->SetInputEnabled( bEnabled );
	}

	virtual void SetGameWindowSize( uint32 nWidth, uint32 nHeight ) OVERRIDE
	{
		return m_pWindow->SetGameWindowSize( nWidth, nHeight );
	}

	virtual void SetFixedSurfaceSize( uint32 unSurfaceWidth, uint32 unSurfaceHeight ) OVERRIDE
	{
		return m_pWindow->SetFixedSurfaceSize( unSurfaceWidth, unSurfaceHeight );
	}

	virtual void OnMouseMove( float x, float y ) OVERRIDE
	{
		return m_pWindow->OnMouseMove( x, y );
	}

	virtual void OnMouseEnter() OVERRIDE
	{
		return m_pWindow->OnMouseEnter();
	}

	virtual void SetLetterboxColor( Color c ) OVERRIDE
	{
		return m_pWindow->SetLetterboxColor( c );
	}
private:
	CTopLevelWindowOverlay *m_pWindow;
};


} // namespace panorama

#endif // UITOPLEVELWINDOWOVERLAY_H