MyGUI  3.2.1
MyGUI_WidgetManager.cpp
Go to the documentation of this file.
00001 /*
00002  * This source file is part of MyGUI. For the latest info, see http://mygui.info/
00003  * Distributed under the MIT License
00004  * (See accompanying file COPYING.MIT or copy at http://opensource.org/licenses/MIT)
00005  */
00006 
00007 #include "MyGUI_Precompiled.h"
00008 #include "MyGUI_WidgetManager.h"
00009 #include "MyGUI_Gui.h"
00010 #include "MyGUI_Widget.h"
00011 #include "MyGUI_FactoryManager.h"
00012 
00013 #include "MyGUI_Button.h"
00014 #include "MyGUI_Canvas.h"
00015 #include "MyGUI_ComboBox.h"
00016 #include "MyGUI_DDContainer.h"
00017 #include "MyGUI_EditBox.h"
00018 #include "MyGUI_ItemBox.h"
00019 #include "MyGUI_ListBox.h"
00020 #include "MyGUI_MenuBar.h"
00021 #include "MyGUI_MenuControl.h"
00022 #include "MyGUI_MenuItem.h"
00023 #include "MyGUI_MultiListBox.h"
00024 #include "MyGUI_MultiListItem.h"
00025 #include "MyGUI_PopupMenu.h"
00026 #include "MyGUI_ProgressBar.h"
00027 #include "MyGUI_ScrollBar.h"
00028 #include "MyGUI_ScrollView.h"
00029 #include "MyGUI_ImageBox.h"
00030 #include "MyGUI_TextBox.h"
00031 #include "MyGUI_TabControl.h"
00032 #include "MyGUI_TabItem.h"
00033 #include "MyGUI_Widget.h"
00034 #include "MyGUI_Window.h"
00035 
00036 #include "MyGUI_BackwardCompatibility.h"
00037 
00038 namespace MyGUI
00039 {
00040 
00041     template <> WidgetManager* Singleton<WidgetManager>::msInstance = nullptr;
00042     template <> const char* Singleton<WidgetManager>::mClassTypeName = "WidgetManager";
00043 
00044     WidgetManager::WidgetManager() :
00045         mIsInitialise(false),
00046         mCategoryName("Widget")
00047     {
00048     }
00049 
00050     void WidgetManager::initialise()
00051     {
00052         MYGUI_ASSERT(!mIsInitialise, getClassTypeName() << " initialised twice");
00053         MYGUI_LOG(Info, "* Initialise: " << getClassTypeName());
00054 
00055         FactoryManager& factory = FactoryManager::getInstance();
00056 
00057         factory.registerFactory<Button>(mCategoryName);
00058         factory.registerFactory<Canvas>(mCategoryName);
00059         factory.registerFactory<ComboBox>(mCategoryName);
00060         factory.registerFactory<DDContainer>(mCategoryName);
00061         factory.registerFactory<EditBox>(mCategoryName);
00062         factory.registerFactory<ItemBox>(mCategoryName);
00063         factory.registerFactory<ListBox>(mCategoryName);
00064         factory.registerFactory<MenuBar>(mCategoryName);
00065         factory.registerFactory<MenuControl>(mCategoryName);
00066         factory.registerFactory<MenuItem>(mCategoryName);
00067         factory.registerFactory<MultiListBox>(mCategoryName);
00068         factory.registerFactory<MultiListItem>(mCategoryName);
00069         factory.registerFactory<PopupMenu>(mCategoryName);
00070         factory.registerFactory<ProgressBar>(mCategoryName);
00071         factory.registerFactory<ScrollBar>(mCategoryName);
00072         factory.registerFactory<ScrollView>(mCategoryName);
00073         factory.registerFactory<ImageBox>(mCategoryName);
00074         factory.registerFactory<TextBox>(mCategoryName);
00075         factory.registerFactory<TabControl>(mCategoryName);
00076         factory.registerFactory<TabItem>(mCategoryName);
00077         factory.registerFactory<Widget>(mCategoryName);
00078         factory.registerFactory<Window>(mCategoryName);
00079 
00080         BackwardCompatibility::registerWidgetTypes();
00081 
00082         Gui::getInstance().eventFrameStart += newDelegate(this, &WidgetManager::notifyEventFrameStart);
00083 
00084         MYGUI_LOG(Info, getClassTypeName() << " successfully initialized");
00085         mIsInitialise = true;
00086     }
00087 
00088     void WidgetManager::shutdown()
00089     {
00090         MYGUI_ASSERT(mIsInitialise, getClassTypeName() << " is not initialised");
00091         MYGUI_LOG(Info, "* Shutdown: " << getClassTypeName());
00092 
00093         Gui::getInstance().eventFrameStart -= newDelegate(this, &WidgetManager::notifyEventFrameStart);
00094         _deleteDelayWidgets();
00095 
00096         mVectorIUnlinkWidget.clear();
00097 
00098         FactoryManager::getInstance().unregisterFactory(mCategoryName);
00099 
00100         MYGUI_LOG(Info, getClassTypeName() << " successfully shutdown");
00101         mIsInitialise = false;
00102     }
00103 
00104     Widget* WidgetManager::createWidget(WidgetStyle _style, const std::string& _type, const std::string& _skin, const IntCoord& _coord, Widget* _parent, ICroppedRectangle* _cropeedParent, const std::string& _name)
00105     {
00106         IObject* object = FactoryManager::getInstance().createObject(mCategoryName, _type);
00107         if (object != nullptr)
00108         {
00109             Widget* widget = object->castType<Widget>();
00110             widget->_initialise(_style, _coord, _skin, _parent, _cropeedParent, _name);
00111 
00112             return widget;
00113         }
00114 
00115         MYGUI_EXCEPT("factory '" << _type << "' not found");
00116     }
00117 
00118     void WidgetManager::destroyWidget(Widget* _widget)
00119     {
00120         Gui::getInstance().destroyWidget(_widget);
00121     }
00122 
00123     void WidgetManager::destroyWidgets(const VectorWidgetPtr& _widgets)
00124     {
00125         Gui::getInstance().destroyWidgets(_widgets);
00126     }
00127 
00128     void WidgetManager::destroyWidgets(EnumeratorWidgetPtr _widgets)
00129     {
00130         Gui::getInstance().destroyWidgets(_widgets);
00131     }
00132 
00133     void WidgetManager::registerUnlinker(IUnlinkWidget* _unlink)
00134     {
00135         unregisterUnlinker(_unlink);
00136         mVectorIUnlinkWidget.push_back(_unlink);
00137     }
00138 
00139     void WidgetManager::unregisterUnlinker(IUnlinkWidget* _unlink)
00140     {
00141         VectorIUnlinkWidget::iterator iter = std::remove(mVectorIUnlinkWidget.begin(), mVectorIUnlinkWidget.end(), _unlink);
00142         if (iter != mVectorIUnlinkWidget.end())
00143             mVectorIUnlinkWidget.erase(iter);
00144     }
00145 
00146     void WidgetManager::unlinkFromUnlinkers(Widget* _widget)
00147     {
00148         for (VectorIUnlinkWidget::iterator iter = mVectorIUnlinkWidget.begin(); iter != mVectorIUnlinkWidget.end(); ++iter)
00149         {
00150             (*iter)->_unlinkWidget(_widget);
00151         }
00152     }
00153 
00154     bool WidgetManager::isFactoryExist(const std::string& _type)
00155     {
00156         if (FactoryManager::getInstance().isFactoryExist(mCategoryName, _type))
00157         {
00158             return true;
00159         }
00160 
00161         return false;
00162     }
00163 
00164     void WidgetManager::notifyEventFrameStart(float _time)
00165     {
00166         _deleteDelayWidgets();
00167     }
00168 
00169     void WidgetManager::_deleteWidget(Widget* _widget)
00170     {
00171         _widget->_shutdown();
00172 
00173         for (VectorWidgetPtr::iterator entry = mDestroyWidgets.begin(); entry != mDestroyWidgets.end(); ++entry)
00174         {
00175             /*if ((*entry) == _widget)
00176                 return;*/
00177             MYGUI_ASSERT((*entry) != _widget, "double delete widget");
00178         }
00179 
00180         mDestroyWidgets.push_back(_widget);
00181     }
00182 
00183     void WidgetManager::_deleteDelayWidgets()
00184     {
00185         if (!mDestroyWidgets.empty())
00186         {
00187             for (VectorWidgetPtr::iterator entry = mDestroyWidgets.begin(); entry != mDestroyWidgets.end(); ++entry)
00188                 delete (*entry);
00189             mDestroyWidgets.clear();
00190         }
00191     }
00192 
00193     const std::string& WidgetManager::getCategoryName() const
00194     {
00195         return mCategoryName;
00196     }
00197 
00198 } // namespace MyGUI