Esempio n. 1
0
/*************************************************************************
    Unregister all window renderer factories and unload shared modules
*************************************************************************/
void Scheme::unloadWindowRendererFactories()
{
    // for all widget modules loaded
    for (WRModuleList::iterator cmod = d_windowRendererModules.begin();
        cmod != d_windowRendererModules.end(); ++cmod)
    {
        // assume module's factories were already removed if wrModule is 0.
        if (!(*cmod).factoryModule)
            continue;

        // see if we should just unregister all factories available in the
        // module (i.e. No factories explicitly specified)
        if ((*cmod).types.size() == 0)
        {
            (*cmod).factoryModule->unregisterAllFactories();
        }
        // remove all window factories explicitly registered for this module
        else
        {
            UIModule::TypeList::const_iterator elem = (*cmod).types.begin();
            for (; elem != (*cmod).types.end(); ++elem)
                (*cmod).factoryModule->unregisterFactory(*elem);
        }

        // unload dynamic module as required
        if ((*cmod).dynamicModule)
        {
            CEGUI_DELETE_AO (*cmod).dynamicModule;
            (*cmod).dynamicModule = 0;
        }

        (*cmod).factoryModule = 0;
    }
}
/*************************************************************************
    Remove a factory by name
*************************************************************************/
void WindowRendererManager::removeFactory(const String& name)
{
    WR_Registry::iterator i = d_wrReg.find(name);

	// non-existing or already removed? The latter can happen when more then one Scheme
	// was loaded using the same renderer.
	if (i == d_wrReg.end())
	{
		return;
	}

    // see if we own this factory
    OwnedFactoryList::iterator j = std::find(d_ownedFactories.begin(),
                                             d_ownedFactories.end(),
                                             (*i).second);

    char addr_buff[32];
    sprintf(addr_buff, "(%p)", static_cast<void*>((*i).second));

    d_wrReg.erase(name);

    Logger::getSingleton().logEvent("WindowRendererFactory for '" + name +
                                    "' WindowRenderers removed. " + addr_buff);

    // delete factory object if we created it
    if (j != d_ownedFactories.end())
    {
        Logger::getSingleton().logEvent("Deleted WindowRendererFactory for '" +
                                        (*j)->getName() +
                                        "' WindowRenderers.");

        CEGUI_DELETE_AO (*j);
        d_ownedFactories.erase(j);
    }
}
/*************************************************************************
	removes a WindowFactory from the registry (by name)
*************************************************************************/
void WindowFactoryManager::removeFactory(const String& name)
{
    WindowFactoryRegistry::iterator i = d_factoryRegistry.find(name);

    // exit if no factory exists for this type
    if (i == d_factoryRegistry.end())
        return;

    // see if we own this factory
    OwnedWindowFactoryList::iterator j = std::find(d_ownedFactories.begin(),
                                                   d_ownedFactories.end(),
                                                   (*i).second);

    char addr_buff[32];
    sprintf(addr_buff, "(%p)", static_cast<void*>((*i).second));

	d_factoryRegistry.erase(name);

    Logger::getSingleton().logEvent("WindowFactory for '" + name +
                                    "' windows removed. " + addr_buff);

    // delete factory object if we created it
    if (j != d_ownedFactories.end())
    {
        Logger::getSingleton().logEvent("Deleted WindowFactory for '" +
                                        (*j)->getTypeName() +
                                        "' windows.");

        CEGUI_DELETE_AO (*j);
        d_ownedFactories.erase(j);
    }
}