
#pragma once
#include "Adept.hpp"

namespace Adept
{
	class GUIObject;
	class GUITextObject;

	//##########################################################################
	//###########################    GUIGroup   ################################
	//##########################################################################
	class GUIGroup:
		public Plug
	{
	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Construction, Destruction
	//
	public:
		GUIGroup(const char *name);

		~GUIGroup();

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Functions
	//
	public:
		void
			AddTextObject(GUITextObject *gui_text_object);
		void
			AddGUIObject(GUIObject *gui_object);
		GUIObject
			*FindGUIObject(const char *object_name);

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Public Data
	//
	public:
		MString
			groupName;
		SortedChainOf<GUIObject *, MString>
			guiObjects;
		ChainOf<GUITextObject *> 
			guiTextObjects;
	};
	//####################################################################
	//###########################    GUIManager   ########################
	//####################################################################

	class GUIManager:
		public Plug
	{
	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Construction, Destruction
	//
	public:
		GUIManager();
		~GUIManager();

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// GUI Initialization
	//
	public:
		void
			ReadObjectsFromNotation(Stuff::NotationFile *gui_contents);

		void
			SaveObjectsToStream(Stuff::MemoryStream *stream);

		void
			ReadObjectsFromStream(Stuff::MemoryStream *stream);
		void
			WriteObjectsFromFileToStream(
				Stuff::NotationFile *gui_contents,
				Stuff::MemoryStream *stream
			);
		virtual void
			ClearGUIChain();

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Cool functions that make this stuff work Data
	//
	public:
		GUIGroup
			*FindGroup(const char *group_name);

		virtual void
			Execute();

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Public Data Don't worry...be happy
	//
	public:
		SortedChainOf<GUIObject *, MString>
			guiObjects;

		SortedChainOf<GUIGroup *, MString>
			guiGroups;

		static GUIManager*
			GetInstance() 
		{
			return reinterpret_cast<GUIManager *>( GlobalPointers::GetGlobalPointer(GUIManagerGlobalPointerIndex));
		};

	};
}
