• Main Page
  • Related Pages
  • Namespaces
  • Data Structures
  • Files
  • Examples
  • File List
  • Globals

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

Generated on Sun Jan 30 2011 for MyGUI by  doxygen 1.7.1