void GuiModuleFactory::RegisterGuiPlugin(string filename) {
    typedef string (* GetTypeFunc)();
    typedef Gui* (* CreateFunc)( Module* mod );
    GetTypeFunc  GetType;
    CreateFunc   Create;
    // GError       **error;

    filename = "./plugins/" + filename;

    GModule*  gm = g_module_open( filename.c_str(), G_MODULE_BIND_MASK );
    if( gm!=NULL ) {
        if( g_module_symbol( gm, "GetGuiType", (gpointer *)&GetType ) == TRUE ) {
            if( g_module_symbol( gm, "CreateGui", (gpointer *)&Create ) == TRUE ) {
                RegisterGui( GetType(), Create );
            }
            else {
                TRACE( "GuiModuleFactory::RegisterGuiPlugin - Nie znaleziono "
                       "CreateGui() w %s\n", filename.c_str() );
            }
        }
        else {
            TRACE( "MGuiModuleFactory::RegisterGuiPlugin - Nie znaleziono CreateGui() w pliku %s\n",
                   filename.c_str() );
        }
    }
}
/**
* static method SetParent must be called first
*/
tcContainerGui::tcContainerGui(const wxPoint& pos, const wxString& configFile, const wxString& name) 
                             : tcXmlWindow(parent, pos, wxSize(10, 10), configFile, name, parent),
	drawCount(0),
	dragIsArmed(false),
	parentItem(0),
	isLButtonDown(false),
    windowDragOn(false),
    protectDeselectIdx(999),
    draggingSelectionBox(false)
{

	// put gui window on top
	SetBaseRenderBin(parent->GetBaseRenderBin() + windowLayer*10);
	wxWindow::Raise();

	tc3DWindow2::SetStencilLayer(windowLayer-3); // assumes windowLayer starts at 4

	windowLayer++;

    TiXmlNode* root = config->FirstChild("Window");
    if (!root)
    {
        fprintf(stderr, "tcContainerGui::tcContainerGui - Missing top level <Window> tag\n");
        return;
    }

	TiXmlNode* current = root;

	/*
    TiXmlElement* elt = current->ToElement();
    
	// background image
	std::string imageName = elt->Attribute("BackgroundImage");
	if (imageName.size() > 2)
	{
		LoadBackgroundImage(imageName.c_str());
	}

	// size of window
	
	int xmlWidth, xmlHeight;
	elt->Attribute("Width", &xmlWidth);
	elt->Attribute("Height", &xmlHeight);

	SetSize(pos.x, pos.y, xmlWidth, xmlHeight); // set all size params
	*/

	// add slots
	current = root->FirstChild("Slot");
    while (current)
    {
		int x = 0;
		int y = 0;
		int size = 0;
		TiXmlElement* elt = current->ToElement();
		elt->Attribute("X", &x);
		elt->Attribute("Y", &y);
		elt->Attribute("Size", &size);

		tcRect loc;
		loc.Set(x, x+size, y, y+size);
		AddSlot(loc);

        current = current->NextSibling("Slot");
    }

    SetUseRenderSurface(true);
    SetRenderSurfaceUpdateInterval(4);

	SetActive(true);

	RegisterGui();

#ifdef _DEBUG
	fprintf(stdout, "tcContainerGui::tcContainerGui - %s, %d slots\n", name.c_str(),
		slots.size());
#endif

    SetBorderDraw(true);

}
GuiModuleFactory::GuiModuleFactory() {
    RegisterGui( GConstant::GetTypeStatic(), GConstant::Create );
    RegisterGui( GSlider::GetTypeStatic(), GSlider::Create );
    RegisterGui( GGate::GetTypeStatic(), GGate::Create );
    RegisterGui( GMonitor::GetTypeStatic(), GMonitor::Create );
    RegisterGui( GFilter::GetTypeStatic(), GFilter::Create );
    RegisterGui( GGain::GetTypeStatic(), GGain::Create );
    RegisterGui( GADSR::GetTypeStatic(), GADSR::Create );
    //RegisterGui( GFFT::GetTypeStatic(), GFFT::Create );
    RegisterGui( GMonitorGraph::GetTypeStatic(), GMonitorGraph::Create );
    RegisterGui( GDelay::GetTypeStatic(), GDelay::Create );
    RegisterGui( GFeedbackDelay::GetTypeStatic(), GFeedbackDelay::Create );
    RegisterGui( GVariableDelay::GetTypeStatic(), GVariableDelay::Create );
    if ( g_module_supported() == TRUE ) {
        RegisterAllGuiPlugins();
    }
}