00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef __MYGUI_ITEM_BOX_H__
00024 #define __MYGUI_ITEM_BOX_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<ItemBox*, Widget*> EventHandle_ItemBoxPtrWidgetPtr;
00037 typedef delegates::CDelegate3<ItemBox*, IntCoord&, bool> EventHandle_ItemBoxPtrIntCoordRefBool;
00038 typedef delegates::CDelegate3<ItemBox*, Widget*, const IBDrawItemInfo &> EventHandle_ItemBoxPtrWidgetPtrCIBCellDrawInfoRef;
00039 typedef delegates::CDelegate2<ItemBox*, size_t> EventHandle_ItemBoxPtrSizeT;
00040 typedef delegates::CDelegate2<ItemBox*, const IBNotifyItemData &> EventHandle_ItemBoxPtrCIBNotifyCellDataRef;
00041
00042 class MYGUI_EXPORT ItemBox :
00043 public DDContainer,
00044 protected ScrollViewBase
00045 {
00046 MYGUI_RTTI_DERIVED( ItemBox )
00047
00048 public:
00049 ItemBox();
00050
00051
00052
00053
00055 size_t getItemCount() const { return mItemsInfo.size(); }
00056
00058 void insertItemAt(size_t _index, Any _data = Any::Null);
00059
00061 void addItem(Any _data = Any::Null) { insertItemAt(ITEM_NONE, _data); }
00062
00064 void removeItemAt(size_t _index);
00065
00067 void removeAllItems();
00068
00070 void redrawItemAt(size_t _index);
00071
00073 void redrawAllItems();
00074
00075
00076
00077
00078
00080 size_t getIndexSelected() { return mIndexSelect; }
00081
00083 void setIndexSelected(size_t _index);
00084
00086 void clearIndexSelected() { setIndexSelected(ITEM_NONE); }
00087
00088
00089
00090
00091
00093 void setItemDataAt(size_t _index, Any _data);
00094
00096 void clearItemDataAt(size_t _index) { setItemDataAt(_index, Any::Null); }
00097
00099 template <typename ValueType>
00100 ValueType * getItemDataAt(size_t _index, bool _throw = true)
00101 {
00102 MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "ItemBox::getItemDataAt");
00103 return mItemsInfo[_index].data.castType<ValueType>(_throw);
00104 }
00105
00106
00108 void setItemBoxAlignVert(bool _value);
00110 bool getItemBoxAlignVert() { return mAlignVert; }
00111
00113 size_t getIndexByWidget(Widget* _widget);
00114
00116 Widget* getWidgetDrag() { return mItemDrag; }
00117
00123 Widget* getWidgetByIndex(size_t _index);
00124
00126 void resetDrag();
00127
00129 virtual void setPosition(const IntPoint& _value);
00131 virtual void setSize(const IntSize& _value);
00133 virtual void setCoord(const IntCoord& _value);
00134
00136 void setPosition(int _left, int _top) { setPosition(IntPoint(_left, _top)); }
00138 void setSize(int _width, int _height) { setSize(IntSize(_width, _height)); }
00140 void setCoord(int _left, int _top, int _width, int _height) { setCoord(IntCoord(_left, _top, _width, _height)); }
00141
00142
00148 EventHandle_ItemBoxPtrWidgetPtr requestCreateWidgetItem;
00149
00156 EventHandle_ItemBoxPtrIntCoordRefBool requestCoordItem;
00157
00164 EventHandle_ItemBoxPtrWidgetPtrCIBCellDrawInfoRef requestDrawItem;
00165
00171 EventHandle_ItemBoxPtrSizeT eventSelectItemAccept;
00172
00178 EventHandle_ItemBoxPtrSizeT eventChangeItemPosition;
00179
00185 EventHandle_ItemBoxPtrSizeT eventMouseItemActivate;
00186
00192 EventHandle_ItemBoxPtrCIBNotifyCellDataRef eventNotifyItem;
00193
00194
00195
00196 virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name);
00197
00198
00199 #ifndef MYGUI_DONT_USE_OBSOLETE
00200
00201 MYGUI_OBSOLETE("use : void Widget::setCoord(const IntCoord& _coord)")
00202 void setPosition(const IntCoord& _coord) { setCoord(_coord); }
00203 MYGUI_OBSOLETE("use : void Widget::setCoord(int _left, int _top, int _width, int _height)")
00204 void setPosition(int _left, int _top, int _width, int _height) { setCoord(_left, _top, _width, _height); }
00205
00206 MYGUI_OBSOLETE("use : size_t ItemBox::getItemIndexSelected()")
00207 size_t getItemIndexSelected() { return getIndexSelected(); }
00208 MYGUI_OBSOLETE("use : void ItemBox::setIndexSelected(size_t _index)")
00209 void setItemSelectedAt(size_t _index) { setIndexSelected(_index); }
00210 MYGUI_OBSOLETE("use : void ItemBox::clearIndexSelected()")
00211 void clearItemSelected() { clearIndexSelected(); }
00212
00213 MYGUI_OBSOLETE("use : void ItemBox::insertItemAt(size_t _index, Any _data)")
00214 void insertItem(size_t _index, Any _data = Any::Null) { insertItemAt(_index, _data); }
00215 MYGUI_OBSOLETE("use : void ItemBox::setItemDataAt(size_t _index, Any _data)")
00216 void setItemData(size_t _index, Any _data) { setItemDataAt(_index, _data); }
00217 MYGUI_OBSOLETE("use : void ItemBox::removeItemAt(size_t _index)")
00218 void deleteItem(size_t _index) { removeItemAt(_index); }
00219 MYGUI_OBSOLETE("use : void ItemBox::removeAllItems()")
00220 void deleteAllItems() { removeAllItems(); }
00221 MYGUI_OBSOLETE("use : size_t ItemBox::getIndexSelected()")
00222 size_t getItemSelect() { return getIndexSelected(); }
00223 MYGUI_OBSOLETE("use : void ItemBox::clearIndexSelected()")
00224 void resetItemSelect() { clearIndexSelected(); }
00225 MYGUI_OBSOLETE("use : void ItemBox::setIndexSelected(size_t _index)")
00226 void setItemSelect(size_t _index) { setIndexSelected(_index); }
00227
00228 MYGUI_OBSOLETE("use : Widget* ItemBox::getWidgetDrag()")
00229 Widget* getWidgetDrop() { return getWidgetDrag(); }
00230 MYGUI_OBSOLETE("use : void ItemBox::resetDrag()")
00231 void resetDrop() { resetDrag(); }
00232
00233 #endif // MYGUI_DONT_USE_OBSOLETE
00234
00235
00236 protected:
00237 virtual ~ItemBox();
00238
00239 struct ItemDataInfo
00240 {
00241 ItemDataInfo(Any _data) :
00242 data(_data) { }
00243 Any data;
00244 };
00245 typedef std::vector<ItemDataInfo> VectorItemInfo;
00246
00247 void baseChangeWidgetSkin(ResourceSkin* _info);
00248
00249 virtual void onMouseButtonPressed(int _left, int _top, MouseButton _id);
00250 virtual void onMouseButtonReleased(int _left, int _top, MouseButton _id);
00251 virtual void onMouseDrag(int _left, int _top);
00252
00253 virtual void onMouseWheel(int _rel);
00254 virtual void onKeyLostFocus(Widget* _new);
00255 virtual void onKeySetFocus(Widget* _old);
00256
00257 void notifyKeyButtonPressed(Widget* _sender, KeyCode _key, Char _char);
00258 void notifyKeyButtonReleased(Widget* _sender, KeyCode _key);
00259 void notifyScrollChangePosition(VScroll* _sender, size_t _index);
00260 void notifyMouseWheel(Widget* _sender, int _rel);
00261 void notifyRootMouseChangeFocus(Widget* _sender, bool _focus);
00262 void notifyMouseButtonDoubleClick(Widget* _sender);
00263 void _requestGetContainer(Widget* _sender, Widget*& _container, size_t& _index);
00264 void notifyMouseDrag(Widget* _sender, int _left, int _top);
00265 void notifyMouseButtonPressed(Widget* _sender, int _left, int _top, MouseButton _id);
00266 void notifyMouseButtonReleased(Widget* _sender, int _left, int _top, MouseButton _id);
00267
00268
00269 virtual void removeDropItems();
00270 virtual void updateDropItems();
00271 virtual void updateDropItemsState(const DDWidgetState& _state);
00272
00273
00274 void updateMetrics();
00275
00276
00277 void _updateAllVisible(bool _redraw);
00278
00279 void updateFromResize();
00280
00281
00282
00283 Widget* getItemWidget(size_t _index);
00284
00285 void _setContainerItemInfo(size_t _index, bool _set, bool _accept);
00286
00287
00288 void resetCurrentActiveItem();
00289
00290 void findCurrentActiveItem();
00291
00292
00293 virtual size_t _getContainerIndex(const IntPoint& _point);
00294
00295
00296 virtual void _resetContainer(bool _update);
00297
00298 private:
00299 void initialiseWidgetSkin(ResourceSkin* _info);
00300 void shutdownWidgetSkin();
00301
00302 size_t calcIndexByWidget(Widget* _widget);
00303
00304 void requestItemSize();
00305
00306 virtual IntSize getContentSize();
00307 virtual IntPoint getContentPosition();
00308 virtual IntSize getViewSize() const;
00309 virtual void eraseContent();
00310 virtual size_t getHScrollPage();
00311 virtual size_t getVScrollPage();
00312 virtual Align getContentAlign();
00313 virtual void setContentPosition(const IntPoint& _point);
00314
00315 IntRect _getClientAbsoluteRect();
00316 Widget* _getClientWidget();
00317 const Widget* _getClientWidget() const;
00318
00319 private:
00320
00321 VectorWidgetPtr mVectorItems;
00322
00323
00324 IntSize mSizeItem;
00325
00326
00327 IntSize mContentSize;
00328
00329 IntPoint mContentPosition;
00330
00331
00332 int mCountItemInLine;
00333
00334 int mCountLines;
00335
00336
00337 int mFirstVisibleIndex;
00338
00339
00340 int mFirstOffsetIndex;
00341
00342
00343 size_t mIndexSelect;
00344
00345 size_t mIndexActive;
00346
00347 size_t mIndexAccept;
00348
00349 size_t mIndexRefuse;
00350
00351
00352 bool mIsFocus;
00353
00354
00355 VectorItemInfo mItemsInfo;
00356
00357 Widget* mItemDrag;
00358 IntPoint mPointDragOffset;
00359
00360 bool mAlignVert;
00361
00362 std::string mDragLayer;
00363
00364 };
00365
00366 }
00367
00368 #endif // __MYGUI_ITEM_BOX_H__