#ifndef IPANEL_H
#define IPANEL_H

#ifdef _WIN32
#pragma once
#endif

#include "vgui.h"
#include "interface.h"
#include "utlvector.h"

#ifdef SendMessage
#undef SendMessage
#endif

class KeyValues;
struct DmxElementUnpackStructure_t;
class CDmxElement;

namespace vgui
{

	class SurfacePlat;
	class IClientPanel;

	class Panel;

	class IPanel : public IBaseInterface
	{
	public:
		virtual void Init(VPANEL vguiPanel, IClientPanel* panel) = 0;

		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 CUtlVector< VPANEL >& GetChildren(VPANEL vguiPanel) = 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 IsFullyVisible(VPANEL vguiPanel) = 0;

		virtual HScheme GetScheme(VPANEL vguiPanel) = 0;
		virtual bool IsProportional(VPANEL vguiPanel) = 0;
		virtual bool IsAutoDeleteSet(VPANEL vguiPanel) = 0;
		virtual void DeletePanel(VPANEL vguiPanel) = 0;

		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;

		virtual void Solve(VPANEL vguiPanel) = 0;

		virtual const char* GetName(VPANEL vguiPanel) = 0;
		virtual const char* GetClassName(VPANEL vguiPanel) = 0;

		virtual void SendMessage(VPANEL vguiPanel, KeyValues* params, VPANEL ifromPanel) = 0;

		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;

		virtual SurfacePlat* Plat(VPANEL vguiPanel) = 0;
		virtual void SetPlat(VPANEL vguiPanel, SurfacePlat* Plat) = 0;

		virtual Panel* GetPanel(VPANEL vguiPanel, const char* destinationModule) = 0;

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

		virtual bool IsTopmostPopup(VPANEL vguiPanel) = 0;
		virtual void SetTopmostPopup(VPANEL vguiPanel, bool state) = 0;

		virtual void SetMessageContextId(VPANEL vguiPanel, int nContextId) = 0;
		virtual int GetMessageContextId(VPANEL vguiPanel) = 0;

		virtual const DmxElementUnpackStructure_t* GetUnpackStructure(VPANEL vguiPanel) const = 0;
		virtual void OnUnserialized(VPANEL vguiPanel, CDmxElement* pElement) = 0;

		virtual void SetSiblingPin(VPANEL vguiPanel, VPANEL newSibling, byte iMyCornerToPin = 0, byte iSiblingCornerToPinTo = 0) = 0;
	};


}   


#endif  