1 /*!
2 	@file
3 	@author		Georgiy Evmenov
4 	@date		09/2008
5 */
6 
7 #include "Precompiled.h"
8 #include "PanelMainProperties.h"
9 #include "Localise.h"
10 #include "PropertyFieldManager.h"
11 #include "UndoManager.h"
12 #include "WidgetSelectorManager.h"
13 #include "GroupMessage.h"
14 
15 namespace tools
16 {
17 
PanelMainProperties()18 	PanelMainProperties::PanelMainProperties() :
19 		BasePanelViewItem("PanelMainProperties.layout"),
20 		mCurrentWidget(nullptr),
21 		mUserDataTargetType("LE_TargetWidgetType")
22 	{
23 	}
24 
initialise()25 	void PanelMainProperties::initialise()
26 	{
27 		mPanelCell->setCaption(replaceTags("Main_properties"));
28 	}
29 
shutdown()30 	void PanelMainProperties::shutdown()
31 	{
32 		destroyPropertyFields();
33 	}
34 
update(MyGUI::Widget * _currentWidget)35 	void PanelMainProperties::update(MyGUI::Widget* _currentWidget)
36 	{
37 		hidePropertyFields();
38 
39 		mCurrentWidget = _currentWidget;
40 		if (mCurrentWidget == nullptr)
41 			return;
42 
43 		WidgetStyle* widgetType = WidgetTypes::getInstance().findWidgetStyle(mCurrentWidget->getTypeName());
44 		WidgetContainer* widgetContainer = EditorWidgets::getInstance().find(mCurrentWidget);
45 		bool existTargetType = widgetContainer->existUserData(mUserDataTargetType);
46 
47 		IPropertyField* field = getPropertyField(mWidgetClient, "Name", "Name");
48 		field->setTarget(_currentWidget);
49 		field->setValue(widgetContainer->getName());
50 
51 		if (widgetType->resizeable)
52 		{
53 			field = getPropertyField(mWidgetClient, "Position", "Position");
54 			field->setTarget(_currentWidget);
55 			field->setValue(widgetContainer->position());
56 		}
57 
58 		field = getPropertyField(mWidgetClient, "Type", "Type");
59 		field->setTarget(_currentWidget);
60 		if (existTargetType)
61 		{
62 			std::string targetType = widgetContainer->getUserData(mUserDataTargetType);
63 			field->setValue(targetType);
64 		}
65 		else
66 		{
67 			field->setValue(widgetContainer->getType());
68 		}
69 
70 		field = getPropertyField(mWidgetClient, "Align", "Align");
71 		field->setTarget(_currentWidget);
72 		field->setValue(widgetContainer->getAlign());
73 
74 		if (mCurrentWidget->isRootWidget())
75 		{
76 			field = getPropertyField(mWidgetClient, "Layer", "Layer");
77 			field->setTarget(_currentWidget);
78 			field->setValue(widgetContainer->getLayerName());
79 
80 			field = getPropertyField(mWidgetClient, "Template", "Bool");
81 			field->setTarget(_currentWidget);
82 			field->setValue(existTargetType ? "true" : "false");
83 		}
84 
85 		field = getPropertyField(mWidgetClient, "Skin", "Skin");
86 		field->setTarget(_currentWidget);
87 		field->setValue(widgetContainer->getSkin());
88 
89 		updateSize();
90 	}
91 
updateSize()92 	void PanelMainProperties::updateSize()
93 	{
94 		int height = 0;
95 
96 		for (MapPropertyField::iterator item = mFields.begin(); item != mFields.end(); ++ item)
97 		{
98 			if ((*item).second->getVisible())
99 			{
100 				MyGUI::IntSize size = (*item).second->getContentSize();
101 				(*item).second->setCoord(MyGUI::IntCoord(0, height, mMainWidget->getWidth(), size.height));
102 				height += size.height;
103 			}
104 		}
105 
106 		mPanelCell->setClientHeight(height);
107 	}
108 
destroyPropertyFields()109 	void PanelMainProperties::destroyPropertyFields()
110 	{
111 		for (MapPropertyField::iterator item = mFields.begin(); item != mFields.end(); ++ item)
112 			delete (*item).second;
113 		mFields.clear();
114 	}
115 
notifyActionSkin(const std::string & _type,const std::string & _value,bool _final)116 	void PanelMainProperties::notifyActionSkin(const std::string& _type, const std::string& _value, bool _final)
117 	{
118 		if (_final)
119 		{
120 			WidgetContainer* widgetContainer = EditorWidgets::getInstance().find(mCurrentWidget);
121 
122 			widgetContainer->setSkin(_value);
123 			if (isSkinExist(widgetContainer->getSkin()) || widgetContainer->getSkin().empty())
124 			{
125 				WidgetSelectorManager::getInstance().saveSelectedWidget();
126 
127 				MyGUI::xml::Document* savedDoc = EditorWidgets::getInstance().savexmlDocument();
128 				EditorWidgets::getInstance().clear();
129 				EditorWidgets::getInstance().loadxmlDocument(savedDoc);
130 				delete savedDoc;
131 
132 				WidgetSelectorManager::getInstance().restoreSelectedWidget();
133 			}
134 			else
135 			{
136 				std::string mess = MyGUI::utility::toString("Skin '", widgetContainer->getSkin(), "' not found. This value will be saved.");
137 				GroupMessage::getInstance().addMessage(mess, MyGUI::LogLevel::Error);
138 			}
139 
140 			UndoManager::getInstance().addValue(PR_PROPERTIES);
141 		}
142 	}
143 
isSkinExist(const std::string & _skinName)144 	bool PanelMainProperties::isSkinExist(const std::string& _skinName)
145 	{
146 		return _skinName == "Default" ||
147 			MyGUI::SkinManager::getInstance().isExist(_skinName) ||
148 			(MyGUI::LayoutManager::getInstance().isExist(_skinName) && checkTemplate(_skinName));
149 	}
150 
checkTemplate(const std::string & _skinName)151 	bool PanelMainProperties::checkTemplate(const std::string& _skinName)
152 	{
153 		MyGUI::ResourceLayout* templateInfo = MyGUI::LayoutManager::getInstance().getByName(_skinName, false);
154 		if (templateInfo != nullptr)
155 		{
156 			const MyGUI::VectorWidgetInfo& data = templateInfo->getLayoutData();
157 			for (MyGUI::VectorWidgetInfo::const_iterator container = data.begin(); container != data.end(); ++container)
158 			{
159 				if (container->name == "Root")
160 					return true;
161 			}
162 		}
163 
164 		return false;
165 	}
166 
notifyActionLayer(const std::string & _type,const std::string & _value,bool _final)167 	void PanelMainProperties::notifyActionLayer(const std::string& _type, const std::string& _value, bool _final)
168 	{
169 		if (_final)
170 		{
171 			WidgetContainer* widgetContainer = EditorWidgets::getInstance().find(mCurrentWidget);
172 			widgetContainer->setLayerName(_value);
173 
174 			UndoManager::getInstance().addValue(PR_PROPERTIES);
175 		}
176 	}
177 
notifyActionName(const std::string & _type,const std::string & _value,bool _final)178 	void PanelMainProperties::notifyActionName(const std::string& _type, const std::string& _value, bool _final)
179 	{
180 		if (_final)
181 		{
182 			WidgetContainer* widgetContainer = EditorWidgets::getInstance().find(mCurrentWidget);
183 			widgetContainer->setName(_value);
184 
185 			UndoManager::getInstance().addValue(PR_PROPERTIES);
186 		}
187 	}
188 
notifyActionType(const std::string & _type,const std::string & _value,bool _final)189 	void PanelMainProperties::notifyActionType(const std::string& _type, const std::string& _value, bool _final)
190 	{
191 		if (_final)
192 		{
193 			WidgetContainer* widgetContainer = EditorWidgets::getInstance().find(mCurrentWidget);
194 			if (!widgetContainer->existUserData(mUserDataTargetType))
195 			{
196 				widgetContainer->setType(_value);
197 
198 				WidgetSelectorManager::getInstance().saveSelectedWidget();
199 
200 				MyGUI::xml::Document* savedDoc = EditorWidgets::getInstance().savexmlDocument();
201 				EditorWidgets::getInstance().clear();
202 				EditorWidgets::getInstance().loadxmlDocument(savedDoc);
203 				delete savedDoc;
204 
205 				WidgetSelectorManager::getInstance().restoreSelectedWidget();
206 
207 				UndoManager::getInstance().addValue(PR_PROPERTIES);
208 			}
209 			else
210 			{
211 				widgetContainer->setUserData(mUserDataTargetType, _value);
212 
213 				WidgetSelectorManager::getInstance().saveSelectedWidget();
214 
215 				MyGUI::xml::Document* savedDoc = EditorWidgets::getInstance().savexmlDocument();
216 				EditorWidgets::getInstance().clear();
217 				EditorWidgets::getInstance().loadxmlDocument(savedDoc);
218 				delete savedDoc;
219 
220 				WidgetSelectorManager::getInstance().restoreSelectedWidget();
221 
222 				UndoManager::getInstance().addValue(PR_PROPERTIES);
223 			}
224 		}
225 	}
226 
notifyActionAlign(const std::string & _type,const std::string & _value,bool _final)227 	void PanelMainProperties::notifyActionAlign(const std::string& _type, const std::string& _value, bool _final)
228 	{
229 		if (_final)
230 		{
231 			WidgetContainer* widgetContainer = EditorWidgets::getInstance().find(mCurrentWidget);
232 
233 			widgetContainer->setAlign(_value);
234 			widgetContainer->getWidget()->setAlign(MyGUI::Align::parse(_value));
235 
236 			UndoManager::getInstance().addValue(PR_PROPERTIES);
237 		}
238 	}
239 
notifyActionTemplate(const std::string & _type,const std::string & _value,bool _final)240 	void PanelMainProperties::notifyActionTemplate(const std::string& _type, const std::string& _value, bool _final)
241 	{
242 		if (_final)
243 		{
244 			WidgetContainer* widgetContainer = EditorWidgets::getInstance().find(mCurrentWidget);
245 			if (_value == "true")
246 			{
247 				if (!widgetContainer->existUserData(mUserDataTargetType))
248 				{
249 					widgetContainer->setUserData(mUserDataTargetType, widgetContainer->getType());
250 					widgetContainer->setType(MyGUI::Widget::getClassTypeName());
251 
252 					WidgetSelectorManager::getInstance().saveSelectedWidget();
253 
254 					MyGUI::xml::Document* savedDoc = EditorWidgets::getInstance().savexmlDocument();
255 					EditorWidgets::getInstance().clear();
256 					EditorWidgets::getInstance().loadxmlDocument(savedDoc);
257 					delete savedDoc;
258 
259 					WidgetSelectorManager::getInstance().restoreSelectedWidget();
260 
261 					UndoManager::getInstance().addValue(PR_PROPERTIES);
262 				}
263 			}
264 			else
265 			{
266 				if (widgetContainer->existUserData(mUserDataTargetType))
267 				{
268 					std::string targetType = widgetContainer->getUserData(mUserDataTargetType);
269 					widgetContainer->clearUserData(mUserDataTargetType);
270 					widgetContainer->setType(targetType);
271 
272 					WidgetSelectorManager::getInstance().saveSelectedWidget();
273 
274 					MyGUI::xml::Document* savedDoc = EditorWidgets::getInstance().savexmlDocument();
275 					EditorWidgets::getInstance().clear();
276 					EditorWidgets::getInstance().loadxmlDocument(savedDoc);
277 					delete savedDoc;
278 
279 					WidgetSelectorManager::getInstance().restoreSelectedWidget();
280 
281 					UndoManager::getInstance().addValue(PR_PROPERTIES);
282 				}
283 			}
284 		}
285 	}
286 
getPropertyField(MyGUI::Widget * _client,const std::string & _name,const std::string & _type)287 	IPropertyField* PanelMainProperties::getPropertyField(MyGUI::Widget* _client, const std::string& _name, const std::string& _type)
288 	{
289 		MapPropertyField::iterator item = mFields.find(_name);
290 		if (item != mFields.end())
291 		{
292 			(*item).second->setVisible(true);
293 			return (*item).second;
294 		}
295 
296 		IPropertyField* result = PropertyFieldManager::getInstance().createPropertyField(_client, _type);
297 		result->setName(_name);
298 		result->eventAction = MyGUI::newDelegate(this, &PanelMainProperties::notifyAction);
299 
300 		mFields[_name] = result;
301 
302 		return result;
303 	}
304 
hidePropertyFields()305 	void PanelMainProperties::hidePropertyFields()
306 	{
307 		for (MapPropertyField::iterator item = mFields.begin(); item != mFields.end(); ++ item)
308 			(*item).second->setVisible(false);
309 	}
310 
notifyAction(const std::string & _name,const std::string & _value,bool _final)311 	void PanelMainProperties::notifyAction(const std::string& _name, const std::string& _value, bool _final)
312 	{
313 		if (_name == "Skin")
314 			notifyActionSkin(_name, _value, _final);
315 		else if (_name == "Layer")
316 			notifyActionLayer(_name, _value, _final);
317 		else if (_name == "Name")
318 			notifyActionName(_name, _value, _final);
319 		else if (_name == "Type")
320 			notifyActionType(_name, _value, _final);
321 		else if (_name == "Align")
322 			notifyActionAlign(_name, _value, _final);
323 		else if (_name == "Template")
324 			notifyActionTemplate(_name, _value, _final);
325 	}
326 
327 }
328