src/window.h
branchcpp_gui
changeset 6267 7c8ec33959b1
parent 6264 9fc3b5467396
child 6268 4b5241e5dd10
equal deleted inserted replaced
6266:3fa43db5af91 6267:7c8ec33959b1
  1030 {
  1030 {
  1031 	typedef BaseWindow* (*CreateFn)(WindowNumber);
  1031 	typedef BaseWindow* (*CreateFn)(WindowNumber);
  1032 
  1032 
  1033 	typedef std::map<WindowClass, WindowFactory*> Factories;
  1033 	typedef std::map<WindowClass, WindowFactory*> Factories;
  1034 
  1034 
  1035 	static Factories s_factories;
  1035 	static Factories& GetFactories()
       
  1036 	{
       
  1037 		static Factories s_factories;
       
  1038 		return s_factories;
       
  1039 	}
  1036 
  1040 
  1037 	WindowClass m_cls;
  1041 	WindowClass m_cls;
  1038 	CreateFn    m_creator;
  1042 	CreateFn    m_creator;
  1039 
  1043 
  1040 	WindowFactory(WindowClass cls, CreateFn creator)
  1044 	WindowFactory(WindowClass cls, CreateFn creator)
  1041 		: m_cls(cls)
  1045 		: m_cls(cls)
  1042 		, m_creator(creator)
  1046 		, m_creator(creator)
  1043 	{
  1047 	{
  1044 		std::pair<Factories::iterator, bool> P = s_factories.insert(Factories::value_type(m_cls, this));
  1048 		std::pair<Factories::iterator, bool> P = GetFactories().insert(Factories::value_type(m_cls, this));
  1045 		assert(P.second);
  1049 		assert(P.second);
  1046 	}
  1050 	}
  1047 
  1051 
  1048 	~WindowFactory()
  1052 	~WindowFactory()
  1049 	{
  1053 	{
  1050 		s_factories.erase(m_cls);
  1054 		GetFactories().erase(m_cls);
  1051 	}
  1055 	}
  1052 
  1056 
  1053 	static BaseWindow* NewWindow(WindowClass cls, WindowNumber num)
  1057 	static BaseWindow* NewWindow(WindowClass cls, WindowNumber num)
  1054 	{
  1058 	{
  1055 		Factories::iterator it = s_factories.find(cls);
  1059 		Factories::iterator it = GetFactories().find(cls);
  1056 		if (it == s_factories.end()) return NULL;
  1060 		if (it == GetFactories().end()) return NULL;
  1057 		WindowFactory *f = (*it).second;
  1061 		WindowFactory *f = (*it).second;
  1058 		BaseWindow *w = f->m_creator(num);
  1062 		BaseWindow *w = f->m_creator(num);
  1059 		return w;
  1063 		return w;
  1060 	}
  1064 	}
  1061 
  1065