#include "AdeptHeaders.hpp"

#include "GUIManager.hpp"
#include "GUIObject.hpp"
#include "GUITextObject.hpp"


//#############################################################################
//###########################    GUIGroup   ###################################
//#############################################################################

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
GUIGroup::GUIGroup(const char *group_name) :
	Plug(Plug::DefaultData),
	guiObjects(NULL, true),
	guiTextObjects(NULL)
{
	groupName = group_name;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
GUIGroup::~GUIGroup()
{
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
	GUIGroup::AddTextObject(GUITextObject *gui_text_object)
{
	Check_Object(this);
	Check_Object(gui_text_object);
	guiTextObjects.Add(gui_text_object);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
	GUIGroup::AddGUIObject(GUIObject *gui_object)
{
	Check_Object(this);
	Check_Object(gui_object);
	guiObjects.AddValue(gui_object, gui_object->guiObjectName);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
GUIObject*
	GUIGroup::FindGUIObject(const char *object_name)
{
	Check_Object(this);
	return guiObjects.Find(object_name);
}

//#######################################################################
//###########################    GUIManager   ###########################
//#######################################################################


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
GUIManager::GUIManager() :
	Plug(Plug::DefaultData),
	guiObjects(NULL, true),
	guiGroups(NULL, true)
{
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
GUIManager::~GUIManager()
{
	guiObjects.DeletePlugs();
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
	GUIManager::ClearGUIChain()
{
	Check_Object(this);

	guiObjects.DeletePlugs();
}
	
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
	GUIManager::ReadObjectsFromNotation(Stuff::NotationFile *gui_contents)
{
	Check_Object(this);
	Check_Pointer(gui_contents);

	NotationFile::PageIterator *pages = gui_contents->MakePageIterator();
	Check_Object(pages);
	Page *page;
	while ((page = pages->ReadAndNext()) != NULL)
	{
		Check_Object(page);
		GUIObject *gui_object;
		gui_object = new GUIObject(GUIObject::DefaultData, page);
		Check_Object(gui_object);
		guiObjects.AddValue(gui_object, gui_object->guiObjectName);
	}
	Check_Object(pages);
	delete pages;
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
	GUIManager::Execute()
{
	Check_Object(this);
	SortedChainIteratorOf<GUIObject *, MString> iterator(&guiObjects);
	GUIObject *gui_object;
	while((gui_object = iterator.ReadAndNext()) != NULL)
	{
		Check_Object(gui_object);
		gui_object->Draw();
	}
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
	GUIManager::WriteObjectsFromFileToStream(
	NotationFile *gui_contents,
	MemoryStream *stream
)
{
	Check_Object(this);
	Check_Pointer(stream);
	NotationFile::PageIterator *pages = gui_contents->MakePageIterator();
	Check_Object(pages);
	Page *page;
	while ((page = pages->ReadAndNext()) != NULL)
	{
		Check_Object(page);
		GUIObject *gui_object;
		gui_object = new GUIObject(GUIObject::DefaultData, page);
		Check_Object(gui_object);
		gui_object->Save(stream);

		Check_Object(gui_object);
		delete gui_object;
	}
	Check_Object(pages);
	delete pages;
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
	GUIManager::SaveObjectsToStream(Stuff::MemoryStream *stream)
{
	Check_Object(this);
	Check_Pointer(stream);

	SortedChainIteratorOf<GUIObject *, MString> iterator(&guiObjects);
	GUIObject *gui_object;
	while((gui_object = iterator.ReadAndNext()) != NULL)
	{
		Check_Object(gui_object);
		gui_object->Save(stream);
	}
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
	GUIManager::ReadObjectsFromStream(Stuff::MemoryStream *stream)
{
	Check_Object(this);
	Check_Pointer(stream);

	while(stream->GetBytesRemaining() > 0)
	{
		GUIObject *gui_object;
		gui_object = new GUIObject(
			GUIObject::DefaultData,
			stream
		);
		Check_Object(gui_object);
		guiObjects.AddValue(gui_object, gui_object->guiObjectName);
	}
}