#ifndef PHANDLE_H
#define PHANDLE_H

#ifdef _WIN32
#pragma once
#endif

#include "VGUI.h"

namespace vgui
{

	class Panel;

	class PHandle
	{
	public:
		PHandle() : m_iPanelID(INVALID_PANEL) {}   

		Panel* Get();
		Panel* Set(Panel* pPanel);
		Panel* Set(HPanel hPanel);

		operator Panel* () { return Get(); }
		Panel* operator ->() { return Get(); }
		Panel* operator = (Panel* pPanel) { return Set(pPanel); }

		bool operator == (Panel* pPanel) { return (Get() == pPanel); }
		operator bool() { return Get() != 0; }

	private:
		HPanel m_iPanelID;
	};

	class VPanelHandle
	{
	public:
		VPanelHandle() : m_iPanelID(INVALID_PANEL) {}

		VPANEL Get();
		VPANEL Set(VPANEL pPanel);

		operator VPANEL () { return Get(); }
		VPANEL operator = (VPANEL pPanel) { return Set(pPanel); }

		bool operator == (VPANEL pPanel) { return (Get() == pPanel); }
		operator bool() { return Get() != 0; }

	private:
		HPanel m_iPanelID;
	};

	template< class PanelType >
	class DHANDLE : public PHandle
	{
	public:
		PanelType* Get() { return (PanelType*)PHandle::Get(); }
		PanelType* Set(PanelType* pPanel) { return (PanelType*)PHandle::Set(pPanel); }
		PanelType* Set(HPanel hPanel) { return (PanelType*)PHandle::Set(hPanel); }

		operator PanelType* () { return (PanelType*)PHandle::Get(); }
		PanelType* operator ->() { return (PanelType*)PHandle::Get(); }
		PanelType* operator = (PanelType* pPanel) { return (PanelType*)PHandle::Set(pPanel); }
		bool operator == (Panel* pPanel) { return (PHandle::Get() == pPanel); }
		operator bool() { return PHandle::Get() != NULL; }
	};

};

#endif  