1 /*
2  * This source file is part of MyGUI. For the latest info, see http://mygui.info/
3  * Distributed under the MIT License
4  * (See accompanying file COPYING.MIT or copy at http://opensource.org/licenses/MIT)
5  */
6 
7 #include "MyGUI_Precompiled.h"
8 #include "MyGUI_LayoutManager.h"
9 #include "MyGUI_ResourceManager.h"
10 #include "MyGUI_FactoryManager.h"
11 #include "MyGUI_WidgetManager.h"
12 
13 namespace MyGUI
14 {
15 
16 	template <> LayoutManager* Singleton<LayoutManager>::msInstance = nullptr;
17 	template <> const char* Singleton<LayoutManager>::mClassTypeName = "LayoutManager";
18 
LayoutManager()19 	LayoutManager::LayoutManager() :
20 		mIsInitialise(false),
21 		mXmlLayoutTagName("Layout")
22 	{
23 	}
24 
initialise()25 	void LayoutManager::initialise()
26 	{
27 		MYGUI_ASSERT(!mIsInitialise, getClassTypeName() << " initialised twice");
28 		MYGUI_LOG(Info, "* Initialise: " << getClassTypeName());
29 
30 		ResourceManager::getInstance().registerLoadXmlDelegate(mXmlLayoutTagName) = newDelegate(this, &LayoutManager::_load);
31 
32 		std::string resourceCategory = ResourceManager::getInstance().getCategoryName();
33 		FactoryManager::getInstance().registerFactory<ResourceLayout>(resourceCategory);
34 
35 		MYGUI_LOG(Info, getClassTypeName() << " successfully initialized");
36 		mIsInitialise = true;
37 	}
38 
shutdown()39 	void LayoutManager::shutdown()
40 	{
41 		MYGUI_ASSERT(mIsInitialise, getClassTypeName() << " is not initialised");
42 		MYGUI_LOG(Info, "* Shutdown: " << getClassTypeName());
43 
44 		ResourceManager::getInstance().unregisterLoadXmlDelegate(mXmlLayoutTagName);
45 
46 		std::string resourceCategory = ResourceManager::getInstance().getCategoryName();
47 		FactoryManager::getInstance().unregisterFactory<ResourceLayout>(resourceCategory);
48 
49 		MYGUI_LOG(Info, getClassTypeName() << " successfully shutdown");
50 		mIsInitialise = false;
51 	}
52 
_load(xml::ElementPtr _node,const std::string & _file,Version _version)53 	void LayoutManager::_load(xml::ElementPtr _node, const std::string& _file, Version _version)
54 	{
55 		ResourceLayout* resource = new ResourceLayout(_node, _file);
56 		ResourceManager::getInstance().addResource(resource);
57 	}
58 
loadLayout(const std::string & _file,const std::string & _prefix,Widget * _parent)59 	VectorWidgetPtr LayoutManager::loadLayout(const std::string& _file, const std::string& _prefix, Widget* _parent)
60 	{
61 		mCurrentLayoutName = _file;
62 
63 		ResourceLayout* resource = getByName(_file, false);
64 		if (!resource)
65 		{
66 			ResourceManager::getInstance().load(_file);
67 			resource = getByName(_file, false);
68 		}
69 
70 		VectorWidgetPtr result;
71 		if (resource)
72 			result = resource->createLayout(_prefix, _parent);
73 		else
74 			MYGUI_LOG(Warning, "Layout '" << _file << "' couldn't be loaded");
75 
76 		mCurrentLayoutName = "";
77 
78 		return result;
79 	}
80 
unloadLayout(VectorWidgetPtr & _widgets)81 	void LayoutManager::unloadLayout(VectorWidgetPtr& _widgets)
82 	{
83 		WidgetManager::getInstance().destroyWidgets(_widgets);
84 	}
85 
getByName(const std::string & _name,bool _throw) const86 	ResourceLayout* LayoutManager::getByName(const std::string& _name, bool _throw) const
87 	{
88 		std::string skinName = BackwardCompatibility::getSkinRename(_name);
89 		IResource* result = ResourceManager::getInstance().getByName(skinName, false);
90 
91 		if (result != nullptr)
92 		{
93 			ResourceLayout* resource = result->castType<ResourceLayout>(false);
94 			if (resource == nullptr)
95 			{
96 				MYGUI_ASSERT(!_throw, "Resource '" << skinName << "' is not ResourceLayout type");
97 			}
98 			return resource;
99 		}
100 
101 		MYGUI_ASSERT(!_throw, "ResourceLayout '" << skinName << "' not found");
102 		return nullptr;
103 	}
104 
getCurrentLayout() const105 	const std::string& LayoutManager::getCurrentLayout() const
106 	{
107 		return mCurrentLayoutName;
108 	}
109 
isExist(const std::string & _name) const110 	bool LayoutManager::isExist(const std::string& _name) const
111 	{
112 		return getByName(_name, false) != nullptr;
113 	}
114 
115 } // namespace MyGUI
116