MyGUI  3.2.1
MyGUI_ListBox.h
Go to the documentation of this file.
00001 /*
00002  * This source file is part of MyGUI. For the latest info, see http://mygui.info/
00003  * Distributed under the MIT License
00004  * (See accompanying file COPYING.MIT or copy at http://opensource.org/licenses/MIT)
00005  */
00006 
00007 #ifndef __MYGUI_LIST_BOX_H__
00008 #define __MYGUI_LIST_BOX_H__
00009 
00010 #include "MyGUI_Prerequest.h"
00011 #include "MyGUI_Button.h"
00012 #include "MyGUI_Any.h"
00013 #include "MyGUI_EventPair.h"
00014 #include "MyGUI_IItem.h"
00015 #include "MyGUI_IItemContainer.h"
00016 #include "MyGUI_IBItemInfo.h"
00017 
00018 namespace MyGUI
00019 {
00020 
00021     typedef delegates::CMultiDelegate2<ListBox*, size_t> EventHandle_ListPtrSizeT;
00022     typedef delegates::CMultiDelegate2<ListBox*, const IBNotifyItemData&> EventHandle_ListBoxPtrCIBNotifyCellDataRef;
00023 
00027     class MYGUI_EXPORT ListBox :
00028         public Widget,
00029         public IItemContainer,
00030         public MemberObsolete<ListBox>
00031     {
00032         MYGUI_RTTI_DERIVED( ListBox )
00033 
00034     public:
00035         ListBox();
00036 
00037         //------------------------------------------------------------------------------//
00038         // манипуляции айтемами
00039 
00044 
00045         size_t getItemCount() const;
00046 
00048         void insertItemAt(size_t _index, const UString& _name, Any _data = Any::Null);
00049 
00051         void addItem(const UString& _name, Any _data = Any::Null);
00052 
00054         void removeItemAt(size_t _index);
00055 
00057         void removeAllItems();
00058 
00060         void swapItemsAt(size_t _index1, size_t _index2);
00061 
00062 
00064         size_t findItemIndexWith(const UString& _name);
00066 
00067         //------------------------------------------------------------------------------//
00068         // манипуляции выделениями
00069 
00075         size_t getIndexSelected() const;
00076 
00078         void setIndexSelected(size_t _index);
00079 
00081         void clearIndexSelected();
00083 
00084         //------------------------------------------------------------------------------//
00085         // манипуляции данными
00086 
00091 
00092         void setItemDataAt(size_t _index, Any _data);
00093 
00095         void clearItemDataAt(size_t _index);
00096 
00098         template <typename ValueType>
00099         ValueType* getItemDataAt(size_t _index, bool _throw = true)
00100         {
00101             MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "ListBox::getItemDataAt");
00102             return mItemsInfo[_index].second.castType<ValueType>(_throw);
00103         }
00105 
00106         //------------------------------------------------------------------------------//
00107         // манипуляции отображением
00108 
00110         void setItemNameAt(size_t _index, const UString& _name);
00111 
00113         const UString& getItemNameAt(size_t _index);
00114 
00115 
00116         //------------------------------------------------------------------------------//
00117         // манипуляции выдимостью
00118 
00123 
00124         void beginToItemAt(size_t _index);
00125 
00127         void beginToItemFirst();
00128 
00130         void beginToItemLast();
00131 
00133         void beginToItemSelected();
00134 
00135         //------------------------------------------------------------------------------//
00136 
00137         // видим ли мы элемент, полностью или нет
00146         bool isItemVisibleAt(size_t _index, bool _fill = true);
00148         bool isItemSelectedVisible(bool _fill = true);
00149 
00150 
00152         void setScrollVisible(bool _visible);
00154         void setScrollPosition(size_t _position);
00156 
00157         //------------------------------------------------------------------------------------//
00158 
00163 
00164         virtual void setPosition(const IntPoint& _value);
00166         virtual void setSize(const IntSize& _value);
00168         virtual void setCoord(const IntCoord& _value);
00169 
00171         void setPosition(int _left, int _top);
00173         void setSize(int _width, int _height);
00175         void setCoord(int _left, int _top, int _width, int _height);
00177 
00178         // возвращает максимальную высоту вмещающую все строки и родительский бордюр
00180         int getOptimalHeight();
00181 
00185         void setActivateOnClick(bool activateOnClick);
00186 
00192         Widget* getWidgetByIndex(size_t _index);
00193 
00194         /*events:*/
00200         EventPair<EventHandle_WidgetSizeT, EventHandle_ListPtrSizeT> eventListSelectAccept;
00201 
00207         EventPair<EventHandle_WidgetSizeT, EventHandle_ListPtrSizeT> eventListChangePosition;
00208 
00214         EventPair<EventHandle_WidgetSizeT, EventHandle_ListPtrSizeT> eventListMouseItemActivate;
00215 
00221         EventPair<EventHandle_WidgetSizeT, EventHandle_ListPtrSizeT> eventListMouseItemFocus;
00222 
00228         EventPair<EventHandle_WidgetSizeT, EventHandle_ListPtrSizeT> eventListChangeScroll;
00229 
00235         EventHandle_ListBoxPtrCIBNotifyCellDataRef eventNotifyItem;
00236 
00237         /*internal:*/
00242         // дебажная проверка на правильность выравнивания списка
00243         void _checkAlign();
00244 
00245         // вспомогательные методы для составных списков
00246         void _setItemFocus(size_t _position, bool _focus);
00247         void _sendEventChangeScroll(size_t _position);
00248 
00249         // IItemContainer impl
00250         virtual size_t _getItemCount();
00251         virtual void _addItem(const MyGUI::UString& _name);
00252         virtual void _removeItemAt(size_t _index);
00253         virtual void _setItemNameAt(size_t _index, const UString& _name);
00254         virtual const UString& _getItemNameAt(size_t _index);
00255 
00256         virtual void _resetContainer(bool _update);
00258 
00259     protected:
00260         virtual void initialiseOverride();
00261         virtual void shutdownOverride();
00262 
00263         void onMouseWheel(int _rel);
00264         void onKeyButtonPressed(KeyCode _key, Char _char);
00265         void onKeyButtonReleased(KeyCode _key);
00266 
00267         void notifyScrollChangePosition(ScrollBar* _sender, size_t _rel);
00268         void notifyMousePressed(Widget* _sender, int _left, int _top, MouseButton _id);
00269         void notifyMouseClick(Widget* _sender);
00270         void notifyMouseDoubleClick(Widget* _sender);
00271         void notifyMouseWheel(Widget* _sender, int _rel);
00272         void notifyMouseSetFocus(Widget* _sender, Widget* _old);
00273         void notifyMouseLostFocus(Widget* _sender, Widget* _new);
00274         void notifyKeyButtonPressed(Widget* _sender, KeyCode _key, Char _char);
00275         void notifyKeyButtonReleased(Widget* _sender, KeyCode _key);
00276         void notifyMouseButtonReleased(Widget* _sender, int _left, int _top, MouseButton _id);
00277 
00278         void updateScroll();
00279         void updateLine(bool _reset = false);
00280 
00281         void _activateItem(Widget* _sender);
00282 
00283         void _setScrollView(size_t _position);
00284 
00285         // перерисовывает от индекса до низа
00286         void _redrawItemRange(size_t _start = 0);
00287 
00288         // перерисовывает индекс
00289         void _redrawItem(size_t _index);
00290 
00291         // ищет и выделяет елемент
00292         void _selectIndex(size_t _index, bool _select);
00293 
00294         // метод для запроса номера айтема и контейнера
00295         virtual size_t _getItemIndex(Widget* _item);
00296 
00297         virtual void setPropertyOverride(const std::string& _key, const std::string& _value);
00298 
00299     private:
00300         void _checkMapping(const std::string& _owner);
00301 
00302         Widget* _getClientWidget();
00303 
00304         size_t getIndexByWidget(Widget* _widget);
00305 
00306     private:
00307         std::string mSkinLine;
00308         ScrollBar* mWidgetScroll;
00309 
00310         // наши дети в строках
00311         typedef std::vector<Button*> VectorButton;
00312         VectorButton mWidgetLines;
00313 
00314         bool mActivateOnClick; // Require a full mouse click rather than only mouse press to activate an item
00315 
00316         int mHeightLine; // высота одной строки
00317         int mTopIndex; // индекс самого верхнего элемента
00318         int mOffsetTop; // текущее смещение
00319         int mRangeIndex; // размерность скрола
00320         size_t mLastRedrawLine; // последняя перерисованная линия
00321 
00322         size_t mIndexSelect; // текущий выделенный элемент или ITEM_NONE
00323         size_t mLineActive; // текущий виджет над которым мыша
00324 
00325         typedef std::pair<UString, Any> PairItem;
00326         typedef std::vector<PairItem> VectorItemInfo;
00327         VectorItemInfo mItemsInfo;
00328 
00329         // имеем ли мы фокус ввода
00330         bool mNeedVisibleScroll;
00331 
00332         IntSize mOldSize;
00333 
00334         Widget* mClient;
00335     };
00336 
00337 } // namespace MyGUI
00338 
00339 #endif // __MYGUI_LIST_BOX_H__