00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef __MYGUI_LIST_H__
00024 #define __MYGUI_LIST_H__
00025
00026 #include "MyGUI_Prerequest.h"
00027 #include "MyGUI_Widget.h"
00028 #include "MyGUI_Any.h"
00029 #include "MyGUI_EventPair.h"
00030
00031 namespace MyGUI
00032 {
00033
00034 typedef delegates::CDelegate2<List*, size_t> EventHandle_ListPtrSizeT;
00035
00036 class MYGUI_EXPORT List :
00037 public Widget
00038 {
00039 MYGUI_RTTI_DERIVED( List )
00040
00041 public:
00042 List();
00043
00044
00045
00046
00048 size_t getItemCount() const { return mItemsInfo.size(); }
00049
00051 void insertItemAt(size_t _index, const UString& _name, Any _data = Any::Null);
00052
00054 void addItem(const UString& _name, Any _data = Any::Null) { insertItemAt(ITEM_NONE, _name, _data); }
00055
00057 void removeItemAt(size_t _index);
00058
00060 void removeAllItems();
00061
00063 void swapItemsAt(size_t _index1, size_t _index2);
00064
00065
00067 size_t findItemIndexWith(const UString& _name);
00068
00069
00070
00071
00072
00074 size_t getIndexSelected() { return mIndexSelect; }
00075
00077 void setIndexSelected(size_t _index);
00078
00080 void clearIndexSelected() { setIndexSelected(ITEM_NONE); }
00081
00082
00083
00084
00085
00087 void setItemDataAt(size_t _index, Any _data);
00088
00090 void clearItemDataAt(size_t _index) { setItemDataAt(_index, Any::Null); }
00091
00093 template <typename ValueType>
00094 ValueType * getItemDataAt(size_t _index, bool _throw = true)
00095 {
00096 MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "List::getItemDataAt");
00097 return mItemsInfo[_index].second.castType<ValueType>(_throw);
00098 }
00099
00100
00101
00102
00103
00105 void setItemNameAt(size_t _index, const UString& _name);
00106
00108 const UString& getItemNameAt(size_t _index);
00109
00110
00111
00112
00113
00115 void beginToItemAt(size_t _index);
00116
00118 void beginToItemFirst() { if (getItemCount()) beginToItemAt(0); }
00119
00121 void beginToItemLast() { if (getItemCount()) beginToItemAt(getItemCount() - 1); }
00122
00124 void beginToItemSelected() { if (getIndexSelected() != ITEM_NONE) beginToItemAt(getIndexSelected()); }
00125
00126
00127
00128
00136 bool isItemVisibleAt(size_t _index, bool _fill = true);
00138 bool isItemSelectedVisible(bool _fill = true) { return isItemVisibleAt(mIndexSelect, _fill); }
00139
00140
00142 void setScrollVisible(bool _visible);
00144 void setScrollPosition(size_t _position);
00145
00146
00147
00149 virtual void setPosition(const IntPoint& _value);
00151 virtual void setSize(const IntSize& _value);
00153 virtual void setCoord(const IntCoord& _value);
00154
00156 void setPosition(int _left, int _top) { setPosition(IntPoint(_left, _top)); }
00158 void setSize(int _width, int _height) { setSize(IntSize(_width, _height)); }
00160 void setCoord(int _left, int _top, int _width, int _height) { setCoord(IntCoord(_left, _top, _width, _height)); }
00161
00162
00164 int getOptimalHeight();
00165
00167 virtual void setProperty(const std::string& _key, const std::string& _value);
00168
00169
00175 EventPair<EventHandle_WidgetSizeT, EventHandle_ListPtrSizeT> eventListSelectAccept;
00176
00182 EventPair<EventHandle_WidgetSizeT, EventHandle_ListPtrSizeT> eventListChangePosition;
00183
00189 EventPair<EventHandle_WidgetSizeT, EventHandle_ListPtrSizeT> eventListMouseItemActivate;
00190
00196 EventPair<EventHandle_WidgetSizeT, EventHandle_ListPtrSizeT> eventListMouseItemFocus;
00197
00203 EventPair<EventHandle_WidgetSizeT, EventHandle_ListPtrSizeT> eventListChangeScroll;
00204
00205
00206
00207 void _checkAlign();
00208
00209
00210 void _setItemFocus(size_t _position, bool _focus);
00211 void _sendEventChangeScroll(size_t _position);
00212
00213 virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name);
00214
00215
00216 #ifndef MYGUI_DONT_USE_OBSOLETE
00217
00218 MYGUI_OBSOLETE("use : void Widget::setCoord(const IntCoord& _coord)")
00219 void setPosition(const IntCoord& _coord) { setCoord(_coord); }
00220 MYGUI_OBSOLETE("use : void Widget::setCoord(int _left, int _top, int _width, int _height)")
00221 void setPosition(int _left, int _top, int _width, int _height) { setCoord(_left, _top, _width, _height); }
00222
00223 MYGUI_OBSOLETE("use : size_t List::getIndexSelected()")
00224 size_t getItemIndexSelected() { return getIndexSelected(); }
00225 MYGUI_OBSOLETE("use : void List::setIndexSelected(size_t _index)")
00226 void setItemSelectedAt(size_t _index) { setIndexSelected(_index); }
00227 MYGUI_OBSOLETE("use : void List::clearIndexSelected()")
00228 void clearItemSelected() { clearIndexSelected(); }
00229
00230 MYGUI_OBSOLETE("use : void List::insertItemAt(size_t _index, const UString& _name)")
00231 void insertItem(size_t _index, const UString& _item) { insertItemAt(_index, _item); }
00232 MYGUI_OBSOLETE("use : void List::setItemNameAt(size_t _index, const UString& _name)")
00233 void setItem(size_t _index, const UString& _item) { setItemNameAt(_index, _item); }
00234 MYGUI_OBSOLETE("use : const UString& List::getItemNameAt(size_t _index)")
00235 const UString& getItem(size_t _index) { return getItemNameAt(_index); }
00236 MYGUI_OBSOLETE("use : void List::removeItemAt(size_t _index)")
00237 void deleteItem(size_t _index) { removeItemAt(_index); }
00238 MYGUI_OBSOLETE("use : void List::removeAllItems()")
00239 void deleteAllItems() { removeAllItems(); }
00240 MYGUI_OBSOLETE("use : size_t List::findItemIndexWith(const UString& _name)")
00241 size_t findItem(const UString& _item) { return findItemIndexWith(_item); }
00242 MYGUI_OBSOLETE("use : size_t List::getIndexSelected()")
00243 size_t getItemSelect() { return getIndexSelected(); }
00244 MYGUI_OBSOLETE("use : void List::clearIndexSelected()")
00245 void resetItemSelect() { clearIndexSelected(); }
00246 MYGUI_OBSOLETE("use : void List::setIndexSelected(size_t _index)")
00247 void setItemSelect(size_t _index) { setIndexSelected(_index); }
00248 MYGUI_OBSOLETE("use : void List::beginToItemAt(size_t _index)")
00249 void beginToIndex(size_t _index) { beginToItemAt(_index); }
00250 MYGUI_OBSOLETE("use : void List::beginToItemFirst()")
00251 void beginToStart() { beginToItemFirst(); }
00252 MYGUI_OBSOLETE("use : void List::beginToItemLast()")
00253 void beginToEnd() { beginToItemLast(); }
00254 MYGUI_OBSOLETE("use : void List::beginToItemSelected()")
00255 void beginToSelect() { beginToItemSelected(); }
00256 MYGUI_OBSOLETE("use : bool List::isItemVisibleAt(size_t _index, bool _fill)")
00257 bool isItemVisible(size_t _index, bool _fill = true) { return isItemVisibleAt(_index, _fill); }
00258 MYGUI_OBSOLETE("use : bool List::isItemSelectedVisible(bool _fill)")
00259 bool isItemSelectVisible(bool _fill = true) { return isItemSelectedVisible(_fill); }
00260
00261 #endif // MYGUI_DONT_USE_OBSOLETE
00262
00263 protected:
00264 virtual ~List();
00265
00266 void baseChangeWidgetSkin(ResourceSkin* _info);
00267
00268 void onMouseWheel(int _rel);
00269 void onKeyLostFocus(Widget* _new);
00270 void onKeySetFocus(Widget* _old);
00271 void onKeyButtonPressed(KeyCode _key, Char _char);
00272
00273 void notifyScrollChangePosition(VScroll* _sender, size_t _rel);
00274 void notifyMousePressed(Widget* _sender, int _left, int _top, MouseButton _id);
00275 void notifyMouseDoubleClick(Widget* _sender);
00276 void notifyMouseWheel(Widget* _sender, int _rel);
00277 void notifyMouseSetFocus(Widget* _sender, Widget* _old);
00278 void notifyMouseLostFocus(Widget* _sender, Widget* _new);
00279
00280 void updateScroll();
00281 void updateLine(bool _reset = false);
00282 void _setScrollView(size_t _position);
00283
00284
00285 void _redrawItemRange(size_t _start = 0);
00286
00287
00288 void _redrawItem(size_t _index);
00289
00290
00291 void _selectIndex(size_t _index, bool _select);
00292
00293 void _updateState() { setState(mIsFocus ? "pushed" : "normal"); }
00294
00295 private:
00296 void initialiseWidgetSkin(ResourceSkin* _info);
00297 void shutdownWidgetSkin();
00298 void _checkMapping(const std::string& _owner);
00299
00300 Widget* _getClientWidget();
00301 const Widget* _getClientWidget() const;
00302
00303 private:
00304 std::string mSkinLine;
00305 VScroll* mWidgetScroll;
00306
00307
00308 VectorWidgetPtr mWidgetLines;
00309
00310 int mHeightLine;
00311 int mTopIndex;
00312 int mOffsetTop;
00313 int mRangeIndex;
00314 size_t mLastRedrawLine;
00315
00316 size_t mIndexSelect;
00317 size_t mLineActive;
00318
00319 typedef std::pair<UString, Any> PairItem;
00320 typedef std::vector<PairItem> VectorItemInfo;
00321 VectorItemInfo mItemsInfo;
00322
00323
00324 bool mIsFocus;
00325 bool mNeedVisibleScroll;
00326
00327 IntSize mOldSize;
00328
00329 };
00330
00331 }
00332
00333 #endif // __MYGUI_LIST_H__