MyGUI  3.0.1
MyGUI_ItemBox.h
Go to the documentation of this file.
00001 
00007 /*
00008     This file is part of MyGUI.
00009 
00010     MyGUI is free software: you can redistribute it and/or modify
00011     it under the terms of the GNU Lesser General Public License as published by
00012     the Free Software Foundation, either version 3 of the License, or
00013     (at your option) any later version.
00014 
00015     MyGUI is distributed in the hope that it will be useful,
00016     but WITHOUT ANY WARRANTY; without even the implied warranty of
00017     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00018     GNU Lesser General Public License for more details.
00019 
00020     You should have received a copy of the GNU Lesser General Public License
00021     along with MyGUI.  If not, see <http://www.gnu.org/licenses/>.
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     /*event:*/
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     /*internal:*/
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     /*obsolete:*/
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         // текущий выделенный элемент или ITEM_NONE
00343         size_t mIndexSelect;
00344         // подсвеченный элемент или ITEM_NONE
00345         size_t mIndexActive;
00346         // индекс со свойством приема или ITEM_NONE
00347         size_t mIndexAccept;
00348         // индекс со свойством отказа или ITEM_NONE
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 } // namespace MyGUI
00367 
00368 #endif // __MYGUI_ITEM_BOX_H__