1 // Aseprite
2 // Copyright (C) 2001-2017  David Capello
3 //
4 // This program is distributed under the terms of
5 // the End-User License Agreement for Aseprite.
6 
7 #ifndef APP_WIDGET_LOADER_H_INCLUDED
8 #define APP_WIDGET_LOADER_H_INCLUDED
9 #pragma once
10 
11 #include "app/i18n/xml_translator.h"
12 #include "app/widget_type_mismatch.h"
13 
14 #include <map>
15 #include <string>
16 
17 class TiXmlElement;
18 
19 namespace ui {
20   class Widget;
21   class TooltipManager;
22 }
23 
24 namespace app {
25 
26   class WidgetLoader {
27   public:
28     // Interface used to create customized widgets.
29     class IWidgetTypeCreator {
30     public:
~IWidgetTypeCreator()31       virtual ~IWidgetTypeCreator() { }
32       virtual void dispose() = 0;
33       virtual ui::Widget* createWidgetFromXml(const TiXmlElement* xmlElem) = 0;
34     };
35 
36     WidgetLoader();
37     ~WidgetLoader();
38 
39     // Adds a new widget type that can be referenced in the .xml file
40     // with an XML element. The "tagName" is the same name as in the
41     // .xml should appear as <tagName>...</tagName>
42     //
43     // The "creator" will not be deleted automatically at the
44     // WidgetLoader dtor.
45     void addWidgetType(const char* tagName, IWidgetTypeCreator* creator);
46 
47     // Loads the specified widget from an .xml file.
48     ui::Widget* loadWidget(const char* fileName, const char* widgetId, ui::Widget* widget = NULL);
49 
50     template<class T>
51     T* loadWidgetT(const char* fileName, const char* widgetId, T* widget = NULL) {
52       T* specificWidget = dynamic_cast<T*>(loadWidget(fileName, widgetId, widget));
53       if (!specificWidget)
54         throw WidgetTypeMismatch(widgetId);
55 
56       return specificWidget;
57     }
58 
59   private:
60     ui::Widget* loadWidgetFromXmlFile(
61       const std::string& xmlFilename,
62       const std::string& widgetId,
63       ui::Widget* widget);
64 
65     ui::Widget* convertXmlElementToWidget(const TiXmlElement* elem, ui::Widget* root, ui::Widget* parent, ui::Widget* widget);
66     void fillWidgetWithXmlElementAttributes(const TiXmlElement* elem, ui::Widget* root, ui::Widget* widget);
67     void fillWidgetWithXmlElementAttributesWithChildren(const TiXmlElement* elem, ui::Widget* root, ui::Widget* widget);
68 
69     typedef std::map<std::string, IWidgetTypeCreator*> TypeCreatorsMap;
70 
71     TypeCreatorsMap m_typeCreators;
72     ui::TooltipManager* m_tooltipManager;
73     XmlTranslator m_xmlTranslator;
74   };
75 
76 } // namespace app
77 
78 #endif
79