00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
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
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
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
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 }