MyGUI  3.0.1
MyGUI_MultiList.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_MULTI_LIST_H__
24 #define __MYGUI_MULTI_LIST_H__
25 
26 #include "MyGUI_Prerequest.h"
27 #include "MyGUI_Widget.h"
28 #include "MyGUI_List.h"
29 #include "MyGUI_Any.h"
30 #include "MyGUI_BiIndexBase.h"
31 #include "MyGUI_EventPair.h"
32 
33 namespace MyGUI
34 {
35 
36  //OBSOLETE
38 
41 
43  public Widget,
44  public BiIndexBase
45  {
47 
48  public:
49  MultiList();
50 
51  //------------------------------------------------------------------------------//
52  // Methods for work with columns (RU:методы для работы со столбцами)
53  //------------------------------------------------------------------------------//
54  // манипуляции айтемами
55 
57  size_t getColumnCount() { return mVectorColumnInfo.size(); }
58 
64  void insertColumnAt(size_t _column, const UString& _name, int _width, Any _data = Any::Null);
65 
70  void addColumn(const UString& _name, int _width, Any _data = Any::Null) { insertColumnAt(ITEM_NONE, _name, _width, _data); }
71 
73  void removeColumnAt(size_t _column);
74 
76  void removeAllColumns();
77 
78 
79  //------------------------------------------------------------------------------//
80  // манипуляции отображением
81 
86  void setColumnNameAt(size_t _column, const UString& _name);
87 
92  void setColumnWidthAt(size_t _column, int _width);
93 
95  const UString& getColumnNameAt(size_t _column);
96 
98  int getColumnWidthAt(size_t _column);
99 
101  void sortByColumn(size_t _column, bool _backward = false);
102 
103  //------------------------------------------------------------------------------//
104  // манипуляции данными
105 
107  void setColumnDataAt(size_t _index, Any _data);
108 
110  void clearColumnDataAt(size_t _index) { setColumnDataAt(_index, Any::Null); }
111 
113  template <typename ValueType>
114  ValueType * getColumnDataAt(size_t _index, bool _throw = true)
115  {
116  MYGUI_ASSERT_RANGE(_index, mVectorColumnInfo.size(), "MultiList::getItemDataAt");
117  return mVectorColumnInfo[_index].data.castType<ValueType>(_throw);
118  }
119 
120  //------------------------------------------------------------------------------//
121  // Methods for work with lines (RU:методы для работы со строками)
127  //------------------------------------------------------------------------------//
128  // манипуляции айтемами
129 
131  size_t getItemCount() const;
132 
134  void insertItemAt(size_t _index, const UString& _name, Any _data = Any::Null);
135 
137  void addItem(const UString& _name, Any _data = Any::Null) { insertItemAt(ITEM_NONE, _name, _data); }
138 
140  void removeItemAt(size_t _index);
141 
143  void removeAllItems();
144 
146  void swapItemsAt(size_t _index1, size_t _index2);
147 
148 
149  //------------------------------------------------------------------------------//
150  // манипуляции отображением
151 
153  void setItemNameAt(size_t _index, const UString& _name) { setSubItemNameAt(0, _index, _name); }
154 
156  const UString& getItemNameAt(size_t _index) { return getSubItemNameAt(0, _index); }
157 
158 
159  //------------------------------------------------------------------------------//
160  // манипуляции выделениями
161 
163  size_t getIndexSelected() { return mItemSelected; }
164 
166  void setIndexSelected(size_t _index);
167 
169  void clearIndexSelected() { setIndexSelected(ITEM_NONE); }
170 
171 
172  //------------------------------------------------------------------------------//
173  // манипуляции данными
174 
176  void setItemDataAt(size_t _index, Any _data) { setSubItemDataAt(0, _index, _data); }
177 
179  void clearItemDataAt(size_t _index) { setItemDataAt(_index, Any::Null); }
180 
182  template <typename ValueType>
183  ValueType * getItemDataAt(size_t _index, bool _throw = true)
184  {
185  return getSubItemDataAt<ValueType>(0, _index, _throw);
186  }
187 
188 
189  //------------------------------------------------------------------------------//
190  // Methods for work with sub lines (RU:методы для работы со саб строками)
191  //------------------------------------------------------------------------------//
192  // манипуляции данными
193 
199  void setSubItemNameAt(size_t _column, size_t _index, const UString& _name);
200 
202  const UString& getSubItemNameAt(size_t _column, size_t _index);
203 
205  size_t findSubItemWith(size_t _column, const UString& _name);
206 
207  //------------------------------------------------------------------------------//
208  // манипуляции данными
209 
211  void setSubItemDataAt(size_t _column, size_t _index, Any _data);
212 
214  void clearSubItemDataAt(size_t _column, size_t _index) { setSubItemDataAt(_column, _index, Any::Null); }
215 
217  template <typename ValueType>
218  ValueType * getSubItemDataAt(size_t _column, size_t _index, bool _throw = true)
219  {
220  MYGUI_ASSERT_RANGE(_column, mVectorColumnInfo.size(), "MultiList::getSubItemDataAt");
221  MYGUI_ASSERT_RANGE(_index, mVectorColumnInfo.begin()->list->getItemCount(), "MultiList::getSubItemDataAt");
222 
223  size_t index = BiIndexBase::convertToBack(_index);
224  return mVectorColumnInfo[_column].list->getItemDataAt<ValueType>(index, _throw);
225  }
226 
227  /*internal:*/
228  virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name);
229 
230  /*event:*/
237 
244 
254 
255  /*obsolete:*/
256 #ifndef MYGUI_DONT_USE_OBSOLETE
257 
258  MYGUI_OBSOLETE("use : size_t MultiList::getIndexSelected()")
259  size_t getItemIndexSelected() { return getIndexSelected(); }
260  MYGUI_OBSOLETE("use : void MultiList::setIndexSelected(size_t _index)")
261  void setItemSelectedAt(size_t _index) { setIndexSelected(_index); }
262  MYGUI_OBSOLETE("use : void MultiList::clearIndexSelected()")
263  void clearItemSelected() { clearIndexSelected(); }
264 
265  MYGUI_OBSOLETE("use : size_t MultiList::findSubItemWith(size_t _column, const UString& _name)")
266  size_t findItem(size_t _column, const UString& _name) { return findSubItemWith(_column, _name); }
267  MYGUI_OBSOLETE("use : const UString& MultiList::getSubItemNameAt(size_t _column, size_t _index)")
268  const UString& getSubItem(size_t _column, size_t _index) { return getSubItemNameAt(_column, _index); }
269  MYGUI_OBSOLETE("use : void MultiList::setSubItemNameAt(size_t _column, size_t _index, const UString& _name)")
270  void setSubItem(size_t _column, size_t _index, const UString& _name) { setSubItemNameAt(_column, _index, _name); }
271  MYGUI_OBSOLETE("use : void MultiList::removeColumnAt(size_t _column)")
272  void deleteColumn(size_t _column) { removeColumnAt(_column); }
273  MYGUI_OBSOLETE("use : void MultiList::removeAllColumns()")
274  void deleteAllColumns() { removeAllColumns(); }
275  MYGUI_OBSOLETE("use : int MultiList::getColumnWidthAt(size_t _column)")
276  int getColumnWidth(size_t _column) { return getColumnWidthAt(_column); }
277  MYGUI_OBSOLETE("use : const UString& MultiList::getColumnNameAt(size_t _column)")
278  const UString& getColumnName(size_t _column) { return getColumnNameAt(_column); }
279  MYGUI_OBSOLETE("use : void MultiList::setColumnWidthAt(size_t _column, int _width)")
280  void setColumnWidth(size_t _column, int _width) { setColumnWidthAt(_column, _width); }
281  MYGUI_OBSOLETE("use : void MultiList::addColumn(const UString& _name, int _width, Any _data)")
282  void addColumn(int _width, const UString& _name) { addColumn(_name, _width); }
283  MYGUI_OBSOLETE("use : void MultiList::setColumnNameAt(size_t _column, const UString& _name)")
284  void setColumnName(size_t _column, const UString& _name) { setColumnNameAt(_column, _name); }
285  MYGUI_OBSOLETE("use : void MultiList::insertColumnAt(size_t _column, const UString& _name, int _width, Any _data)")
286  void insertColumn(size_t _column, int _width, const UString& _name) { insertColumnAt(_column, _name, _width); }
287  MYGUI_OBSOLETE("use : size_t MultiList::getIndexSelected()")
288  size_t getItemSelect() { return getIndexSelected(); }
289  MYGUI_OBSOLETE("use : void MultiList::clearIndexSelected()")
290  void resetItemSelect() { clearIndexSelected(); }
291  MYGUI_OBSOLETE("use : void MultiList::setIndexSelected(size_t _index)")
292  void setItemSelect(size_t _index) { setIndexSelected(_index); }
293  MYGUI_OBSOLETE("use : void MultiList::insertItemAt(size_t _index, const UString& _name, Any _data)")
294  void insertItem(size_t _index, const UString& _name) { insertItemAt(_index, _name); }
295  MYGUI_OBSOLETE("use : void MultiList::setItemNameAt(size_t _index, const UString& _name)")
296  void setItem(size_t _index, const UString& _name) { setItemNameAt(_index, _name); }
297  MYGUI_OBSOLETE("use : const UString& MultiList::getItemNameAt(size_t _index)")
298  const UString& getItem(size_t _index) { return getItemNameAt(_index); }
299  MYGUI_OBSOLETE("use : void MultiList::removeItemAt(size_t _index)")
300  void deleteItem(size_t _index) { removeItemAt(_index); }
301  MYGUI_OBSOLETE("use : void MultiList::removeAllItems()")
302  void deleteAllItems() { removeAllItems(); }
303 
304 #endif // MYGUI_DONT_USE_OBSOLETE
305 
306  protected:
307  virtual ~MultiList();
308 
309  void baseChangeWidgetSkin(ResourceSkin* _info);
310 
311  void notifyListChangePosition(List* _sender, size_t _position);
312  void notifyListChangeFocus(List* _sender, size_t _position);
313  void notifyListChangeScrollPosition(List* _sender, size_t _position);
314  void notifyButtonClick(Widget* _sender);
315  void notifyListSelectAccept(List* _sender, size_t _position);
316 
317  void updateColumns();
318  void redrawButtons();
319  void updateOnlyEmpty();
320 
321  bool compare(List* _list, size_t _left, size_t _right);
322  void sortList();
323  void flipList();
324 
325  Widget* getSeparator(size_t _index);
326 
327  void setButtonImageIndex(Button* _button, size_t _index);
328 
329  void updateBackSelected(size_t _index);
330 
331  private:
332  void initialiseWidgetSkin(ResourceSkin* _info);
333  void shutdownWidgetSkin();
334 
335  void frameEntered(float _frame);
336 
337  void frameAdvise(bool _advise);
338 
339  private:
340  struct ColumnInfo
341  {
342  List* list;
343  Button* button;
344  int width;
345  UString name;
346  Any data;
347  };
348 
349  typedef std::vector<ColumnInfo> VectorColumnInfo;
350 
351  enum ImageSort
352  {
353  SORT_NONE,
354  SORT_UP,
355  SORT_DOWN
356  };
357 
358  private:
359  int mHeightButton;
360  int mWidthBar;
361  std::string mSkinButton, mSkinList;
362  Button* mButtonMain;
363 
364  VectorColumnInfo mVectorColumnInfo;
365 
366  VectorWidgetPtr mSeparators;
367 
368  size_t mLastMouseFocusIndex;
369 
370  bool mSortUp;
371  size_t mSortColumnIndex;
372 
373  int mWidthSeparator;
374  std::string mSkinSeparator;
375  int mOffsetButtonSeparator;
376 
377  size_t mItemSelected;
378 
379  bool mFrameAdvise;
380  Widget* mClient;
381  };
382 
383 } // namespace MyGUI
384 
385 #endif // __MYGUI_MULTI_LIST_H__