MyGUI  3.0.1
MyGUI_ListCtrl.h
Go to the documentation of this file.
1 
7 /*
8  This file is part of MyGUI.
9 
10  MyGUI is free software: you can redistribute it and/or modify
11  it under the terms of the GNU Lesser General Public License as published by
12  the Free Software Foundation, either version 3 of the License, or
13  (at your option) any later version.
14 
15  MyGUI is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  GNU Lesser General Public License for more details.
19 
20  You should have received a copy of the GNU Lesser General Public License
21  along with MyGUI. If not, see <http://www.gnu.org/licenses/>.
22 */
23 #ifndef __MYGUI_LIST_CTRL_H__
24 #define __MYGUI_LIST_CTRL_H__
25 
26 #include "MyGUI_Prerequest.h"
27 #include "MyGUI_DDContainer.h"
28 #include "MyGUI_IBItemInfo.h"
29 #include "MyGUI_Any.h"
30 #include "MyGUI_EventPair.h"
31 #include "MyGUI_ScrollViewBase.h"
32 
33 namespace MyGUI
34 {
35 
40 
42  public DDContainer,
43  protected ScrollViewBase
44  {
46 
47  public:
48  ListCtrl();
49 
50  //------------------------------------------------------------------------------//
51  // манипуляции айтемами
52 
54  size_t getItemCount() const { return mItemsInfo.size(); }
55 
57  void insertItemAt(size_t _index, Any _data = Any::Null);
58 
60  void addItem(Any _data = Any::Null) { insertItemAt(ITEM_NONE, _data); }
61 
63  void removeItemAt(size_t _index);
64 
66  void removeAllItems();
67 
69  void redrawItemAt(size_t _index);
70 
72  void redrawAllItems() { _updateAllVisible(ITEM_NONE, true, true); }
73 
74 
75  //------------------------------------------------------------------------------//
76  // манипуляции выделениями
77 
79  size_t getIndexSelected() { return mIndexSelect; }
80 
82  void setIndexSelected(size_t _index);
83 
85  void clearIndexSelected() { setIndexSelected(ITEM_NONE); }
86 
87 
88  //------------------------------------------------------------------------------//
89  // манипуляции данными
90 
92  void setItemDataAt(size_t _index, Any _data);
93 
95  void clearItemDataAt(size_t _index) { setItemDataAt(_index, Any::Null); }
96 
98  template <typename ValueType>
99  ValueType * getItemDataAt(size_t _index, bool _throw = true)
100  {
101  MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "ListCtrl::getItemDataAt");
102  return mItemsInfo[_index].data.castType<ValueType>(_throw);
103  }
104 
105 
107  size_t getIndexByWidget(Widget* _widget);
108 
110  Widget* getWidgetDrag() { return mItemDrag; }
111 
117  Widget* getWidgetByIndex(size_t _index);
118 
120  void resetDrag();
121 
123  virtual void setPosition(const IntPoint& _value);
125  virtual void setSize(const IntSize& _value);
127  virtual void setCoord(const IntCoord& _value);
128 
130  void setPosition(int _left, int _top) { setPosition(IntPoint(_left, _top)); }
132  void setSize(int _width, int _height) { setSize(IntSize(_width, _height)); }
134  void setCoord(int _left, int _top, int _width, int _height) { setCoord(IntCoord(_left, _top, _width, _height)); }
135 
136 
137  /*event:*/
144 
152 
159 
166 
173 
180 
181  /*internal:*/
182  virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name);
183 
184  protected:
185  virtual ~ListCtrl();
186 
188  {
189  ItemDataInfo(Any _data) :
190  data(_data) { }
193  };
194  typedef std::vector<ItemDataInfo> VectorItemInfo;
195 
196  void baseChangeWidgetSkin(ResourceSkin* _info);
197 
198  virtual void onMouseButtonPressed(int _left, int _top, MouseButton _id);
199  virtual void onMouseButtonReleased(int _left, int _top, MouseButton _id);
200  virtual void onMouseDrag(int _left, int _top);
201 
202  virtual void onMouseWheel(int _rel);
203  virtual void onKeyLostFocus(Widget* _new);
204  virtual void onKeySetFocus(Widget* _old);
205 
206  void notifyKeyButtonPressed(Widget* _sender, KeyCode _key, Char _char);
207  void notifyKeyButtonReleased(Widget* _sender, KeyCode _key);
208  void notifyScrollChangePosition(VScroll* _sender, size_t _index);
209  void notifyMouseWheel(Widget* _sender, int _rel);
210  void notifyRootMouseChangeFocus(Widget* _sender, bool _focus);
211  void notifyMouseButtonDoubleClick(Widget* _sender);
212  void _requestGetContainer(Widget* _sender, Widget*& _container, size_t& _index);
213  void notifyMouseDrag(Widget* _sender, int _left, int _top);
214  void notifyMouseButtonPressed(Widget* _sender, int _left, int _top, MouseButton _id);
215  void notifyMouseButtonReleased(Widget* _sender, int _left, int _top, MouseButton _id);
216 
217 
218  virtual void removeDropItems();
219  virtual void updateDropItems();
220  virtual void updateDropItemsState(const DDWidgetState& _state);
221 
222  // Обновляет данные о айтемах, при изменении размеров
223  void updateMetrics();
224 
225  // просто обновляет все виджеты что видны
226  void _updateAllVisible(size_t _index, bool _needUpdateContetntSize, bool _update);
227 
228  void updateFromResize();
229 
230  // возвращает следующий айтем, если нет его, то создается
231  // запросы только последовательно
232  Widget* getItemWidget(size_t _index);
233 
234  void _setContainerItemInfo(size_t _index, bool _set, bool _accept);
235 
236  // сбрасываем старую подсветку
237  void resetCurrentActiveItem();
238  // ищет и устанавливает подсвеченный айтем
239  void findCurrentActiveItem();
240 
241  // запрашиваем у конейтера айтем по позиции мыши
242  virtual size_t _getContainerIndex(const IntPoint& _point);
243 
244  // сбрасывает зависимости, при любом колличественном изменении
245  virtual void _resetContainer(bool _update);
246 
247  void _setScrollViewPage(size_t _size) { mScrollViewPage = _size; }
248 
249  private:
250  void initialiseWidgetSkin(ResourceSkin* _info);
251  void shutdownWidgetSkin();
252 
253  size_t calcIndexByWidget(Widget* _widget) { return *_widget->_getInternalData<size_t>(); }
254 
255  virtual IntSize getContentSize();
256  virtual IntPoint getContentPosition();
257  virtual IntSize getViewSize() const;
258  virtual void eraseContent();
259  virtual size_t getHScrollPage();
260  virtual size_t getVScrollPage();
261  virtual Align getContentAlign();
262  virtual void setContentPosition(const IntPoint& _point);
263 
264  Widget* _getClientWidget();
265  const Widget* _getClientWidget() const;
266 
267  private:
268  // наши дети в строках
269  VectorWidgetPtr mVectorItems;
270 
271  // размерность скролла в пикселях
272  IntSize mContentSize;
273  // позиция скролла п пикселях
274  IntPoint mContentPosition;
275 
276  // текущий выделенный элемент или ITEM_NONE
277  size_t mIndexSelect;
278  // подсвеченный элемент или ITEM_NONE
279  size_t mIndexActive;
280  // индекс со свойством приема или ITEM_NONE
281  size_t mIndexAccept;
282  // индекс со свойством отказа или ITEM_NONE
283  size_t mIndexRefuse;
284 
285  // имеем ли мы фокус ввода
286  bool mIsFocus;
287 
288  // структура данных об айтеме
289  VectorItemInfo mItemsInfo;
290 
291  Widget* mItemDrag;
292  IntPoint mPointDragOffset;
293 
294  std::string mDragLayer;
295 
296  size_t mScrollViewPage;
297  };
298 
299 } // namespace MyGUI
300 
301 #endif // __MYGUI_LIST_CTRL_H__