00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef __MYGUI_LIST_CTRL_H__
00024 #define __MYGUI_LIST_CTRL_H__
00025
00026 #include "MyGUI_Prerequest.h"
00027 #include "MyGUI_DDContainer.h"
00028 #include "MyGUI_IBItemInfo.h"
00029 #include "MyGUI_Any.h"
00030 #include "MyGUI_EventPair.h"
00031 #include "MyGUI_ScrollViewBase.h"
00032
00033 namespace MyGUI
00034 {
00035
00036 typedef delegates::CDelegate2<ListCtrlPtr, WidgetPtr> EventHandle_ListCtrlPtrWidgetPtr;
00037 typedef delegates::CDelegate4<ListCtrlPtr, WidgetPtr, const IBDrawItemInfo &, IntCoord&> EventHandle_ListCtrlPtrWidgetPtrCIBCellDrawInfoRef;
00038 typedef delegates::CDelegate2<ListCtrlPtr, size_t> EventHandle_ListCtrlPtrSizeT;
00039 typedef delegates::CDelegate2<ListCtrlPtr, const IBNotifyItemData &> EventHandle_ListCtrlPtrCIBNotifyCellDataRef;
00040
00041 class MYGUI_EXPORT ListCtrl :
00042 public DDContainer,
00043 protected ScrollViewBase
00044 {
00045 MYGUI_RTTI_DERIVED( ListCtrl );
00046
00047 public:
00048 ListCtrl();
00049
00050
00051
00052
00054 size_t getItemCount() { return mItemsInfo.size(); }
00055
00057 void insertItemAt(size_t _index, Any _data = Any::Null);
00058
00060 void addItem(Any _data = Any::Null) { insertItemAt(ITEM_NONE, _data); }
00061
00063 void removeItemAt(size_t _index);
00064
00066 void removeAllItems();
00067
00069 void redrawItemAt(size_t _index);
00070
00072 void redrawAllItems() { _updateAllVisible(ITEM_NONE, true, true); }
00073
00074
00075
00076
00077
00079 size_t getIndexSelected() { return mIndexSelect; }
00080
00082 void setIndexSelected(size_t _index);
00083
00085 void clearIndexSelected() { setIndexSelected(ITEM_NONE); }
00086
00087
00088
00089
00090
00092 void setItemDataAt(size_t _index, Any _data);
00093
00095 void clearItemDataAt(size_t _index) { setItemDataAt(_index, Any::Null); }
00096
00098 template <typename ValueType>
00099 ValueType * getItemDataAt(size_t _index, bool _throw = true)
00100 {
00101 MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "ListCtrl::getItemDataAt");
00102 return mItemsInfo[_index].data.castType<ValueType>(_throw);
00103 }
00104
00105
00107 size_t getIndexByWidget(WidgetPtr _widget);
00108
00110 WidgetPtr getWidgetDrag() { return mItemDrag; }
00111
00117 WidgetPtr getWidgetByIndex(size_t _index);
00118
00120 void resetDrag();
00121
00123 virtual void setPosition(const IntPoint& _value);
00125 virtual void setSize(const IntSize& _value);
00127 virtual void setCoord(const IntCoord& _value);
00128
00130 void setPosition(int _left, int _top) { setPosition(IntPoint(_left, _top)); }
00132 void setSize(int _width, int _height) { setSize(IntSize(_width, _height)); }
00134 void setCoord(int _left, int _top, int _width, int _height) { setCoord(IntCoord(_left, _top, _width, _height)); }
00135
00136
00137
00143 EventHandle_ListCtrlPtrWidgetPtr requestCreateWidgetItem;
00144
00151 EventHandle_ListCtrlPtrWidgetPtrCIBCellDrawInfoRef requestDrawItem;
00152
00158 EventHandle_ListCtrlPtrSizeT eventSelectItemAccept;
00159
00165 EventHandle_ListCtrlPtrSizeT eventChangeItemPosition;
00166
00172 EventHandle_ListCtrlPtrSizeT eventMouseItemActivate;
00173
00179 EventHandle_ListCtrlPtrCIBNotifyCellDataRef eventNotifyItem;
00180
00181
00182 virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, WidgetPtr _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name);
00183
00184 protected:
00185 virtual ~ListCtrl();
00186
00187 struct ItemDataInfo
00188 {
00189 ItemDataInfo(Any _data) :
00190 data(_data) { }
00191 Any data;
00192 IntSize size;
00193 };
00194 typedef std::vector<ItemDataInfo> VectorItemInfo;
00195
00196 void baseChangeWidgetSkin(ResourceSkin* _info);
00197
00198 virtual void onMouseButtonPressed(int _left, int _top, MouseButton _id);
00199 virtual void onMouseButtonReleased(int _left, int _top, MouseButton _id);
00200 virtual void onMouseDrag(int _left, int _top);
00201
00202 virtual void onMouseWheel(int _rel);
00203 virtual void onKeyLostFocus(WidgetPtr _new);
00204 virtual void onKeySetFocus(WidgetPtr _old);
00205
00206 void notifyKeyButtonPressed(WidgetPtr _sender, KeyCode _key, Char _char);
00207 void notifyKeyButtonReleased(WidgetPtr _sender, KeyCode _key);
00208 void notifyScrollChangePosition(VScrollPtr _sender, size_t _index);
00209 void notifyMouseWheel(WidgetPtr _sender, int _rel);
00210 void notifyRootMouseChangeFocus(WidgetPtr _sender, bool _focus);
00211 void notifyMouseButtonDoubleClick(WidgetPtr _sender);
00212 void _requestGetContainer(WidgetPtr _sender, WidgetPtr& _container, size_t& _index);
00213 void notifyMouseDrag(WidgetPtr _sender, int _left, int _top);
00214 void notifyMouseButtonPressed(WidgetPtr _sender, int _left, int _top, MouseButton _id);
00215 void notifyMouseButtonReleased(WidgetPtr _sender, int _left, int _top, MouseButton _id);
00216
00217
00218 virtual void removeDropItems();
00219 virtual void updateDropItems();
00220 virtual void updateDropItemsState(const DDWidgetState& _state);
00221
00222
00223 void updateMetrics();
00224
00225
00226 void _updateAllVisible(size_t _index, bool _needUpdateContetntSize, bool _update);
00227
00228 void updateFromResize();
00229
00230
00231
00232 WidgetPtr getItemWidget(size_t _index);
00233
00234 void _setContainerItemInfo(size_t _index, bool _set, bool _accept);
00235
00236
00237 void resetCurrentActiveItem();
00238
00239 void findCurrentActiveItem();
00240
00241
00242 virtual size_t _getContainerIndex(const IntPoint& _point);
00243
00244
00245 virtual void _resetContainer(bool _update);
00246
00247 void _setScrollViewPage(size_t _size) { mScrollViewPage = _size; }
00248
00249 private:
00250 void initialiseWidgetSkin(ResourceSkin* _info);
00251 void shutdownWidgetSkin();
00252
00253 size_t calcIndexByWidget(WidgetPtr _widget) { return *_widget->_getInternalData<size_t>(); }
00254
00255 virtual IntSize getContentSize() { return mContentSize; }
00256 virtual IntPoint getContentPosition() { return mContentPosition; }
00257 virtual IntSize getViewSize() { return mWidgetClient->getSize(); }
00258 virtual void eraseContent() { _updateAllVisible(ITEM_NONE, false, true); updateMetrics(); }
00259 virtual size_t getHScrollPage();
00260 virtual size_t getVScrollPage();
00261 virtual Align getContentAlign() { return Align::Default; }
00262 virtual void setContentPosition(const IntPoint& _point);
00263
00264 private:
00265
00266 VectorWidgetPtr mVectorItems;
00267
00268
00269 IntSize mContentSize;
00270
00271 IntPoint mContentPosition;
00272
00273
00274 size_t mIndexSelect;
00275
00276 size_t mIndexActive;
00277
00278 size_t mIndexAccept;
00279
00280 size_t mIndexRefuse;
00281
00282
00283 bool mIsFocus;
00284
00285
00286 VectorItemInfo mItemsInfo;
00287
00288 WidgetPtr mItemDrag;
00289 IntPoint mPointDragOffset;
00290
00291 std::string mDragLayer;
00292
00293 size_t mScrollViewPage;
00294 };
00295
00296 }
00297
00298 #endif // __MYGUI_LIST_CTRL_H__