• Main Page
  • Related Pages
  • Namespaces
  • Data Structures
  • Files
  • Examples
  • File List
  • Globals

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(false == 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.registryFactory<Button>("Widget");
00073         factory.registryFactory<Canvas>("Widget");
00074         factory.registryFactory<ComboBox>("Widget");
00075         factory.registryFactory<DDContainer>("Widget");
00076         factory.registryFactory<Edit>("Widget");
00077         factory.registryFactory<HScroll>("Widget");
00078         factory.registryFactory<ItemBox>("Widget");
00079         factory.registryFactory<List>("Widget");
00080         factory.registryFactory<ListBox>("Widget");
00081         factory.registryFactory<ListCtrl>("Widget");
00082         factory.registryFactory<MenuBar>("Widget");
00083         factory.registryFactory<MenuCtrl>("Widget");
00084         factory.registryFactory<MenuItem>("Widget");
00085         factory.registryFactory<Message>("Widget");
00086         factory.registryFactory<MultiList>("Widget");
00087         factory.registryFactory<PopupMenu>("Widget");
00088         factory.registryFactory<Progress>("Widget");
00089         factory.registryFactory<ScrollView>("Widget");
00090         factory.registryFactory<StaticImage>("Widget");
00091         factory.registryFactory<StaticText>("Widget");
00092         factory.registryFactory<Tab>("Widget");
00093         factory.registryFactory<TabItem>("Widget");
00094         factory.registryFactory<VScroll>("Widget");
00095         factory.registryFactory<Widget>("Widget");
00096         factory.registryFactory<Window>("Widget");
00097 
00098 #ifndef MYGUI_DONT_USE_OBSOLETE
00099 
00100         factory.registryFactory<RenderBox>("Widget");
00101         factory.registryFactory<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 (false == 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().unregistryFactory("Widget");
00121 
00122         MYGUI_LOG(Info, INSTANCE_TYPE_NAME << " successfully shutdown");
00123         mIsInitialise = false;
00124     }
00125 
00126     void WidgetManager::registerFactory(IWidgetFactory * _factory)
00127     {
00128         mFactoryList.insert(_factory);
00129         MYGUI_LOG(Info, "* Register widget factory '" << _factory->getTypeName() << "'");
00130     }
00131 
00132     void WidgetManager::unregisterFactory(IWidgetFactory * _factory)
00133     {
00134         SetWidgetFactory::iterator iter = mFactoryList.find(_factory);
00135         if (iter != mFactoryList.end()) mFactoryList.erase(iter);
00136         MYGUI_LOG(Info, "* Unregister widget factory '" << _factory->getTypeName() << "'");
00137     }
00138 
00139     WidgetPtr WidgetManager::createWidget(WidgetStyle _style, const std::string& _type, const std::string& _skin, const IntCoord& _coord, Align _align, WidgetPtr _parent, ICroppedRectangle * _cropeedParent, IWidgetCreator * _creator, const std::string& _name)
00140     {
00141         IObject* object = FactoryManager::getInstance().createObject("Widget", _type);
00142         if (object != nullptr)
00143         {
00144             WidgetPtr widget = object->castType<Widget>();
00145             ResourceSkin* skin = SkinManager::getInstance().getByName(_skin);
00146             widget->_initialise(_style, _coord, _align, skin, _parent, _cropeedParent, _creator, _name);
00147 
00148             return widget;
00149         }
00150 
00151         // старый вариант создания
00152         /*std::string name;
00153         if (false == _name.empty())
00154         {
00155             MapWidgetPtr::iterator iter = mWidgets.find(_name);
00156             MYGUI_ASSERT(iter == mWidgets.end(), "widget with name '" << _name << "' already exist");
00157             name = _name;
00158         }
00159         else
00160         {
00161             static long num = 0;
00162             name = utility::toString(num++, "_", _type);
00163         }*/
00164 
00165         for (SetWidgetFactory::iterator factory = mFactoryList.begin(); factory != mFactoryList.end(); factory++)
00166         {
00167             if ( (*factory)->getTypeName() == _type)
00168             {
00169                 WidgetPtr widget = (*factory)->createWidget(_style, _skin, _coord, _align, _parent, _cropeedParent, _creator, _name);
00170                 //mWidgets[name] = widget;
00171                 return widget;
00172             }
00173         }
00174 
00175         MYGUI_EXCEPT("factory '" << _type << "' not found");
00176         return nullptr;
00177     }
00178 
00179     WidgetPtr WidgetManager::findWidgetT(const std::string& _name, bool _throw)
00180     {
00181         return Gui::getInstance().findWidgetT(_name, _throw);
00182 
00183         /*MapWidgetPtr::iterator iter = mWidgets.find(_name);
00184         if (iter == mWidgets.end())
00185         {
00186             MYGUI_ASSERT(!_throw, "Widget '" << _name << "' not found");
00187             return nullptr;
00188         }
00189         return iter->second;*/
00190     }
00191 
00192     WidgetPtr WidgetManager::findWidgetT(const std::string& _name, const std::string& _prefix, bool _throw)
00193     {
00194         return Gui::getInstance().findWidgetT(_name, _prefix, _throw);
00195     }
00196 
00197     /*void WidgetManager::_unlinkWidget(WidgetPtr _widget)
00198     {
00199         if (_widget == nullptr) return;
00200         MapWidgetPtr::iterator iter = mWidgets.find(_widget->getName());
00201         if (iter != mWidgets.end()) mWidgets.erase(iter);
00202     }*/
00203 
00204     ParseDelegate& WidgetManager::registerDelegate(const std::string& _key)
00205     {
00206         MapDelegate::iterator iter = mDelegates.find(_key);
00207         MYGUI_ASSERT(iter == mDelegates.end(), "delegate with name '" << _key << "' already exist");
00208         return (mDelegates[_key] = ParseDelegate());
00209     }
00210 
00211     void WidgetManager::unregisterDelegate(const std::string& _key)
00212     {
00213         MapDelegate::iterator iter = mDelegates.find(_key);
00214         if (iter != mDelegates.end()) mDelegates.erase(iter);
00215     }
00216 
00217     void WidgetManager::parse(WidgetPtr _widget, const std::string &_key, const std::string &_value)
00218     {
00219         MapDelegate::iterator iter = mDelegates.find(_key);
00220         if (iter == mDelegates.end())
00221         {
00222             //MYGUI_LOG(Error, "Unknown key '" << _key << "' with value '" << _value << "'");
00223             _widget->setProperty(_key, _value);
00224             return;
00225         }
00226         iter->second(_widget, _key, _value);
00227     }
00228 
00229     void WidgetManager::destroyWidget(WidgetPtr _widget)
00230     {
00231         // иначе возможен бесконечный цикл
00232         MYGUI_ASSERT(_widget != nullptr, "widget is deleted");
00233 
00234         // делегирует удаление отцу виджета
00235         IWidgetCreator * creator = _widget->_getIWidgetCreator();
00236         creator->_destroyChildWidget(_widget);
00237     }
00238 
00239     void WidgetManager::destroyWidgets(const VectorWidgetPtr& _widgets)
00240     {
00241         for (VectorWidgetPtr::const_iterator iter = _widgets.begin(); iter != _widgets.end(); ++iter)
00242         {
00243             destroyWidget(*iter);
00244         }
00245     }
00246 
00247     void WidgetManager::destroyWidgets(EnumeratorWidgetPtr _widgets)
00248     {
00249         VectorWidgetPtr widgets;
00250         while (_widgets.next())
00251         {
00252             widgets.push_back(_widgets.current());
00253         };
00254         destroyWidgets(widgets);
00255     }
00256 
00257     void WidgetManager::registerUnlinker(IUnlinkWidget * _unlink)
00258     {
00259         unregisterUnlinker(_unlink);
00260         mVectorIUnlinkWidget.push_back(_unlink);
00261     }
00262 
00263     void WidgetManager::unregisterUnlinker(IUnlinkWidget * _unlink)
00264     {
00265         for (size_t pos=0; pos<mVectorIUnlinkWidget.size(); pos++)
00266         {
00267             if (mVectorIUnlinkWidget[pos] == _unlink)
00268             {
00269                 mVectorIUnlinkWidget[pos] = mVectorIUnlinkWidget[mVectorIUnlinkWidget.size()-1];
00270                 mVectorIUnlinkWidget.pop_back();
00271                 break;
00272             }
00273         }
00274     }
00275 
00276     void WidgetManager::unlinkFromUnlinkers(WidgetPtr _widget)
00277     {
00278         for (VectorIUnlinkWidget::iterator iter = mVectorIUnlinkWidget.begin(); iter!=mVectorIUnlinkWidget.end(); ++iter)
00279         {
00280             (*iter)->_unlinkWidget(_widget);
00281         }
00282         // вызывать последним, обнулится
00283         removeWidgetFromUnlink(_widget);
00284     }
00285 
00286     void WidgetManager::addWidgetToUnlink(WidgetPtr _widget)
00287     {
00288         if (_widget) mUnlinkWidgets.push_back(_widget);
00289     }
00290 
00291     void WidgetManager::removeWidgetFromUnlink(WidgetPtr& _widget)
00292     {
00293         VectorWidgetPtr::iterator iter = std::find(mUnlinkWidgets.begin(), mUnlinkWidgets.end(), _widget);
00294         if (iter != mUnlinkWidgets.end())
00295         {
00296             (*iter) = mUnlinkWidgets.back();
00297             mUnlinkWidgets.pop_back();
00298         }
00299         else
00300         {
00301             _widget = nullptr;
00302         }
00303     }
00304 
00305 } // namespace MyGUI

Generated on Sun Jan 30 2011 for MyGUI by  doxygen 1.7.1