MyGUI  3.0.1
MyGUI_WidgetManager.cpp
Go to the documentation of this file.
00001 
00007 /*
00008     This file is part of MyGUI.
00009 
00010     MyGUI is free software: you can redistribute it and/or modify
00011     it under the terms of the GNU Lesser General Public License as published by
00012     the Free Software Foundation, either version 3 of the License, or
00013     (at your option) any later version.
00014 
00015     MyGUI is distributed in the hope that it will be useful,
00016     but WITHOUT ANY WARRANTY; without even the implied warranty of
00017     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00018     GNU Lesser General Public License for more details.
00019 
00020     You should have received a copy of the GNU Lesser General Public License
00021     along with MyGUI.  If not, see <http://www.gnu.org/licenses/>.
00022 */
00023 #include "MyGUI_Precompiled.h"
00024 #include "MyGUI_Gui.h"
00025 #include "MyGUI_WidgetManager.h"
00026 #include "MyGUI_LayerManager.h"
00027 #include "MyGUI_Widget.h"
00028 #include "MyGUI_IWidgetCreator.h"
00029 #include "MyGUI_IWidgetFactory.h"
00030 #include "MyGUI_FactoryManager.h"
00031 
00032 #include "MyGUI_Button.h"
00033 #include "MyGUI_Canvas.h"
00034 #include "MyGUI_ComboBox.h"
00035 #include "MyGUI_DDContainer.h"
00036 #include "MyGUI_Edit.h"
00037 #include "MyGUI_HScroll.h"
00038 #include "MyGUI_ItemBox.h"
00039 #include "MyGUI_List.h"
00040 #include "MyGUI_ListBox.h"
00041 #include "MyGUI_ListCtrl.h"
00042 #include "MyGUI_MenuBar.h"
00043 #include "MyGUI_MenuCtrl.h"
00044 #include "MyGUI_MenuItem.h"
00045 #include "MyGUI_Message.h"
00046 #include "MyGUI_MultiList.h"
00047 #include "MyGUI_PopupMenu.h"
00048 #include "MyGUI_Progress.h"
00049 #include "MyGUI_ScrollView.h"
00050 #include "MyGUI_StaticImage.h"
00051 #include "MyGUI_StaticText.h"
00052 #include "MyGUI_Tab.h"
00053 #include "MyGUI_TabItem.h"
00054 #include "MyGUI_VScroll.h"
00055 #include "MyGUI_Widget.h"
00056 #include "MyGUI_Window.h"
00057 
00058 namespace MyGUI
00059 {
00060 
00061     MYGUI_INSTANCE_IMPLEMENT( WidgetManager )
00062 
00063     void WidgetManager::initialise()
00064     {
00065         MYGUI_ASSERT(!mIsInitialise, INSTANCE_TYPE_NAME << " initialised twice");
00066         MYGUI_LOG(Info, "* Initialise: " << INSTANCE_TYPE_NAME);
00067 
00068         //registerUnlinker(this);
00069 
00070         FactoryManager& factory = FactoryManager::getInstance();
00071 
00072         factory.registerFactory<Button>("Widget");
00073         factory.registerFactory<Canvas>("Widget");
00074         factory.registerFactory<ComboBox>("Widget");
00075         factory.registerFactory<DDContainer>("Widget");
00076         factory.registerFactory<Edit>("Widget");
00077         factory.registerFactory<HScroll>("Widget");
00078         factory.registerFactory<ItemBox>("Widget");
00079         factory.registerFactory<List>("Widget");
00080         factory.registerFactory<ListBox>("Widget");
00081         factory.registerFactory<ListCtrl>("Widget");
00082         factory.registerFactory<MenuBar>("Widget");
00083         factory.registerFactory<MenuCtrl>("Widget");
00084         factory.registerFactory<MenuItem>("Widget");
00085         factory.registerFactory<Message>("Widget");
00086         factory.registerFactory<MultiList>("Widget");
00087         factory.registerFactory<PopupMenu>("Widget");
00088         factory.registerFactory<Progress>("Widget");
00089         factory.registerFactory<ScrollView>("Widget");
00090         factory.registerFactory<StaticImage>("Widget");
00091         factory.registerFactory<StaticText>("Widget");
00092         factory.registerFactory<Tab>("Widget");
00093         factory.registerFactory<TabItem>("Widget");
00094         factory.registerFactory<VScroll>("Widget");
00095         factory.registerFactory<Widget>("Widget");
00096         factory.registerFactory<Window>("Widget");
00097 
00098 #ifndef MYGUI_DONT_USE_OBSOLETE
00099 
00100         factory.registerFactory<RenderBox>("Widget");
00101         factory.registerFactory<Sheet>("Widget");
00102 
00103 #endif // MYGUI_DONT_USE_OBSOLETE
00104 
00105         MYGUI_LOG(Info, INSTANCE_TYPE_NAME << " successfully initialized");
00106         mIsInitialise = true;
00107     }
00108 
00109     void WidgetManager::shutdown()
00110     {
00111         if (!mIsInitialise) return;
00112         MYGUI_LOG(Info, "* Shutdown: " << INSTANCE_TYPE_NAME);
00113 
00114         //unregisterUnlinker(this);
00115 
00116         mFactoryList.clear();
00117         mDelegates.clear();
00118         mVectorIUnlinkWidget.clear();
00119 
00120         FactoryManager::getInstance().unregisterFactory("Widget");
00121 
00122         MYGUI_LOG(Info, INSTANCE_TYPE_NAME << " successfully shutdown");
00123         mIsInitialise = false;
00124     }
00125 
00126     Widget* WidgetManager::createWidget(WidgetStyle _style, const std::string& _type, const std::string& _skin, const IntCoord& _coord, Align _align, Widget* _parent, ICroppedRectangle * _cropeedParent, IWidgetCreator * _creator, const std::string& _name)
00127     {
00128         IObject* object = FactoryManager::getInstance().createObject("Widget", _type);
00129         if (object != nullptr)
00130         {
00131             Widget* widget = object->castType<Widget>();
00132             ResourceSkin* skin = SkinManager::getInstance().getByName(_skin);
00133             widget->_initialise(_style, _coord, _align, skin, _parent, _cropeedParent, _creator, _name);
00134 
00135             return widget;
00136         }
00137 
00138         // старый вариант создания
00139         for (SetWidgetFactory::iterator factory = mFactoryList.begin(); factory != mFactoryList.end(); ++factory)
00140         {
00141             if ((*factory)->getTypeName() == _type)
00142             {
00143                 Widget* widget = (*factory)->createWidget(_style, _skin, _coord, _align, _parent, _cropeedParent, _creator, _name);
00144                 return widget;
00145             }
00146         }
00147 
00148         MYGUI_EXCEPT("factory '" << _type << "' not found");
00149         return nullptr;
00150     }
00151 
00152     void WidgetManager::destroyWidget(Widget* _widget)
00153     {
00154         // иначе возможен бесконечный цикл
00155         MYGUI_ASSERT(_widget != nullptr, "widget is deleted");
00156 
00157         // делегирует удаление отцу виджета
00158         IWidgetCreator * creator = _widget->_getIWidgetCreator();
00159         creator->_destroyChildWidget(_widget);
00160     }
00161 
00162     void WidgetManager::destroyWidgets(const VectorWidgetPtr& _widgets)
00163     {
00164         for (VectorWidgetPtr::const_iterator iter = _widgets.begin(); iter != _widgets.end(); ++iter)
00165         {
00166             destroyWidget(*iter);
00167         }
00168     }
00169 
00170     void WidgetManager::destroyWidgets(EnumeratorWidgetPtr _widgets)
00171     {
00172         VectorWidgetPtr widgets;
00173         while (_widgets.next())
00174         {
00175             widgets.push_back(_widgets.current());
00176         }
00177         destroyWidgets(widgets);
00178     }
00179 
00180     void WidgetManager::registerUnlinker(IUnlinkWidget * _unlink)
00181     {
00182         unregisterUnlinker(_unlink);
00183         mVectorIUnlinkWidget.push_back(_unlink);
00184     }
00185 
00186     void WidgetManager::unregisterUnlinker(IUnlinkWidget * _unlink)
00187     {
00188         for (size_t pos=0; pos<mVectorIUnlinkWidget.size(); pos++)
00189         {
00190             if (mVectorIUnlinkWidget[pos] == _unlink)
00191             {
00192                 mVectorIUnlinkWidget[pos] = mVectorIUnlinkWidget[mVectorIUnlinkWidget.size()-1];
00193                 mVectorIUnlinkWidget.pop_back();
00194                 break;
00195             }
00196         }
00197     }
00198 
00199     void WidgetManager::unlinkFromUnlinkers(Widget* _widget)
00200     {
00201         for (VectorIUnlinkWidget::iterator iter = mVectorIUnlinkWidget.begin(); iter!=mVectorIUnlinkWidget.end(); ++iter)
00202         {
00203             (*iter)->_unlinkWidget(_widget);
00204         }
00205         // вызывать последним, обнулится
00206         removeWidgetFromUnlink(_widget);
00207     }
00208 
00209     void WidgetManager::addWidgetToUnlink(Widget* _widget)
00210     {
00211         if (_widget) mUnlinkWidgets.push_back(_widget);
00212     }
00213 
00214     void WidgetManager::removeWidgetFromUnlink(Widget*& _widget)
00215     {
00216         VectorWidgetPtr::iterator iter = std::find(mUnlinkWidgets.begin(), mUnlinkWidgets.end(), _widget);
00217         if (iter != mUnlinkWidgets.end())
00218         {
00219             (*iter) = mUnlinkWidgets.back();
00220             mUnlinkWidgets.pop_back();
00221         }
00222         else
00223         {
00224             _widget = nullptr;
00225         }
00226     }
00227 
00228     bool WidgetManager::isFactoryExist(const std::string& _type)
00229     {
00230         if (FactoryManager::getInstance().isFactoryExist("Widget", _type))
00231         {
00232             return true;
00233         }
00234 
00235         // старый вариант
00236         for (SetWidgetFactory::iterator factory = mFactoryList.begin(); factory != mFactoryList.end(); ++factory)
00237         {
00238             if ((*factory)->getTypeName() == _type)
00239             {
00240                 return true;
00241             }
00242         }
00243 
00244         return false;
00245     }
00246 
00247 #ifndef MYGUI_DONT_USE_OBSOLETE
00248     Widget* WidgetManager::findWidgetT(const std::string& _name, bool _throw)
00249     {
00250         return Gui::getInstance().findWidgetT(_name, _throw);
00251     }
00252 
00253     Widget* WidgetManager::findWidgetT(const std::string& _name, const std::string& _prefix, bool _throw)
00254     {
00255         return Gui::getInstance().findWidgetT(_name, _prefix, _throw);
00256     }
00257 
00258     void WidgetManager::registerFactory(IWidgetFactory * _factory)
00259     {
00260         mFactoryList.insert(_factory);
00261         MYGUI_LOG(Info, "* Register widget factory '" << _factory->getTypeName() << "'");
00262     }
00263 
00264     void WidgetManager::unregisterFactory(IWidgetFactory * _factory)
00265     {
00266         SetWidgetFactory::iterator iter = mFactoryList.find(_factory);
00267         if (iter != mFactoryList.end()) mFactoryList.erase(iter);
00268         MYGUI_LOG(Info, "* Unregister widget factory '" << _factory->getTypeName() << "'");
00269     }
00270 
00271     void WidgetManager::parse(Widget* _widget, const std::string &_key, const std::string &_value)
00272     {
00273         MapDelegate::iterator iter = mDelegates.find(_key);
00274         if (iter == mDelegates.end())
00275         {
00276             //MYGUI_LOG(Error, "Unknown key '" << _key << "' with value '" << _value << "'");
00277             _widget->setProperty(_key, _value);
00278             return;
00279         }
00280         iter->second(_widget, _key, _value);
00281     }
00282 
00283     ParseDelegate& WidgetManager::registerDelegate(const std::string& _key)
00284     {
00285         MapDelegate::iterator iter = mDelegates.find(_key);
00286         MYGUI_ASSERT(iter == mDelegates.end(), "delegate with name '" << _key << "' already exist");
00287         return (mDelegates[_key] = ParseDelegate());
00288     }
00289 
00290     void WidgetManager::unregisterDelegate(const std::string& _key)
00291     {
00292         MapDelegate::iterator iter = mDelegates.find(_key);
00293         if (iter != mDelegates.end()) mDelegates.erase(iter);
00294     }
00295 #endif // MYGUI_DONT_USE_OBSOLETE
00296 } // namespace MyGUI