00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef __MYGUI_MULTI_LIST_H__
00024 #define __MYGUI_MULTI_LIST_H__
00025
00026 #include "MyGUI_Prerequest.h"
00027 #include "MyGUI_Widget.h"
00028 #include "MyGUI_List.h"
00029 #include "MyGUI_Any.h"
00030 #include "MyGUI_BiIndexBase.h"
00031 #include "MyGUI_EventPair.h"
00032
00033 namespace MyGUI
00034 {
00035
00036
00037 typedef delegates::CDelegate5<WidgetPtr, size_t, const UString &, const UString &, bool &> EventHandle_WidgetIntUTFStringUTFStringBool;
00038
00039 typedef delegates::CDelegate5<MultiListPtr, size_t, const UString &, const UString &, bool &> EventHandle_MultiListPtrSizeTCUTFStringRefCUTFStringRefBoolRef;
00040 typedef delegates::CDelegate2<MultiListPtr, size_t> EventHandle_MultiListPtrSizeT;
00041
00042 class MYGUI_EXPORT MultiList :
00043 public Widget,
00044 public BiIndexBase
00045 {
00046 MYGUI_RTTI_DERIVED( MultiList );
00047
00048 public:
00049 MultiList();
00050
00051
00052
00053
00054
00055
00057 size_t getColumnCount() { return mVectorColumnInfo.size(); }
00058
00064 void insertColumnAt(size_t _column, const UString& _name, int _width, Any _data = Any::Null);
00065
00070 void addColumn(const UString& _name, int _width, Any _data = Any::Null) { insertColumnAt(ITEM_NONE, _name, _width, _data); }
00071
00073 void removeColumnAt(size_t _column);
00074
00076 void removeAllColumns();
00077
00078
00079
00080
00081
00086 void setColumnNameAt(size_t _column, const UString& _name);
00087
00092 void setColumnWidthAt(size_t _column, int _width);
00093
00095 const UString& getColumnNameAt(size_t _column);
00096
00098 int getColumnWidthAt(size_t _column);
00099
00101 void sortByColumn(size_t _column, bool _backward = false);
00102
00103
00104
00105
00107 void setColumnDataAt(size_t _index, Any _data);
00108
00110 void clearColumnDataAt(size_t _index) { setColumnDataAt(_index, Any::Null); }
00111
00113 template <typename ValueType>
00114 ValueType * getColumnDataAt(size_t _index, bool _throw = true)
00115 {
00116 MYGUI_ASSERT_RANGE(_index, mVectorColumnInfo.size(), "MultiList::getItemDataAt");
00117 return mVectorColumnInfo[_index].data.castType<ValueType>(_throw);
00118 }
00119
00120
00121
00127
00128
00129
00131 size_t getItemCount();
00132
00134 void insertItemAt(size_t _index, const UString& _name, Any _data = Any::Null);
00135
00137 void addItem(const UString& _name, Any _data = Any::Null) { insertItemAt(ITEM_NONE, _name, _data); }
00138
00140 void removeItemAt(size_t _index);
00141
00143 void removeAllItems();
00144
00146 void swapItemsAt(size_t _index1, size_t _index2);
00147
00148
00149
00150
00151
00153 void setItemNameAt(size_t _index, const UString& _name) { setSubItemNameAt(0, _index, _name); }
00154
00156 const UString& getItemNameAt(size_t _index) { return getSubItemNameAt(0, _index); }
00157
00158
00159
00160
00161
00163 size_t getIndexSelected() { return mItemSelected; }
00164
00166 void setIndexSelected(size_t _index);
00167
00169 void clearIndexSelected() { setIndexSelected(ITEM_NONE); }
00170
00171
00172
00173
00174
00176 void setItemDataAt(size_t _index, Any _data) { setSubItemDataAt(0, _index, _data); }
00177
00179 void clearItemDataAt(size_t _index) { setItemDataAt(_index, Any::Null); }
00180
00182 template <typename ValueType>
00183 ValueType * getItemDataAt(size_t _index, bool _throw = true)
00184 {
00185 return getSubItemDataAt<ValueType>(0, _index, _throw);
00186 }
00187
00188
00189
00190
00191
00192
00193
00199 void setSubItemNameAt(size_t _column, size_t _index, const UString& _name);
00200
00202 const UString& getSubItemNameAt(size_t _column, size_t _index);
00203
00205 size_t findSubItemWith(size_t _column, const UString& _name);
00206
00207
00208
00209
00211 void setSubItemDataAt(size_t _column, size_t _index, Any _data);
00212
00214 void clearSubItemDataAt(size_t _column, size_t _index) { setSubItemDataAt(_column, _index, Any::Null); }
00215
00217 template <typename ValueType>
00218 ValueType * getSubItemDataAt(size_t _column, size_t _index, bool _throw = true)
00219 {
00220 MYGUI_ASSERT_RANGE(_column, mVectorColumnInfo.size(), "MultiList::getSubItemDataAt");
00221 MYGUI_ASSERT_RANGE(_index, mVectorColumnInfo.begin()->list->getItemCount(), "MultiList::getSubItemDataAt");
00222
00223 size_t index = BiIndexBase::convertToBack(_index);
00224 return mVectorColumnInfo[_column].list->getItemDataAt<ValueType>(index, _throw);
00225 }
00226
00227
00228 virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, WidgetPtr _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name);
00229
00230
00236 EventPair<EventHandle_WidgetSizeT, EventHandle_MultiListPtrSizeT> eventListSelectAccept;
00237
00243 EventPair<EventHandle_WidgetSizeT, EventHandle_MultiListPtrSizeT> eventListChangePosition;
00244
00253 EventHandle_MultiListPtrSizeTCUTFStringRefCUTFStringRefBoolRef requestOperatorLess;
00254
00255
00256 #ifndef MYGUI_DONT_USE_OBSOLETE
00257
00258 MYGUI_OBSOLETE("use : size_t MultiList::getIndexSelected()")
00259 size_t getItemIndexSelected() { return getIndexSelected(); }
00260 MYGUI_OBSOLETE("use : void MultiList::setIndexSelected(size_t _index)")
00261 void setItemSelectedAt(size_t _index) { setIndexSelected(_index); }
00262 MYGUI_OBSOLETE("use : void MultiList::clearIndexSelected()")
00263 void clearItemSelected() { clearIndexSelected(); }
00264
00265 MYGUI_OBSOLETE("use : size_t MultiList::findSubItemWith(size_t _column, const UString& _name)")
00266 size_t findItem(size_t _column, const UString& _name) { return findSubItemWith(_column, _name); }
00267 MYGUI_OBSOLETE("use : const UString& MultiList::getSubItemNameAt(size_t _column, size_t _index)")
00268 const UString& getSubItem(size_t _column, size_t _index) { return getSubItemNameAt(_column, _index); }
00269 MYGUI_OBSOLETE("use : void MultiList::setSubItemNameAt(size_t _column, size_t _index, const UString& _name)")
00270 void setSubItem(size_t _column, size_t _index, const UString& _name) { setSubItemNameAt(_column, _index, _name); }
00271 MYGUI_OBSOLETE("use : void MultiList::removeColumnAt(size_t _column)")
00272 void deleteColumn(size_t _column) { removeColumnAt(_column); }
00273 MYGUI_OBSOLETE("use : void MultiList::removeAllColumns()")
00274 void deleteAllColumns() { removeAllColumns(); }
00275 MYGUI_OBSOLETE("use : int MultiList::getColumnWidthAt(size_t _column)")
00276 int getColumnWidth(size_t _column) { return getColumnWidthAt(_column); }
00277 MYGUI_OBSOLETE("use : const UString& MultiList::getColumnNameAt(size_t _column)")
00278 const UString& getColumnName(size_t _column) { return getColumnNameAt(_column); }
00279 MYGUI_OBSOLETE("use : void MultiList::setColumnWidthAt(size_t _column, int _width)")
00280 void setColumnWidth(size_t _column, int _width) { setColumnWidthAt(_column, _width); }
00281 MYGUI_OBSOLETE("use : void MultiList::addColumn(const UString& _name, int _width, Any _data)")
00282 void addColumn(int _width, const UString& _name) { addColumn(_name, _width); }
00283 MYGUI_OBSOLETE("use : void MultiList::setColumnNameAt(size_t _column, const UString& _name)")
00284 void setColumnName(size_t _column, const UString& _name) { setColumnNameAt(_column, _name); }
00285 MYGUI_OBSOLETE("use : void MultiList::insertColumnAt(size_t _column, const UString& _name, int _width, Any _data)")
00286 void insertColumn(size_t _column, int _width, const UString& _name) { insertColumnAt(_column, _name, _width); }
00287 MYGUI_OBSOLETE("use : size_t MultiList::getIndexSelected()")
00288 size_t getItemSelect() { return getIndexSelected(); }
00289 MYGUI_OBSOLETE("use : void MultiList::clearIndexSelected()")
00290 void resetItemSelect() { clearIndexSelected(); }
00291 MYGUI_OBSOLETE("use : void MultiList::setIndexSelected(size_t _index)")
00292 void setItemSelect(size_t _index) { setIndexSelected(_index); }
00293 MYGUI_OBSOLETE("use : void MultiList::insertItemAt(size_t _index, const UString& _name, Any _data)")
00294 void insertItem(size_t _index, const UString& _name) { insertItemAt(_index, _name); }
00295 MYGUI_OBSOLETE("use : void MultiList::setItemNameAt(size_t _index, const UString& _name)")
00296 void setItem(size_t _index, const UString& _name) { setItemNameAt(_index, _name); }
00297 MYGUI_OBSOLETE("use : const UString& MultiList::getItemNameAt(size_t _index)")
00298 const UString& getItem(size_t _index) { return getItemNameAt(_index); }
00299 MYGUI_OBSOLETE("use : void MultiList::removeItemAt(size_t _index)")
00300 void deleteItem(size_t _index) { removeItemAt(_index); }
00301 MYGUI_OBSOLETE("use : void MultiList::removeAllItems()")
00302 void deleteAllItems() { removeAllItems(); }
00303
00304 #endif // MYGUI_DONT_USE_OBSOLETE
00305
00306 protected:
00307 virtual ~MultiList();
00308
00309 void baseChangeWidgetSkin(ResourceSkin* _info);
00310
00311 void notifyListChangePosition(ListPtr _sender, size_t _position);
00312 void notifyListChangeFocus(ListPtr _sender, size_t _position);
00313 void notifyListChangeScrollPosition(ListPtr _sender, size_t _position);
00314 void notifyButtonClick(WidgetPtr _sender);
00315 void notifyListSelectAccept(ListPtr _sender, size_t _position);
00316
00317 void updateColumns();
00318 void redrawButtons();
00319 void updateOnlyEmpty();
00320
00321 bool compare(ListPtr _list, size_t _left, size_t _right);
00322 void sortList();
00323 void flipList();
00324
00325 WidgetPtr getSeparator(size_t _index);
00326
00327 void setButtonImageIndex(ButtonPtr _button, size_t _index);
00328
00329 void updateBackSelected(size_t _index);
00330
00331 private:
00332 void initialiseWidgetSkin(ResourceSkin* _info);
00333 void shutdownWidgetSkin();
00334
00335 void frameEntered(float _frame);
00336
00337 void frameAdvise(bool _advise);
00338
00339 private:
00340 struct ColumnInfo
00341 {
00342 ListPtr list;
00343 ButtonPtr button;
00344 int width;
00345 UString name;
00346 Any data;
00347 };
00348
00349 typedef std::vector<ColumnInfo> VectorColumnInfo;
00350
00351 enum ImageSort
00352 {
00353 SORT_NONE,
00354 SORT_UP,
00355 SORT_DOWN
00356 };
00357
00358 private:
00359 int mHeightButton;
00360 int mWidthBar;
00361 std::string mSkinButton, mSkinList;
00362 ButtonPtr mButtonMain;
00363
00364 VectorColumnInfo mVectorColumnInfo;
00365
00366 VectorWidgetPtr mSeparators;
00367
00368 size_t mLastMouseFocusIndex;
00369
00370 bool mSortUp;
00371 size_t mSortColumnIndex;
00372
00373 bool mIsDirtySort;
00374
00375 int mWidthSeparator;
00376 std::string mSkinSeparator;
00377 int mOffsetButtonSeparator;
00378
00379 size_t mItemSelected;
00380
00381 bool mFrameAdvise;
00382 WidgetPtr mClient;
00383 };
00384
00385 }
00386
00387 #endif // __MYGUI_MULTI_LIST_H__