MyGUI  3.2.0
MyGUI_ItemBox.h
Go to the documentation of this file.
00001 
00006 /*
00007     This file is part of MyGUI.
00008 
00009     MyGUI is free software: you can redistribute it and/or modify
00010     it under the terms of the GNU Lesser General Public License as published by
00011     the Free Software Foundation, either version 3 of the License, or
00012     (at your option) any later version.
00013 
00014     MyGUI is distributed in the hope that it will be useful,
00015     but WITHOUT ANY WARRANTY; without even the implied warranty of
00016     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00017     GNU Lesser General Public License for more details.
00018 
00019     You should have received a copy of the GNU Lesser General Public License
00020     along with MyGUI.  If not, see <http://www.gnu.org/licenses/>.
00021 */
00022 #ifndef __MYGUI_ITEM_BOX_H__
00023 #define __MYGUI_ITEM_BOX_H__
00024 
00025 #include "MyGUI_Prerequest.h"
00026 #include "MyGUI_DDContainer.h"
00027 #include "MyGUI_IBItemInfo.h"
00028 #include "MyGUI_Any.h"
00029 #include "MyGUI_EventPair.h"
00030 #include "MyGUI_ScrollViewBase.h"
00031 
00032 namespace MyGUI
00033 {
00034 
00035     typedef delegates::CDelegate2<ItemBox*, Widget*> EventHandle_ItemBoxPtrWidgetPtr;
00036     typedef delegates::CDelegate3<ItemBox*, IntCoord&, bool> EventHandle_ItemBoxPtrIntCoordRefBool;
00037     typedef delegates::CDelegate3<ItemBox*, Widget*, const IBDrawItemInfo&> EventHandle_ItemBoxPtrWidgetPtrCIBCellDrawInfoRef;
00038     typedef delegates::CMultiDelegate2<ItemBox*, size_t> EventHandle_ItemBoxPtrSizeT;
00039     typedef delegates::CMultiDelegate2<ItemBox*, const IBNotifyItemData&> EventHandle_ItemBoxPtrCIBNotifyCellDataRef;
00040 
00041     class MYGUI_EXPORT ItemBox :
00042         public DDContainer,
00043         protected ScrollViewBase,
00044         public MemberObsolete<ItemBox>
00045     {
00046         MYGUI_RTTI_DERIVED( ItemBox )
00047 
00048     public:
00049         ItemBox();
00050 
00051         //------------------------------------------------------------------------------//
00052         // манипуляции айтемами
00053 
00055         size_t getItemCount() const;
00056 
00058         void insertItemAt(size_t _index, Any _data = Any::Null);
00059 
00061         void addItem(Any _data = Any::Null);
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() const;
00081 
00083         void setIndexSelected(size_t _index);
00084 
00086         void clearIndexSelected();
00087 
00088 
00089         //------------------------------------------------------------------------------//
00090         // манипуляции данными
00091 
00093         void setItemDataAt(size_t _index, Any _data);
00094 
00096         void clearItemDataAt(size_t _index);
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 setVerticalAlignment(bool _value);
00110         bool getVerticalAlignment() const;
00111 
00113         size_t getIndexByWidget(Widget* _widget);
00114 
00116         Widget* getWidgetDrag();
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);
00138         void setSize(int _width, int _height);
00140         void setCoord(int _left, int _top, int _width, int _height);
00141 
00142     /*events:*/
00148         EventHandle_ItemBoxPtrWidgetPtr
00149             requestCreateWidgetItem;
00150 
00157         EventHandle_ItemBoxPtrIntCoordRefBool
00158             requestCoordItem;
00159 
00166         EventHandle_ItemBoxPtrWidgetPtrCIBCellDrawInfoRef
00167             requestDrawItem;
00168 
00174         EventHandle_ItemBoxPtrSizeT
00175             eventSelectItemAccept;
00176 
00182         EventHandle_ItemBoxPtrSizeT
00183             eventChangeItemPosition;
00184 
00190         EventHandle_ItemBoxPtrSizeT
00191             eventMouseItemActivate;
00192 
00198         EventHandle_ItemBoxPtrCIBNotifyCellDataRef
00199             eventNotifyItem;
00200 
00201     /*internal:*/
00202         virtual void _resetContainer(bool _update);
00203 
00204     protected:
00205         virtual void initialiseOverride();
00206         virtual void shutdownOverride();
00207 
00208         struct ItemDataInfo
00209         {
00210             ItemDataInfo(Any _data) :
00211                 data(_data) { }
00212             Any data;
00213         };
00214         typedef std::vector<ItemDataInfo> VectorItemInfo;
00215 
00216         virtual void onMouseButtonPressed(int _left, int _top, MouseButton _id);
00217         virtual void onMouseButtonReleased(int _left, int _top, MouseButton _id);
00218         virtual void onMouseDrag(int _left, int _top, MouseButton _id);
00219 
00220         virtual void onMouseWheel(int _rel);
00221         virtual void onKeyLostFocus(Widget* _new);
00222         virtual void onKeySetFocus(Widget* _old);
00223 
00224         void notifyKeyButtonPressed(Widget* _sender, KeyCode _key, Char _char);
00225         void notifyKeyButtonReleased(Widget* _sender, KeyCode _key);
00226         void notifyScrollChangePosition(ScrollBar* _sender, size_t _index);
00227         void notifyMouseWheel(Widget* _sender, int _rel);
00228         void notifyRootMouseChangeFocus(Widget* _sender, bool _focus);
00229         void notifyMouseButtonDoubleClick(Widget* _sender);
00230         virtual size_t _getItemIndex(Widget* _item);
00231         void notifyMouseDrag(Widget* _sender, int _left, int _top, MouseButton _id);
00232         void notifyMouseButtonPressed(Widget* _sender, int _left, int _top, MouseButton _id);
00233         void notifyMouseButtonReleased(Widget* _sender, int _left, int _top, MouseButton _id);
00234 
00235 
00236         virtual void removeDropItems();
00237         virtual void updateDropItems();
00238         virtual void updateDropItemsState(const DDWidgetState& _state);
00239 
00240         // Обновляет данные о айтемах, при изменении размеров
00241         void updateMetrics();
00242 
00243         // просто обновляет все виджеты что видны
00244         void _updateAllVisible(bool _redraw);
00245 
00246         void updateFromResize();
00247 
00248         // возвращает следующий айтем, если нет его, то создается
00249         // запросы только последовательно
00250         Widget* getItemWidget(size_t _index);
00251 
00252         void _setContainerItemInfo(size_t _index, bool _set, bool _accept);
00253 
00254         // сбрасываем старую подсветку
00255         void resetCurrentActiveItem();
00256         // ищет и устанавливает подсвеченный айтем
00257         void findCurrentActiveItem();
00258 
00259         // запрашиваем у конейтера айтем по позиции мыши
00260         virtual size_t _getContainerIndex(const IntPoint& _point);
00261 
00262         virtual void setPropertyOverride(const std::string& _key, const std::string& _value);
00263 
00264     private:
00265         size_t calcIndexByWidget(Widget* _widget);
00266 
00267         void requestItemSize();
00268 
00269         virtual IntSize getContentSize();
00270         virtual IntPoint getContentPosition();
00271         virtual IntSize getViewSize();
00272         virtual void eraseContent();
00273         virtual size_t getHScrollPage();
00274         virtual size_t getVScrollPage();
00275         virtual Align getContentAlign();
00276         virtual void setContentPosition(const IntPoint& _point);
00277 
00278         IntRect _getClientAbsoluteRect();
00279         Widget* _getClientWidget();
00280 
00281     private:
00282         // наши дети в строках
00283         VectorWidgetPtr mVectorItems;
00284 
00285         // размер одного айтема
00286         IntSize mSizeItem;
00287 
00288         // размерность скролла в пикселях
00289         IntSize mContentSize;
00290         // позиция скролла п пикселях
00291         IntPoint mContentPosition;
00292 
00293         // колличество айтемов в одной строке
00294         int mCountItemInLine;
00295         // колличество линий
00296         int mCountLines;
00297 
00298         // самая верхняя строка
00299         int mFirstVisibleIndex;
00300         // текущее смещение верхнего элемента в пикселях
00301         // сколько его пикселей не видно сверху
00302         int mFirstOffsetIndex;
00303 
00304         // текущий выделенный элемент или ITEM_NONE
00305         size_t mIndexSelect;
00306         // подсвеченный элемент или ITEM_NONE
00307         size_t mIndexActive;
00308         // индекс со свойством приема или ITEM_NONE
00309         size_t mIndexAccept;
00310         // индекс со свойством отказа или ITEM_NONE
00311         size_t mIndexRefuse;
00312 
00313         // имеем ли мы фокус ввода
00314         bool mIsFocus;
00315 
00316         // структура данных об айтеме
00317         VectorItemInfo mItemsInfo;
00318 
00319         Widget* mItemDrag;
00320         IntPoint mPointDragOffset;
00321 
00322         bool mAlignVert;
00323 
00324         std::string mDragLayer;
00325     };
00326 
00327 } // namespace MyGUI
00328 
00329 #endif // __MYGUI_ITEM_BOX_H__