util/src/gui/widgets/qtabwidget.cpp
changeset 7 f7bc934e204c
equal deleted inserted replaced
3:41300fa6a67c 7:f7bc934e204c
       
     1 /****************************************************************************
       
     2 **
       
     3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
       
     4 ** All rights reserved.
       
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
       
     6 **
       
     7 ** This file is part of the QtGui module of the Qt Toolkit.
       
     8 **
       
     9 ** $QT_BEGIN_LICENSE:LGPL$
       
    10 ** No Commercial Usage
       
    11 ** This file contains pre-release code and may not be distributed.
       
    12 ** You may use this file in accordance with the terms and conditions
       
    13 ** contained in the Technology Preview License Agreement accompanying
       
    14 ** this package.
       
    15 **
       
    16 ** GNU Lesser General Public License Usage
       
    17 ** Alternatively, this file may be used under the terms of the GNU Lesser
       
    18 ** General Public License version 2.1 as published by the Free Software
       
    19 ** Foundation and appearing in the file LICENSE.LGPL included in the
       
    20 ** packaging of this file.  Please review the following information to
       
    21 ** ensure the GNU Lesser General Public License version 2.1 requirements
       
    22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
       
    23 **
       
    24 ** In addition, as a special exception, Nokia gives you certain additional
       
    25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
       
    26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
       
    27 **
       
    28 ** If you have questions regarding the use of this file, please contact
       
    29 ** Nokia at qt-info@nokia.com.
       
    30 **
       
    31 **
       
    32 **
       
    33 **
       
    34 **
       
    35 **
       
    36 **
       
    37 **
       
    38 ** $QT_END_LICENSE$
       
    39 **
       
    40 ****************************************************************************/
       
    41 
       
    42 #include "qtabwidget.h"
       
    43 
       
    44 #ifndef QT_NO_TABWIDGET
       
    45 #include "private/qwidget_p.h"
       
    46 #include "private/qtabbar_p.h"
       
    47 #include "qapplication.h"
       
    48 #include "qbitmap.h"
       
    49 #include "qdesktopwidget.h"
       
    50 #include "qevent.h"
       
    51 #include "qlayout.h"
       
    52 #include "qstackedwidget.h"
       
    53 #include "qstyle.h"
       
    54 #include "qstyleoption.h"
       
    55 #include "qstylepainter.h"
       
    56 #include "qtabbar.h"
       
    57 #include "qtoolbutton.h"
       
    58 
       
    59 QT_BEGIN_NAMESPACE
       
    60 
       
    61 /*!
       
    62     \class QTabWidget
       
    63     \brief The QTabWidget class provides a stack of tabbed widgets.
       
    64 
       
    65     \ingroup organizers
       
    66     \ingroup basicwidgets
       
    67 
       
    68 
       
    69     A tab widget provides a tab bar (see QTabBar) and a "page area"
       
    70     that is used to display pages related to each tab. By default, the
       
    71     tab bar is shown above the page area, but different configurations
       
    72     are available (see \l{TabPosition}). Each tab is associated with a
       
    73     different widget (called a page). Only the current page is shown in
       
    74     the page area; all the other pages are hidden. The user can show a
       
    75     different page by clicking on its tab or by pressing its
       
    76     Alt+\e{letter} shortcut if it has one.
       
    77 
       
    78     The normal way to use QTabWidget is to do the following:
       
    79     \list 1
       
    80     \i Create a QTabWidget.
       
    81     \i Create a QWidget for each of the pages in the tab dialog, but
       
    82        do not specify parent widgets for them.
       
    83     \i Insert child widgets into the page widget, using layouts to
       
    84        position them as normal.
       
    85     \i Call addTab() or insertTab() to put the page widgets into the
       
    86        tab widget, giving each tab a suitable label with an optional
       
    87        keyboard shortcut.
       
    88     \endlist
       
    89 
       
    90     The position of the tabs is defined by \l tabPosition, their shape
       
    91     by \l tabShape.
       
    92 
       
    93     The signal currentChanged() is emitted when the user selects a
       
    94     page.
       
    95 
       
    96     The current page index is available as currentIndex(), the current
       
    97     page widget with currentWidget().  You can retrieve a pointer to a
       
    98     page widget with a given index using widget(), and can find the
       
    99     index position of a widget with indexOf(). Use setCurrentWidget()
       
   100     or setCurrentIndex() to show a particular page.
       
   101 
       
   102     You can change a tab's text and icon using setTabText() or
       
   103     setTabIcon(). A tab and its associated page can be removed with
       
   104     removeTab().
       
   105 
       
   106     Each tab is either enabled or disabled at any given time (see
       
   107     setTabEnabled()). If a tab is enabled, the tab text is drawn
       
   108     normally and the user can select that tab. If it is disabled, the
       
   109     tab is drawn in a different way and the user cannot select that
       
   110     tab. Note that even if a tab is disabled, the page can still be
       
   111     visible, for example if all of the tabs happen to be disabled.
       
   112 
       
   113     Tab widgets can be a very good way to split up a complex dialog.
       
   114     An alternative is to use a QStackedWidget for which you provide some
       
   115     means of navigating between pages, for example, a QToolBar or a
       
   116     QListWidget.
       
   117 
       
   118     Most of the functionality in QTabWidget is provided by a QTabBar
       
   119     (at the top, providing the tabs) and a QStackedWidget (most of the
       
   120     area, organizing the individual pages).
       
   121 
       
   122     \table 100%
       
   123     \row \o \inlineimage windowsxp-tabwidget.png Screenshot of a Windows XP style tab widget
       
   124          \o \inlineimage macintosh-tabwidget.png Screenshot of a Macintosh style tab widget
       
   125          \o \inlineimage plastique-tabwidget.png Screenshot of a Plastique style tab widget
       
   126     \row \o A Windows XP style tab widget.
       
   127          \o A Macintosh style tab widget.
       
   128          \o A Plastique style tab widget.
       
   129     \endtable
       
   130 
       
   131     \sa QTabBar, QStackedWidget, QToolBox, {Tab Dialog Example}
       
   132 */
       
   133 
       
   134 /*!
       
   135     \enum QTabWidget::TabPosition
       
   136 
       
   137     This enum type defines where QTabWidget draws the tab row:
       
   138 
       
   139     \value North  The tabs are drawn above the pages.
       
   140     \value South  The tabs are drawn below the pages.
       
   141     \value West  The tabs are drawn to the left of the pages.
       
   142     \value East  The tabs are drawn to the right of the pages.
       
   143     \omitvalue Bottom
       
   144     \omitvalue Top
       
   145 */
       
   146 
       
   147 /*!
       
   148     \enum QTabWidget::TabShape
       
   149 
       
   150     This enum type defines the shape of the tabs:
       
   151     \value Rounded  The tabs are drawn with a rounded look. This is the default
       
   152                     shape.
       
   153     \value Triangular  The tabs are drawn with a triangular look.
       
   154 */
       
   155 
       
   156 /*!
       
   157     \fn void QTabWidget::selected(const QString &tabLabel)
       
   158 
       
   159     This signal is emitted whenever a tab is selected (raised),
       
   160     including during the first show().
       
   161 
       
   162     You can normally use currentChanged() instead.
       
   163 */
       
   164 
       
   165 /*!
       
   166     \fn void QTabWidget::currentChanged(int index)
       
   167 
       
   168     This signal is emitted whenever the current page index changes.
       
   169     The parameter is the new current page \a index position, or -1
       
   170     if there isn't a new one (for example, if there are no widgets
       
   171     in the QTabWidget)
       
   172 
       
   173     \sa currentWidget() currentIndex
       
   174 */
       
   175 
       
   176 /*!
       
   177     \fn void QTabWidget::tabCloseRequested(int index)
       
   178     \since 4.5
       
   179 
       
   180     This signal is emitted when the close button on a tab is clicked.
       
   181     The \a index is the index that should be removed.
       
   182 
       
   183     \sa setTabsClosable()
       
   184 */
       
   185 
       
   186 class QTabWidgetPrivate : public QWidgetPrivate
       
   187 {
       
   188     Q_DECLARE_PUBLIC(QTabWidget)
       
   189 
       
   190 public:
       
   191     QTabWidgetPrivate();
       
   192     ~QTabWidgetPrivate();
       
   193     void updateTabBarPosition();
       
   194     void _q_showTab(int);
       
   195     void _q_removeTab(int);
       
   196     void _q_tabMoved(int from, int to);
       
   197     void init();
       
   198 
       
   199     QTabBar *tabs;
       
   200     QStackedWidget *stack;
       
   201     QRect panelRect;
       
   202     bool dirty;
       
   203     QTabWidget::TabPosition pos;
       
   204     QTabWidget::TabShape shape;
       
   205     int alignment;
       
   206     QWidget *leftCornerWidget;
       
   207     QWidget *rightCornerWidget;
       
   208 };
       
   209 
       
   210 QTabWidgetPrivate::QTabWidgetPrivate()
       
   211     : tabs(0), stack(0), dirty(true),
       
   212       pos(QTabWidget::North), shape(QTabWidget::Rounded),
       
   213       leftCornerWidget(0), rightCornerWidget(0)
       
   214 {}
       
   215 
       
   216 QTabWidgetPrivate::~QTabWidgetPrivate()
       
   217 {}
       
   218 
       
   219 void QTabWidgetPrivate::init()
       
   220 {
       
   221     Q_Q(QTabWidget);
       
   222 
       
   223     stack = new QStackedWidget(q);
       
   224     stack->setObjectName(QLatin1String("qt_tabwidget_stackedwidget"));
       
   225     stack->setLineWidth(0);
       
   226     // hack so that QMacStyle::layoutSpacing() can detect tab widget pages
       
   227     stack->setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred, QSizePolicy::TabWidget));
       
   228 
       
   229     QObject::connect(stack, SIGNAL(widgetRemoved(int)), q, SLOT(_q_removeTab(int)));
       
   230     QTabBar *tabBar = new QTabBar(q);
       
   231     tabBar->setObjectName(QLatin1String("qt_tabwidget_tabbar"));
       
   232     tabBar->setDrawBase(false);
       
   233     q->setTabBar(tabBar);
       
   234 
       
   235     q->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding,
       
   236                                  QSizePolicy::TabWidget));
       
   237 #ifdef QT_KEYPAD_NAVIGATION
       
   238     if (QApplication::keypadNavigationEnabled())
       
   239         q->setFocusPolicy(Qt::NoFocus);
       
   240     else
       
   241 #endif
       
   242     q->setFocusPolicy(Qt::TabFocus);
       
   243     q->setFocusProxy(tabs);
       
   244     q->setTabPosition(static_cast<QTabWidget::TabPosition> (q->style()->styleHint(
       
   245                       QStyle::SH_TabWidget_DefaultTabPosition, 0, q )));
       
   246 
       
   247 }
       
   248 
       
   249 /*!
       
   250     Initialize \a option with the values from this QTabWidget. This method is useful
       
   251     for subclasses when they need a QStyleOptionTabWidgetFrame, but don't want to fill
       
   252     in all the information themselves.
       
   253 
       
   254     \sa QStyleOption::initFrom() QTabBar::initStyleOption()
       
   255 */
       
   256 void QTabWidget::initStyleOption(QStyleOptionTabWidgetFrame *option) const
       
   257 {
       
   258     if (!option)
       
   259         return;
       
   260 
       
   261     Q_D(const QTabWidget);
       
   262     option->initFrom(this);
       
   263 
       
   264     if (documentMode())
       
   265         option->lineWidth = 0;
       
   266     else
       
   267         option->lineWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth, 0, this);
       
   268 
       
   269     int exth = style()->pixelMetric(QStyle::PM_TabBarBaseHeight, 0, this);
       
   270     QSize t(0, d->stack->frameWidth());
       
   271     if (d->tabs->isVisibleTo(const_cast<QTabWidget *>(this))) {
       
   272         t = d->tabs->sizeHint();
       
   273         if (documentMode()) {
       
   274             if (tabPosition() == East || tabPosition() == West) {
       
   275                 t.setHeight(height());
       
   276             } else {
       
   277                 t.setWidth(width());
       
   278             }
       
   279         }
       
   280     }
       
   281 
       
   282     if (d->rightCornerWidget) {
       
   283         const QSize rightCornerSizeHint = d->rightCornerWidget->sizeHint();
       
   284         const QSize bounds(rightCornerSizeHint.width(), t.height() - exth);
       
   285         option->rightCornerWidgetSize = rightCornerSizeHint.boundedTo(bounds);
       
   286     } else {
       
   287         option->rightCornerWidgetSize = QSize(0, 0);
       
   288     }
       
   289 
       
   290     if (d->leftCornerWidget) {
       
   291         const QSize leftCornerSizeHint = d->leftCornerWidget->sizeHint();
       
   292         const QSize bounds(leftCornerSizeHint.width(), t.height() - exth);
       
   293         option->leftCornerWidgetSize = leftCornerSizeHint.boundedTo(bounds);
       
   294     } else {
       
   295         option->leftCornerWidgetSize = QSize(0, 0);
       
   296     }
       
   297 
       
   298     switch (d->pos) {
       
   299     case QTabWidget::North:
       
   300         option->shape = d->shape == QTabWidget::Rounded ? QTabBar::RoundedNorth
       
   301                                                         : QTabBar::TriangularNorth;
       
   302         break;
       
   303     case QTabWidget::South:
       
   304         option->shape = d->shape == QTabWidget::Rounded ? QTabBar::RoundedSouth
       
   305                                                         : QTabBar::TriangularSouth;
       
   306         break;
       
   307     case QTabWidget::West:
       
   308         option->shape = d->shape == QTabWidget::Rounded ? QTabBar::RoundedWest
       
   309                                                         : QTabBar::TriangularWest;
       
   310         break;
       
   311     case QTabWidget::East:
       
   312         option->shape = d->shape == QTabWidget::Rounded ? QTabBar::RoundedEast
       
   313                                                         : QTabBar::TriangularEast;
       
   314         break;
       
   315     }
       
   316 
       
   317     option->tabBarSize = t;
       
   318 
       
   319     if (QStyleOptionTabWidgetFrameV2 *tabframe = qstyleoption_cast<QStyleOptionTabWidgetFrameV2*>(option)) {
       
   320         QRect tbRect = tabBar()->geometry();
       
   321         QRect selectedTabRect = tabBar()->tabRect(tabBar()->currentIndex());
       
   322         tabframe->tabBarRect = tbRect;
       
   323         selectedTabRect.moveTopLeft(selectedTabRect.topLeft() + tbRect.topLeft());
       
   324         tabframe->selectedTabRect = selectedTabRect;
       
   325     }
       
   326 }
       
   327 
       
   328 /*!
       
   329     Constructs a tabbed widget with parent \a parent.
       
   330 */
       
   331 QTabWidget::QTabWidget(QWidget *parent)
       
   332     : QWidget(*new QTabWidgetPrivate, parent, 0)
       
   333 {
       
   334     Q_D(QTabWidget);
       
   335     d->init();
       
   336 }
       
   337 
       
   338 #ifdef QT3_SUPPORT
       
   339 /*!
       
   340     Use one of the constructors that doesn't take the \a name
       
   341     argument and then use setObjectName() instead.
       
   342 */
       
   343 QTabWidget::QTabWidget(QWidget *parent, const char *name, Qt::WindowFlags f)
       
   344     : QWidget(*new QTabWidgetPrivate, parent, f)
       
   345 {
       
   346     Q_D(QTabWidget);
       
   347     setObjectName(QString::fromAscii(name));
       
   348     d->init();
       
   349 }
       
   350 #endif
       
   351 
       
   352 /*!
       
   353     Destroys the tabbed widget.
       
   354 */
       
   355 QTabWidget::~QTabWidget()
       
   356 {
       
   357 }
       
   358 
       
   359 /*!
       
   360     \fn int QTabWidget::addTab(QWidget *page, const QString &label)
       
   361 
       
   362     Adds a tab with the given \a page and \a label to the tab widget,
       
   363     and returns the index of the tab in the tab bar.
       
   364 
       
   365     If the tab's \a label contains an ampersand, the letter following
       
   366     the ampersand is used as a shortcut for the tab, e.g. if the
       
   367     label is "Bro\&wse" then Alt+W becomes a shortcut which will
       
   368     move the focus to this tab.
       
   369 
       
   370     \note If you call addTab() after show(), the layout system will try
       
   371     to adjust to the changes in its widgets hierarchy and may cause
       
   372     flicker. To prevent this, you can set the QWidget::updatesEnabled
       
   373     property to false prior to changes; remember to set the property
       
   374     to true when the changes are done, making the widget receive paint
       
   375     events again.
       
   376 
       
   377     \sa insertTab()
       
   378 */
       
   379 int QTabWidget::addTab(QWidget *child, const QString &label)
       
   380 {
       
   381     return insertTab(-1, child, label);
       
   382 }
       
   383 
       
   384 
       
   385 /*!
       
   386     \fn int QTabWidget::addTab(QWidget *page, const QIcon &icon, const QString &label)
       
   387     \overload
       
   388 
       
   389     Adds a tab with the given \a page, \a icon, and \a label to the tab
       
   390     widget, and returns the index of the tab in the tab bar.
       
   391 
       
   392     This function is the same as addTab(), but with an additional \a
       
   393     icon.
       
   394 */
       
   395 int QTabWidget::addTab(QWidget *child, const QIcon& icon, const QString &label)
       
   396 {
       
   397     return insertTab(-1, child, icon, label);
       
   398 }
       
   399 
       
   400 
       
   401 /*!
       
   402     \fn int QTabWidget::insertTab(int index, QWidget *page, const QString &label)
       
   403 
       
   404     Inserts a tab with the given \a label and \a page into the tab
       
   405     widget at the specified \a index, and returns the index of the
       
   406     inserted tab in the tab bar.
       
   407 
       
   408     The label is displayed in the tab and may vary in appearance depending
       
   409     on the configuration of the tab widget.
       
   410 
       
   411     If the tab's \a label contains an ampersand, the letter following
       
   412     the ampersand is used as a shortcut for the tab, e.g. if the
       
   413     label is "Bro\&wse" then Alt+W becomes a shortcut which will
       
   414     move the focus to this tab.
       
   415 
       
   416     If \a index is out of range, the tab is simply appended.
       
   417     Otherwise it is inserted at the specified position.
       
   418 
       
   419     If the QTabWidget was empty before this function is called, the
       
   420     new page becomes the current page. Inserting a new tab at an index
       
   421     less than or equal to the current index will increment the current
       
   422     index, but keep the current page.
       
   423 
       
   424     \note If you call insertTab() after show(), the layout system will try
       
   425     to adjust to the changes in its widgets hierarchy and may cause
       
   426     flicker. To prevent this, you can set the QWidget::updatesEnabled
       
   427     property to false prior to changes; remember to set the property
       
   428     to true when the changes are done, making the widget receive paint
       
   429     events again.
       
   430 
       
   431     \sa addTab()
       
   432 */
       
   433 int QTabWidget::insertTab(int index, QWidget *w, const QString &label)
       
   434 {
       
   435     return insertTab(index, w, QIcon(), label);
       
   436 }
       
   437 
       
   438 
       
   439 /*!
       
   440     \fn int QTabWidget::insertTab(int index, QWidget *page, const QIcon& icon, const QString &label)
       
   441     \overload
       
   442 
       
   443     Inserts a tab with the given \a label, \a page, and \a icon into
       
   444     the tab widget at the specified \a index, and returns the index of the
       
   445     inserted tab in the tab bar.
       
   446 
       
   447     This function is the same as insertTab(), but with an additional
       
   448     \a icon.
       
   449 */
       
   450 int QTabWidget::insertTab(int index, QWidget *w, const QIcon& icon, const QString &label)
       
   451 {
       
   452     Q_D(QTabWidget);
       
   453     if(!w)
       
   454         return -1;
       
   455     index = d->stack->insertWidget(index, w);
       
   456     d->tabs->insertTab(index, icon, label);
       
   457     setUpLayout();
       
   458     tabInserted(index);
       
   459 
       
   460     return index;
       
   461 }
       
   462 
       
   463 
       
   464 /*!
       
   465     Defines a new \a label for the page at position \a index's tab.
       
   466 
       
   467     If the provided text contains an ampersand character ('&'), a
       
   468     shortcut is automatically created for it. The character that
       
   469     follows the '&' will be used as the shortcut key. Any previous
       
   470     shortcut will be overwritten, or cleared if no shortcut is defined
       
   471     by the text. See the \l {QShortcut#mnemonic}{QShortcut}
       
   472     documentation for details (to display an actual ampersand, use
       
   473     '&&').
       
   474 
       
   475 */
       
   476 void QTabWidget::setTabText(int index, const QString &label)
       
   477 {
       
   478     Q_D(QTabWidget);
       
   479     d->tabs->setTabText(index, label);
       
   480     setUpLayout();
       
   481 }
       
   482 
       
   483 /*!
       
   484     Returns the label text for the tab on the page at position \a index.
       
   485 */
       
   486 
       
   487 QString QTabWidget::tabText(int index) const
       
   488 {
       
   489     Q_D(const QTabWidget);
       
   490     return d->tabs->tabText(index);
       
   491 }
       
   492 
       
   493 /*!
       
   494     \overload
       
   495 
       
   496     Sets the \a icon for the tab at position \a index.
       
   497 */
       
   498 void QTabWidget::setTabIcon(int index, const QIcon &icon)
       
   499 {
       
   500     Q_D(QTabWidget);
       
   501     d->tabs->setTabIcon(index, icon);
       
   502     setUpLayout();
       
   503 }
       
   504 
       
   505 /*!
       
   506     Returns the icon for the tab on the page at position \a index.
       
   507 */
       
   508 
       
   509 QIcon QTabWidget::tabIcon(int index) const
       
   510 {
       
   511     Q_D(const QTabWidget);
       
   512     return d->tabs->tabIcon(index);
       
   513 }
       
   514 
       
   515 /*!
       
   516     Returns true if the page at position \a index is enabled; otherwise returns false.
       
   517 
       
   518     \sa setTabEnabled(), QWidget::isEnabled()
       
   519 */
       
   520 
       
   521 bool QTabWidget::isTabEnabled(int index) const
       
   522 {
       
   523     Q_D(const QTabWidget);
       
   524     return d->tabs->isTabEnabled(index);
       
   525 }
       
   526 
       
   527 /*!
       
   528     If \a enable is true, the page at position \a index is enabled; otherwise the page at position \a index is
       
   529     disabled. The page's tab is redrawn appropriately.
       
   530 
       
   531     QTabWidget uses QWidget::setEnabled() internally, rather than
       
   532     keeping a separate flag.
       
   533 
       
   534     Note that even a disabled tab/page may be visible. If the page is
       
   535     visible already, QTabWidget will not hide it; if all the pages are
       
   536     disabled, QTabWidget will show one of them.
       
   537 
       
   538     \sa isTabEnabled(), QWidget::setEnabled()
       
   539 */
       
   540 
       
   541 void QTabWidget::setTabEnabled(int index, bool enable)
       
   542 {
       
   543     Q_D(QTabWidget);
       
   544     d->tabs->setTabEnabled(index, enable);
       
   545 }
       
   546 
       
   547 /*!
       
   548   \fn void QTabWidget::setCornerWidget(QWidget *widget, Qt::Corner corner)
       
   549 
       
   550   Sets the given \a widget to be shown in the specified \a corner of the
       
   551   tab widget. The geometry of the widget is determined based on the widget's
       
   552   sizeHint() and the style().
       
   553 
       
   554   Only the horizontal element of the \a corner will be used.
       
   555 
       
   556   Passing 0 shows no widget in the corner.
       
   557 
       
   558   Any previously set corner widget is hidden.
       
   559 
       
   560   All widgets set here will be deleted by the tab widget when it is
       
   561   destroyed unless you separately reparent the widget after setting
       
   562   some other corner widget (or 0).
       
   563 
       
   564   Note: Corner widgets are designed for \l North and \l South tab positions;
       
   565   other orientations are known to not work properly.
       
   566 
       
   567   \sa cornerWidget(), setTabPosition()
       
   568 */
       
   569 void QTabWidget::setCornerWidget(QWidget * widget, Qt::Corner corner)
       
   570 {
       
   571     Q_D(QTabWidget);
       
   572     if (widget && widget->parentWidget() != this)
       
   573         widget->setParent(this);
       
   574 
       
   575     if (corner & Qt::TopRightCorner) {
       
   576         if (d->rightCornerWidget)
       
   577             d->rightCornerWidget->hide();
       
   578         d->rightCornerWidget = widget;
       
   579     } else {
       
   580         if (d->leftCornerWidget)
       
   581             d->leftCornerWidget->hide();
       
   582         d->leftCornerWidget = widget;
       
   583     }
       
   584     setUpLayout();
       
   585 }
       
   586 
       
   587 /*!
       
   588     Returns the widget shown in the \a corner of the tab widget or 0.
       
   589 */
       
   590 QWidget * QTabWidget::cornerWidget(Qt::Corner corner) const
       
   591 {
       
   592     Q_D(const QTabWidget);
       
   593     if (corner & Qt::TopRightCorner)
       
   594         return d->rightCornerWidget;
       
   595     return d->leftCornerWidget;
       
   596 }
       
   597 
       
   598 /*!
       
   599    Removes the tab at position \a index from this stack of widgets.
       
   600    The page widget itself is not deleted.
       
   601 
       
   602    \sa addTab(), insertTab()
       
   603 */
       
   604 void QTabWidget::removeTab(int index)
       
   605 {
       
   606     Q_D(QTabWidget);
       
   607     if (QWidget *w = d->stack->widget(index))
       
   608         d->stack->removeWidget(w);
       
   609 }
       
   610 
       
   611 /*!
       
   612     Returns a pointer to the page currently being displayed by the tab
       
   613     dialog. The tab dialog does its best to make sure that this value
       
   614     is never 0 (but if you try hard enough, it can be).
       
   615 
       
   616     \sa currentIndex(), setCurrentWidget()
       
   617 */
       
   618 
       
   619 QWidget * QTabWidget::currentWidget() const
       
   620 {
       
   621     Q_D(const QTabWidget);
       
   622     return d->stack->currentWidget();
       
   623 }
       
   624 
       
   625 /*!
       
   626     Makes \a widget the current widget. The \a widget used must be a page in
       
   627     this tab widget.
       
   628 
       
   629     \sa addTab(), setCurrentIndex(), currentWidget()
       
   630  */
       
   631 void QTabWidget::setCurrentWidget(QWidget *widget)
       
   632 {
       
   633     Q_D(const QTabWidget);
       
   634     d->tabs->setCurrentIndex(indexOf(widget));
       
   635 }
       
   636 
       
   637 
       
   638 /*!
       
   639     \property QTabWidget::currentIndex
       
   640     \brief the index position of the current tab page
       
   641 
       
   642     The current index is -1 if there is no current widget.
       
   643 
       
   644     By default, this property contains a value of -1 because there are initially
       
   645     no tabs in the widget.
       
   646 */
       
   647 
       
   648 int QTabWidget::currentIndex() const
       
   649 {
       
   650     Q_D(const QTabWidget);
       
   651     return d->tabs->currentIndex();
       
   652 }
       
   653 
       
   654 void QTabWidget::setCurrentIndex(int index)
       
   655 {
       
   656     Q_D(QTabWidget);
       
   657     d->tabs->setCurrentIndex(index);
       
   658 }
       
   659 
       
   660 
       
   661 /*!
       
   662     Returns the index position of the page occupied by the widget \a
       
   663     w, or -1 if the widget cannot be found.
       
   664 */
       
   665 int QTabWidget::indexOf(QWidget* w) const
       
   666 {
       
   667     Q_D(const QTabWidget);
       
   668     return d->stack->indexOf(w);
       
   669 }
       
   670 
       
   671 
       
   672 /*!
       
   673     \reimp
       
   674 */
       
   675 void QTabWidget::resizeEvent(QResizeEvent *e)
       
   676 {
       
   677     QWidget::resizeEvent(e);
       
   678     setUpLayout();
       
   679 }
       
   680 
       
   681 /*!
       
   682     Replaces the dialog's QTabBar heading with the tab bar \a tb. Note
       
   683     that this must be called \e before any tabs have been added, or
       
   684     the behavior is undefined.
       
   685 
       
   686     \sa tabBar()
       
   687 */
       
   688 void QTabWidget::setTabBar(QTabBar* tb)
       
   689 {
       
   690     Q_D(QTabWidget);
       
   691     Q_ASSERT(tb);
       
   692 
       
   693     if (tb->parentWidget() != this) {
       
   694         tb->setParent(this);
       
   695         tb->show();
       
   696     }
       
   697     delete d->tabs;
       
   698     d->tabs = tb;
       
   699     setFocusProxy(d->tabs);
       
   700     connect(d->tabs, SIGNAL(currentChanged(int)),
       
   701             this, SLOT(_q_showTab(int)));
       
   702     connect(d->tabs, SIGNAL(tabMoved(int,int)),
       
   703             this, SLOT(_q_tabMoved(int,int)));
       
   704     if (d->tabs->tabsClosable())
       
   705         connect(d->tabs, SIGNAL(tabCloseRequested(int)),
       
   706                 this, SIGNAL(tabCloseRequested(int)));
       
   707     tb->setExpanding(!documentMode());
       
   708     setUpLayout();
       
   709 }
       
   710 
       
   711 
       
   712 /*!
       
   713     Returns the current QTabBar.
       
   714 
       
   715     \sa setTabBar()
       
   716 */
       
   717 QTabBar* QTabWidget::tabBar() const
       
   718 {
       
   719     Q_D(const QTabWidget);
       
   720     return d->tabs;
       
   721 }
       
   722 
       
   723 /*!
       
   724     Ensures that the selected tab's page is visible and appropriately
       
   725     sized.
       
   726 */
       
   727 
       
   728 void QTabWidgetPrivate::_q_showTab(int index)
       
   729 {
       
   730     Q_Q(QTabWidget);
       
   731     if (index < stack->count() && index >= 0)
       
   732         stack->setCurrentIndex(index);
       
   733     emit q->currentChanged(index);
       
   734 #ifdef QT3_SUPPORT
       
   735     emit q->selected(q->tabText(index));
       
   736     emit q->currentChanged(stack->widget(index));
       
   737 #endif
       
   738 }
       
   739 
       
   740 void QTabWidgetPrivate::_q_removeTab(int index)
       
   741 {
       
   742     Q_Q(QTabWidget);
       
   743     tabs->removeTab(index);
       
   744     q->setUpLayout();
       
   745     q->tabRemoved(index);
       
   746 }
       
   747 
       
   748 void QTabWidgetPrivate::_q_tabMoved(int from, int to)
       
   749 {
       
   750     stack->blockSignals(true);
       
   751     QWidget *w = stack->widget(from);
       
   752     stack->removeWidget(w);
       
   753     stack->insertWidget(to, w);
       
   754     stack->blockSignals(false);
       
   755 }
       
   756 
       
   757 /*
       
   758     Set up the layout.
       
   759     Get subrect from the current style, and set the geometry for the
       
   760     stack widget, tab bar and corner widgets.
       
   761 */
       
   762 void QTabWidget::setUpLayout(bool onlyCheck)
       
   763 {
       
   764     Q_D(QTabWidget);
       
   765     if (onlyCheck && !d->dirty)
       
   766         return; // nothing to do
       
   767 
       
   768     QStyleOptionTabWidgetFrameV2 option;
       
   769     initStyleOption(&option);
       
   770 
       
   771     // this must be done immediately, because QWidgetItem relies on it (even if !isVisible())
       
   772     d->setLayoutItemMargins(QStyle::SE_TabWidgetLayoutItem, &option);
       
   773 
       
   774     if (!isVisible()) {
       
   775         d->dirty = true;
       
   776         return; // we'll do it later
       
   777     }
       
   778 
       
   779     QRect tabRect = style()->subElementRect(QStyle::SE_TabWidgetTabBar, &option, this);
       
   780     d->panelRect = style()->subElementRect(QStyle::SE_TabWidgetTabPane, &option, this);
       
   781     QRect contentsRect = style()->subElementRect(QStyle::SE_TabWidgetTabContents, &option, this);
       
   782     QRect leftCornerRect = style()->subElementRect(QStyle::SE_TabWidgetLeftCorner, &option, this);
       
   783     QRect rightCornerRect = style()->subElementRect(QStyle::SE_TabWidgetRightCorner, &option, this);
       
   784 
       
   785     d->tabs->setGeometry(tabRect);
       
   786     d->stack->setGeometry(contentsRect);
       
   787     if (d->leftCornerWidget)
       
   788         d->leftCornerWidget->setGeometry(leftCornerRect);
       
   789     if (d->rightCornerWidget)
       
   790         d->rightCornerWidget->setGeometry(rightCornerRect);
       
   791 
       
   792     if (!onlyCheck)
       
   793         update();
       
   794     updateGeometry();
       
   795 }
       
   796 
       
   797 /*!
       
   798     \internal
       
   799 */
       
   800 static inline QSize basicSize(
       
   801     bool horizontal, const QSize &lc, const QSize &rc, const QSize &s, const QSize &t)
       
   802 {
       
   803     return horizontal
       
   804         ? QSize(qMax(s.width(), t.width() + rc.width() + lc.width()),
       
   805                 s.height() + (qMax(rc.height(), qMax(lc.height(), t.height()))))
       
   806         : QSize(s.width() + (qMax(rc.width(), qMax(lc.width(), t.width()))),
       
   807                 qMax(s.height(), t.height() + rc.height() + lc.height()));
       
   808 }
       
   809 
       
   810 /*!
       
   811     \reimp
       
   812 */
       
   813 QSize QTabWidget::sizeHint() const
       
   814 {
       
   815     Q_D(const QTabWidget);
       
   816     QSize lc(0, 0), rc(0, 0);
       
   817     QStyleOption opt(0);
       
   818     opt.init(this);
       
   819     opt.state = QStyle::State_None;
       
   820 
       
   821     if (d->leftCornerWidget)
       
   822         lc = d->leftCornerWidget->sizeHint();
       
   823     if(d->rightCornerWidget)
       
   824         rc = d->rightCornerWidget->sizeHint();
       
   825     if (!d->dirty) {
       
   826         QTabWidget *that = (QTabWidget*)this;
       
   827         that->setUpLayout(true);
       
   828     }
       
   829     QSize s(d->stack->sizeHint());
       
   830     QSize t(d->tabs->sizeHint());
       
   831     if(usesScrollButtons())
       
   832         t = t.boundedTo(QSize(200,200));
       
   833     else
       
   834         t = t.boundedTo(QApplication::desktop()->size());
       
   835 
       
   836     QSize sz = basicSize(d->pos == North || d->pos == South, lc, rc, s, t);
       
   837 
       
   838     return style()->sizeFromContents(QStyle::CT_TabWidget, &opt, sz, this)
       
   839                     .expandedTo(QApplication::globalStrut());
       
   840 }
       
   841 
       
   842 
       
   843 /*!
       
   844     \reimp
       
   845 
       
   846     Returns a suitable minimum size for the tab widget.
       
   847 */
       
   848 QSize QTabWidget::minimumSizeHint() const
       
   849 {
       
   850     Q_D(const QTabWidget);
       
   851     QSize lc(0, 0), rc(0, 0);
       
   852 
       
   853     if(d->leftCornerWidget)
       
   854         lc = d->leftCornerWidget->minimumSizeHint();
       
   855     if(d->rightCornerWidget)
       
   856         rc = d->rightCornerWidget->minimumSizeHint();
       
   857     if (!d->dirty) {
       
   858         QTabWidget *that = (QTabWidget*)this;
       
   859         that->setUpLayout(true);
       
   860     }
       
   861     QSize s(d->stack->minimumSizeHint());
       
   862     QSize t(d->tabs->minimumSizeHint());
       
   863 
       
   864     QSize sz = basicSize(d->pos == North || d->pos == South, lc, rc, s, t);
       
   865 
       
   866     QStyleOption opt(0);
       
   867     opt.rect = rect();
       
   868     opt.palette = palette();
       
   869     opt.state = QStyle::State_None;
       
   870     return style()->sizeFromContents(QStyle::CT_TabWidget, &opt, sz, this)
       
   871                     .expandedTo(QApplication::globalStrut());
       
   872 }
       
   873 
       
   874 /*!
       
   875     \reimp
       
   876  */
       
   877 void QTabWidget::showEvent(QShowEvent *)
       
   878 {
       
   879     setUpLayout();
       
   880 }
       
   881 
       
   882 void QTabWidgetPrivate::updateTabBarPosition()
       
   883 {
       
   884     Q_Q(QTabWidget);
       
   885     switch (pos) {
       
   886     case QTabWidget::North:
       
   887         tabs->setShape(shape == QTabWidget::Rounded ? QTabBar::RoundedNorth
       
   888                                                     : QTabBar::TriangularNorth);
       
   889         break;
       
   890     case QTabWidget::South:
       
   891         tabs->setShape(shape == QTabWidget::Rounded ? QTabBar::RoundedSouth
       
   892                                                     : QTabBar::TriangularSouth);
       
   893         break;
       
   894     case QTabWidget::West:
       
   895         tabs->setShape(shape == QTabWidget::Rounded ? QTabBar::RoundedWest
       
   896                                                     : QTabBar::TriangularWest);
       
   897         break;
       
   898     case QTabWidget::East:
       
   899         tabs->setShape(shape == QTabWidget::Rounded ? QTabBar::RoundedEast
       
   900                                                     : QTabBar::TriangularEast);
       
   901         break;
       
   902     }
       
   903     q->setUpLayout();
       
   904 }
       
   905 
       
   906 /*!
       
   907     \property QTabWidget::tabPosition
       
   908     \brief the position of the tabs in this tab widget
       
   909 
       
   910     Possible values for this property are described by the TabPosition
       
   911     enum.
       
   912 
       
   913     By default, this property is set to \l North.
       
   914 
       
   915     \sa TabPosition
       
   916 */
       
   917 QTabWidget::TabPosition QTabWidget::tabPosition() const
       
   918 {
       
   919     Q_D(const QTabWidget);
       
   920     return d->pos;
       
   921 }
       
   922 
       
   923 void QTabWidget::setTabPosition(TabPosition pos)
       
   924 {
       
   925     Q_D(QTabWidget);
       
   926     if (d->pos == pos)
       
   927         return;
       
   928     d->pos = pos;
       
   929     d->updateTabBarPosition();
       
   930 }
       
   931 
       
   932 /*!
       
   933     \property QTabWidget::tabsClosable
       
   934     \brief whether close buttons are automatically added to each tab.
       
   935 
       
   936     \since 4.5
       
   937 
       
   938     \sa QTabBar::tabsClosable()
       
   939 */
       
   940 bool QTabWidget::tabsClosable() const
       
   941 {
       
   942     return tabBar()->tabsClosable();
       
   943 }
       
   944 
       
   945 void QTabWidget::setTabsClosable(bool closeable)
       
   946 {
       
   947     if (tabsClosable() == closeable)
       
   948         return;
       
   949 
       
   950     tabBar()->setTabsClosable(closeable);
       
   951     if (closeable)
       
   952         connect(tabBar(), SIGNAL(tabCloseRequested(int)),
       
   953                 this, SIGNAL(tabCloseRequested(int)));
       
   954     else
       
   955         disconnect(tabBar(), SIGNAL(tabCloseRequested(int)),
       
   956                   this, SIGNAL(tabCloseRequested(int)));
       
   957     setUpLayout();
       
   958 }
       
   959 
       
   960 /*!
       
   961     \property QTabWidget::movable
       
   962     \brief This property holds whether the user can move the tabs
       
   963     within the tabbar area.
       
   964 
       
   965     \since 4.5
       
   966 
       
   967     By default, this property is false;
       
   968 */
       
   969 
       
   970 bool QTabWidget::isMovable() const
       
   971 {
       
   972     return tabBar()->isMovable();
       
   973 }
       
   974 
       
   975 void QTabWidget::setMovable(bool movable)
       
   976 {
       
   977     tabBar()->setMovable(movable);
       
   978 }
       
   979 
       
   980 /*!
       
   981     \property QTabWidget::tabShape
       
   982     \brief the shape of the tabs in this tab widget
       
   983 
       
   984     Possible values for this property are QTabWidget::Rounded
       
   985     (default) or QTabWidget::Triangular.
       
   986 
       
   987     \sa TabShape
       
   988 */
       
   989 
       
   990 QTabWidget::TabShape QTabWidget::tabShape() const
       
   991 {
       
   992     Q_D(const QTabWidget);
       
   993     return d->shape;
       
   994 }
       
   995 
       
   996 void QTabWidget::setTabShape(TabShape s)
       
   997 {
       
   998     Q_D(QTabWidget);
       
   999     if (d->shape == s)
       
  1000         return;
       
  1001     d->shape = s;
       
  1002     d->updateTabBarPosition();
       
  1003 }
       
  1004 
       
  1005 /*!
       
  1006     \reimp
       
  1007  */
       
  1008 bool QTabWidget::event(QEvent *ev)
       
  1009 {
       
  1010     if (ev->type() == QEvent::LayoutRequest)
       
  1011         setUpLayout();
       
  1012     return QWidget::event(ev);
       
  1013 }
       
  1014 
       
  1015 /*!
       
  1016     \reimp
       
  1017  */
       
  1018 void QTabWidget::changeEvent(QEvent *ev)
       
  1019 {
       
  1020     if (ev->type() == QEvent::StyleChange
       
  1021 #ifdef Q_WS_MAC
       
  1022             || ev->type() == QEvent::MacSizeChange
       
  1023 #endif
       
  1024             )
       
  1025         setUpLayout();
       
  1026     QWidget::changeEvent(ev);
       
  1027 }
       
  1028 
       
  1029 
       
  1030 /*!
       
  1031     \reimp
       
  1032  */
       
  1033 void QTabWidget::keyPressEvent(QKeyEvent *e)
       
  1034 {
       
  1035     Q_D(QTabWidget);
       
  1036     if (((e->key() == Qt::Key_Tab || e->key() == Qt::Key_Backtab) &&
       
  1037           count() > 1 && e->modifiers() & Qt::ControlModifier)
       
  1038 #ifdef QT_KEYPAD_NAVIGATION
       
  1039           || QApplication::keypadNavigationEnabled() && (e->key() == Qt::Key_Left || e->key() == Qt::Key_Right) && count() > 1
       
  1040 #endif
       
  1041        ) {
       
  1042         int pageCount = d->tabs->count();
       
  1043         int page = currentIndex();
       
  1044         int dx = (e->key() == Qt::Key_Backtab || e->modifiers() & Qt::ShiftModifier) ? -1 : 1;
       
  1045 #ifdef QT_KEYPAD_NAVIGATION
       
  1046         if (QApplication::keypadNavigationEnabled() && (e->key() == Qt::Key_Left || e->key() == Qt::Key_Right))
       
  1047             dx = e->key() == (isRightToLeft() ? Qt::Key_Right : Qt::Key_Left) ? -1 : 1;
       
  1048 #endif
       
  1049         for (int pass = 0; pass < pageCount; ++pass) {
       
  1050             page+=dx;
       
  1051             if (page < 0
       
  1052 #ifdef QT_KEYPAD_NAVIGATION
       
  1053                 && !e->isAutoRepeat()
       
  1054 #endif
       
  1055                ) {
       
  1056                 page = count() - 1;
       
  1057             } else if (page >= pageCount
       
  1058 #ifdef QT_KEYPAD_NAVIGATION
       
  1059                        && !e->isAutoRepeat()
       
  1060 #endif
       
  1061                       ) {
       
  1062                 page = 0;
       
  1063             }
       
  1064             if (d->tabs->isTabEnabled(page)) {
       
  1065                 setCurrentIndex(page);
       
  1066                 break;
       
  1067             }
       
  1068         }
       
  1069         if (!QApplication::focusWidget())
       
  1070             d->tabs->setFocus();
       
  1071     } else {
       
  1072         e->ignore();
       
  1073     }
       
  1074 }
       
  1075 
       
  1076 /*!
       
  1077     Returns the tab page at index position \a index or 0 if the \a
       
  1078     index is out of range.
       
  1079 */
       
  1080 QWidget *QTabWidget::widget(int index) const
       
  1081 {
       
  1082     Q_D(const QTabWidget);
       
  1083     return d->stack->widget(index);
       
  1084 }
       
  1085 
       
  1086 /*!
       
  1087     \property QTabWidget::count
       
  1088     \brief the number of tabs in the tab bar
       
  1089 
       
  1090     By default, this property contains a value of 0.
       
  1091 */
       
  1092 int QTabWidget::count() const
       
  1093 {
       
  1094     Q_D(const QTabWidget);
       
  1095     return d->tabs->count();
       
  1096 }
       
  1097 
       
  1098 #ifndef QT_NO_TOOLTIP
       
  1099 /*!
       
  1100     Sets the tab tool tip for the page at position \a index to \a tip.
       
  1101 
       
  1102     \sa  tabToolTip()
       
  1103 */
       
  1104 void QTabWidget::setTabToolTip(int index, const QString & tip)
       
  1105 {
       
  1106     Q_D(QTabWidget);
       
  1107     d->tabs->setTabToolTip(index, tip);
       
  1108 }
       
  1109 
       
  1110 /*!
       
  1111     Returns the tab tool tip for the page at position \a index or
       
  1112     an empty string if no tool tip has been set.
       
  1113 
       
  1114     \sa setTabToolTip()
       
  1115 */
       
  1116 QString QTabWidget::tabToolTip(int index) const
       
  1117 {
       
  1118     Q_D(const QTabWidget);
       
  1119     return d->tabs->tabToolTip(index);
       
  1120 }
       
  1121 #endif // QT_NO_TOOLTIP
       
  1122 
       
  1123 #ifndef QT_NO_WHATSTHIS
       
  1124 /*!
       
  1125     \since 4.1
       
  1126 
       
  1127     Sets the What's This help text for the page at position \a index
       
  1128     to \a text.
       
  1129 */
       
  1130 void QTabWidget::setTabWhatsThis(int index, const QString &text)
       
  1131 {
       
  1132     Q_D(QTabWidget);
       
  1133     d->tabs->setTabWhatsThis(index, text);
       
  1134 }
       
  1135 
       
  1136 /*!
       
  1137     \since 4.1
       
  1138 
       
  1139     Returns the What's This help text for the page at position \a index,
       
  1140     or an empty string if no help text has been set.
       
  1141 */
       
  1142 QString QTabWidget::tabWhatsThis(int index) const
       
  1143 {
       
  1144     Q_D(const QTabWidget);
       
  1145     return d->tabs->tabWhatsThis(index);
       
  1146 }
       
  1147 #endif // QT_NO_WHATSTHIS
       
  1148 
       
  1149 /*!
       
  1150   This virtual handler is called after a new tab was added or
       
  1151   inserted at position \a index.
       
  1152 
       
  1153   \sa tabRemoved()
       
  1154  */
       
  1155 void QTabWidget::tabInserted(int index)
       
  1156 {
       
  1157     Q_UNUSED(index)
       
  1158 }
       
  1159 
       
  1160 /*!
       
  1161   This virtual handler is called after a tab was removed from
       
  1162   position \a index.
       
  1163 
       
  1164   \sa tabInserted()
       
  1165  */
       
  1166 void QTabWidget::tabRemoved(int index)
       
  1167 {
       
  1168     Q_UNUSED(index)
       
  1169 }
       
  1170 
       
  1171 /*!
       
  1172     \fn void QTabWidget::paintEvent(QPaintEvent *event)
       
  1173 
       
  1174     Paints the tab widget's tab bar in response to the paint \a event.
       
  1175 */
       
  1176 void QTabWidget::paintEvent(QPaintEvent *)
       
  1177 {
       
  1178     Q_D(QTabWidget);
       
  1179     if (documentMode()) {
       
  1180         QStylePainter p(this, tabBar());
       
  1181         if (QWidget *w = cornerWidget(Qt::TopLeftCorner)) {
       
  1182             QStyleOptionTabBarBaseV2 opt;
       
  1183             QTabBarPrivate::initStyleBaseOption(&opt, tabBar(), w->size());
       
  1184             opt.rect.moveLeft(w->x() + opt.rect.x());
       
  1185             opt.rect.moveTop(w->y() + opt.rect.y());
       
  1186             p.drawPrimitive(QStyle::PE_FrameTabBarBase, opt);
       
  1187         }
       
  1188         if (QWidget *w = cornerWidget(Qt::TopRightCorner)) {
       
  1189             QStyleOptionTabBarBaseV2 opt;
       
  1190             QTabBarPrivate::initStyleBaseOption(&opt, tabBar(), w->size());
       
  1191             opt.rect.moveLeft(w->x() + opt.rect.x());
       
  1192             opt.rect.moveTop(w->y() + opt.rect.y());
       
  1193             p.drawPrimitive(QStyle::PE_FrameTabBarBase, opt);
       
  1194         }
       
  1195         return;
       
  1196     }
       
  1197     QStylePainter p(this);
       
  1198 
       
  1199     QStyleOptionTabWidgetFrameV2 opt;
       
  1200     initStyleOption(&opt);
       
  1201     opt.rect = d->panelRect;
       
  1202     p.drawPrimitive(QStyle::PE_FrameTabWidget, opt);
       
  1203 }
       
  1204 
       
  1205 /*!
       
  1206     \property QTabWidget::iconSize
       
  1207     \brief The size for icons in the tab bar
       
  1208     \since 4.2
       
  1209 
       
  1210     The default value is style-dependent. This is the maximum size
       
  1211     that the icons will have. Icons are not scaled up if they are of
       
  1212     smaller size.
       
  1213 
       
  1214     \sa QTabBar::iconSize
       
  1215 */
       
  1216 QSize QTabWidget::iconSize() const
       
  1217 {
       
  1218     return d_func()->tabs->iconSize();
       
  1219 }
       
  1220 
       
  1221 void QTabWidget::setIconSize(const QSize &size)
       
  1222 {
       
  1223     d_func()->tabs->setIconSize(size);
       
  1224 }
       
  1225 
       
  1226 /*!
       
  1227     \property QTabWidget::elideMode
       
  1228     \brief how to elide text in the tab bar
       
  1229     \since 4.2
       
  1230 
       
  1231     This property controls how items are elided when there is not
       
  1232     enough space to show them for a given tab bar size.
       
  1233 
       
  1234     By default the value is style dependant.
       
  1235 
       
  1236     \sa QTabBar::elideMode usesScrollButtons QStyle::SH_TabBar_ElideMode
       
  1237 */
       
  1238 Qt::TextElideMode QTabWidget::elideMode() const
       
  1239 {
       
  1240     return d_func()->tabs->elideMode();
       
  1241 }
       
  1242 
       
  1243 void QTabWidget::setElideMode(Qt::TextElideMode mode)
       
  1244 {
       
  1245     d_func()->tabs->setElideMode(mode);
       
  1246 }
       
  1247 
       
  1248 /*!
       
  1249     \property QTabWidget::usesScrollButtons
       
  1250     \brief Whether or not a tab bar should use buttons to scroll tabs when it
       
  1251     has many tabs.
       
  1252     \since 4.2
       
  1253 
       
  1254     When there are too many tabs in a tab bar for its size, the tab bar can either choose
       
  1255     to expand its size or to add buttons that allow you to scroll through the tabs.
       
  1256 
       
  1257     By default the value is style dependant.
       
  1258 
       
  1259     \sa elideMode QTabBar::usesScrollButtons QStyle::SH_TabBar_PreferNoArrows
       
  1260 */
       
  1261 bool QTabWidget::usesScrollButtons() const
       
  1262 {
       
  1263     return d_func()->tabs->usesScrollButtons();
       
  1264 }
       
  1265 
       
  1266 void QTabWidget::setUsesScrollButtons(bool useButtons)
       
  1267 {
       
  1268     d_func()->tabs->setUsesScrollButtons(useButtons);
       
  1269 }
       
  1270 
       
  1271 /*!
       
  1272     \property QTabWidget::documentMode
       
  1273     \brief Whether or not the tab widget is rendered in a mode suitable for document
       
  1274      pages. This is the same as document mode on Mac OS X.
       
  1275     \since 4.5
       
  1276 
       
  1277     When this property is set the tab widget frame is not rendered. This mode is useful
       
  1278     for showing document-type pages where the page covers most of the tab widget
       
  1279     area.
       
  1280 
       
  1281     \sa elideMode, QTabBar::documentMode, QTabBar::usesScrollButtons, QStyle::SH_TabBar_PreferNoArrows
       
  1282 */
       
  1283 bool QTabWidget::documentMode() const
       
  1284 {
       
  1285     Q_D(const QTabWidget);
       
  1286     return d->tabs->documentMode();
       
  1287 }
       
  1288 
       
  1289 void QTabWidget::setDocumentMode(bool enabled)
       
  1290 {
       
  1291     Q_D(QTabWidget);
       
  1292     d->tabs->setDocumentMode(enabled);
       
  1293     d->tabs->setExpanding(!enabled);
       
  1294     d->tabs->setDrawBase(enabled);
       
  1295     setUpLayout();
       
  1296 }
       
  1297 
       
  1298 /*!
       
  1299     Removes all the pages, but does not delete them. Calling this function
       
  1300     is equivalent to calling removeTab() until the tab widget is empty.
       
  1301 */
       
  1302 void QTabWidget::clear()
       
  1303 {
       
  1304     // ### optimize by introduce QStackedLayout::clear()
       
  1305     while (count())
       
  1306         removeTab(0);
       
  1307 }
       
  1308 
       
  1309 /*!
       
  1310     \fn void QTabWidget::insertTab(QWidget *widget, const QString &label, int index)
       
  1311 
       
  1312     Use insertTab(index, widget, label) instead.
       
  1313 */
       
  1314 
       
  1315 /*!
       
  1316     \fn void QTabWidget::insertTab(QWidget *widget, const QIcon& icon, const QString &label, int index)
       
  1317 
       
  1318     Use insertTab(index, widget, icon, label) instead.
       
  1319 */
       
  1320 
       
  1321 /*!
       
  1322     \fn void QTabWidget::changeTab(QWidget *widget, const QString
       
  1323     &label)
       
  1324 
       
  1325     Use setTabText() instead.
       
  1326 
       
  1327 */
       
  1328 
       
  1329 /*!
       
  1330     \fn void QTabWidget::changeTab(QWidget *widget, const QIcon& icon, const QString &label)
       
  1331 
       
  1332     Use setTabText() and setTabIcon() instead.
       
  1333 */
       
  1334 
       
  1335 /*!
       
  1336     \fn bool QTabWidget::isTabEnabled( QWidget *widget) const
       
  1337 
       
  1338     Use isTabEnabled(tabWidget->indexOf(widget)) instead.
       
  1339 */
       
  1340 
       
  1341 /*!
       
  1342     \fn void QTabWidget::setTabEnabled(QWidget *widget, bool b)
       
  1343 
       
  1344     Use setTabEnabled(tabWidget->indexOf(widget), b) instead.
       
  1345 */
       
  1346 
       
  1347 /*!
       
  1348     \fn QString QTabWidget::tabLabel(QWidget *widget) const
       
  1349 
       
  1350     Use tabText(tabWidget->indexOf(widget)) instead.
       
  1351 */
       
  1352 
       
  1353 /*!
       
  1354     \fn void QTabWidget::setTabLabel(QWidget *widget, const QString
       
  1355     &label)
       
  1356 
       
  1357     Use setTabText(tabWidget->indexOf(widget), label) instead.
       
  1358 */
       
  1359 
       
  1360 /*!
       
  1361     \fn QIcon QTabWidget::tabIconSet(QWidget * widget) const
       
  1362 
       
  1363     Use tabIcon(tabWidget->indexOf(widget)) instead.
       
  1364 */
       
  1365 
       
  1366 /*!
       
  1367     \fn void QTabWidget::setTabIconSet(QWidget * widget, const QIcon & icon)
       
  1368 
       
  1369     Use setTabIcon(tabWidget->indexOf(widget), icon) instead.
       
  1370 */
       
  1371 
       
  1372 /*!
       
  1373     \fn void QTabWidget::removeTabToolTip(QWidget * widget)
       
  1374 
       
  1375     Use setTabToolTip(tabWidget->indexOf(widget), QString()) instead.
       
  1376 */
       
  1377 
       
  1378 /*!
       
  1379     \fn void QTabWidget::setTabToolTip(QWidget * widget, const QString & tip)
       
  1380 
       
  1381     Use setTabToolTip(tabWidget->indexOf(widget), tip) instead.
       
  1382 */
       
  1383 
       
  1384 /*!
       
  1385     \fn QString QTabWidget::tabToolTip(QWidget * widget) const
       
  1386 
       
  1387     Use tabToolTip(tabWidget->indexOf(widget)) instead.
       
  1388 */
       
  1389 
       
  1390 /*!
       
  1391     \fn QWidget * QTabWidget::currentPage() const
       
  1392 
       
  1393     Use currentWidget() instead.
       
  1394 */
       
  1395 
       
  1396 /*!
       
  1397     \fn QWidget *QTabWidget::page(int index) const
       
  1398 
       
  1399     Use widget() instead.
       
  1400 */
       
  1401 
       
  1402 /*!
       
  1403     \fn QString QTabWidget::label(int index) const
       
  1404 
       
  1405     Use tabText() instead.
       
  1406 */
       
  1407 
       
  1408 /*!
       
  1409     \fn int QTabWidget::currentPageIndex() const
       
  1410 
       
  1411     Use currentIndex() instead.
       
  1412 */
       
  1413 
       
  1414 /*!
       
  1415     \fn int QTabWidget::margin() const
       
  1416 
       
  1417     This function is kept only to make old code compile.
       
  1418     This functionality is no longer supported by QTabWidget.
       
  1419 
       
  1420     \sa contentsRect(), setContentsMargins()
       
  1421 */
       
  1422 
       
  1423 /*!
       
  1424     \fn void QTabWidget::setMargin(int margin)
       
  1425 
       
  1426     This function is kept only to make old code compile.
       
  1427     This functionality is no longer supported by QTabWidget.
       
  1428 
       
  1429     \sa contentsRect(), setContentsMargins()
       
  1430 */
       
  1431 
       
  1432 /*!
       
  1433     \fn void QTabWidget::setCurrentPage(int index)
       
  1434 
       
  1435     Use setCurrentIndex() instead.
       
  1436 */
       
  1437 
       
  1438 /*!
       
  1439     \fn void QTabWidget::showPage(QWidget *widget)
       
  1440 
       
  1441     Use setCurrentIndex(indexOf(widget)) instead.
       
  1442 */
       
  1443 
       
  1444 /*!
       
  1445     \fn void QTabWidget::removePage(QWidget *widget)
       
  1446 
       
  1447     Use removeTab(indexOf(widget)) instead.
       
  1448 */
       
  1449 
       
  1450 /*!
       
  1451     \fn void QTabWidget::currentChanged(QWidget *widget)
       
  1452 
       
  1453     Use currentChanged(int) instead.
       
  1454 */
       
  1455 
       
  1456 QT_END_NAMESPACE
       
  1457 
       
  1458 #include "moc_qtabwidget.cpp"
       
  1459 
       
  1460 #endif //QT_NO_TABWIDGET