MyGUI 3.0.1
|
00001 00007 /* 00008 This file is part of MyGUI. 00009 00010 MyGUI is free software: you can redistribute it and/or modify 00011 it under the terms of the GNU Lesser General Public License as published by 00012 the Free Software Foundation, either version 3 of the License, or 00013 (at your option) any later version. 00014 00015 MyGUI is distributed in the hope that it will be useful, 00016 but WITHOUT ANY WARRANTY; without even the implied warranty of 00017 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00018 GNU Lesser General Public License for more details. 00019 00020 You should have received a copy of the GNU Lesser General Public License 00021 along with MyGUI. If not, see <http://www.gnu.org/licenses/>. 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 //OBSOLETE 00037 typedef delegates::CDelegate5<Widget*, size_t, const UString &, const UString &, bool &> EventHandle_WidgetIntUTFStringUTFStringBool; 00038 00039 typedef delegates::CDelegate5<MultiList*, size_t, const UString &, const UString &, bool &> EventHandle_MultiListPtrSizeTCUTFStringRefCUTFStringRefBoolRef; 00040 typedef delegates::CDelegate2<MultiList*, 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 // Methods for work with columns (RU:методы для работы со столбцами) 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 // Methods for work with lines (RU:методы для работы со строками) 00127 //------------------------------------------------------------------------------// 00128 // манипуляции айтемами 00129 00131 size_t getItemCount() const; 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 // Methods for work with sub lines (RU:методы для работы со саб строками) 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 /*internal:*/ 00228 virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name); 00229 00230 /*event:*/ 00236 EventPair<EventHandle_WidgetSizeT, EventHandle_MultiListPtrSizeT> eventListSelectAccept; 00237 00243 EventPair<EventHandle_WidgetSizeT, EventHandle_MultiListPtrSizeT> eventListChangePosition; 00244 00253 EventHandle_MultiListPtrSizeTCUTFStringRefCUTFStringRefBoolRef requestOperatorLess; 00254 00255 /*obsolete:*/ 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(List* _sender, size_t _position); 00312 void notifyListChangeFocus(List* _sender, size_t _position); 00313 void notifyListChangeScrollPosition(List* _sender, size_t _position); 00314 void notifyButtonClick(Widget* _sender); 00315 void notifyListSelectAccept(List* _sender, size_t _position); 00316 00317 void updateColumns(); 00318 void redrawButtons(); 00319 void updateOnlyEmpty(); 00320 00321 bool compare(List* _list, size_t _left, size_t _right); 00322 void sortList(); 00323 void flipList(); 00324 00325 Widget* getSeparator(size_t _index); 00326 00327 void setButtonImageIndex(Button* _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 List* list; 00343 Button* 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 Button* mButtonMain; 00363 00364 VectorColumnInfo mVectorColumnInfo; 00365 00366 VectorWidgetPtr mSeparators; 00367 00368 size_t mLastMouseFocusIndex; 00369 00370 bool mSortUp; 00371 size_t mSortColumnIndex; 00372 00373 int mWidthSeparator; 00374 std::string mSkinSeparator; 00375 int mOffsetButtonSeparator; 00376 00377 size_t mItemSelected; 00378 00379 bool mFrameAdvise; 00380 Widget* mClient; 00381 }; 00382 00383 } // namespace MyGUI 00384 00385 #endif // __MYGUI_MULTI_LIST_H__