MyGUI 3.0.1
MyGUI_Tab.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_TAB_H__
00024 #define __MYGUI_TAB_H__
00025 
00026 #include "MyGUI_Prerequest.h"
00027 #include "MyGUI_Widget.h"
00028 #include "MyGUI_Any.h"
00029 #include "MyGUI_EventPair.h"
00030 #include "MyGUI_ControllerFadeAlpha.h"
00031 
00032 namespace MyGUI
00033 {
00034 
00035     typedef delegates::CDelegate2<Tab*, size_t> EventHandle_TabPtrSizeT;
00036 
00037     class MYGUI_EXPORT Tab :
00038         public Widget
00039     {
00040         // для уведобления об удалении
00041         //FIXME
00042         friend class TabItem;
00043 
00044         MYGUI_RTTI_DERIVED( Tab )
00045 
00046     public:
00047         Tab();
00048 
00049         struct TabItemInfo
00050         {
00051             TabItemInfo(int _width, const UString& _name, TabItem* _item, Any _data) :
00052                 width(_width),
00053                 name(_name),
00054                 item(_item),
00055                 data(_data)
00056             {
00057             }
00058 
00059             int width;
00060             UString name;
00061             TabItem* item;
00062             Any data;
00063         };
00064 
00065         typedef std::vector<TabItemInfo> VectorTabItemInfo;
00066 
00068         virtual void setPosition(const IntPoint& _value);
00070         virtual void setSize(const IntSize& _value);
00072         virtual void setCoord(const IntCoord& _value);
00073 
00075         void setPosition(int _left, int _top) { setPosition(IntPoint(_left, _top)); }
00077         void setSize(int _width, int _height) { setSize(IntSize(_width, _height)); }
00079         void setCoord(int _left, int _top, int _width, int _height) { setCoord(IntCoord(_left, _top, _width, _height)); }
00080 
00081         //------------------------------------------------------------------------------//
00082         // манипуляции айтемами
00083 
00085         size_t getItemCount() const { return mItemsInfo.size(); }
00086 
00088         TabItem* insertItemAt(size_t _index, const UString& _name, Any _data = Any::Null);
00090         TabItem* insertItem(TabItem* _to, const UString& _name, Any _data = Any::Null)
00091         {
00092             return insertItemAt(getItemIndex(_to), _name, _data);
00093         }
00094 
00096         TabItem* addItem(const UString& _name, Any _data = Any::Null)
00097         {
00098             return insertItemAt(ITEM_NONE, _name, _data);
00099         }
00100 
00102         void removeItemAt(size_t _index);
00104         void removeItem(TabItem* _item) { removeItemAt(getItemIndex(_item)); }
00105 
00107         void removeAllItems();
00108 
00109 
00111         TabItem* getItemAt(size_t _index);
00112 
00114         size_t getItemIndex(TabItem* _item);
00115 
00117         size_t findItemIndex(TabItem* _item);
00118 
00120         size_t findItemIndexWith(const UString& _name);
00121 
00123         TabItem* findItemWith(const UString& _name);
00124 
00125 
00126         //------------------------------------------------------------------------------//
00127         // манипуляции выделениями
00128 
00130         size_t getIndexSelected() { return mIndexSelect; }
00131 
00133         TabItem* getItemSelected();
00134 
00136         void setIndexSelected(size_t _index);
00137 
00139         void setItemSelected(TabItem* _item) { setIndexSelected(getItemIndex(_item)); }
00140 
00141 
00142         //------------------------------------------------------------------------------//
00143         // манипуляции данными
00144 
00146         void setItemDataAt(size_t _index, Any _data);
00148         void setItemData(TabItem* _item, Any _data) { setItemDataAt(getItemIndex(_item), _data); }
00149 
00151         void clearItemDataAt(size_t _index) { setItemDataAt(_index, Any::Null); }
00153         void clearItemData(TabItem* _item) { clearItemDataAt(getItemIndex(_item)); }
00154 
00156         template <typename ValueType>
00157         ValueType * getItemDataAt(size_t _index, bool _throw = true)
00158         {
00159             MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "Tab::getItemDataAt");
00160             return mItemsInfo[_index].data.castType<ValueType>(_throw);
00161         }
00163         template <typename ValueType>
00164         ValueType * getItemData(TabItem* _item, bool _throw = true)
00165         {
00166             return getItemDataAt<ValueType>(getItemIndex(_item), _throw);
00167         }
00168 
00169 
00170         //------------------------------------------------------------------------------//
00171         // манипуляции отображением
00172 
00174         void setItemNameAt(size_t _index, const UString& _name);
00175 
00177         void setItemName(TabItem* _item, const UString& _name) { setItemNameAt(getItemIndex(_item), _name); }
00178 
00180         const UString& getItemNameAt(size_t _index);
00181 
00183         const UString& getItemName(TabItem* _item) { return getItemNameAt(getItemIndex(_item)); }
00184 
00185 
00186         //------------------------------------------------------------------------------//
00187         // манипуляции выдимостью
00188 
00190         void beginToItemAt(size_t _index);
00191 
00193         void beginToItem(TabItem* _item) { beginToItemAt(getItemIndex(_item)); }
00194 
00196         void beginToItemFirst() { if (getItemCount()) beginToItemAt(0); }
00197 
00199         void beginToItemLast() { if (getItemCount()) beginToItemAt(getItemCount() - 1); }
00200 
00202         void beginToItemSelected() { if (getIndexSelected() != ITEM_NONE) beginToItemAt(getIndexSelected()); }
00203 
00204 
00205         //------------------------------------------------------------------------------//
00206         // остальные манипуляции
00207 
00209         void setButtonWidthAt(size_t _index, int _width = DEFAULT);
00211         void setButtonWidth(TabItem* _item, int _width = DEFAULT) { setButtonWidthAt(getItemIndex(_item), _width); }
00212 
00214         int getButtonWidthAt(size_t _index);
00216         int getButtonWidth(TabItem* _item) { return getButtonWidthAt(getItemIndex(_item)); }
00217 
00218         //------------------------------------------------------------------------------//
00219 
00221         void setButtonDefaultWidth(int _value);
00223         int getButtonDefaultWidth() { return mButtonDefaultWidth; }
00224 
00226         void setButtonAutoWidth(bool _value);
00228         bool getButtonAutoWidth() { return mButtonAutoWidth; }
00229 
00231         void setSmoothShow(bool _value) { mSmoothShow = _value; }
00233         bool getSmoothShow() { return mSmoothShow; }
00234 
00236         virtual void setProperty(const std::string& _key, const std::string& _value);
00237 
00238     /*event:*/
00244         EventPair<EventHandle_WidgetSizeT, EventHandle_TabPtrSizeT> eventTabChangeSelect;
00245 
00246     /*internal:*/
00247         virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name);
00248 
00249     /*obsolete:*/
00250 #ifndef MYGUI_DONT_USE_OBSOLETE
00251 
00252         MYGUI_OBSOLETE("use : void Widget::setCoord(const IntCoord& _coord)")
00253         void setPosition(const IntCoord& _coord) { setCoord(_coord); }
00254         MYGUI_OBSOLETE("use : void Widget::setCoord(int _left, int _top, int _width, int _height)")
00255         void setPosition(int _left, int _top, int _width, int _height) { setCoord(_left, _top, _width, _height); }
00256 
00257         MYGUI_OBSOLETE("use : int Tab::getButtonWidthAt(size_t _index)")
00258         int getSheetButtonWidthIndex(size_t _index) { return getButtonWidthAt(_index); }
00259         MYGUI_OBSOLETE("use : int Tab::getButtonWidth(TabItem* _item)")
00260         int getSheetButtonWidth(TabItem* _sheet) { return getButtonWidth(_sheet); }
00261         MYGUI_OBSOLETE("use : void Tab::setButtonWidthAt(size_t _index, int _width)")
00262         void setSheetButtonWidthIndex(size_t _index, int _width = DEFAULT) { setButtonWidthAt(_index, _width); }
00263         MYGUI_OBSOLETE("use : void Tab::setButtonWidth(TabItem* _item, int _width)")
00264         void setSheetButtonWidth(TabItem* _sheet, int _width = DEFAULT) { setButtonWidth(_sheet, _width); }
00265         MYGUI_OBSOLETE("use : void Tab::beginToItemAt(size_t _index)")
00266         void showBarButton(size_t _index) { beginToItemAt(_index); }
00267         MYGUI_OBSOLETE("use : void Tab::beginToItemSelected()")
00268         void showBarSelectButton() { beginToItemSelected(); }
00269         MYGUI_OBSOLETE("use : size_t Tab::getItemCount()")
00270         size_t getSheetCount() { return getItemCount(); }
00271         MYGUI_OBSOLETE("use : const UString& Tab::getItemName(TabItem* _item)")
00272         const UString& getSheetName(TabItem* _sheet) { return getItemName(_sheet); }
00273         MYGUI_OBSOLETE("use : const UString& Tab::getItemNameAt(size_t _index)")
00274         const UString& getSheetNameIndex(size_t _index) { return getItemNameAt(_index); }
00275         MYGUI_OBSOLETE("use : TabItem* Tab::getItemAt(size_t _index)")
00276         TabItem* getSheet(size_t _index) { return getItemAt(_index); }
00277         MYGUI_OBSOLETE("use : void Tab::setItemNameAt(size_t _index, const UString& _name)")
00278         void setSheetNameIndex(size_t _index, const UString& _name, int _width = DEFAULT) { setItemNameAt(_index, _name); }
00279         MYGUI_OBSOLETE("use : void Tab::setItemName(TabItem* _item, const UString& _name)")
00280         void setSheetName(TabItem* _sheet, const UString& _name, int _width = DEFAULT) { setItemName(_sheet, _name); }
00281         MYGUI_OBSOLETE("use : TabItem* Tab::addItem(const UString& _name, Any _data)")
00282         TabItem* addSheet(const UString& _name, int _width = DEFAULT) { return addItem(_name, _width); }
00283         MYGUI_OBSOLETE("use : TabItem* Tab::insertItemAt(size_t _index, const UString& _name, Any _data)")
00284         TabItem* insertSheet(size_t _index, const UString& _name, int _width = DEFAULT) { return insertItemAt(_index, _name); }
00285         MYGUI_OBSOLETE("use : void Tab::removeItemAt(size_t _index)")
00286         void removeSheetIndex(size_t _index) { removeItemAt(_index); }
00287         MYGUI_OBSOLETE("use : void Tab::removeItem(TabItem* _item)")
00288         void removeSheet(TabItem* _sheet) { removeItem(_sheet); }
00289         MYGUI_OBSOLETE("use : void Tab::setIndexSelected(size_t _index)")
00290         void selectSheetIndex(size_t _index, bool _smooth = true) { setIndexSelected(_index); }
00291         MYGUI_OBSOLETE("use : void Tab::setItemSelected(TabItem* _item)")
00292         void selectSheet(TabItem* _sheet, bool _smooth = true) { setItemSelected(_sheet); }
00293         MYGUI_OBSOLETE("use : size_t Tab::getIndexSelected()")
00294         size_t getSelectSheetIndex() { return getIndexSelected(); }
00295 
00296         MYGUI_OBSOLETE("use : size_t Widget::getIndexSelected()")
00297         size_t getItemIndexSelected() { return getIndexSelected(); }
00298         MYGUI_OBSOLETE("use : void Widget::setIndexSelected(size_t _index)")
00299         void setItemSelectedAt(size_t _index) { setIndexSelected(_index); }
00300 
00301 #endif // MYGUI_DONT_USE_OBSOLETE
00302 
00303     protected:
00304         virtual ~Tab();
00305 
00306         void baseChangeWidgetSkin(ResourceSkin* _info);
00307 
00308         // переопределяем для особого обслуживания страниц
00309         virtual Widget* baseCreateWidget(WidgetStyle _style, const std::string& _type, const std::string& _skin, const IntCoord& _coord, Align _align, const std::string& _layer, const std::string& _name);
00310 
00311         void updateBar();
00312 
00313         void notifyPressedButtonEvent(MyGUI::Widget* _sender);
00314         void notifyPressedBarButtonEvent(MyGUI::Widget* _sender);
00315 
00316         int _getTextWidth(const UString& _text);
00317 
00318         void _showItem(TabItem* _sheet, bool _show, bool _smooth);
00319 
00320         void _createItemButton();
00321 
00322         void _insertItem(size_t _index, const UString& _name, TabItem* _sheet, Any _data);
00323 
00324         // вкладка при удалении уведомляет таб
00325         void _notifyDeleteItem(TabItem* _item);
00326 
00327     private:
00328         void initialiseWidgetSkin(ResourceSkin* _info);
00329         void shutdownWidgetSkin();
00330         void actionWidgetHide(Widget* _widget);
00331 
00332         ControllerFadeAlpha* createControllerFadeAlpha(float _alpha, float _coef, bool _enable);
00333 
00334         Widget* _getWidgetTemplate();
00335         Widget* _getWidgetBar();
00336 
00337     private:
00338         int mOffsetTab; // смещение бара при показе кнопок
00339         bool mButtonShow;
00340         int mWidthBar; // ширина в которую помещаються все кнопки
00341         VectorWidgetPtr mItemButton; // список кнопок, не должно равно списку страниц
00342         std::string mButtonSkinName, mEmptySkinName;
00343 
00344         Widget* mWidgetBar;
00345         Button* mButtonLeft;
00346         Button* mButtonRight;
00347         Button* mButtonList;
00348         Widget* mButtonDecor;
00349         VectorWidgetPtr mWidgetsPatch; // список виджетов которые нужно показать при показе кнопки
00350         Widget* mEmptyBarWidget;
00351         Widget* mItemTemplate;
00352 
00353         // информация о вкладках
00354         VectorTabItemInfo mItemsInfo;
00355         size_t mStartIndex;
00356         size_t mIndexSelect;
00357 
00358         int mButtonDefaultWidth;
00359         bool mSmoothShow;
00360         bool mButtonAutoWidth;
00361 
00362         // флаг, чтобы отсеч уведомления от вкладок, при общем шутдауне виджета
00363         bool mShutdown;
00364 
00365     };
00366 
00367 } // namespace MyGUI
00368 
00369 #endif // __MYGUI_TAB_H__