MyGUI  3.2.1
MyGUI_ListBox.h
Go to the documentation of this file.
1 /*
2  * This source file is part of MyGUI. For the latest info, see http://mygui.info/
3  * Distributed under the MIT License
4  * (See accompanying file COPYING.MIT or copy at http://opensource.org/licenses/MIT)
5  */
6 
7 #ifndef __MYGUI_LIST_BOX_H__
8 #define __MYGUI_LIST_BOX_H__
9 
10 #include "MyGUI_Prerequest.h"
11 #include "MyGUI_Button.h"
12 #include "MyGUI_Any.h"
13 #include "MyGUI_EventPair.h"
14 #include "MyGUI_IItem.h"
15 #include "MyGUI_IItemContainer.h"
16 #include "MyGUI_IBItemInfo.h"
17 
18 namespace MyGUI
19 {
20 
23 
28  public Widget,
29  public IItemContainer,
30  public MemberObsolete<ListBox>
31  {
33 
34  public:
35  ListBox();
36 
37  //------------------------------------------------------------------------------//
38  // манипуляции айтемами
39 
44 
45  size_t getItemCount() const;
46 
48  void insertItemAt(size_t _index, const UString& _name, Any _data = Any::Null);
49 
51  void addItem(const UString& _name, Any _data = Any::Null);
52 
54  void removeItemAt(size_t _index);
55 
57  void removeAllItems();
58 
60  void swapItemsAt(size_t _index1, size_t _index2);
61 
62 
64  size_t findItemIndexWith(const UString& _name);
66 
67  //------------------------------------------------------------------------------//
68  // манипуляции выделениями
69 
75  size_t getIndexSelected() const;
76 
78  void setIndexSelected(size_t _index);
79 
81  void clearIndexSelected();
83 
84  //------------------------------------------------------------------------------//
85  // манипуляции данными
86 
91 
92  void setItemDataAt(size_t _index, Any _data);
93 
95  void clearItemDataAt(size_t _index);
96 
98  template <typename ValueType>
99  ValueType* getItemDataAt(size_t _index, bool _throw = true)
100  {
101  MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "ListBox::getItemDataAt");
102  return mItemsInfo[_index].second.castType<ValueType>(_throw);
103  }
105 
106  //------------------------------------------------------------------------------//
107  // манипуляции отображением
108 
110  void setItemNameAt(size_t _index, const UString& _name);
111 
113  const UString& getItemNameAt(size_t _index);
114 
115 
116  //------------------------------------------------------------------------------//
117  // манипуляции выдимостью
118 
123 
124  void beginToItemAt(size_t _index);
125 
127  void beginToItemFirst();
128 
130  void beginToItemLast();
131 
133  void beginToItemSelected();
134 
135  //------------------------------------------------------------------------------//
136 
137  // видим ли мы элемент, полностью или нет
146  bool isItemVisibleAt(size_t _index, bool _fill = true);
148  bool isItemSelectedVisible(bool _fill = true);
149 
150 
152  void setScrollVisible(bool _visible);
154  void setScrollPosition(size_t _position);
156 
157  //------------------------------------------------------------------------------------//
158 
163 
164  virtual void setPosition(const IntPoint& _value);
166  virtual void setSize(const IntSize& _value);
168  virtual void setCoord(const IntCoord& _value);
169 
171  void setPosition(int _left, int _top);
173  void setSize(int _width, int _height);
175  void setCoord(int _left, int _top, int _width, int _height);
177 
178  // возвращает максимальную высоту вмещающую все строки и родительский бордюр
180  int getOptimalHeight();
181 
187  Widget* getWidgetByIndex(size_t _index);
188 
189  /*events:*/
196 
203 
210 
217 
224 
231 
232  /*internal:*/
237  // дебажная проверка на правильность выравнивания списка
238  void _checkAlign();
239 
240  // вспомогательные методы для составных списков
241  void _setItemFocus(size_t _position, bool _focus);
242  void _sendEventChangeScroll(size_t _position);
243 
244  // IItemContainer impl
245  virtual size_t _getItemCount();
246  virtual void _addItem(const MyGUI::UString& _name);
247  virtual void _removeItemAt(size_t _index);
248  virtual void _setItemNameAt(size_t _index, const UString& _name);
249  virtual const UString& _getItemNameAt(size_t _index);
250 
251  virtual void _resetContainer(bool _update);
253 
254  protected:
255  virtual void initialiseOverride();
256  virtual void shutdownOverride();
257 
258  void onMouseWheel(int _rel);
259  void onKeyButtonPressed(KeyCode _key, Char _char);
260  void onKeyButtonReleased(KeyCode _key);
261 
262  void notifyScrollChangePosition(ScrollBar* _sender, size_t _rel);
263  void notifyMousePressed(Widget* _sender, int _left, int _top, MouseButton _id);
264  void notifyMouseDoubleClick(Widget* _sender);
265  void notifyMouseWheel(Widget* _sender, int _rel);
266  void notifyMouseSetFocus(Widget* _sender, Widget* _old);
267  void notifyMouseLostFocus(Widget* _sender, Widget* _new);
268  void notifyKeyButtonPressed(Widget* _sender, KeyCode _key, Char _char);
269  void notifyKeyButtonReleased(Widget* _sender, KeyCode _key);
270  void notifyMouseButtonReleased(Widget* _sender, int _left, int _top, MouseButton _id);
271 
272  void updateScroll();
273  void updateLine(bool _reset = false);
274  void _setScrollView(size_t _position);
275 
276  // перерисовывает от индекса до низа
277  void _redrawItemRange(size_t _start = 0);
278 
279  // перерисовывает индекс
280  void _redrawItem(size_t _index);
281 
282  // ищет и выделяет елемент
283  void _selectIndex(size_t _index, bool _select);
284 
285  // метод для запроса номера айтема и контейнера
286  virtual size_t _getItemIndex(Widget* _item);
287 
288  virtual void setPropertyOverride(const std::string& _key, const std::string& _value);
289 
290  private:
291  void _checkMapping(const std::string& _owner);
292 
293  Widget* _getClientWidget();
294 
295  size_t getIndexByWidget(Widget* _widget);
296 
297  private:
298  std::string mSkinLine;
299  ScrollBar* mWidgetScroll;
300 
301  // наши дети в строках
302  typedef std::vector<Button*> VectorButton;
303  VectorButton mWidgetLines;
304 
305  int mHeightLine; // высота одной строки
306  int mTopIndex; // индекс самого верхнего элемента
307  int mOffsetTop; // текущее смещение
308  int mRangeIndex; // размерность скрола
309  size_t mLastRedrawLine; // последняя перерисованная линия
310 
311  size_t mIndexSelect; // текущий выделенный элемент или ITEM_NONE
312  size_t mLineActive; // текущий виджет над которым мыша
313 
314  typedef std::pair<UString, Any> PairItem;
315  typedef std::vector<PairItem> VectorItemInfo;
316  VectorItemInfo mItemsInfo;
317 
318  // имеем ли мы фокус ввода
319  bool mNeedVisibleScroll;
320 
321  IntSize mOldSize;
322 
323  Widget* mClient;
324  };
325 
326 } // namespace MyGUI
327 
328 #endif // __MYGUI_LIST_BOX_H__