MyGUI 3.0.1
|
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__