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_ListBox.h"
00025 #include "MyGUI_Button.h"
00026
00027 namespace MyGUI
00028 {
00029
00030 ListBox::ListBox() :
00031 mHeightLine(0)
00032 {
00033 requestCreateWidgetItem = MyGUI::newDelegate(this, &ListBox::notifyCreateWidgetItem);
00034 requestDrawItem = MyGUI::newDelegate(this, &ListBox::notifyDrawItem);
00035 }
00036
00037 void ListBox::_initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name)
00038 {
00039 Base::_initialise(_style, _coord, _align, _info, _parent, _croppedParent, _creator, _name);
00040
00041 initialiseWidgetSkin(_info);
00042 }
00043
00044 ListBox::~ListBox()
00045 {
00046 shutdownWidgetSkin();
00047 }
00048
00049 void ListBox::baseChangeWidgetSkin(ResourceSkin* _info)
00050 {
00051 shutdownWidgetSkin();
00052 Base::baseChangeWidgetSkin(_info);
00053 initialiseWidgetSkin(_info);
00054 }
00055
00056 void ListBox::initialiseWidgetSkin(ResourceSkin* _info)
00057 {
00058 mHeightLine = 20;
00059 mChangeContentByResize = false;
00060
00061 const MapString& properties = _info->getProperties();
00062 if (!properties.empty())
00063 {
00064 MapString::const_iterator iter = properties.end();
00065 iter = properties.find("SkinLine");
00066 if (iter != properties.end()) mSkinLine = iter->second;
00067 iter = properties.find("HeightLine");
00068 if (iter != properties.end()) mHeightLine = utility::parseInt(iter->second);
00069 }
00070
00071 _setScrollViewPage(mHeightLine);
00072 }
00073
00074 void ListBox::shutdownWidgetSkin()
00075 {
00076 }
00077
00078 void ListBox::notifyCreateWidgetItem(MyGUI::ListCtrl* _sender, MyGUI::Widget* _item)
00079 {
00080 const MyGUI::IntSize& size = _item->getSize();
00081
00082 MyGUI::Button* text = _item->createWidget<MyGUI::Button>(mSkinLine, MyGUI::IntCoord(0, 0, size.width, size.height), MyGUI::Align::Stretch);
00083
00084 text->setNeedMouseFocus(false);
00085
00086 _item->setUserData(text);
00087 }
00088
00089 void ListBox::notifyDrawItem(MyGUI::ListCtrl* _sender, MyGUI::Widget* _item, const MyGUI::IBDrawItemInfo& _info, MyGUI::IntCoord& _coord)
00090 {
00091 MyGUI::Button* text = *_item->getUserData<MyGUI::Button*>();
00092
00093 if (_info.update)
00094 {
00095 text->setCaption(mItemsInfo[_info.index]);
00096
00097 MyGUI::IntSize size = text->getTextSize() + (text->getSize() - text->getTextRegion().size());
00098 size.height = mHeightLine;
00099 _coord.set(0, 0, size.width, size.height);
00100 }
00101
00102 text->setButtonPressed(_info.select);
00103 text->_setMouseFocus(_info.active);
00104 }
00105
00106 void ListBox::insertItemAt(size_t _index, const UString& _name, Any _data)
00107 {
00108 MYGUI_ASSERT_RANGE_INSERT(_index, mItemsInfo.size(), "ListBox::insertItemAt");
00109 if (_index == ITEM_NONE) _index = mItemsInfo.size();
00110
00111 mItemsInfo.insert(mItemsInfo.begin() + _index, _name);
00112
00113 Base::insertItemAt(_index, _data);
00114 }
00115
00116 void ListBox::removeItemAt(size_t _index)
00117 {
00118 MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "ListBox::removeItemAt");
00119 mItemsInfo.erase(mItemsInfo.begin() + _index);
00120
00121 Base::removeItemAt(_index);
00122 }
00123
00124 void ListBox::removeAllItems()
00125 {
00126 mItemsInfo.clear();
00127
00128 Base::removeAllItems();
00129 }
00130
00131 void ListBox::swapItemsAt(size_t _index1, size_t _index2)
00132 {
00133 MYGUI_ASSERT_RANGE(_index1, mItemsInfo.size(), "ListBox::swapItemsAt");
00134 MYGUI_ASSERT_RANGE(_index2, mItemsInfo.size(), "ListBox::swapItemsAt");
00135
00136 if (_index1 == _index2) return;
00137
00138 std::swap(mItemsInfo[_index1], mItemsInfo[_index2]);
00139
00140 Base::redrawItemAt(_index1);
00141 Base::redrawItemAt(_index2);
00142 }
00143
00144 size_t ListBox::findItemIndexWith(const UString& _name)
00145 {
00146 for (size_t pos=0; pos<mItemsInfo.size(); pos++)
00147 {
00148 if (mItemsInfo[pos] == _name) return pos;
00149 }
00150 return ITEM_NONE;
00151 }
00152
00153 void ListBox::setItemNameAt(size_t _index, const UString& _name)
00154 {
00155 MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "ListBox::setItemNameAt");
00156
00157 Base::redrawItemAt(_index);
00158 }
00159
00160 const UString& ListBox::getItemNameAt(size_t _index)
00161 {
00162 MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "ListBox::getItemNameAt");
00163
00164 return mItemsInfo[_index];
00165 }
00166
00167 void ListBox::beginToItemAt(size_t _index)
00168 {
00169 MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "ListBox::beginToItemAt");
00170
00171
00172 }
00173
00174 }