//========= Copyright © 1996-2003, Valve LLC, All rights reserved. ============
//
// The copyright to the contents herein is the property of Valve, L.L.C.
// The contents may be used and/or copied only with the written permission of
// Valve, L.L.C., or in accordance with the terms and conditions stipulated in
// the agreement/contract under which the contents have been supplied.
//
// Purpose: 
//
// $NoKeywords: $
//=============================================================================

#ifndef IPANEL_H
#define IPANEL_H
#ifdef _WIN32
#pragma once
#endif

#ifdef SendMessage
#undef SendMessage
#endif

class KeyValues;

namespace vgui2
{

class SurfacePlat;
class IClientPanel;

//!! must be removed
class Panel;

#ifdef GetClassName // :/
#undef GetClassName
#endif

//-----------------------------------------------------------------------------
// Purpose: interface from Client panels -> vgui panels
//-----------------------------------------------------------------------------
class IPanel : public IBaseInterface
{
public:
	virtual void			Init(VPANEL vguiPanel, IClientPanel *panel) = 0;

	// methods
	virtual void			SetPos(VPANEL vguiPanel, int x, int y) = 0;
	virtual void			GetPos(VPANEL vguiPanel, int &x, int &y) = 0;
	virtual void			SetSize(VPANEL vguiPanel, int wide, int tall) = 0;
	virtual void			GetSize(VPANEL vguiPanel, int &wide, int &tall) = 0;
	virtual void			SetMinimumSize(VPANEL vguiPanel, int wide, int tall) = 0;
	virtual void			GetMinimumSize(VPANEL vguiPanel, int &wide, int &tall) = 0;
	virtual void			SetZPos(VPANEL vguiPanel, int z) = 0;
	virtual int				GetZPos(VPANEL vguiPanel) = 0;

	virtual void			GetAbsPos(VPANEL vguiPanel, int &x, int &y) = 0;
	virtual void			GetClipRect(VPANEL vguiPanel, int &x0, int &y0, int &x1, int &y1) = 0;
	virtual void			SetInset(VPANEL vguiPanel, int left, int top, int right, int bottom) = 0;
	virtual void			GetInset(VPANEL vguiPanel, int &left, int &top, int &right, int &bottom) = 0;

	virtual void			SetVisible(VPANEL vguiPanel, bool state) = 0;
	virtual bool			IsVisible(VPANEL vguiPanel) = 0;
	virtual void			SetParent(VPANEL vguiPanel, VPANEL newParent) = 0;
	virtual int				GetChildCount(VPANEL vguiPanel) = 0;
	virtual VPANEL			GetChild(VPANEL vguiPanel, int index) = 0;
	virtual VPANEL			GetParent(VPANEL vguiPanel) = 0;
	virtual void			MoveToFront(VPANEL vguiPanel) = 0;
	virtual void			MoveToBack(VPANEL vguiPanel) = 0;
	virtual bool			HasParent(VPANEL vguiPanel, VPANEL potentialParent) = 0;
	virtual bool			IsPopup(VPANEL vguiPanel) = 0;
	virtual void			SetPopup(VPANEL vguiPanel, bool state) = 0;

	virtual bool			Render_GetPopupVisible(VPANEL vguiPanel) = 0;
	virtual void			Render_SetPopupVisible(VPANEL vguiPanel, bool state) = 0;

	// gets the scheme this panel uses
	virtual HScheme			GetScheme(VPANEL vguiPanel) = 0;
	// gets whether or not this panel should scale with screen resolution
	virtual bool			IsProportional(VPANEL vguiPanel) = 0;
	// returns true if auto-deletion flag is set
	virtual bool			IsAutoDeleteSet(VPANEL vguiPanel) = 0;
	// deletes the Panel * associated with the vpanel
	virtual void			DeletePanel(VPANEL vguiPanel) = 0;

	// input interest
	virtual void			SetKeyBoardInputEnabled(VPANEL vguiPanel, bool state) = 0;
	virtual void			SetMouseInputEnabled(VPANEL vguiPanel, bool state) = 0;
	virtual bool			IsKeyBoardInputEnabled(VPANEL vguiPanel) = 0;
	virtual bool			IsMouseInputEnabled(VPANEL vguiPanel) = 0;

	// calculates the panels current position within the hierarchy
	virtual void			Solve(VPANEL vguiPanel) = 0;

	// gets names of the object (for debugging purposes)
	virtual const char*		GetName(VPANEL vguiPanel) = 0;
	virtual const char*		GetClassName(VPANEL vguiPanel) = 0;

	// delivers a message to the panel
	virtual void			SendMessage(VPANEL vguiPanel, KeyValues *params, VPANEL ifromPanel) = 0;

	// these pass through to the IClientPanel
	virtual void			Think(VPANEL vguiPanel) = 0;
	virtual void			PerformApplySchemeSettings(VPANEL vguiPanel) = 0;
	virtual void			PaintTraverse(VPANEL vguiPanel, bool forceRepaint, bool allowForce = true) = 0;
	virtual void			Repaint(VPANEL vguiPanel) = 0;
	virtual VPANEL			IsWithinTraverse(VPANEL vguiPanel, int x, int y, bool traversePopups) = 0;
	virtual void			OnChildAdded(VPANEL vguiPanel, VPANEL child) = 0;
	virtual void			OnSizeChanged(VPANEL vguiPanel, int newWide, int newTall) = 0;

	virtual void			InternalFocusChanged(VPANEL vguiPanel, bool lost) = 0;
	virtual bool			RequestInfo(VPANEL vguiPanel, KeyValues *outputData) = 0;
	virtual void			RequestFocus(VPANEL vguiPanel, int direction = 0) = 0;
	virtual bool			RequestFocusPrev(VPANEL vguiPanel, VPANEL existingPanel) = 0;
	virtual bool			RequestFocusNext(VPANEL vguiPanel, VPANEL existingPanel) = 0;
	virtual VPANEL			GetCurrentKeyFocus(VPANEL vguiPanel) = 0;
	virtual int				GetTabPosition(VPANEL vguiPanel) = 0;

	// used by ISurface to store platform-specific data
	virtual SurfacePlat*	Plat(VPANEL vguiPanel) = 0;
	virtual void			SetPlat(VPANEL vguiPanel, SurfacePlat *Plat) = 0;

	// returns a pointer to the vgui controls baseclass Panel *
	// destinationModule needs to be passed in to verify that the returned Panel * is from the same module
	// it must be from the same module since Panel * vtbl may be different in each module
	virtual Panel*			GetPanel(VPANEL vguiPanel, const char *destinationModule) = 0;

	virtual bool			IsEnabled(VPANEL vguiPanel) = 0;
	virtual void			SetEnabled(VPANEL vguiPanel, bool state) = 0;
};

#define VGUI_PANEL_INTERFACE_VERSION "VGUI_Panel007"

} // namespace vgui2

#endif // IPANEL_H
