MyGUI  3.0.3
MyGUI_ListCtrl.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_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<ListCtrl*, Widget*> EventHandle_ListCtrlPtrWidgetPtr;
00037     typedef delegates::CDelegate4<ListCtrl*, Widget*, const IBDrawItemInfo &, IntCoord&> EventHandle_ListCtrlPtrWidgetPtrCIBCellDrawInfoRef;
00038     typedef delegates::CDelegate2<ListCtrl*, size_t> EventHandle_ListCtrlPtrSizeT;
00039     typedef delegates::CDelegate2<ListCtrl*, 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() const { 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(Widget* _widget);
00108 
00110         Widget* getWidgetDrag() { return mItemDrag; }
00111 
00117         Widget* 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     /*event:*/
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     /*internal:*/
00182         virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _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(Widget* _new);
00204         virtual void onKeySetFocus(Widget* _old);
00205 
00206         void notifyKeyButtonPressed(Widget* _sender, KeyCode _key, Char _char);
00207         void notifyKeyButtonReleased(Widget* _sender, KeyCode _key);
00208         void notifyScrollChangePosition(VScroll* _sender, size_t _index);
00209         void notifyMouseWheel(Widget* _sender, int _rel);
00210         void notifyRootMouseChangeFocus(Widget* _sender, bool _focus);
00211         void notifyMouseButtonDoubleClick(Widget* _sender);
00212         void _requestGetContainer(Widget* _sender, Widget*& _container, size_t& _index);
00213         void notifyMouseDrag(Widget* _sender, int _left, int _top);
00214         void notifyMouseButtonPressed(Widget* _sender, int _left, int _top, MouseButton _id);
00215         void notifyMouseButtonReleased(Widget* _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         Widget* 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(Widget* _widget) { return *_widget->_getInternalData<size_t>(); }
00254 
00255         virtual IntSize getContentSize();
00256         virtual IntPoint getContentPosition();
00257         virtual IntSize getViewSize() const;
00258         virtual void eraseContent();
00259         virtual size_t getHScrollPage();
00260         virtual size_t getVScrollPage();
00261         virtual Align getContentAlign();
00262         virtual void setContentPosition(const IntPoint& _point);
00263 
00264         Widget* _getClientWidget();
00265         const Widget* _getClientWidget() const;
00266 
00267     private:
00268         // наши дети в строках
00269         VectorWidgetPtr mVectorItems;
00270 
00271         // размерность скролла в пикселях
00272         IntSize mContentSize;
00273         // позиция скролла п пикселях
00274         IntPoint mContentPosition;
00275 
00276         // текущий выделенный элемент или ITEM_NONE
00277         size_t mIndexSelect;
00278         // подсвеченный элемент или ITEM_NONE
00279         size_t mIndexActive;
00280         // индекс со свойством приема или ITEM_NONE
00281         size_t mIndexAccept;
00282         // индекс со свойством отказа или ITEM_NONE
00283         size_t mIndexRefuse;
00284 
00285         // имеем ли мы фокус ввода
00286         bool mIsFocus;
00287 
00288         // структура данных об айтеме
00289         VectorItemInfo mItemsInfo;
00290 
00291         Widget* mItemDrag;
00292         IntPoint mPointDragOffset;
00293 
00294         std::string mDragLayer;
00295 
00296         size_t mScrollViewPage;
00297     };
00298 
00299 } // namespace MyGUI
00300 
00301 #endif // __MYGUI_LIST_CTRL_H__