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_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__