MyGUI 3.0.1

MyGUI_List.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_H__
00024 #define __MYGUI_LIST_H__
00025 
00026 #include "MyGUI_Prerequest.h"
00027 #include "MyGUI_Widget.h"
00028 #include "MyGUI_Any.h"
00029 #include "MyGUI_EventPair.h"
00030 
00031 namespace MyGUI
00032 {
00033 
00034     typedef delegates::CDelegate2<List*, size_t> EventHandle_ListPtrSizeT;
00035 
00036     class MYGUI_EXPORT List :
00037         public Widget
00038     {
00039         MYGUI_RTTI_DERIVED( List )
00040 
00041     public:
00042         List();
00043 
00044         //------------------------------------------------------------------------------//
00045         // манипуляции айтемами
00046 
00048         size_t getItemCount() const { return mItemsInfo.size(); }
00049 
00051         void insertItemAt(size_t _index, const UString& _name, Any _data = Any::Null);
00052 
00054         void addItem(const UString& _name, Any _data = Any::Null) { insertItemAt(ITEM_NONE, _name, _data); }
00055 
00057         void removeItemAt(size_t _index);
00058 
00060         void removeAllItems();
00061 
00063         void swapItemsAt(size_t _index1, size_t _index2);
00064 
00065 
00067         size_t findItemIndexWith(const UString& _name);
00068 
00069 
00070         //------------------------------------------------------------------------------//
00071         // манипуляции выделениями
00072 
00074         size_t getIndexSelected() { return mIndexSelect; }
00075 
00077         void setIndexSelected(size_t _index);
00078 
00080         void clearIndexSelected() { setIndexSelected(ITEM_NONE); }
00081 
00082 
00083         //------------------------------------------------------------------------------//
00084         // манипуляции данными
00085 
00087         void setItemDataAt(size_t _index, Any _data);
00088 
00090         void clearItemDataAt(size_t _index) { setItemDataAt(_index, Any::Null); }
00091 
00093         template <typename ValueType>
00094         ValueType * getItemDataAt(size_t _index, bool _throw = true)
00095         {
00096             MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "List::getItemDataAt");
00097             return mItemsInfo[_index].second.castType<ValueType>(_throw);
00098         }
00099 
00100 
00101         //------------------------------------------------------------------------------//
00102         // манипуляции отображением
00103 
00105         void setItemNameAt(size_t _index, const UString& _name);
00106 
00108         const UString& getItemNameAt(size_t _index);
00109 
00110 
00111         //------------------------------------------------------------------------------//
00112         // манипуляции выдимостью
00113 
00115         void beginToItemAt(size_t _index);
00116 
00118         void beginToItemFirst() { if (getItemCount()) beginToItemAt(0); }
00119 
00121         void beginToItemLast() { if (getItemCount()) beginToItemAt(getItemCount() - 1); }
00122 
00124         void beginToItemSelected() { if (getIndexSelected() != ITEM_NONE) beginToItemAt(getIndexSelected()); }
00125 
00126         //------------------------------------------------------------------------------//
00127 
00128         // видим ли мы элемент, полностью или нет
00136         bool isItemVisibleAt(size_t _index, bool _fill = true);
00138         bool isItemSelectedVisible(bool _fill = true) { return isItemVisibleAt(mIndexSelect, _fill); }
00139 
00140 
00142         void setScrollVisible(bool _visible);
00144         void setScrollPosition(size_t _position);
00145 
00146         //------------------------------------------------------------------------------------//
00147 
00149         virtual void setPosition(const IntPoint& _value);
00151         virtual void setSize(const IntSize& _value);
00153         virtual void setCoord(const IntCoord& _value);
00154 
00156         void setPosition(int _left, int _top) { setPosition(IntPoint(_left, _top)); }
00158         void setSize(int _width, int _height) { setSize(IntSize(_width, _height)); }
00160         void setCoord(int _left, int _top, int _width, int _height) { setCoord(IntCoord(_left, _top, _width, _height)); }
00161 
00162         // возвращает максимальную высоту вмещающую все строки и родительский бордюр
00164         int getOptimalHeight();
00165 
00167         virtual void setProperty(const std::string& _key, const std::string& _value);
00168 
00169     /*event:*/
00175         EventPair<EventHandle_WidgetSizeT, EventHandle_ListPtrSizeT> eventListSelectAccept;
00176 
00182         EventPair<EventHandle_WidgetSizeT, EventHandle_ListPtrSizeT> eventListChangePosition;
00183 
00189         EventPair<EventHandle_WidgetSizeT, EventHandle_ListPtrSizeT> eventListMouseItemActivate;
00190 
00196         EventPair<EventHandle_WidgetSizeT, EventHandle_ListPtrSizeT> eventListMouseItemFocus;
00197 
00203         EventPair<EventHandle_WidgetSizeT, EventHandle_ListPtrSizeT> eventListChangeScroll;
00204 
00205     /*internal:*/
00206         // дебажная проверка на правильность выравнивания списка
00207         void _checkAlign();
00208 
00209         // вспомогательные методы для составных списков
00210         void _setItemFocus(size_t _position, bool _focus);
00211         void _sendEventChangeScroll(size_t _position);
00212 
00213         virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name);
00214 
00215     /*obsolete:*/
00216 #ifndef MYGUI_DONT_USE_OBSOLETE
00217 
00218         MYGUI_OBSOLETE("use : void Widget::setCoord(const IntCoord& _coord)")
00219         void setPosition(const IntCoord& _coord) { setCoord(_coord); }
00220         MYGUI_OBSOLETE("use : void Widget::setCoord(int _left, int _top, int _width, int _height)")
00221         void setPosition(int _left, int _top, int _width, int _height) { setCoord(_left, _top, _width, _height); }
00222 
00223         MYGUI_OBSOLETE("use : size_t List::getIndexSelected()")
00224         size_t getItemIndexSelected() { return getIndexSelected(); }
00225         MYGUI_OBSOLETE("use : void List::setIndexSelected(size_t _index)")
00226         void setItemSelectedAt(size_t _index) { setIndexSelected(_index); }
00227         MYGUI_OBSOLETE("use : void List::clearIndexSelected()")
00228         void clearItemSelected() { clearIndexSelected(); }
00229 
00230         MYGUI_OBSOLETE("use : void List::insertItemAt(size_t _index, const UString& _name)")
00231         void insertItem(size_t _index, const UString& _item) { insertItemAt(_index, _item); }
00232         MYGUI_OBSOLETE("use : void List::setItemNameAt(size_t _index, const UString& _name)")
00233         void setItem(size_t _index, const UString& _item) { setItemNameAt(_index, _item); }
00234         MYGUI_OBSOLETE("use : const UString& List::getItemNameAt(size_t _index)")
00235         const UString& getItem(size_t _index) { return getItemNameAt(_index); }
00236         MYGUI_OBSOLETE("use : void List::removeItemAt(size_t _index)")
00237         void deleteItem(size_t _index) { removeItemAt(_index); }
00238         MYGUI_OBSOLETE("use : void List::removeAllItems()")
00239         void deleteAllItems() { removeAllItems(); }
00240         MYGUI_OBSOLETE("use : size_t List::findItemIndexWith(const UString& _name)")
00241         size_t findItem(const UString& _item) { return findItemIndexWith(_item); }
00242         MYGUI_OBSOLETE("use : size_t List::getIndexSelected()")
00243         size_t getItemSelect() { return getIndexSelected(); }
00244         MYGUI_OBSOLETE("use : void List::clearIndexSelected()")
00245         void resetItemSelect() { clearIndexSelected(); }
00246         MYGUI_OBSOLETE("use : void List::setIndexSelected(size_t _index)")
00247         void setItemSelect(size_t _index) { setIndexSelected(_index); }
00248         MYGUI_OBSOLETE("use : void List::beginToItemAt(size_t _index)")
00249         void beginToIndex(size_t _index) { beginToItemAt(_index); }
00250         MYGUI_OBSOLETE("use : void List::beginToItemFirst()")
00251         void beginToStart() { beginToItemFirst(); }
00252         MYGUI_OBSOLETE("use : void List::beginToItemLast()")
00253         void beginToEnd() { beginToItemLast(); }
00254         MYGUI_OBSOLETE("use : void List::beginToItemSelected()")
00255         void beginToSelect() { beginToItemSelected(); }
00256         MYGUI_OBSOLETE("use : bool List::isItemVisibleAt(size_t _index, bool _fill)")
00257         bool isItemVisible(size_t _index, bool _fill = true) { return isItemVisibleAt(_index, _fill); }
00258         MYGUI_OBSOLETE("use : bool List::isItemSelectedVisible(bool _fill)")
00259         bool isItemSelectVisible(bool _fill = true) { return isItemSelectedVisible(_fill); }
00260 
00261 #endif // MYGUI_DONT_USE_OBSOLETE
00262 
00263     protected:
00264         virtual ~List();
00265 
00266         void baseChangeWidgetSkin(ResourceSkin* _info);
00267 
00268         void onMouseWheel(int _rel);
00269         void onKeyLostFocus(Widget* _new);
00270         void onKeySetFocus(Widget* _old);
00271         void onKeyButtonPressed(KeyCode _key, Char _char);
00272 
00273         void notifyScrollChangePosition(VScroll* _sender, size_t _rel);
00274         void notifyMousePressed(Widget* _sender, int _left, int _top, MouseButton _id);
00275         void notifyMouseDoubleClick(Widget* _sender);
00276         void notifyMouseWheel(Widget* _sender, int _rel);
00277         void notifyMouseSetFocus(Widget* _sender, Widget* _old);
00278         void notifyMouseLostFocus(Widget* _sender, Widget* _new);
00279 
00280         void updateScroll();
00281         void updateLine(bool _reset = false);
00282         void _setScrollView(size_t _position);
00283 
00284         // перерисовывает от индекса до низа
00285         void _redrawItemRange(size_t _start = 0);
00286 
00287         // перерисовывает индекс
00288         void _redrawItem(size_t _index);
00289 
00290         // ищет и выделяет елемент
00291         void _selectIndex(size_t _index, bool _select);
00292 
00293         void _updateState() { setState(mIsFocus ? "pushed" : "normal"); }
00294 
00295     private:
00296         void initialiseWidgetSkin(ResourceSkin* _info);
00297         void shutdownWidgetSkin();
00298         void _checkMapping(const std::string& _owner);
00299 
00300         Widget* _getClientWidget();
00301         const Widget* _getClientWidget() const;
00302 
00303     private:
00304         std::string mSkinLine;
00305         VScroll* mWidgetScroll;
00306 
00307         // наши дети в строках
00308         VectorWidgetPtr mWidgetLines;
00309 
00310         int mHeightLine; // высота одной строки
00311         int mTopIndex; // индекс самого верхнего элемента
00312         int mOffsetTop; // текущее смещение
00313         int mRangeIndex; // размерность скрола
00314         size_t mLastRedrawLine; // последняя перерисованная линия
00315 
00316         size_t mIndexSelect; // текущий выделенный элемент или ITEM_NONE
00317         size_t mLineActive; // текущий виджет над которым мыша
00318 
00319         typedef std::pair<UString, Any> PairItem;
00320         typedef std::vector<PairItem> VectorItemInfo;
00321         VectorItemInfo mItemsInfo;
00322 
00323         // имеем ли мы фокус ввода
00324         bool mIsFocus;
00325         bool mNeedVisibleScroll;
00326 
00327         IntSize mOldSize;
00328 
00329     };
00330 
00331 } // namespace MyGUI
00332 
00333 #endif // __MYGUI_LIST_H__
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines