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(false == 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.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
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
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
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
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
00184
00185
00186
00187
00188
00189
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
00198
00199
00200
00201
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
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 }