MyGUI
3.2.1
|
00001 /* 00002 * This source file is part of MyGUI. For the latest info, see http://mygui.info/ 00003 * Distributed under the MIT License 00004 * (See accompanying file COPYING.MIT or copy at http://opensource.org/licenses/MIT) 00005 */ 00006 00007 #ifndef __MYGUI_LIST_BOX_H__ 00008 #define __MYGUI_LIST_BOX_H__ 00009 00010 #include "MyGUI_Prerequest.h" 00011 #include "MyGUI_Button.h" 00012 #include "MyGUI_Any.h" 00013 #include "MyGUI_EventPair.h" 00014 #include "MyGUI_IItem.h" 00015 #include "MyGUI_IItemContainer.h" 00016 #include "MyGUI_IBItemInfo.h" 00017 00018 namespace MyGUI 00019 { 00020 00021 typedef delegates::CMultiDelegate2<ListBox*, size_t> EventHandle_ListPtrSizeT; 00022 typedef delegates::CMultiDelegate2<ListBox*, const IBNotifyItemData&> EventHandle_ListBoxPtrCIBNotifyCellDataRef; 00023 00027 class MYGUI_EXPORT ListBox : 00028 public Widget, 00029 public IItemContainer, 00030 public MemberObsolete<ListBox> 00031 { 00032 MYGUI_RTTI_DERIVED( ListBox ) 00033 00034 public: 00035 ListBox(); 00036 00037 //------------------------------------------------------------------------------// 00038 // манипуляции айтемами 00039 00044 00045 size_t getItemCount() const; 00046 00048 void insertItemAt(size_t _index, const UString& _name, Any _data = Any::Null); 00049 00051 void addItem(const UString& _name, Any _data = Any::Null); 00052 00054 void removeItemAt(size_t _index); 00055 00057 void removeAllItems(); 00058 00060 void swapItemsAt(size_t _index1, size_t _index2); 00061 00062 00064 size_t findItemIndexWith(const UString& _name); 00066 00067 //------------------------------------------------------------------------------// 00068 // манипуляции выделениями 00069 00075 size_t getIndexSelected() const; 00076 00078 void setIndexSelected(size_t _index); 00079 00081 void clearIndexSelected(); 00083 00084 //------------------------------------------------------------------------------// 00085 // манипуляции данными 00086 00091 00092 void setItemDataAt(size_t _index, Any _data); 00093 00095 void clearItemDataAt(size_t _index); 00096 00098 template <typename ValueType> 00099 ValueType* getItemDataAt(size_t _index, bool _throw = true) 00100 { 00101 MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "ListBox::getItemDataAt"); 00102 return mItemsInfo[_index].second.castType<ValueType>(_throw); 00103 } 00105 00106 //------------------------------------------------------------------------------// 00107 // манипуляции отображением 00108 00110 void setItemNameAt(size_t _index, const UString& _name); 00111 00113 const UString& getItemNameAt(size_t _index); 00114 00115 00116 //------------------------------------------------------------------------------// 00117 // манипуляции выдимостью 00118 00123 00124 void beginToItemAt(size_t _index); 00125 00127 void beginToItemFirst(); 00128 00130 void beginToItemLast(); 00131 00133 void beginToItemSelected(); 00134 00135 //------------------------------------------------------------------------------// 00136 00137 // видим ли мы элемент, полностью или нет 00146 bool isItemVisibleAt(size_t _index, bool _fill = true); 00148 bool isItemSelectedVisible(bool _fill = true); 00149 00150 00152 void setScrollVisible(bool _visible); 00154 void setScrollPosition(size_t _position); 00156 00157 //------------------------------------------------------------------------------------// 00158 00163 00164 virtual void setPosition(const IntPoint& _value); 00166 virtual void setSize(const IntSize& _value); 00168 virtual void setCoord(const IntCoord& _value); 00169 00171 void setPosition(int _left, int _top); 00173 void setSize(int _width, int _height); 00175 void setCoord(int _left, int _top, int _width, int _height); 00177 00178 // возвращает максимальную высоту вмещающую все строки и родительский бордюр 00180 int getOptimalHeight(); 00181 00185 void setActivateOnClick(bool activateOnClick); 00186 00192 Widget* getWidgetByIndex(size_t _index); 00193 00194 /*events:*/ 00200 EventPair<EventHandle_WidgetSizeT, EventHandle_ListPtrSizeT> eventListSelectAccept; 00201 00207 EventPair<EventHandle_WidgetSizeT, EventHandle_ListPtrSizeT> eventListChangePosition; 00208 00214 EventPair<EventHandle_WidgetSizeT, EventHandle_ListPtrSizeT> eventListMouseItemActivate; 00215 00221 EventPair<EventHandle_WidgetSizeT, EventHandle_ListPtrSizeT> eventListMouseItemFocus; 00222 00228 EventPair<EventHandle_WidgetSizeT, EventHandle_ListPtrSizeT> eventListChangeScroll; 00229 00235 EventHandle_ListBoxPtrCIBNotifyCellDataRef eventNotifyItem; 00236 00237 /*internal:*/ 00242 // дебажная проверка на правильность выравнивания списка 00243 void _checkAlign(); 00244 00245 // вспомогательные методы для составных списков 00246 void _setItemFocus(size_t _position, bool _focus); 00247 void _sendEventChangeScroll(size_t _position); 00248 00249 // IItemContainer impl 00250 virtual size_t _getItemCount(); 00251 virtual void _addItem(const MyGUI::UString& _name); 00252 virtual void _removeItemAt(size_t _index); 00253 virtual void _setItemNameAt(size_t _index, const UString& _name); 00254 virtual const UString& _getItemNameAt(size_t _index); 00255 00256 virtual void _resetContainer(bool _update); 00258 00259 protected: 00260 virtual void initialiseOverride(); 00261 virtual void shutdownOverride(); 00262 00263 void onMouseWheel(int _rel); 00264 void onKeyButtonPressed(KeyCode _key, Char _char); 00265 void onKeyButtonReleased(KeyCode _key); 00266 00267 void notifyScrollChangePosition(ScrollBar* _sender, size_t _rel); 00268 void notifyMousePressed(Widget* _sender, int _left, int _top, MouseButton _id); 00269 void notifyMouseClick(Widget* _sender); 00270 void notifyMouseDoubleClick(Widget* _sender); 00271 void notifyMouseWheel(Widget* _sender, int _rel); 00272 void notifyMouseSetFocus(Widget* _sender, Widget* _old); 00273 void notifyMouseLostFocus(Widget* _sender, Widget* _new); 00274 void notifyKeyButtonPressed(Widget* _sender, KeyCode _key, Char _char); 00275 void notifyKeyButtonReleased(Widget* _sender, KeyCode _key); 00276 void notifyMouseButtonReleased(Widget* _sender, int _left, int _top, MouseButton _id); 00277 00278 void updateScroll(); 00279 void updateLine(bool _reset = false); 00280 00281 void _activateItem(Widget* _sender); 00282 00283 void _setScrollView(size_t _position); 00284 00285 // перерисовывает от индекса до низа 00286 void _redrawItemRange(size_t _start = 0); 00287 00288 // перерисовывает индекс 00289 void _redrawItem(size_t _index); 00290 00291 // ищет и выделяет елемент 00292 void _selectIndex(size_t _index, bool _select); 00293 00294 // метод для запроса номера айтема и контейнера 00295 virtual size_t _getItemIndex(Widget* _item); 00296 00297 virtual void setPropertyOverride(const std::string& _key, const std::string& _value); 00298 00299 private: 00300 void _checkMapping(const std::string& _owner); 00301 00302 Widget* _getClientWidget(); 00303 00304 size_t getIndexByWidget(Widget* _widget); 00305 00306 private: 00307 std::string mSkinLine; 00308 ScrollBar* mWidgetScroll; 00309 00310 // наши дети в строках 00311 typedef std::vector<Button*> VectorButton; 00312 VectorButton mWidgetLines; 00313 00314 bool mActivateOnClick; // Require a full mouse click rather than only mouse press to activate an item 00315 00316 int mHeightLine; // высота одной строки 00317 int mTopIndex; // индекс самого верхнего элемента 00318 int mOffsetTop; // текущее смещение 00319 int mRangeIndex; // размерность скрола 00320 size_t mLastRedrawLine; // последняя перерисованная линия 00321 00322 size_t mIndexSelect; // текущий выделенный элемент или ITEM_NONE 00323 size_t mLineActive; // текущий виджет над которым мыша 00324 00325 typedef std::pair<UString, Any> PairItem; 00326 typedef std::vector<PairItem> VectorItemInfo; 00327 VectorItemInfo mItemsInfo; 00328 00329 // имеем ли мы фокус ввода 00330 bool mNeedVisibleScroll; 00331 00332 IntSize mOldSize; 00333 00334 Widget* mClient; 00335 }; 00336 00337 } // namespace MyGUI 00338 00339 #endif // __MYGUI_LIST_BOX_H__