MyGUI  3.2.1
MyGUI_TabControl.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_TAB_CONTROL_H__
00008 #define __MYGUI_TAB_CONTROL_H__
00009 
00010 #include "MyGUI_Prerequest.h"
00011 #include "MyGUI_Widget.h"
00012 #include "MyGUI_Any.h"
00013 #include "MyGUI_EventPair.h"
00014 #include "MyGUI_ControllerFadeAlpha.h"
00015 #include "MyGUI_IItem.h"
00016 #include "MyGUI_IItemContainer.h"
00017 
00018 namespace MyGUI
00019 {
00020 
00021     typedef delegates::CMultiDelegate2<TabControl*, size_t> EventHandle_TabPtrSizeT;
00022 
00026     class MYGUI_EXPORT TabControl :
00027         public Widget,
00028         public IItemContainer,
00029         public MemberObsolete<TabControl>
00030     {
00031         // для уведобления об удалении
00032         //FIXME
00033         friend class TabItem;
00034 
00035         MYGUI_RTTI_DERIVED( TabControl )
00036 
00037     public:
00038         TabControl();
00039 
00040         struct TabItemInfo
00041         {
00042             TabItemInfo(int _width, const UString& _name, TabItem* _item, Any _data) :
00043                 width(_width),
00044                 name(_name),
00045                 item(_item),
00046                 data(_data)
00047             {
00048             }
00049 
00050             int width;
00051             UString name;
00052             TabItem* item;
00053             Any data;
00054         };
00055 
00056         typedef std::vector<TabItemInfo> VectorTabItemInfo;
00057 
00059         virtual void setPosition(const IntPoint& _value);
00061         virtual void setSize(const IntSize& _value);
00063         virtual void setCoord(const IntCoord& _value);
00064 
00066         void setPosition(int _left, int _top);
00068         void setSize(int _width, int _height);
00070         void setCoord(int _left, int _top, int _width, int _height);
00071 
00072         //------------------------------------------------------------------------------//
00073         // манипуляции айтемами
00074 
00076         size_t getItemCount() const;
00077 
00079         TabItem* insertItemAt(size_t _index, const UString& _name, Any _data = Any::Null);
00081         TabItem* insertItem(TabItem* _to, const UString& _name, Any _data = Any::Null);
00082 
00084         TabItem* addItem(const UString& _name, Any _data = Any::Null);
00085 
00087         void removeItemAt(size_t _index);
00089         void removeItem(TabItem* _item);
00090 
00092         void removeAllItems();
00093 
00094 
00096         TabItem* getItemAt(size_t _index);
00097 
00099         size_t getItemIndex(TabItem* _item);
00100 
00102         size_t findItemIndex(TabItem* _item);
00103 
00105         size_t findItemIndexWith(const UString& _name);
00106 
00108         TabItem* findItemWith(const UString& _name);
00109 
00110         void swapItems(size_t _index1, size_t _index2);
00111 
00112         //------------------------------------------------------------------------------//
00113         // манипуляции выделениями
00114 
00116         size_t getIndexSelected() const;
00117 
00119         TabItem* getItemSelected();
00120 
00122         void setIndexSelected(size_t _index);
00123 
00125         void setItemSelected(TabItem* _item);
00126 
00127 
00128         //------------------------------------------------------------------------------//
00129         // манипуляции данными
00130 
00132         void setItemDataAt(size_t _index, Any _data);
00134         void setItemData(TabItem* _item, Any _data);
00135 
00137         void clearItemDataAt(size_t _index);
00139         void clearItemData(TabItem* _item);
00140 
00142         template <typename ValueType>
00143         ValueType* getItemDataAt(size_t _index, bool _throw = true)
00144         {
00145             MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "TabControl::getItemDataAt");
00146             return mItemsInfo[_index].data.castType<ValueType>(_throw);
00147         }
00149         template <typename ValueType>
00150         ValueType* getItemData(TabItem* _item, bool _throw = true)
00151         {
00152             return getItemDataAt<ValueType>(getItemIndex(_item), _throw);
00153         }
00154 
00155 
00156         //------------------------------------------------------------------------------//
00157         // манипуляции отображением
00158 
00160         void setItemNameAt(size_t _index, const UString& _name);
00161 
00163         void setItemName(TabItem* _item, const UString& _name);
00164 
00166         const UString& getItemNameAt(size_t _index);
00167 
00169         const UString& getItemName(TabItem* _item);
00170 
00171 
00172         //------------------------------------------------------------------------------//
00173         // манипуляции выдимостью
00174 
00176         void beginToItemAt(size_t _index);
00177 
00179         void beginToItem(TabItem* _item);
00181         void beginToItemFirst();
00183         void beginToItemLast();
00185         void beginToItemSelected();
00186 
00187 
00188         //------------------------------------------------------------------------------//
00189         // остальные манипуляции
00190 
00192         void setButtonWidthAt(size_t _index, int _width = DEFAULT);
00194         void setButtonWidth(TabItem* _item, int _width = DEFAULT);
00195 
00197         int getButtonWidthAt(size_t _index);
00199         int getButtonWidth(TabItem* _item);
00200 
00201         //------------------------------------------------------------------------------//
00202 
00204         void setButtonDefaultWidth(int _value);
00206         int getButtonDefaultWidth() const;
00207 
00209         void setButtonAutoWidth(bool _value);
00211         bool getButtonAutoWidth() const;
00212 
00214         void setSmoothShow(bool _value);
00216         bool getSmoothShow() const;
00217 
00218         /*events:*/
00224         EventPair<EventHandle_WidgetSizeT, EventHandle_TabPtrSizeT> eventTabChangeSelect;
00225 
00226         /*internal:*/
00227         // IItemContainer impl
00228         virtual size_t _getItemCount();
00229         virtual void _addItem(const MyGUI::UString& _name);
00230         virtual void _removeItemAt(size_t _index);
00231         virtual Widget* _getItemAt(size_t _index);
00232         virtual void _setItemNameAt(size_t _index, const UString& _name);
00233         virtual const UString& _getItemNameAt(size_t _index);
00234 
00235     protected:
00236         virtual void initialiseOverride();
00237         virtual void shutdownOverride();
00238 
00239         void updateBar();
00240 
00241         void notifyPressedButtonEvent(MyGUI::Widget* _sender);
00242         void notifyPressedBarButtonEvent(MyGUI::Widget* _sender);
00243 
00244         int _getTextWidth(const UString& _text);
00245 
00246         void _showItem(TabItem* _sheet, bool _show, bool _smooth);
00247 
00248         void _createItemButton();
00249 
00250         void _insertItem(size_t _index, const UString& _name, TabItem* _sheet, Any _data);
00251 
00252         // вкладка при удалении уведомляет таб
00253         void _notifyDeleteItem(TabItem* _item);
00254 
00255         virtual void onWidgetCreated(Widget* _widget);
00256 
00257         virtual void setPropertyOverride(const std::string& _key, const std::string& _value);
00258 
00259     private:
00260         void actionWidgetHide(Widget* _widget, ControllerItem* _controller);
00261 
00262         ControllerFadeAlpha* createControllerFadeAlpha(float _alpha, float _coef, bool _enable);
00263 
00264         Widget* _getWidgetTemplate();
00265         Widget* _getWidgetBar();
00266 
00267         Button* createButton();
00268         void updateBarOld();
00269         void updateBarNew();
00270 
00271     private:
00272         int mOffsetTab; // смещение бара при показе кнопок
00273         bool mButtonShow;
00274         int mWidthBar; // ширина в которую помещаються все кнопки
00275         std::vector<Button*> mItemButton; // список кнопок, не должно равно списку страниц
00276         std::string mButtonSkinName;
00277         std::string mEmptySkinName;
00278 
00279         Widget* mWidgetBar;
00280         Button* mButtonLeft;
00281         Button* mButtonRight;
00282         Widget* mButtonDecor;
00283         VectorWidgetPtr mWidgetsPatch; // список виджетов которые нужно показать при показе кнопки
00284         Widget* mEmptyBarWidget;
00285         Widget* mItemTemplate;
00286 
00287         // информация о вкладках
00288         VectorTabItemInfo mItemsInfo;
00289         size_t mStartIndex;
00290         size_t mIndexSelect;
00291 
00292         int mButtonDefaultWidth;
00293         bool mSmoothShow;
00294         bool mButtonAutoWidth;
00295 
00296         // флаг, чтобы отсеч уведомления от вкладок, при общем шутдауне виджета
00297         bool mShutdown;
00298 
00299         Widget* mHeaderPlace;
00300         Widget* mControls;
00301         Widget* mEmpty;
00302     };
00303 
00304 } // namespace MyGUI
00305 
00306 #endif // __MYGUI_TAB_CONTROL_H__