#include <algorithm>
#include "moduletype.h"
#include "modulemanager.h"

Ptr<ModuleManager> ModuleManager::manager;

const char* ModuleManager::type="ModuleManager";

const char* ModuleManager::getType() const
{
	return type;
}

ModuleManager::ModuleManager(ModuleType* types [],Ptr<TkGui>& gui):gui(gui)
{
	int i=0;
	do
	{
		ModuleType* type=types[i++];
		if (type==0) break;

		type->manager=this;
		moduleTypes.push_back(type);
	} while(true);
}

ModuleManager::~ModuleManager()
{
}

ModuleManager::const_iterator ModuleManager::begin() const
{
	return moduleTypes.begin();
}

ModuleManager::const_iterator ModuleManager::end() const
{
	return moduleTypes.end();
}

Ptr<IModule>& ModuleManager::getModule(const string& instanceName)
{
	for(t_module_types::iterator it=moduleTypes.begin();it!=moduleTypes.end();it++)
	{
		Ptr<IModule>& module=(*it)->getModule(instanceName);
		if (!module.isNull()) return module;
	}
	return IModule::nullRef;
}

Ptr<ModuleType>& ModuleManager::getModuleType(const string& type)
{
	for(t_module_types::iterator it=moduleTypes.begin();it!=moduleTypes.end();it++)
	{
		if ((*it)->getName()==type) return *it;
	}
	return ModuleType::nullRef;
}

void ModuleManager::sendToAll(TObject* mesg)
{
	for(t_module_types::iterator it=moduleTypes.begin();it!=moduleTypes.end();it++)
	{
		(*it)->sendToAll(mesg);
	}
}
