MyGUI  3.2.1
MyGUI_ItemBox.h
Go to the documentation of this file.
00001 /*
00002  * This source file is part of MyGUI. For the latest info, see http://mygui.info/
00003  * Distributed under the MIT License
00004  * (See accompanying file COPYING.MIT or copy at http://opensource.org/licenses/MIT)
00005  */
00006 
00007 #ifndef __MYGUI_ITEM_BOX_H__
00008 #define __MYGUI_ITEM_BOX_H__
00009 
00010 #include "MyGUI_Prerequest.h"
00011 #include "MyGUI_DDContainer.h"
00012 #include "MyGUI_IBItemInfo.h"
00013 #include "MyGUI_Any.h"
00014 #include "MyGUI_EventPair.h"
00015 #include "MyGUI_ScrollViewBase.h"
00016 
00017 namespace MyGUI
00018 {
00019 
00020     typedef delegates::CDelegate2<ItemBox*, Widget*> EventHandle_ItemBoxPtrWidgetPtr;
00021     typedef delegates::CDelegate3<ItemBox*, IntCoord&, bool> EventHandle_ItemBoxPtrIntCoordRefBool;
00022     typedef delegates::CDelegate3<ItemBox*, Widget*, const IBDrawItemInfo&> EventHandle_ItemBoxPtrWidgetPtrCIBCellDrawInfoRef;
00023     typedef delegates::CMultiDelegate2<ItemBox*, size_t> EventHandle_ItemBoxPtrSizeT;
00024     typedef delegates::CMultiDelegate2<ItemBox*, const IBNotifyItemData&> EventHandle_ItemBoxPtrCIBNotifyCellDataRef;
00025 
00029     class MYGUI_EXPORT ItemBox :
00030         public DDContainer,
00031         protected ScrollViewBase,
00032         public MemberObsolete<ItemBox>
00033     {
00034         MYGUI_RTTI_DERIVED( ItemBox )
00035 
00036     public:
00037         ItemBox();
00038 
00039         //------------------------------------------------------------------------------//
00040         // манипуляции айтемами
00041 
00043         size_t getItemCount() const;
00044 
00046         void insertItemAt(size_t _index, Any _data = Any::Null);
00047 
00049         void addItem(Any _data = Any::Null);
00050 
00052         void removeItemAt(size_t _index);
00053 
00055         void removeAllItems();
00056 
00058         void redrawItemAt(size_t _index);
00059 
00061         void redrawAllItems();
00062 
00063 
00064         //------------------------------------------------------------------------------//
00065         // манипуляции выделениями
00066 
00068         size_t getIndexSelected() const;
00069 
00071         void setIndexSelected(size_t _index);
00072 
00074         void clearIndexSelected();
00075 
00076 
00077         //------------------------------------------------------------------------------//
00078         // манипуляции данными
00079 
00081         void setItemDataAt(size_t _index, Any _data);
00082 
00084         void clearItemDataAt(size_t _index);
00085 
00087         template <typename ValueType>
00088         ValueType* getItemDataAt(size_t _index, bool _throw = true)
00089         {
00090             MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "ItemBox::getItemDataAt");
00091             return mItemsInfo[_index].data.castType<ValueType>(_throw);
00092         }
00093 
00094 
00096         void setVerticalAlignment(bool _value);
00098         bool getVerticalAlignment() const;
00099 
00101         size_t getIndexByWidget(Widget* _widget);
00102 
00104         Widget* getWidgetDrag();
00105 
00111         Widget* getWidgetByIndex(size_t _index);
00112 
00114         void resetDrag();
00115 
00117         virtual void setPosition(const IntPoint& _value);
00119         virtual void setSize(const IntSize& _value);
00121         virtual void setCoord(const IntCoord& _value);
00122 
00124         void setPosition(int _left, int _top);
00126         void setSize(int _width, int _height);
00128         void setCoord(int _left, int _top, int _width, int _height);
00129 
00131         void setViewOffset(const IntPoint& _value);
00133         IntPoint getViewOffset();
00134 
00135         virtual IntSize getViewSize();
00136 
00137         /*events:*/
00143         EventHandle_ItemBoxPtrWidgetPtr requestCreateWidgetItem;
00144 
00151         EventHandle_ItemBoxPtrIntCoordRefBool requestCoordItem;
00152 
00159         EventHandle_ItemBoxPtrWidgetPtrCIBCellDrawInfoRef requestDrawItem;
00160 
00166         EventHandle_ItemBoxPtrSizeT eventSelectItemAccept;
00167 
00173         EventHandle_ItemBoxPtrSizeT eventChangeItemPosition;
00174 
00180         EventHandle_ItemBoxPtrSizeT eventMouseItemActivate;
00181 
00187         EventHandle_ItemBoxPtrCIBNotifyCellDataRef eventNotifyItem;
00188 
00189         /*internal:*/
00190         virtual void _resetContainer(bool _update);
00191 
00192     protected:
00193         virtual void initialiseOverride();
00194         virtual void shutdownOverride();
00195 
00196         struct ItemDataInfo
00197         {
00198             ItemDataInfo(Any _data) :
00199                 data(_data) { }
00200             Any data;
00201         };
00202         typedef std::vector<ItemDataInfo> VectorItemInfo;
00203 
00204         virtual void onMouseButtonPressed(int _left, int _top, MouseButton _id);
00205         virtual void onMouseButtonReleased(int _left, int _top, MouseButton _id);
00206         virtual void onKeyButtonPressed(KeyCode _key, Char _char);
00207         virtual void onKeyButtonReleased(KeyCode _key);
00208         virtual void onMouseDrag(int _left, int _top, MouseButton _id);
00209 
00210         virtual void onMouseWheel(int _rel);
00211         virtual void onKeyLostFocus(Widget* _new);
00212         virtual void onKeySetFocus(Widget* _old);
00213 
00214         void notifyKeyButtonPressed(Widget* _sender, KeyCode _key, Char _char);
00215         void notifyKeyButtonReleased(Widget* _sender, KeyCode _key);
00216         void notifyScrollChangePosition(ScrollBar* _sender, size_t _index);
00217         void notifyMouseWheel(Widget* _sender, int _rel);
00218         void notifyRootMouseChangeFocus(Widget* _sender, bool _focus);
00219         void notifyMouseButtonDoubleClick(Widget* _sender);
00220         virtual size_t _getItemIndex(Widget* _item);
00221         void notifyMouseDrag(Widget* _sender, int _left, int _top, MouseButton _id);
00222         void notifyMouseButtonPressed(Widget* _sender, int _left, int _top, MouseButton _id);
00223         void notifyMouseButtonReleased(Widget* _sender, int _left, int _top, MouseButton _id);
00224 
00225 
00226         virtual void removeDropItems();
00227         virtual void updateDropItems();
00228         virtual void updateDropItemsState(const DDWidgetState& _state);
00229 
00230         // Обновляет данные о айтемах, при изменении размеров
00231         void updateMetrics();
00232 
00233         // просто обновляет все виджеты что видны
00234         void _updateAllVisible(bool _redraw);
00235 
00236         void updateFromResize();
00237 
00238         // возвращает следующий айтем, если нет его, то создается
00239         // запросы только последовательно
00240         Widget* getItemWidget(size_t _index);
00241 
00242         void _setContainerItemInfo(size_t _index, bool _set, bool _accept);
00243 
00244         // сбрасываем старую подсветку
00245         void resetCurrentActiveItem();
00246         // ищет и устанавливает подсвеченный айтем
00247         void findCurrentActiveItem();
00248 
00249         // запрашиваем у конейтера айтем по позиции мыши
00250         virtual size_t _getContainerIndex(const IntPoint& _point);
00251 
00252         virtual void setPropertyOverride(const std::string& _key, const std::string& _value);
00253 
00254     private:
00255         size_t calcIndexByWidget(Widget* _widget);
00256 
00257         void requestItemSize();
00258 
00259         virtual IntSize getContentSize();
00260         virtual IntPoint getContentPosition();
00261         virtual void eraseContent();
00262         virtual size_t getHScrollPage();
00263         virtual size_t getVScrollPage();
00264         virtual Align getContentAlign();
00265         virtual void setContentPosition(const IntPoint& _point);
00266 
00267         IntRect _getClientAbsoluteRect();
00268         Widget* _getClientWidget();
00269 
00270     private:
00271         // наши дети в строках
00272         VectorWidgetPtr mVectorItems;
00273 
00274         // размер одного айтема
00275         IntSize mSizeItem;
00276 
00277         // размерность скролла в пикселях
00278         IntSize mContentSize;
00279         // позиция скролла п пикселях
00280         IntPoint mContentPosition;
00281 
00282         // колличество айтемов в одной строке
00283         int mCountItemInLine;
00284         // колличество линий
00285         int mCountLines;
00286 
00287         // самая верхняя строка
00288         int mFirstVisibleIndex;
00289         // текущее смещение верхнего элемента в пикселях
00290         // сколько его пикселей не видно сверху
00291         int mFirstOffsetIndex;
00292 
00293         // текущий выделенный элемент или ITEM_NONE
00294         size_t mIndexSelect;
00295         // подсвеченный элемент или ITEM_NONE
00296         size_t mIndexActive;
00297         // индекс со свойством приема или ITEM_NONE
00298         size_t mIndexAccept;
00299         // индекс со свойством отказа или ITEM_NONE
00300         size_t mIndexRefuse;
00301 
00302         // имеем ли мы фокус ввода
00303         bool mIsFocus;
00304 
00305         // структура данных об айтеме
00306         VectorItemInfo mItemsInfo;
00307 
00308         Widget* mItemDrag;
00309         IntPoint mPointDragOffset;
00310 
00311         bool mAlignVert;
00312 
00313         std::string mDragLayer;
00314     };
00315 
00316 } // namespace MyGUI
00317 
00318 #endif // __MYGUI_ITEM_BOX_H__