util/src/gui/widgets/qmenubar.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 <qmenubar.h>
       
    43 
       
    44 #include <qstyle.h>
       
    45 #include <qlayout.h>
       
    46 #include <qapplication.h>
       
    47 #include <qdesktopwidget.h>
       
    48 #ifndef QT_NO_ACCESSIBILITY
       
    49 # include <qaccessible.h>
       
    50 #endif
       
    51 #include <qpainter.h>
       
    52 #include <qstylepainter.h>
       
    53 #include <qevent.h>
       
    54 #include <qmainwindow.h>
       
    55 #include <qtoolbar.h>
       
    56 #include <qtoolbutton.h>
       
    57 #include <qwhatsthis.h>
       
    58 
       
    59 #ifndef QT_NO_MENUBAR
       
    60 
       
    61 #ifdef QT3_SUPPORT
       
    62 #include <private/qaction_p.h>
       
    63 #include <qmenudata.h>
       
    64 #endif
       
    65 
       
    66 #include "qmenu_p.h"
       
    67 #include "qmenubar_p.h"
       
    68 #include "qdebug.h"
       
    69 
       
    70 #ifdef Q_WS_WINCE
       
    71 extern bool qt_wince_is_mobile(); //defined in qguifunctions_wce.cpp
       
    72 #endif
       
    73 
       
    74 #ifdef QT_SOFTKEYS_ENABLED
       
    75 #include <private/qsoftkeymanager_p.h>
       
    76 #endif
       
    77 
       
    78 QT_BEGIN_NAMESPACE
       
    79 
       
    80 class QMenuBarExtension : public QToolButton
       
    81 {
       
    82 public:
       
    83     explicit QMenuBarExtension(QWidget *parent);
       
    84 
       
    85     QSize sizeHint() const;
       
    86     void paintEvent(QPaintEvent *);
       
    87 };
       
    88 
       
    89 QMenuBarExtension::QMenuBarExtension(QWidget *parent)
       
    90     : QToolButton(parent)
       
    91 {
       
    92     setObjectName(QLatin1String("qt_menubar_ext_button"));
       
    93     setAutoRaise(true);
       
    94 #ifndef QT_NO_MENU
       
    95     setPopupMode(QToolButton::InstantPopup);
       
    96 #endif
       
    97     setIcon(style()->standardIcon(QStyle::SP_ToolBarHorizontalExtensionButton, 0, parentWidget()));
       
    98 }
       
    99 
       
   100 void QMenuBarExtension::paintEvent(QPaintEvent *)
       
   101 {
       
   102     QStylePainter p(this);
       
   103     QStyleOptionToolButton opt;
       
   104     initStyleOption(&opt);
       
   105     // We do not need to draw both extention arrows
       
   106     opt.features &= ~QStyleOptionToolButton::HasMenu;
       
   107     p.drawComplexControl(QStyle::CC_ToolButton, opt);
       
   108 }
       
   109 
       
   110 
       
   111 QSize QMenuBarExtension::sizeHint() const
       
   112 {
       
   113     int ext = style()->pixelMetric(QStyle::PM_ToolBarExtensionExtent, 0, parentWidget());
       
   114     return QSize(ext, ext);
       
   115 }
       
   116 
       
   117 
       
   118 /*!
       
   119     \internal
       
   120 */
       
   121 QAction *QMenuBarPrivate::actionAt(QPoint p) const
       
   122 {
       
   123     for(int i = 0; i < actions.size(); ++i) {
       
   124         if(actionRect(actions.at(i)).contains(p))
       
   125             return actions.at(i);
       
   126     }
       
   127     return 0;
       
   128 }
       
   129 
       
   130 QRect QMenuBarPrivate::menuRect(bool extVisible) const
       
   131 {
       
   132     Q_Q(const QMenuBar);
       
   133 
       
   134     int hmargin = q->style()->pixelMetric(QStyle::PM_MenuBarPanelWidth, 0, q);
       
   135     QRect result = q->rect();
       
   136     result.adjust(hmargin, 0, -hmargin, 0);
       
   137 
       
   138     if (extVisible) {
       
   139         if (q->isRightToLeft())
       
   140             result.setLeft(result.left() + extension->sizeHint().width());
       
   141         else
       
   142             result.setWidth(result.width() - extension->sizeHint().width());
       
   143     }
       
   144 
       
   145     if (leftWidget && leftWidget->isVisible()) {
       
   146         QSize sz = leftWidget->sizeHint();
       
   147         if (q->isRightToLeft())
       
   148             result.setRight(result.right() - sz.width());
       
   149         else
       
   150             result.setLeft(result.left() + sz.width());
       
   151     }
       
   152 
       
   153     if (rightWidget && rightWidget->isVisible()) {
       
   154         QSize sz = rightWidget->sizeHint();
       
   155         if (q->isRightToLeft())
       
   156             result.setLeft(result.left() + sz.width());
       
   157         else
       
   158             result.setRight(result.right() - sz.width());
       
   159     }
       
   160 
       
   161     return result;
       
   162 }
       
   163 
       
   164 bool QMenuBarPrivate::isVisible(QAction *action)
       
   165 {
       
   166     return !hiddenActions.contains(action);
       
   167 }
       
   168 
       
   169 void QMenuBarPrivate::updateGeometries()
       
   170 {
       
   171     Q_Q(QMenuBar);
       
   172     if(!itemsDirty)
       
   173         return;
       
   174     int q_width = q->width()-(q->style()->pixelMetric(QStyle::PM_MenuBarPanelWidth, 0, q)*2);
       
   175     int q_start = -1;
       
   176     if(leftWidget || rightWidget) {
       
   177         int vmargin = q->style()->pixelMetric(QStyle::PM_MenuBarVMargin, 0, q)
       
   178                       + q->style()->pixelMetric(QStyle::PM_MenuBarPanelWidth, 0, q);
       
   179         int hmargin = q->style()->pixelMetric(QStyle::PM_MenuBarHMargin, 0, q)
       
   180                       + q->style()->pixelMetric(QStyle::PM_MenuBarPanelWidth, 0, q);
       
   181         if (leftWidget && leftWidget->isVisible()) {
       
   182             QSize sz = leftWidget->sizeHint();
       
   183             q_width -= sz.width();
       
   184             q_start = sz.width();
       
   185             QPoint pos(hmargin, (q->height() - leftWidget->height()) / 2);
       
   186             QRect vRect = QStyle::visualRect(q->layoutDirection(), q->rect(), QRect(pos, sz));
       
   187             leftWidget->setGeometry(vRect);
       
   188         }
       
   189         if (rightWidget && rightWidget->isVisible()) {
       
   190             QSize sz = rightWidget->sizeHint();
       
   191             q_width -= sz.width();
       
   192             QPoint pos(q->width() - sz.width() - hmargin, vmargin);
       
   193             QRect vRect = QStyle::visualRect(q->layoutDirection(), q->rect(), QRect(pos, sz));
       
   194             rightWidget->setGeometry(vRect);
       
   195         }
       
   196     }
       
   197 
       
   198 #ifdef Q_WS_MAC
       
   199     if(q->isNativeMenuBar()) {//nothing to see here folks, move along..
       
   200         itemsDirty = false;
       
   201         return;
       
   202     }
       
   203 #endif
       
   204     calcActionRects(q_width, q_start);
       
   205     currentAction = 0;
       
   206 #ifndef QT_NO_SHORTCUT
       
   207     if(itemsDirty) {
       
   208         for(int j = 0; j < shortcutIndexMap.size(); ++j)
       
   209             q->releaseShortcut(shortcutIndexMap.value(j));
       
   210         shortcutIndexMap.resize(0); // faster than clear
       
   211         for(int i = 0; i < actions.count(); i++)
       
   212             shortcutIndexMap.append(q->grabShortcut(QKeySequence::mnemonic(actions.at(i)->text())));
       
   213     }
       
   214 #endif
       
   215     itemsDirty = false;
       
   216 
       
   217     hiddenActions.clear();
       
   218     //this is the menu rectangle without any extension
       
   219     QRect menuRect = this->menuRect(false);
       
   220 
       
   221     //we try to see if the actions will fit there
       
   222     bool hasHiddenActions = false;
       
   223     for (int i = 0; i < actions.count(); ++i) {
       
   224         const QRect &rect = actionRects.at(i);
       
   225         if (rect.isValid() && !menuRect.contains(rect)) {
       
   226             hasHiddenActions = true;
       
   227             break;
       
   228         }
       
   229     }
       
   230 
       
   231     //...and if not, determine the ones that fit on the menu with the extension visible
       
   232     if (hasHiddenActions) {
       
   233         menuRect = this->menuRect(true);
       
   234         for (int i = 0; i < actions.count(); ++i) {
       
   235             const QRect &rect = actionRects.at(i);
       
   236             if (rect.isValid() && !menuRect.contains(rect)) {
       
   237                 hiddenActions.append(actions.at(i));
       
   238             }
       
   239         }
       
   240     }
       
   241 
       
   242     if (hiddenActions.count() > 0) {
       
   243         QMenu *pop = extension->menu();
       
   244         if (!pop) {
       
   245             pop = new QMenu(q);
       
   246             extension->setMenu(pop);
       
   247         }
       
   248         pop->clear();
       
   249         pop->addActions(hiddenActions);
       
   250 
       
   251         int vmargin = q->style()->pixelMetric(QStyle::PM_MenuBarVMargin, 0, q);
       
   252         int x = q->isRightToLeft()
       
   253                 ? menuRect.left() - extension->sizeHint().width() + 1
       
   254                 : menuRect.right();
       
   255         extension->setGeometry(x, vmargin, extension->sizeHint().width(), menuRect.height() - vmargin*2);
       
   256         extension->show();
       
   257     } else {
       
   258         extension->hide();
       
   259     }
       
   260     q->updateGeometry();
       
   261 #ifdef QT3_SUPPORT
       
   262     if (parent) {
       
   263         QMenubarUpdatedEvent menubarUpdated(q);
       
   264         QApplication::sendEvent(parent, &menubarUpdated);
       
   265     }
       
   266 #endif
       
   267 }
       
   268 
       
   269 QRect QMenuBarPrivate::actionRect(QAction *act) const
       
   270 {
       
   271     Q_Q(const QMenuBar);
       
   272     const int index = actions.indexOf(act);
       
   273     if (index == -1)
       
   274         return QRect();
       
   275 
       
   276     //makes sure the geometries are up-to-date
       
   277     const_cast<QMenuBarPrivate*>(this)->updateGeometries();
       
   278 
       
   279     if (index >= actionRects.count())
       
   280         return QRect(); // that can happen in case of native menubar
       
   281 
       
   282     QRect ret = actionRects.at(index);
       
   283     return QStyle::visualRect(q->layoutDirection(), q->rect(), ret);
       
   284 }
       
   285 
       
   286 void QMenuBarPrivate::focusFirstAction()
       
   287 {
       
   288     if(!currentAction) {
       
   289         updateGeometries();
       
   290         int index = 0;
       
   291         while (index < actions.count() && actionRects.at(index).isNull()) ++index;
       
   292         if (index < actions.count())
       
   293             setCurrentAction(actions.at(index));
       
   294     }
       
   295 }
       
   296 
       
   297 void QMenuBarPrivate::setKeyboardMode(bool b)
       
   298 {
       
   299     Q_Q(QMenuBar);
       
   300     if (b && !q->style()->styleHint(QStyle::SH_MenuBar_AltKeyNavigation, 0, q)) {
       
   301         setCurrentAction(0);
       
   302         return;
       
   303     }
       
   304     keyboardState = b;
       
   305     if(b) {
       
   306         QWidget *fw = QApplication::focusWidget();
       
   307         if (fw != q)
       
   308             keyboardFocusWidget = fw;
       
   309         focusFirstAction();
       
   310         q->setFocus(Qt::MenuBarFocusReason);
       
   311     } else {
       
   312         if(!popupState)
       
   313             setCurrentAction(0);
       
   314         if(keyboardFocusWidget) {
       
   315             if (QApplication::focusWidget() == q)
       
   316                 keyboardFocusWidget->setFocus(Qt::MenuBarFocusReason);
       
   317             keyboardFocusWidget = 0;
       
   318         }
       
   319     }
       
   320     q->update();
       
   321 }
       
   322 
       
   323 void QMenuBarPrivate::popupAction(QAction *action, bool activateFirst)
       
   324 {
       
   325     Q_Q(QMenuBar);
       
   326     if(!action || !action->menu() || closePopupMode)
       
   327         return;
       
   328     popupState = true;
       
   329     if (action->isEnabled() && action->menu()->isEnabled()) {
       
   330         closePopupMode = 0;
       
   331         activeMenu = action->menu();
       
   332         activeMenu->d_func()->causedPopup.widget = q;
       
   333         activeMenu->d_func()->causedPopup.action = action;
       
   334 
       
   335         QRect adjustedActionRect = actionRect(action);
       
   336         QPoint pos(q->mapToGlobal(QPoint(adjustedActionRect.left(), adjustedActionRect.bottom() + 1)));
       
   337         QSize popup_size = activeMenu->sizeHint();
       
   338 
       
   339         //we put the popup menu on the screen containing the bottom-center of the action rect
       
   340         QRect screenRect = QApplication::desktop()->screenGeometry(pos + QPoint(adjustedActionRect.width() / 2, 0));
       
   341         pos = QPoint(qMax(pos.x(), screenRect.x()), qMax(pos.y(), screenRect.y()));
       
   342 
       
   343         const bool fitUp = (q->mapToGlobal(adjustedActionRect.topLeft()).y() >= popup_size.height());
       
   344         const bool fitDown = (pos.y() + popup_size.height() <= screenRect.bottom());
       
   345         const bool rtl = q->isRightToLeft();
       
   346         const int actionWidth = adjustedActionRect.width();
       
   347 
       
   348         if (!fitUp && !fitDown) { //we should shift the menu
       
   349             bool shouldShiftToRight = !rtl;
       
   350             if (rtl && popup_size.width() > pos.x())
       
   351                 shouldShiftToRight = true;
       
   352             else if (actionWidth + popup_size.width() + pos.x() > screenRect.right())
       
   353                 shouldShiftToRight = false;
       
   354 
       
   355             if (shouldShiftToRight) {
       
   356                 pos.rx() += actionWidth + (rtl ? popup_size.width() : 0);
       
   357             } else {
       
   358                 //shift to left
       
   359                 if (!rtl)
       
   360                     pos.rx() -= popup_size.width();
       
   361             }
       
   362         } else if (rtl) {
       
   363             pos.rx() += actionWidth;
       
   364         }
       
   365 
       
   366         if(!defaultPopDown || (fitUp && !fitDown))
       
   367             pos.setY(qMax(screenRect.y(), q->mapToGlobal(QPoint(0, adjustedActionRect.top()-popup_size.height())).y()));
       
   368         activeMenu->popup(pos);
       
   369         if(activateFirst)
       
   370             activeMenu->d_func()->setFirstActionActive();
       
   371     }
       
   372     q->update(actionRect(action));
       
   373 }
       
   374 
       
   375 void QMenuBarPrivate::setCurrentAction(QAction *action, bool popup, bool activateFirst)
       
   376 {
       
   377     if(currentAction == action && popup == popupState)
       
   378         return;
       
   379 
       
   380     autoReleaseTimer.stop();
       
   381 
       
   382     doChildEffects = (popup && !activeMenu);
       
   383     Q_Q(QMenuBar);
       
   384     QWidget *fw = 0;
       
   385     if(QMenu *menu = activeMenu) {
       
   386         activeMenu = 0;
       
   387         if (popup) {
       
   388             fw = q->window()->focusWidget();
       
   389             q->setFocus(Qt::NoFocusReason);
       
   390         }
       
   391         menu->hide();
       
   392     }
       
   393 
       
   394     if(currentAction)
       
   395         q->update(actionRect(currentAction));
       
   396 
       
   397     popupState = popup;
       
   398 #ifndef QT_NO_STATUSTIP
       
   399     QAction *previousAction = currentAction;
       
   400 #endif
       
   401     currentAction = action;
       
   402     if (action) {
       
   403         activateAction(action, QAction::Hover);
       
   404         if(popup)
       
   405             popupAction(action, activateFirst);
       
   406         q->update(actionRect(action));
       
   407 #ifndef QT_NO_STATUSTIP
       
   408     }  else if (previousAction) {
       
   409         QString empty;
       
   410         QStatusTipEvent tip(empty);
       
   411         QApplication::sendEvent(q, &tip);
       
   412 #endif
       
   413     }
       
   414     if (fw)
       
   415         fw->setFocus(Qt::NoFocusReason);
       
   416 }
       
   417 
       
   418 void QMenuBarPrivate::calcActionRects(int max_width, int start) const
       
   419 {
       
   420     Q_Q(const QMenuBar);
       
   421 
       
   422     if(!itemsDirty)
       
   423         return;
       
   424 
       
   425     //let's reinitialize the buffer
       
   426     actionRects.resize(actions.count());
       
   427     actionRects.fill(QRect());
       
   428 
       
   429     const QStyle *style = q->style();
       
   430 
       
   431     const int itemSpacing = style->pixelMetric(QStyle::PM_MenuBarItemSpacing, 0, q);
       
   432     int max_item_height = 0, separator = -1, separator_start = 0, separator_len = 0;
       
   433 
       
   434     //calculate size
       
   435     const QFontMetrics fm = q->fontMetrics();
       
   436     const int hmargin = style->pixelMetric(QStyle::PM_MenuBarHMargin, 0, q),
       
   437               vmargin = style->pixelMetric(QStyle::PM_MenuBarVMargin, 0, q),
       
   438                 icone = style->pixelMetric(QStyle::PM_SmallIconSize, 0, q);
       
   439     for(int i = 0; i < actions.count(); i++) {
       
   440         QAction *action = actions.at(i);
       
   441         if(!action->isVisible())
       
   442             continue;
       
   443 
       
   444         QSize sz;
       
   445 
       
   446         //calc what I think the size is..
       
   447         if(action->isSeparator()) {
       
   448             if (style->styleHint(QStyle::SH_DrawMenuBarSeparator, 0, q))
       
   449                 separator = i;
       
   450             continue; //we don't really position these!
       
   451         } else {
       
   452             const QString s = action->text();
       
   453             QIcon is = action->icon();
       
   454             // If an icon is set, only the icon is visible
       
   455             if (!is.isNull())
       
   456                 sz = sz.expandedTo(QSize(icone, icone));
       
   457             else if (!s.isEmpty())
       
   458                 sz = fm.size(Qt::TextShowMnemonic, s);
       
   459         }
       
   460 
       
   461         //let the style modify the above size..
       
   462         QStyleOptionMenuItem opt;
       
   463         q->initStyleOption(&opt, action);
       
   464         sz = q->style()->sizeFromContents(QStyle::CT_MenuBarItem, &opt, sz, q);
       
   465 
       
   466         if(!sz.isEmpty()) {
       
   467             { //update the separator state
       
   468                 int iWidth = sz.width() + itemSpacing;
       
   469                 if(separator == -1)
       
   470                     separator_start += iWidth;
       
   471                 else
       
   472                     separator_len += iWidth;
       
   473             }
       
   474             //maximum height
       
   475             max_item_height = qMax(max_item_height, sz.height());
       
   476             //append
       
   477             actionRects[i] = QRect(0, 0, sz.width(), sz.height());
       
   478         }
       
   479     }
       
   480 
       
   481     //calculate position
       
   482     const int fw = q->style()->pixelMetric(QStyle::PM_MenuBarPanelWidth, 0, q);
       
   483     int x = fw + ((start == -1) ? hmargin : start) + itemSpacing;
       
   484     int y = fw + vmargin;
       
   485     for(int i = 0; i < actions.count(); i++) {
       
   486         QRect &rect = actionRects[i];
       
   487         if (rect.isNull())
       
   488             continue;
       
   489 
       
   490         //resize
       
   491         rect.setHeight(max_item_height);
       
   492 
       
   493         //move
       
   494         if(separator != -1 && i >= separator) { //after the separator
       
   495             int left = (max_width - separator_len - hmargin - itemSpacing) + (x - separator_start - hmargin);
       
   496             if(left < separator_start) { //wrap
       
   497                 separator_start = x = hmargin;
       
   498                 y += max_item_height;
       
   499             }
       
   500             rect.moveLeft(left);
       
   501         } else {
       
   502             rect.moveLeft(x);
       
   503         }
       
   504         rect.moveTop(y);
       
   505 
       
   506         //keep moving along..
       
   507         x += rect.width() + itemSpacing;
       
   508     }
       
   509 }
       
   510 
       
   511 void QMenuBarPrivate::activateAction(QAction *action, QAction::ActionEvent action_e)
       
   512 {
       
   513     Q_Q(QMenuBar);
       
   514     if (!action || !action->isEnabled())
       
   515         return;
       
   516     action->activate(action_e);
       
   517     if (action_e == QAction::Hover)
       
   518         action->showStatusText(q);
       
   519 
       
   520 //     if(action_e == QAction::Trigger)
       
   521 //         emit q->activated(action);
       
   522 //     else if(action_e == QAction::Hover)
       
   523 //         emit q->highlighted(action);
       
   524 }
       
   525 
       
   526 
       
   527 void QMenuBarPrivate::_q_actionTriggered()
       
   528 {
       
   529     Q_Q(QMenuBar);
       
   530     if (QAction *action = qobject_cast<QAction *>(q->sender())) {
       
   531         emit q->triggered(action);
       
   532 #ifdef QT3_SUPPORT
       
   533         emit q->activated(q->findIdForAction(action));
       
   534 #endif
       
   535     }
       
   536 }
       
   537 
       
   538 void QMenuBarPrivate::_q_actionHovered()
       
   539 {
       
   540     Q_Q(QMenuBar);
       
   541     if (QAction *action = qobject_cast<QAction *>(q->sender())) {
       
   542         emit q->hovered(action);
       
   543 #ifndef QT_NO_ACCESSIBILITY
       
   544         if (QAccessible::isActive()) {
       
   545             int actionIndex = actions.indexOf(action);
       
   546             ++actionIndex;
       
   547             QAccessible::updateAccessibility(q, actionIndex, QAccessible::Focus);
       
   548             QAccessible::updateAccessibility(q, actionIndex, QAccessible::Selection);
       
   549         }
       
   550 #endif //QT_NO_ACCESSIBILITY
       
   551 #ifdef QT3_SUPPORT
       
   552         emit q->highlighted(q->findIdForAction(action));
       
   553 #endif
       
   554     }
       
   555 }
       
   556 
       
   557 /*!
       
   558     Initialize \a option with the values from the menu bar and information from \a action. This method
       
   559     is useful for subclasses when they need a QStyleOptionMenuItem, but don't want
       
   560     to fill in all the information themselves.
       
   561 
       
   562     \sa QStyleOption::initFrom() QMenu::initStyleOption()
       
   563 */
       
   564 void QMenuBar::initStyleOption(QStyleOptionMenuItem *option, const QAction *action) const
       
   565 {
       
   566     if (!option || !action)
       
   567         return;
       
   568     Q_D(const QMenuBar);
       
   569     option->palette = palette();
       
   570     option->state = QStyle::State_None;
       
   571     if (isEnabled() && action->isEnabled())
       
   572         option->state |= QStyle::State_Enabled;
       
   573     else
       
   574         option->palette.setCurrentColorGroup(QPalette::Disabled);
       
   575     option->fontMetrics = fontMetrics();
       
   576     if (d->currentAction && d->currentAction == action) {
       
   577         option->state |= QStyle::State_Selected;
       
   578         if (d->popupState && !d->closePopupMode)
       
   579             option->state |= QStyle::State_Sunken;
       
   580     }
       
   581     if (hasFocus() || d->currentAction)
       
   582         option->state |= QStyle::State_HasFocus;
       
   583     option->menuRect = rect();
       
   584     option->menuItemType = QStyleOptionMenuItem::Normal;
       
   585     option->checkType = QStyleOptionMenuItem::NotCheckable;
       
   586     option->text = action->text();
       
   587     option->icon = action->icon();
       
   588 }
       
   589 
       
   590 /*!
       
   591     \class QMenuBar
       
   592     \brief The QMenuBar class provides a horizontal menu bar.
       
   593 
       
   594     \ingroup mainwindow-classes
       
   595 
       
   596     A menu bar consists of a list of pull-down menu items. You add
       
   597     menu items with addMenu(). For example, asuming that \c menubar
       
   598     is a pointer to a QMenuBar and \c fileMenu is a pointer to a
       
   599     QMenu, the following statement inserts the menu into the menu bar:
       
   600     \snippet doc/src/snippets/code/src_gui_widgets_qmenubar.cpp 0
       
   601 
       
   602     The ampersand in the menu item's text sets Alt+F as a shortcut for
       
   603     this menu. (You can use "\&\&" to get a real ampersand in the menu
       
   604     bar.)
       
   605 
       
   606     There is no need to lay out a menu bar. It automatically sets its
       
   607     own geometry to the top of the parent widget and changes it
       
   608     appropriately whenever the parent is resized.
       
   609 
       
   610     \section1 Usage
       
   611 
       
   612     In most main window style applications you would use the
       
   613     \l{QMainWindow::}{menuBar()} function provided in QMainWindow,
       
   614     adding \l{QMenu}s to the menu bar and adding \l{QAction}s to the
       
   615     pop-up menus.
       
   616 
       
   617     Example (from the \l{mainwindows/menus}{Menus} example):
       
   618 
       
   619     \snippet examples/mainwindows/menus/mainwindow.cpp 9
       
   620 
       
   621     Menu items may be removed with removeAction().
       
   622 
       
   623     Widgets can be added to menus by using instances of the QWidgetAction
       
   624     class to hold them. These actions can then be inserted into menus
       
   625     in the usual way; see the QMenu documentation for more details.
       
   626 
       
   627     \section1 Platform Dependent Look and Feel
       
   628 
       
   629     Different platforms have different requirements for the appearance
       
   630     of menu bars and their behavior when the user interacts with them.
       
   631     For example, Windows systems are often configured so that the
       
   632     underlined character mnemonics that indicate keyboard shortcuts
       
   633     for items in the menu bar are only shown when the \gui{Alt} key is
       
   634     pressed.
       
   635 
       
   636     \table
       
   637 
       
   638     \row \o \inlineimage plastique-menubar.png A menu bar shown in the
       
   639     Plastique widget style.
       
   640 
       
   641     \o The \l{QPlastiqueStyle}{Plastique widget style}, like most
       
   642     other styles, handles the \gui{Help} menu in the same way as it
       
   643     handles any other menu.
       
   644 
       
   645     \row \o \inlineimage motif-menubar.png A menu bar shown in the
       
   646     Motif widget style.
       
   647 
       
   648     \o The \l{QMotifStyle}{Motif widget style} treats \gui{Help} menus
       
   649     in a special way, placing them at right-hand end of the menu bar.
       
   650 
       
   651     \endtable
       
   652 
       
   653     \section1 QMenuBar on Mac OS X
       
   654 
       
   655     QMenuBar on Mac OS X is a wrapper for using the system-wide menu bar.
       
   656     If you have multiple menu bars in one dialog the outermost menu bar
       
   657     (normally inside a widget with widget flag Qt::Window) will
       
   658     be used for the system-wide menu bar.
       
   659 
       
   660     Qt for Mac OS X also provides a menu bar merging feature to make
       
   661     QMenuBar conform more closely to accepted Mac OS X menu bar layout.
       
   662     The merging functionality is based on string matching the title of
       
   663     a QMenu entry. These strings are translated (using QObject::tr())
       
   664     in the "QMenuBar" context. If an entry is moved its slots will still
       
   665     fire as if it was in the original place. The table below outlines
       
   666     the strings looked for and where the entry is placed if matched:
       
   667 
       
   668     \table
       
   669     \header \i String matches \i Placement \i Notes
       
   670     \row \i about.*
       
   671          \i Application Menu | About <application name>
       
   672          \i The application name is fetched from the \c {Info.plist} file
       
   673             (see note below). If this entry is not found no About item
       
   674             will appear in the Application Menu.
       
   675     \row \i config, options, setup, settings or preferences
       
   676          \i Application Menu | Preferences
       
   677          \i If this entry is not found the Settings item will be disabled
       
   678     \row \i quit or exit
       
   679          \i Application Menu | Quit <application name>
       
   680          \i If this entry is not found a default Quit item will be
       
   681             created to call QApplication::quit()
       
   682     \endtable
       
   683 
       
   684     You can override this behavior by using the QAction::menuRole()
       
   685     property.
       
   686 
       
   687     If you want all windows in a Mac application to share one menu
       
   688     bar, you must create a menu bar that does not have a parent.
       
   689     Create a parent-less menu bar this way:
       
   690 
       
   691     \snippet doc/src/snippets/code/src_gui_widgets_qmenubar.cpp 1
       
   692 
       
   693     \bold{Note:} Do \e{not} call QMainWindow::menuBar() to create the
       
   694     shared menu bar, because that menu bar will have the QMainWindow
       
   695     as its parent. That menu bar would only be displayed for the
       
   696     parent QMainWindow.
       
   697 
       
   698     \bold{Note:} The text used for the application name in the menu
       
   699     bar is obtained from the value set in the \c{Info.plist} file in
       
   700     the application's bundle. See \l{Deploying an Application on
       
   701     Mac OS X} for more information.
       
   702 
       
   703     \section1 QMenuBar on Windows CE
       
   704 
       
   705     QMenuBar on Windows CE is a wrapper for using the system-wide menu bar,
       
   706     similar to the Mac.  This feature is activated for Windows Mobile
       
   707     and integrates QMenuBar with the native soft keys. The left soft
       
   708     key can be controlled with QMenuBar::setDefaultAction() and the
       
   709     right soft key can be used to access the menu bar.
       
   710 
       
   711     The hovered() signal is not supported for the native menu
       
   712     integration. Also, it is not possible to display an icon in a
       
   713     native menu on Windows Mobile.
       
   714 
       
   715     \section1 Examples
       
   716 
       
   717     The \l{mainwindows/menus}{Menus} example shows how to use QMenuBar
       
   718     and QMenu.  The other \l{Main Window Examples}{main window
       
   719     application examples} also provide menus using these classes.
       
   720 
       
   721     \sa QMenu, QShortcut, QAction,
       
   722         {http://developer.apple.com/documentation/UserExperience/Conceptual/AppleHIGuidelines/XHIGIntro/XHIGIntro.html}{Introduction to Apple Human Interface Guidelines},
       
   723         {fowler}{GUI Design Handbook: Menu Bar}, {Menus Example}
       
   724 */
       
   725 
       
   726 
       
   727 void QMenuBarPrivate::init()
       
   728 {
       
   729     Q_Q(QMenuBar);
       
   730     q->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum);
       
   731     q->setAttribute(Qt::WA_CustomWhatsThis);
       
   732 #ifdef Q_WS_MAC
       
   733     macCreateMenuBar(q->parentWidget());
       
   734     if(mac_menubar)
       
   735         q->hide();
       
   736 #endif
       
   737 #ifdef Q_WS_WINCE
       
   738     if (qt_wince_is_mobile()) {
       
   739         wceCreateMenuBar(q->parentWidget());
       
   740         if(wce_menubar)
       
   741             q->hide();
       
   742     }
       
   743     else {
       
   744         QApplication::setAttribute(Qt::AA_DontUseNativeMenuBar, true);
       
   745     }
       
   746 #endif
       
   747     q->setBackgroundRole(QPalette::Button);
       
   748     oldWindow = oldParent = 0;
       
   749 #ifdef QT3_SUPPORT
       
   750     doAutoResize = false;
       
   751 #endif
       
   752 #ifdef QT_SOFTKEYS_ENABLED
       
   753     menuBarAction = 0;
       
   754 #endif
       
   755     handleReparent();
       
   756     q->setMouseTracking(q->style()->styleHint(QStyle::SH_MenuBar_MouseTracking, 0, q));
       
   757 
       
   758     extension = new QMenuBarExtension(q);
       
   759     extension->setFocusPolicy(Qt::NoFocus);
       
   760     extension->hide();
       
   761 }
       
   762 
       
   763 //Gets the next action for keyboard navigation
       
   764 QAction *QMenuBarPrivate::getNextAction(const int _start, const int increment) const
       
   765 {
       
   766     Q_Q(const QMenuBar);
       
   767     const_cast<QMenuBarPrivate*>(this)->updateGeometries();
       
   768     bool allowActiveAndDisabled = q->style()->styleHint(QStyle::SH_Menu_AllowActiveAndDisabled, 0, q);
       
   769     const int start = (_start == -1 && increment == -1) ? actions.count() : _start;
       
   770     const int end =  increment == -1 ? 0 : actions.count() - 1;
       
   771 
       
   772     for (int i = start; start != end;) {
       
   773         i += increment;
       
   774         QAction *current = actions.at(i);
       
   775         if (!actionRects.at(i).isNull() && (allowActiveAndDisabled || current->isEnabled()))
       
   776             return current;
       
   777     }
       
   778 
       
   779     if (_start != -1) //let's try from the beginning or the end
       
   780         return getNextAction(-1, increment);
       
   781 
       
   782     return 0;
       
   783 }
       
   784 
       
   785 /*!
       
   786     Constructs a menu bar with parent \a parent.
       
   787 */
       
   788 QMenuBar::QMenuBar(QWidget *parent) : QWidget(*new QMenuBarPrivate, parent, 0)
       
   789 {
       
   790     Q_D(QMenuBar);
       
   791     d->init();
       
   792 }
       
   793 
       
   794 #ifdef QT3_SUPPORT
       
   795 /*!
       
   796     Use one of the constructors that doesn't take the \a name
       
   797     argument and then use setObjectName() instead.
       
   798 */
       
   799 QMenuBar::QMenuBar(QWidget *parent, const char *name) : QWidget(*new QMenuBarPrivate, parent, 0)
       
   800 {
       
   801     Q_D(QMenuBar);
       
   802     d->init();
       
   803     setObjectName(QString::fromAscii(name));
       
   804 }
       
   805 #endif
       
   806 
       
   807 /*!
       
   808     Destroys the menu bar.
       
   809 */
       
   810 QMenuBar::~QMenuBar()
       
   811 {
       
   812 #ifdef Q_WS_MAC
       
   813     Q_D(QMenuBar);
       
   814     d->macDestroyMenuBar();
       
   815 #endif
       
   816 #ifdef Q_WS_WINCE
       
   817     Q_D(QMenuBar);
       
   818     if (qt_wince_is_mobile())
       
   819         d->wceDestroyMenuBar();
       
   820 #endif
       
   821 #ifdef Q_WS_S60
       
   822     Q_D(QMenuBar);
       
   823     d->symbianDestroyMenuBar();
       
   824 #endif
       
   825 }
       
   826 
       
   827 /*!
       
   828     \overload
       
   829 
       
   830     This convenience function creates a new action with \a text.
       
   831     The function adds the newly created action to the menu's
       
   832     list of actions, and returns it.
       
   833 
       
   834     \sa QWidget::addAction(), QWidget::actions()
       
   835 */
       
   836 QAction *QMenuBar::addAction(const QString &text)
       
   837 {
       
   838     QAction *ret = new QAction(text, this);
       
   839     addAction(ret);
       
   840     return ret;
       
   841 }
       
   842 
       
   843 /*!
       
   844     \overload
       
   845 
       
   846     This convenience function creates a new action with the given \a
       
   847     text. The action's triggered() signal is connected to the \a
       
   848     receiver's \a member slot. The function adds the newly created
       
   849     action to the menu's list of actions and returns it.
       
   850 
       
   851     \sa QWidget::addAction(), QWidget::actions()
       
   852 */
       
   853 QAction *QMenuBar::addAction(const QString &text, const QObject *receiver, const char* member)
       
   854 {
       
   855     QAction *ret = new QAction(text, this);
       
   856     QObject::connect(ret, SIGNAL(triggered(bool)), receiver, member);
       
   857     addAction(ret);
       
   858     return ret;
       
   859 }
       
   860 
       
   861 /*!
       
   862   Appends a new QMenu with \a title to the menu bar. The menu bar
       
   863   takes ownership of the menu. Returns the new menu.
       
   864 
       
   865   \sa QWidget::addAction() QMenu::menuAction()
       
   866 */
       
   867 QMenu *QMenuBar::addMenu(const QString &title)
       
   868 {
       
   869     QMenu *menu = new QMenu(title, this);
       
   870     addAction(menu->menuAction());
       
   871     return menu;
       
   872 }
       
   873 
       
   874 /*!
       
   875   Appends a new QMenu with \a icon and \a title to the menu bar. The menu bar
       
   876   takes ownership of the menu. Returns the new menu.
       
   877 
       
   878   \sa QWidget::addAction() QMenu::menuAction()
       
   879 */
       
   880 QMenu *QMenuBar::addMenu(const QIcon &icon, const QString &title)
       
   881 {
       
   882     QMenu *menu = new QMenu(title, this);
       
   883     menu->setIcon(icon);
       
   884     addAction(menu->menuAction());
       
   885     return menu;
       
   886 }
       
   887 
       
   888 /*!
       
   889     Appends \a menu to the menu bar. Returns the menu's menuAction().
       
   890 
       
   891     \note The returned QAction object can be used to hide the corresponding
       
   892     menu.
       
   893 
       
   894     \sa QWidget::addAction() QMenu::menuAction()
       
   895 */
       
   896 QAction *QMenuBar::addMenu(QMenu *menu)
       
   897 {
       
   898     QAction *action = menu->menuAction();
       
   899     addAction(action);
       
   900     return action;
       
   901 }
       
   902 
       
   903 /*!
       
   904   Appends a separator to the menu.
       
   905 */
       
   906 QAction *QMenuBar::addSeparator()
       
   907 {
       
   908     QAction *ret = new QAction(this);
       
   909     ret->setSeparator(true);
       
   910     addAction(ret);
       
   911     return ret;
       
   912 }
       
   913 
       
   914 /*!
       
   915     This convenience function creates a new separator action, i.e. an
       
   916     action with QAction::isSeparator() returning true. The function inserts
       
   917     the newly created action into this menu bar's list of actions before
       
   918     action \a before and returns it.
       
   919 
       
   920     \sa QWidget::insertAction(), addSeparator()
       
   921 */
       
   922 QAction *QMenuBar::insertSeparator(QAction *before)
       
   923 {
       
   924     QAction *action = new QAction(this);
       
   925     action->setSeparator(true);
       
   926     insertAction(before, action);
       
   927     return action;
       
   928 }
       
   929 
       
   930 /*!
       
   931   This convenience function inserts \a menu before action \a before
       
   932   and returns the menus menuAction().
       
   933 
       
   934   \sa QWidget::insertAction() addMenu()
       
   935 */
       
   936 QAction *QMenuBar::insertMenu(QAction *before, QMenu *menu)
       
   937 {
       
   938     QAction *action = menu->menuAction();
       
   939     insertAction(before, action);
       
   940     return action;
       
   941 }
       
   942 
       
   943 /*!
       
   944   Returns the QAction that is currently highlighted. A null pointer
       
   945   will be returned if no action is currently selected.
       
   946 */
       
   947 QAction *QMenuBar::activeAction() const
       
   948 {
       
   949     Q_D(const QMenuBar);
       
   950     return d->currentAction;
       
   951 }
       
   952 
       
   953 /*!
       
   954     \since 4.1
       
   955 
       
   956     Sets the currently highlighted action to \a act.
       
   957 */
       
   958 void QMenuBar::setActiveAction(QAction *act)
       
   959 {
       
   960     Q_D(QMenuBar);
       
   961     d->setCurrentAction(act, true, false);
       
   962 }
       
   963 
       
   964 
       
   965 /*!
       
   966     Removes all the actions from the menu bar.
       
   967 
       
   968     \note On Mac OS X, menu items that have been merged to the system
       
   969     menu bar are not removed by this function. One way to handle this
       
   970     would be to remove the extra actions yourself. You can set the
       
   971     \l{QAction::MenuRole}{menu role} on the different menus, so that
       
   972     you know ahead of time which menu items get merged and which do
       
   973     not. Then decide what to recreate or remove yourself.
       
   974 
       
   975     \sa removeAction()
       
   976 */
       
   977 void QMenuBar::clear()
       
   978 {
       
   979     QList<QAction*> acts = actions();
       
   980     for(int i = 0; i < acts.size(); i++)
       
   981         removeAction(acts[i]);
       
   982 }
       
   983 
       
   984 /*!
       
   985     \property QMenuBar::defaultUp
       
   986     \brief the popup orientation
       
   987 
       
   988     The default popup orientation. By default, menus pop "down" the
       
   989     screen. By setting the property to true, the menu will pop "up".
       
   990     You might call this for menus that are \e below the document to
       
   991     which they refer.
       
   992 
       
   993     If the menu would not fit on the screen, the other direction is
       
   994     used automatically.
       
   995 */
       
   996 void QMenuBar::setDefaultUp(bool b)
       
   997 {
       
   998     Q_D(QMenuBar);
       
   999     d->defaultPopDown = !b;
       
  1000 }
       
  1001 
       
  1002 bool QMenuBar::isDefaultUp() const
       
  1003 {
       
  1004     Q_D(const QMenuBar);
       
  1005     return !d->defaultPopDown;
       
  1006 }
       
  1007 
       
  1008 /*!
       
  1009   \reimp
       
  1010 */
       
  1011 void QMenuBar::resizeEvent(QResizeEvent *)
       
  1012 {
       
  1013     Q_D(QMenuBar);
       
  1014     d->itemsDirty = true;
       
  1015     d->updateGeometries();
       
  1016 }
       
  1017 
       
  1018 /*!
       
  1019   \reimp
       
  1020 */
       
  1021 void QMenuBar::paintEvent(QPaintEvent *e)
       
  1022 {
       
  1023     Q_D(QMenuBar);
       
  1024     QPainter p(this);
       
  1025     QRegion emptyArea(rect());
       
  1026 
       
  1027     //draw the items
       
  1028     for (int i = 0; i < d->actions.count(); ++i) {
       
  1029         QAction *action = d->actions.at(i);
       
  1030         QRect adjustedActionRect = d->actionRect(action);
       
  1031         if (adjustedActionRect.isEmpty() || !d->isVisible(action))
       
  1032             continue;
       
  1033         if(!e->rect().intersects(adjustedActionRect))
       
  1034             continue;
       
  1035 
       
  1036         emptyArea -= adjustedActionRect;
       
  1037         QStyleOptionMenuItem opt;
       
  1038         initStyleOption(&opt, action);
       
  1039         opt.rect = adjustedActionRect;
       
  1040         p.setClipRect(adjustedActionRect);
       
  1041         style()->drawControl(QStyle::CE_MenuBarItem, &opt, &p, this);
       
  1042     }
       
  1043      //draw border
       
  1044     if(int fw = style()->pixelMetric(QStyle::PM_MenuBarPanelWidth, 0, this)) {
       
  1045         QRegion borderReg;
       
  1046         borderReg += QRect(0, 0, fw, height()); //left
       
  1047         borderReg += QRect(width()-fw, 0, fw, height()); //right
       
  1048         borderReg += QRect(0, 0, width(), fw); //top
       
  1049         borderReg += QRect(0, height()-fw, width(), fw); //bottom
       
  1050         p.setClipRegion(borderReg);
       
  1051         emptyArea -= borderReg;
       
  1052         QStyleOptionFrame frame;
       
  1053         frame.rect = rect();
       
  1054         frame.palette = palette();
       
  1055         frame.state = QStyle::State_None;
       
  1056         frame.lineWidth = style()->pixelMetric(QStyle::PM_MenuBarPanelWidth);
       
  1057         frame.midLineWidth = 0;
       
  1058         style()->drawPrimitive(QStyle::PE_PanelMenuBar, &frame, &p, this);
       
  1059     }
       
  1060     p.setClipRegion(emptyArea);
       
  1061     QStyleOptionMenuItem menuOpt;
       
  1062     menuOpt.palette = palette();
       
  1063     menuOpt.state = QStyle::State_None;
       
  1064     menuOpt.menuItemType = QStyleOptionMenuItem::EmptyArea;
       
  1065     menuOpt.checkType = QStyleOptionMenuItem::NotCheckable;
       
  1066     menuOpt.rect = rect();
       
  1067     menuOpt.menuRect = rect();
       
  1068     style()->drawControl(QStyle::CE_MenuBarEmptyArea, &menuOpt, &p, this);
       
  1069 }
       
  1070 
       
  1071 /*!
       
  1072   \reimp
       
  1073 */
       
  1074 void QMenuBar::setVisible(bool visible)
       
  1075 {
       
  1076 #if defined(Q_WS_MAC) || defined(Q_OS_WINCE) || defined(Q_WS_S60)
       
  1077     if (isNativeMenuBar())
       
  1078         return;
       
  1079 #endif
       
  1080     QWidget::setVisible(visible);
       
  1081 }
       
  1082 
       
  1083 /*!
       
  1084   \reimp
       
  1085 */
       
  1086 void QMenuBar::mousePressEvent(QMouseEvent *e)
       
  1087 {
       
  1088     Q_D(QMenuBar);
       
  1089     if(e->button() != Qt::LeftButton)
       
  1090         return;
       
  1091 
       
  1092     d->mouseDown = true;
       
  1093 
       
  1094     QAction *action = d->actionAt(e->pos());
       
  1095     if (!action || !d->isVisible(action)) {
       
  1096         d->setCurrentAction(0);
       
  1097 #ifndef QT_NO_WHATSTHIS
       
  1098         if (QWhatsThis::inWhatsThisMode())
       
  1099             QWhatsThis::showText(e->globalPos(), d->whatsThis, this);
       
  1100 #endif
       
  1101         return;
       
  1102     }
       
  1103 
       
  1104     if(d->currentAction == action && d->popupState) {
       
  1105         if(QMenu *menu = d->activeMenu) {
       
  1106             d->activeMenu = 0;
       
  1107             menu->hide();
       
  1108         }
       
  1109 #ifdef Q_WS_WIN
       
  1110         if((d->closePopupMode = style()->styleHint(QStyle::SH_MenuBar_DismissOnSecondClick)))
       
  1111             update(d->actionRect(action));
       
  1112 #endif
       
  1113     } else {
       
  1114         d->setCurrentAction(action, true);
       
  1115     }
       
  1116 }
       
  1117 
       
  1118 /*!
       
  1119   \reimp
       
  1120 */
       
  1121 void QMenuBar::mouseReleaseEvent(QMouseEvent *e)
       
  1122 {
       
  1123     Q_D(QMenuBar);
       
  1124     if(e->button() != Qt::LeftButton || !d->mouseDown)
       
  1125         return;
       
  1126 
       
  1127     d->mouseDown = false;
       
  1128     QAction *action = d->actionAt(e->pos());
       
  1129     if((d->closePopupMode && action == d->currentAction) || !action || !action->menu()) {
       
  1130         //we set the current action before activating
       
  1131         //so that we let the leave event set the current back to 0
       
  1132         d->setCurrentAction(action, false);
       
  1133         if(action)
       
  1134             d->activateAction(action, QAction::Trigger);
       
  1135     }
       
  1136     d->closePopupMode = 0;
       
  1137 }
       
  1138 
       
  1139 /*!
       
  1140   \reimp
       
  1141 */
       
  1142 void QMenuBar::keyPressEvent(QKeyEvent *e)
       
  1143 {
       
  1144     Q_D(QMenuBar);
       
  1145     d->updateGeometries();
       
  1146     int key = e->key();
       
  1147     if(isRightToLeft()) {  // in reverse mode open/close key for submenues are reversed
       
  1148         if(key == Qt::Key_Left)
       
  1149             key = Qt::Key_Right;
       
  1150         else if(key == Qt::Key_Right)
       
  1151             key = Qt::Key_Left;
       
  1152     }
       
  1153     if(key == Qt::Key_Tab) //means right
       
  1154         key = Qt::Key_Right;
       
  1155     else if(key == Qt::Key_Backtab) //means left
       
  1156         key = Qt::Key_Left;
       
  1157 
       
  1158     bool key_consumed = false;
       
  1159     switch(key) {
       
  1160     case Qt::Key_Up:
       
  1161     case Qt::Key_Down:
       
  1162     case Qt::Key_Enter:
       
  1163     case Qt::Key_Space:
       
  1164     case Qt::Key_Return: {
       
  1165         if(!style()->styleHint(QStyle::SH_MenuBar_AltKeyNavigation, 0, this) || !d->currentAction)
       
  1166            break;
       
  1167         if(d->currentAction->menu()) {
       
  1168             d->popupAction(d->currentAction, true);
       
  1169         } else if(key == Qt::Key_Enter || key == Qt::Key_Return || key == Qt::Key_Space) {
       
  1170             d->activateAction(d->currentAction, QAction::Trigger);
       
  1171             d->setCurrentAction(d->currentAction, false);
       
  1172             d->setKeyboardMode(false);
       
  1173         }
       
  1174         key_consumed = true;
       
  1175         break; }
       
  1176 
       
  1177     case Qt::Key_Right:
       
  1178     case Qt::Key_Left: {
       
  1179         if(d->currentAction) {
       
  1180             int index = d->actions.indexOf(d->currentAction);
       
  1181             if (QAction *nextAction = d->getNextAction(index, key == Qt::Key_Left ? -1 : +1)) {
       
  1182                 d->setCurrentAction(nextAction, d->popupState, true);
       
  1183                 key_consumed = true;
       
  1184             }
       
  1185         }
       
  1186         break; }
       
  1187 
       
  1188     case Qt::Key_Escape:
       
  1189         d->setCurrentAction(0);
       
  1190         d->setKeyboardMode(false);
       
  1191         key_consumed = true;
       
  1192         break;
       
  1193 
       
  1194     default:
       
  1195         key_consumed = false;
       
  1196     }
       
  1197 
       
  1198     if(!key_consumed &&
       
  1199        (!e->modifiers() ||
       
  1200         (e->modifiers()&(Qt::MetaModifier|Qt::AltModifier))) && e->text().length()==1 && !d->popupState) {
       
  1201         int clashCount = 0;
       
  1202         QAction *first = 0, *currentSelected = 0, *firstAfterCurrent = 0;
       
  1203         {
       
  1204             QChar c = e->text()[0].toUpper();
       
  1205             for(int i = 0; i < d->actions.size(); ++i) {
       
  1206                 if (d->actionRects.at(i).isNull())
       
  1207                     continue;
       
  1208                 QAction *act = d->actions.at(i);
       
  1209                 QString s = act->text();
       
  1210                 if(!s.isEmpty()) {
       
  1211                     int ampersand = s.indexOf(QLatin1Char('&'));
       
  1212                     if(ampersand >= 0) {
       
  1213                         if(s[ampersand+1].toUpper() == c) {
       
  1214                             clashCount++;
       
  1215                             if(!first)
       
  1216                                 first = act;
       
  1217                             if(act == d->currentAction)
       
  1218                                 currentSelected = act;
       
  1219                             else if (!firstAfterCurrent && currentSelected)
       
  1220                                 firstAfterCurrent = act;
       
  1221                         }
       
  1222                     }
       
  1223                 }
       
  1224             }
       
  1225         }
       
  1226         QAction *next_action = 0;
       
  1227         if(clashCount >= 1) {
       
  1228             if(clashCount == 1 || !d->currentAction || (currentSelected && !firstAfterCurrent))
       
  1229                 next_action = first;
       
  1230             else
       
  1231                 next_action = firstAfterCurrent;
       
  1232         }
       
  1233         if(next_action) {
       
  1234             key_consumed = true;
       
  1235             d->setCurrentAction(next_action, true, true);
       
  1236         }
       
  1237     }
       
  1238     if(key_consumed)
       
  1239         e->accept();
       
  1240     else
       
  1241         e->ignore();
       
  1242 }
       
  1243 
       
  1244 /*!
       
  1245   \reimp
       
  1246 */
       
  1247 void QMenuBar::mouseMoveEvent(QMouseEvent *e)
       
  1248 {
       
  1249     Q_D(QMenuBar);
       
  1250     if (!(e->buttons() & Qt::LeftButton))
       
  1251         d->mouseDown = false;
       
  1252     bool popupState = d->popupState || d->mouseDown;
       
  1253     QAction *action = d->actionAt(e->pos());
       
  1254     if ((action && d->isVisible(action)) || !popupState)
       
  1255         d->setCurrentAction(action, popupState);
       
  1256 }
       
  1257 
       
  1258 /*!
       
  1259   \reimp
       
  1260 */
       
  1261 void QMenuBar::leaveEvent(QEvent *)
       
  1262 {
       
  1263     Q_D(QMenuBar);
       
  1264     if((!hasFocus() && !d->popupState) ||
       
  1265         (d->currentAction && d->currentAction->menu() == 0))
       
  1266         d->setCurrentAction(0);
       
  1267 }
       
  1268 
       
  1269 /*!
       
  1270   \reimp
       
  1271 */
       
  1272 void QMenuBar::actionEvent(QActionEvent *e)
       
  1273 {
       
  1274     Q_D(QMenuBar);
       
  1275     d->itemsDirty = true;
       
  1276 #if defined (Q_WS_MAC) || defined(Q_OS_WINCE) || defined(Q_WS_S60)
       
  1277     if (isNativeMenuBar()) {
       
  1278 #ifdef Q_WS_MAC
       
  1279         QMenuBarPrivate::QMacMenuBarPrivate *nativeMenuBar = d->mac_menubar;
       
  1280 #elif defined(Q_WS_S60)
       
  1281         QMenuBarPrivate::QSymbianMenuBarPrivate *nativeMenuBar = d->symbian_menubar;
       
  1282 #else
       
  1283         QMenuBarPrivate::QWceMenuBarPrivate *nativeMenuBar = d->wce_menubar;
       
  1284 #endif
       
  1285         if (!nativeMenuBar)
       
  1286             return;
       
  1287         if(e->type() == QEvent::ActionAdded)
       
  1288             nativeMenuBar->addAction(e->action(), nativeMenuBar->findAction(e->before()));
       
  1289         else if(e->type() == QEvent::ActionRemoved)
       
  1290             nativeMenuBar->removeAction(e->action());
       
  1291         else if(e->type() == QEvent::ActionChanged)
       
  1292             nativeMenuBar->syncAction(e->action());
       
  1293     }
       
  1294 #endif
       
  1295 
       
  1296     if(e->type() == QEvent::ActionAdded) {
       
  1297         connect(e->action(), SIGNAL(triggered()), this, SLOT(_q_actionTriggered()));
       
  1298         connect(e->action(), SIGNAL(hovered()), this, SLOT(_q_actionHovered()));
       
  1299     } else if(e->type() == QEvent::ActionRemoved) {
       
  1300         e->action()->disconnect(this);
       
  1301     }
       
  1302     if (isVisible()) {
       
  1303         d->updateGeometries();
       
  1304         update();
       
  1305     }
       
  1306 }
       
  1307 
       
  1308 /*!
       
  1309   \reimp
       
  1310 */
       
  1311 void QMenuBar::focusInEvent(QFocusEvent *)
       
  1312 {
       
  1313     Q_D(QMenuBar);
       
  1314     if(d->keyboardState)
       
  1315         d->focusFirstAction();
       
  1316 }
       
  1317 
       
  1318 /*!
       
  1319   \reimp
       
  1320 */
       
  1321 void QMenuBar::focusOutEvent(QFocusEvent *)
       
  1322 {
       
  1323     Q_D(QMenuBar);
       
  1324     if(!d->popupState) {
       
  1325         d->setCurrentAction(0);
       
  1326         d->setKeyboardMode(false);
       
  1327     }
       
  1328 }
       
  1329 
       
  1330 /*!
       
  1331   \reimp
       
  1332  */
       
  1333 void QMenuBar::timerEvent (QTimerEvent *e)
       
  1334 {
       
  1335     Q_D(QMenuBar);
       
  1336     if (e->timerId() == d->autoReleaseTimer.timerId()) {
       
  1337         d->autoReleaseTimer.stop();
       
  1338         d->setCurrentAction(0);
       
  1339     }
       
  1340     QWidget::timerEvent(e);
       
  1341 }
       
  1342 
       
  1343 
       
  1344 void QMenuBarPrivate::handleReparent()
       
  1345 {
       
  1346     Q_Q(QMenuBar);
       
  1347     QWidget *newParent = q->parentWidget();
       
  1348     //Note: if parent is reparented, then window may change even if parent doesn't
       
  1349 
       
  1350     // we need to install an event filter on parent, and remove the old one
       
  1351 
       
  1352     if (oldParent != newParent) {
       
  1353         if (oldParent)
       
  1354             oldParent->removeEventFilter(q);
       
  1355         if (newParent)
       
  1356             newParent->installEventFilter(q);
       
  1357     }
       
  1358 
       
  1359     //we also need event filter on top-level (for shortcuts)
       
  1360     QWidget *newWindow = newParent ? newParent->window() : 0;
       
  1361 
       
  1362     if (oldWindow != newWindow) {
       
  1363         if (oldParent && oldParent != oldWindow)
       
  1364             oldWindow->removeEventFilter(q);
       
  1365 
       
  1366         if (newParent && newParent != newWindow)
       
  1367             newWindow->installEventFilter(q);
       
  1368     }
       
  1369 
       
  1370     oldParent = newParent;
       
  1371     oldWindow = newWindow;
       
  1372 
       
  1373 #ifdef Q_WS_MAC
       
  1374     if (q->isNativeMenuBar() && !macWidgetHasNativeMenubar(newParent)) {
       
  1375         // If the new parent got a native menubar from before, keep that
       
  1376         // menubar rather than replace it with this one (because a parents
       
  1377         // menubar has precedence over children menubars).
       
  1378         macDestroyMenuBar();
       
  1379         macCreateMenuBar(newParent);
       
  1380     }
       
  1381 #endif
       
  1382 
       
  1383 #ifdef Q_WS_WINCE
       
  1384     if (qt_wince_is_mobile() && wce_menubar)
       
  1385         wce_menubar->rebuild();
       
  1386 #endif
       
  1387 #ifdef Q_WS_S60
       
  1388 
       
  1389     // Construct symbian_menubar when this code path is entered first time
       
  1390     // and when newParent != NULL
       
  1391     if (!symbian_menubar)
       
  1392         symbianCreateMenuBar(newParent);
       
  1393 
       
  1394     // Reparent and rebuild menubar when parent is changed
       
  1395     if (symbian_menubar) {
       
  1396         if (oldParent != newParent)
       
  1397             reparentMenuBar(oldParent, newParent);
       
  1398         q->hide();
       
  1399         symbian_menubar->rebuild();
       
  1400     }
       
  1401 
       
  1402 #ifdef QT_SOFTKEYS_ENABLED
       
  1403     // Constuct menuBarAction when this code path is entered first time
       
  1404     if (!menuBarAction) {
       
  1405         if (newParent) {
       
  1406             menuBarAction = QSoftKeyManager::createAction(QSoftKeyManager::MenuSoftKey, newParent);
       
  1407             newParent->addAction(menuBarAction);
       
  1408         }
       
  1409     } else {
       
  1410         // If reparenting i.e. we already have menuBarAction, remove it from old parent
       
  1411         // and add for a new parent
       
  1412         if (oldParent)
       
  1413             oldParent->removeAction(menuBarAction);
       
  1414         if (newParent)
       
  1415             newParent->addAction(menuBarAction);
       
  1416     }
       
  1417 #endif // QT_SOFTKEYS_ENABLED
       
  1418 #endif // Q_WS_S60
       
  1419 }
       
  1420 
       
  1421 #ifdef QT3_SUPPORT
       
  1422 /*!
       
  1423     Sets whether the menu bar should automatically resize itself
       
  1424     when its parent widget is resized.
       
  1425 
       
  1426     This feature is provided to help porting to Qt 4. We recommend
       
  1427     against using it in new code.
       
  1428 
       
  1429     \sa autoGeometry()
       
  1430 */
       
  1431 void QMenuBar::setAutoGeometry(bool b)
       
  1432 {
       
  1433     Q_D(QMenuBar);
       
  1434     d->doAutoResize = b;
       
  1435 }
       
  1436 
       
  1437 /*!
       
  1438     Returns true if the menu bar automatically resizes itself
       
  1439     when its parent widget is resized; otherwise returns false.
       
  1440 
       
  1441     This feature is provided to help porting to Qt 4. We recommend
       
  1442     against using it in new code.
       
  1443 
       
  1444     \sa setAutoGeometry()
       
  1445 */
       
  1446 bool QMenuBar::autoGeometry() const
       
  1447 {
       
  1448     Q_D(const QMenuBar);
       
  1449     return d->doAutoResize;
       
  1450 }
       
  1451 #endif
       
  1452 
       
  1453 /*!
       
  1454   \reimp
       
  1455 */
       
  1456 void QMenuBar::changeEvent(QEvent *e)
       
  1457 {
       
  1458     Q_D(QMenuBar);
       
  1459     if(e->type() == QEvent::StyleChange) {
       
  1460         d->itemsDirty = true;
       
  1461         setMouseTracking(style()->styleHint(QStyle::SH_MenuBar_MouseTracking, 0, this));
       
  1462         if(parentWidget())
       
  1463             resize(parentWidget()->width(), heightForWidth(parentWidget()->width()));
       
  1464         d->updateGeometries();
       
  1465     } else if (e->type() == QEvent::ParentChange) {
       
  1466         d->handleReparent();
       
  1467     } else if (e->type() == QEvent::FontChange
       
  1468                || e->type() == QEvent::ApplicationFontChange) {
       
  1469         d->itemsDirty = true;
       
  1470         d->updateGeometries();
       
  1471 #ifdef QT_SOFTKEYS_ENABLED
       
  1472     } else if (e->type() == QEvent::LanguageChange) {
       
  1473         if (d->menuBarAction)
       
  1474             d->menuBarAction->setText(QSoftKeyManager::standardSoftKeyText(QSoftKeyManager::MenuSoftKey));
       
  1475 #endif
       
  1476     }
       
  1477 
       
  1478     QWidget::changeEvent(e);
       
  1479 }
       
  1480 
       
  1481 /*!
       
  1482   \reimp
       
  1483 */
       
  1484 bool QMenuBar::event(QEvent *e)
       
  1485 {
       
  1486     Q_D(QMenuBar);
       
  1487     switch (e->type()) {
       
  1488     case QEvent::KeyPress: {
       
  1489         QKeyEvent *ke = (QKeyEvent*)e;
       
  1490 #if 0
       
  1491         if(!d->keyboardState) { //all keypresses..
       
  1492             d->setCurrentAction(0);
       
  1493             return ;
       
  1494         }
       
  1495 #endif
       
  1496         if(ke->key() == Qt::Key_Tab || ke->key() == Qt::Key_Backtab) {
       
  1497             keyPressEvent(ke);
       
  1498             return true;
       
  1499         }
       
  1500 
       
  1501     } break;
       
  1502 #ifndef QT_NO_SHORTCUT
       
  1503     case QEvent::Shortcut: {
       
  1504         QShortcutEvent *se = static_cast<QShortcutEvent *>(e);
       
  1505         int shortcutId = se->shortcutId();
       
  1506         for(int j = 0; j < d->shortcutIndexMap.size(); ++j) {
       
  1507             if (shortcutId == d->shortcutIndexMap.value(j))
       
  1508                 d->_q_internalShortcutActivated(j);
       
  1509         }
       
  1510     } break;
       
  1511 #endif
       
  1512     case QEvent::Show:
       
  1513 #ifdef QT3_SUPPORT
       
  1514         if(QWidget *p = parentWidget()) {
       
  1515             // If itemsDirty == true, updateGeometries sends the MenubarUpdated event.
       
  1516             if (!d->itemsDirty) {
       
  1517                 QMenubarUpdatedEvent menubarUpdated(this);
       
  1518                 QApplication::sendEvent(p, &menubarUpdated);
       
  1519             }
       
  1520         }
       
  1521 #endif
       
  1522         d->_q_updateLayout();
       
  1523     break;
       
  1524     case QEvent::ShortcutOverride: {
       
  1525         QKeyEvent *kev = static_cast<QKeyEvent*>(e);
       
  1526         //we only filter out escape if there is a current action
       
  1527         if (kev->key() == Qt::Key_Escape && d->currentAction) {
       
  1528             e->accept();
       
  1529             return true;
       
  1530         }
       
  1531     }
       
  1532     break;
       
  1533 
       
  1534 #ifdef QT3_SUPPORT
       
  1535     case QEvent::Hide: {
       
  1536         if(QWidget *p = parentWidget()) {
       
  1537             QMenubarUpdatedEvent menubarUpdated(this);
       
  1538             QApplication::sendEvent(p, &menubarUpdated);
       
  1539         }
       
  1540     } break;
       
  1541 #endif
       
  1542 
       
  1543 #ifndef QT_NO_WHATSTHIS
       
  1544     case QEvent::QueryWhatsThis:
       
  1545         e->setAccepted(d->whatsThis.size());
       
  1546         if (QAction *action = d->actionAt(static_cast<QHelpEvent*>(e)->pos())) {
       
  1547             if (action->whatsThis().size() || action->menu())
       
  1548                 e->accept();
       
  1549         }
       
  1550         return true;
       
  1551 #endif
       
  1552     case QEvent::LayoutDirectionChange:
       
  1553         d->_q_updateLayout();
       
  1554         break;
       
  1555     default:
       
  1556         break;
       
  1557     }
       
  1558     return QWidget::event(e);
       
  1559 }
       
  1560 
       
  1561 /*!
       
  1562   \reimp
       
  1563 */
       
  1564 bool QMenuBar::eventFilter(QObject *object, QEvent *event)
       
  1565 {
       
  1566     Q_D(QMenuBar);
       
  1567     if (object == parent() && object) {
       
  1568 #ifdef QT3_SUPPORT
       
  1569         if (d->doAutoResize && event->type() == QEvent::Resize) {
       
  1570             QResizeEvent *e = (QResizeEvent *)event;
       
  1571             int w = e->size().width();
       
  1572             setGeometry(0, y(), w, heightForWidth(w));
       
  1573             return false;
       
  1574         }
       
  1575 #endif
       
  1576         if (event->type() == QEvent::ParentChange) //GrandparentChange
       
  1577             d->handleReparent();
       
  1578     }
       
  1579     if (object == d->leftWidget || object == d->rightWidget) {
       
  1580         switch (event->type()) {
       
  1581         case QEvent::ShowToParent:
       
  1582         case QEvent::HideToParent:
       
  1583             d->_q_updateLayout();
       
  1584             break;
       
  1585         default:
       
  1586             break;
       
  1587         }
       
  1588     }
       
  1589 
       
  1590     if (style()->styleHint(QStyle::SH_MenuBar_AltKeyNavigation, 0, this)) {
       
  1591         if (d->altPressed) {
       
  1592             switch (event->type()) {
       
  1593             case QEvent::KeyPress:
       
  1594             case QEvent::KeyRelease:
       
  1595             {
       
  1596                 QKeyEvent *kev = static_cast<QKeyEvent*>(event);
       
  1597                 if (kev->key() == Qt::Key_Alt || kev->key() == Qt::Key_Meta) {
       
  1598                     if (event->type() == QEvent::KeyPress) // Alt-press does not interest us, we have the shortcut-override event
       
  1599                         break;
       
  1600                     d->setKeyboardMode(!d->keyboardState);
       
  1601                 }
       
  1602             }
       
  1603             // fall through
       
  1604             case QEvent::MouseButtonPress:
       
  1605             case QEvent::MouseButtonRelease:
       
  1606             case QEvent::MouseMove:
       
  1607             case QEvent::FocusIn:
       
  1608             case QEvent::FocusOut:
       
  1609             case QEvent::ActivationChange:
       
  1610                 d->altPressed = false;
       
  1611                 qApp->removeEventFilter(this);
       
  1612                 break;
       
  1613             default:
       
  1614                 break;
       
  1615             }
       
  1616         } else if (isVisible()) {
       
  1617             if (event->type() == QEvent::ShortcutOverride) {
       
  1618                 QKeyEvent *kev = static_cast<QKeyEvent*>(event);
       
  1619                 if ((kev->key() == Qt::Key_Alt || kev->key() == Qt::Key_Meta)
       
  1620                     && kev->modifiers() == Qt::AltModifier) {
       
  1621                     d->altPressed = true;
       
  1622                     qApp->installEventFilter(this);
       
  1623                 }
       
  1624             }
       
  1625         }
       
  1626     }
       
  1627 
       
  1628     return false;
       
  1629 }
       
  1630 
       
  1631 /*!
       
  1632   \internal
       
  1633 
       
  1634   Return the item at \a pt, or 0 if there is no item there or if it is
       
  1635   a separator item.
       
  1636 */
       
  1637 QAction *QMenuBar::actionAt(const QPoint &pt) const
       
  1638 {
       
  1639     Q_D(const QMenuBar);
       
  1640     return d->actionAt(pt);
       
  1641 }
       
  1642 
       
  1643 /*!
       
  1644   \internal
       
  1645 
       
  1646   Returns the geometry of action \a act.
       
  1647 */
       
  1648 QRect QMenuBar::actionGeometry(QAction *act) const
       
  1649 {
       
  1650     Q_D(const QMenuBar);
       
  1651     return d->actionRect(act);
       
  1652 }
       
  1653 
       
  1654 /*!
       
  1655   \reimp
       
  1656 */
       
  1657 QSize QMenuBar::minimumSizeHint() const
       
  1658 {
       
  1659     Q_D(const QMenuBar);
       
  1660 #if defined(Q_WS_MAC) || defined(Q_WS_WINCE) || defined(Q_WS_S60)
       
  1661     const bool as_gui_menubar = !isNativeMenuBar();
       
  1662 #else
       
  1663     const bool as_gui_menubar = true;
       
  1664 #endif
       
  1665 
       
  1666     ensurePolished();
       
  1667     QSize ret(0, 0);
       
  1668     const_cast<QMenuBarPrivate*>(d)->updateGeometries();
       
  1669     const int hmargin = style()->pixelMetric(QStyle::PM_MenuBarHMargin, 0, this);
       
  1670     const int vmargin = style()->pixelMetric(QStyle::PM_MenuBarVMargin, 0, this);
       
  1671     int fw = style()->pixelMetric(QStyle::PM_MenuBarPanelWidth, 0, this);
       
  1672     int spaceBelowMenuBar = style()->styleHint(QStyle::SH_MainWindow_SpaceBelowMenuBar, 0, this);
       
  1673     if(as_gui_menubar) {
       
  1674         int w = parentWidget() ? parentWidget()->width() : QApplication::desktop()->width();
       
  1675         d->calcActionRects(w - (2 * fw), 0);
       
  1676         for (int i = 0; ret.isNull() && i < d->actions.count(); ++i)
       
  1677             ret = d->actionRects.at(i).size();
       
  1678         if (!d->extension->isHidden())
       
  1679             ret += QSize(d->extension->sizeHint().width(), 0);
       
  1680         ret += QSize(2*fw + hmargin, 2*fw + vmargin);
       
  1681     }
       
  1682     int margin = 2*vmargin + 2*fw + spaceBelowMenuBar;
       
  1683     if(d->leftWidget) {
       
  1684         QSize sz = d->leftWidget->minimumSizeHint();
       
  1685         ret.setWidth(ret.width() + sz.width());
       
  1686         if(sz.height() + margin > ret.height())
       
  1687             ret.setHeight(sz.height() + margin);
       
  1688     }
       
  1689     if(d->rightWidget) {
       
  1690         QSize sz = d->rightWidget->minimumSizeHint();
       
  1691         ret.setWidth(ret.width() + sz.width());
       
  1692         if(sz.height() + margin > ret.height())
       
  1693             ret.setHeight(sz.height() + margin);
       
  1694     }
       
  1695     if(as_gui_menubar) {
       
  1696         QStyleOptionMenuItem opt;
       
  1697         opt.rect = rect();
       
  1698         opt.menuRect = rect();
       
  1699         opt.state = QStyle::State_None;
       
  1700         opt.menuItemType = QStyleOptionMenuItem::Normal;
       
  1701         opt.checkType = QStyleOptionMenuItem::NotCheckable;
       
  1702         opt.palette = palette();
       
  1703         return (style()->sizeFromContents(QStyle::CT_MenuBar, &opt,
       
  1704                                          ret.expandedTo(QApplication::globalStrut()),
       
  1705                                          this));
       
  1706     }
       
  1707     return ret;
       
  1708 }
       
  1709 
       
  1710 /*!
       
  1711   \reimp
       
  1712 */
       
  1713 QSize QMenuBar::sizeHint() const
       
  1714 {
       
  1715     Q_D(const QMenuBar);
       
  1716 #if defined(Q_WS_MAC) || defined(Q_WS_WINCE) || defined(Q_WS_S60)
       
  1717     const bool as_gui_menubar = !isNativeMenuBar();
       
  1718 #else
       
  1719     const bool as_gui_menubar = true;
       
  1720 #endif
       
  1721 
       
  1722 
       
  1723     ensurePolished();
       
  1724     QSize ret(0, 0);
       
  1725     const_cast<QMenuBarPrivate*>(d)->updateGeometries();
       
  1726     const int hmargin = style()->pixelMetric(QStyle::PM_MenuBarHMargin, 0, this);
       
  1727     const int vmargin = style()->pixelMetric(QStyle::PM_MenuBarVMargin, 0, this);
       
  1728     int fw = style()->pixelMetric(QStyle::PM_MenuBarPanelWidth, 0, this);
       
  1729     int spaceBelowMenuBar = style()->styleHint(QStyle::SH_MainWindow_SpaceBelowMenuBar, 0, this);
       
  1730     if(as_gui_menubar) {
       
  1731         const int w = parentWidget() ? parentWidget()->width() : QApplication::desktop()->width();
       
  1732         d->calcActionRects(w - (2 * fw), 0);
       
  1733         for (int i = 0; i < d->actionRects.count(); ++i) {
       
  1734             const QRect &actionRect = d->actionRects.at(i);
       
  1735             ret = ret.expandedTo(QSize(actionRect.x() + actionRect.width(), actionRect.y() + actionRect.height()));
       
  1736         }
       
  1737         //the action geometries already contain the top and left
       
  1738         //margins. So we only need to add those from right and bottom.
       
  1739         ret += QSize(fw + hmargin, fw + vmargin);
       
  1740     }
       
  1741     int margin = 2*vmargin + 2*fw + spaceBelowMenuBar;
       
  1742     if(d->leftWidget) {
       
  1743         QSize sz = d->leftWidget->sizeHint();
       
  1744         ret.setWidth(ret.width() + sz.width());
       
  1745         if(sz.height() + margin > ret.height())
       
  1746             ret.setHeight(sz.height() + margin);
       
  1747     }
       
  1748     if(d->rightWidget) {
       
  1749         QSize sz = d->rightWidget->sizeHint();
       
  1750         ret.setWidth(ret.width() + sz.width());
       
  1751         if(sz.height() + margin > ret.height())
       
  1752             ret.setHeight(sz.height() + margin);
       
  1753     }
       
  1754     if(as_gui_menubar) {
       
  1755         QStyleOptionMenuItem opt;
       
  1756         opt.rect = rect();
       
  1757         opt.menuRect = rect();
       
  1758         opt.state = QStyle::State_None;
       
  1759         opt.menuItemType = QStyleOptionMenuItem::Normal;
       
  1760         opt.checkType = QStyleOptionMenuItem::NotCheckable;
       
  1761         opt.palette = palette();
       
  1762         return (style()->sizeFromContents(QStyle::CT_MenuBar, &opt,
       
  1763                                          ret.expandedTo(QApplication::globalStrut()),
       
  1764                                          this));
       
  1765     }
       
  1766     return ret;
       
  1767 }
       
  1768 
       
  1769 /*!
       
  1770   \reimp
       
  1771 */
       
  1772 int QMenuBar::heightForWidth(int) const
       
  1773 {
       
  1774     Q_D(const QMenuBar);
       
  1775 #if defined(Q_WS_MAC) || defined(Q_WS_WINCE) || defined(Q_WS_S60)
       
  1776     const bool as_gui_menubar = !isNativeMenuBar();
       
  1777 #else
       
  1778     const bool as_gui_menubar = true;
       
  1779 #endif
       
  1780 
       
  1781     const_cast<QMenuBarPrivate*>(d)->updateGeometries();
       
  1782     int height = 0;
       
  1783     const int vmargin = style()->pixelMetric(QStyle::PM_MenuBarVMargin, 0, this);
       
  1784     int fw = style()->pixelMetric(QStyle::PM_MenuBarPanelWidth, 0, this);
       
  1785     int spaceBelowMenuBar = style()->styleHint(QStyle::SH_MainWindow_SpaceBelowMenuBar, 0, this);
       
  1786     if(as_gui_menubar) {
       
  1787         for (int i = 0; i < d->actionRects.count(); ++i)
       
  1788             height = qMax(height, d->actionRects.at(i).height());
       
  1789         if (height) //there is at least one non-null item
       
  1790             height += spaceBelowMenuBar;
       
  1791         height += 2*fw;
       
  1792         height += 2*vmargin;
       
  1793     }
       
  1794     int margin = 2*vmargin + 2*fw + spaceBelowMenuBar;
       
  1795     if(d->leftWidget)
       
  1796         height = qMax(d->leftWidget->sizeHint().height() + margin, height);
       
  1797     if(d->rightWidget)
       
  1798         height = qMax(d->rightWidget->sizeHint().height() + margin, height);
       
  1799     if(as_gui_menubar) {
       
  1800         QStyleOptionMenuItem opt;
       
  1801         opt.init(this);
       
  1802         opt.menuRect = rect();
       
  1803         opt.state = QStyle::State_None;
       
  1804         opt.menuItemType = QStyleOptionMenuItem::Normal;
       
  1805         opt.checkType = QStyleOptionMenuItem::NotCheckable;
       
  1806         return style()->sizeFromContents(QStyle::CT_MenuBar, &opt, QSize(0, height), this).height(); //not pretty..
       
  1807     }
       
  1808     return height;
       
  1809 }
       
  1810 
       
  1811 /*!
       
  1812   \internal
       
  1813 */
       
  1814 void QMenuBarPrivate::_q_internalShortcutActivated(int id)
       
  1815 {
       
  1816     Q_Q(QMenuBar);
       
  1817     QAction *act = actions.at(id);
       
  1818     setCurrentAction(act, true, true);
       
  1819     if (act && !act->menu()) {
       
  1820         activateAction(act, QAction::Trigger);
       
  1821         //100 is the same as the default value in QPushButton::animateClick
       
  1822         autoReleaseTimer.start(100, q);
       
  1823     } else if (act && q->style()->styleHint(QStyle::SH_MenuBar_AltKeyNavigation, 0, q)) {
       
  1824         // When we open a menu using a shortcut, we should end up in keyboard state
       
  1825         setKeyboardMode(true);
       
  1826     }
       
  1827 }
       
  1828 
       
  1829 void QMenuBarPrivate::_q_updateLayout()
       
  1830 {
       
  1831     Q_Q(QMenuBar);
       
  1832     itemsDirty = true;
       
  1833     if (q->isVisible()) {
       
  1834         updateGeometries();
       
  1835         q->update();
       
  1836     }
       
  1837 }
       
  1838 
       
  1839 /*!
       
  1840   \internal
       
  1841 
       
  1842   This sets widget \a w to be shown directly on the left of the first or
       
  1843   the right of the last menu item, depending on \a corner.
       
  1844 */
       
  1845 void QMenuBar::setCornerWidget(QWidget *w, Qt::Corner corner)
       
  1846 {
       
  1847     Q_D(QMenuBar);
       
  1848     switch (corner) {
       
  1849     case Qt::TopLeftCorner:
       
  1850         if (d->leftWidget)
       
  1851             d->leftWidget->removeEventFilter(this);
       
  1852         d->leftWidget = w;
       
  1853         break;
       
  1854     case Qt::TopRightCorner:
       
  1855         if (d->rightWidget)
       
  1856             d->rightWidget->removeEventFilter(this);
       
  1857         d->rightWidget = w;
       
  1858         break;
       
  1859     default:
       
  1860         qWarning("QMenuBar::setCornerWidget: Only TopLeftCorner and TopRightCorner are supported");
       
  1861         return;
       
  1862     }
       
  1863 
       
  1864     if (w) {
       
  1865         w->setParent(this);
       
  1866         w->installEventFilter(this);
       
  1867     }
       
  1868 
       
  1869     d->_q_updateLayout();
       
  1870 }
       
  1871 
       
  1872 /*!
       
  1873   \internal
       
  1874 
       
  1875   Returns the widget in the left of the first or the right of the last menu
       
  1876   item, depending on \a corner.
       
  1877 */
       
  1878 QWidget *QMenuBar::cornerWidget(Qt::Corner corner) const
       
  1879 {
       
  1880     Q_D(const QMenuBar);
       
  1881     QWidget *w = 0;
       
  1882     switch(corner) {
       
  1883     case Qt::TopLeftCorner:
       
  1884         w = d->leftWidget;
       
  1885         break;
       
  1886     case Qt::TopRightCorner:
       
  1887         w = d->rightWidget;
       
  1888         break;
       
  1889     default:
       
  1890         qWarning("QMenuBar::cornerWidget: Only TopLeftCorner and TopRightCorner are supported");
       
  1891         break;
       
  1892     }
       
  1893 
       
  1894     return w;
       
  1895 }
       
  1896 
       
  1897 /*!
       
  1898     \property QMenuBar::nativeMenuBar
       
  1899     \brief Whether or not a menubar will be used as a native menubar on platforms that support it
       
  1900     \since 4.6
       
  1901 
       
  1902     This property specifies whether or not the menubar should be used as a native menubar on platforms
       
  1903     that support it. The currently supported platforms are Mac OS X and Windows CE. On these platforms
       
  1904     if this property is true, the menubar is used in the native menubar and is not in the window of
       
  1905     its parent, if false the menubar remains in the window. On other platforms the value of this
       
  1906     attribute has no effect.
       
  1907 
       
  1908     The default is to follow whether the Qt::AA_DontUseNativeMenuBar attribute
       
  1909     is set for the application. Explicitly settings this property overrides
       
  1910     the presence (or abscence) of the attribute.
       
  1911 */
       
  1912 
       
  1913 void QMenuBar::setNativeMenuBar(bool nativeMenuBar)
       
  1914 {
       
  1915     Q_D(QMenuBar);
       
  1916     if (d->nativeMenuBar == -1 || (nativeMenuBar != bool(d->nativeMenuBar))) {
       
  1917         d->nativeMenuBar = nativeMenuBar;
       
  1918 #ifdef Q_WS_MAC
       
  1919         if (!d->nativeMenuBar) {
       
  1920             extern void qt_mac_clear_menubar();
       
  1921             qt_mac_clear_menubar();
       
  1922             d->macDestroyMenuBar();
       
  1923             const QList<QAction *> &menubarActions = actions();
       
  1924             for (int i = 0; i < menubarActions.size(); ++i) {
       
  1925                 const QAction *action = menubarActions.at(i);
       
  1926                 if (QMenu *menu = action->menu()) {
       
  1927                     delete menu->d_func()->mac_menu;
       
  1928                     menu->d_func()->mac_menu = 0;
       
  1929                 }
       
  1930             }
       
  1931         } else {
       
  1932             d->macCreateMenuBar(parentWidget());
       
  1933         }
       
  1934         macUpdateMenuBar();
       
  1935         updateGeometry();
       
  1936         setVisible(false);
       
  1937         setVisible(true);
       
  1938 #endif
       
  1939     }
       
  1940 }
       
  1941 
       
  1942 bool QMenuBar::isNativeMenuBar() const
       
  1943 {
       
  1944     Q_D(const QMenuBar);
       
  1945     if (d->nativeMenuBar == -1) {
       
  1946         return !QApplication::instance()->testAttribute(Qt::AA_DontUseNativeMenuBar);
       
  1947     }
       
  1948     return d->nativeMenuBar;
       
  1949 }
       
  1950 
       
  1951 /*!
       
  1952   \since 4.4
       
  1953 
       
  1954   Sets the default action to \a act.
       
  1955 
       
  1956   The default action is assigned to the left soft key. The menu is assigned
       
  1957   to the right soft key.
       
  1958 
       
  1959   Currently there is only support for the default action on Windows
       
  1960   Mobile. All other platforms ignore the default action.
       
  1961 
       
  1962   \sa defaultAction()
       
  1963 */
       
  1964 
       
  1965 #ifdef Q_WS_WINCE
       
  1966 void QMenuBar::setDefaultAction(QAction *act)
       
  1967 {
       
  1968     Q_D(QMenuBar);
       
  1969     if (d->defaultAction == act)
       
  1970         return;
       
  1971 #ifdef Q_WS_WINCE
       
  1972     if (qt_wince_is_mobile())
       
  1973         if (d->defaultAction) {
       
  1974             disconnect(d->defaultAction, SIGNAL(changed()), this, SLOT(_q_updateDefaultAction()));
       
  1975             disconnect(d->defaultAction, SIGNAL(destroyed()), this, SLOT(_q_updateDefaultAction()));
       
  1976         }
       
  1977 #endif
       
  1978     d->defaultAction = act;
       
  1979 #ifdef Q_WS_WINCE
       
  1980     if (qt_wince_is_mobile())
       
  1981         if (d->defaultAction) {
       
  1982             connect(d->defaultAction, SIGNAL(changed()), this, SLOT(_q_updateDefaultAction()));
       
  1983             connect(d->defaultAction, SIGNAL(destroyed()), this, SLOT(_q_updateDefaultAction()));
       
  1984         }
       
  1985     if (d->wce_menubar) {
       
  1986         d->wce_menubar->rebuild();
       
  1987     }
       
  1988 #endif
       
  1989 }
       
  1990 
       
  1991 /*!
       
  1992   \since 4.4
       
  1993 
       
  1994   Returns the current default action.
       
  1995 
       
  1996   \sa setDefaultAction()
       
  1997 */
       
  1998 QAction *QMenuBar::defaultAction() const
       
  1999 {
       
  2000     return d_func()->defaultAction;
       
  2001 }
       
  2002 #endif
       
  2003 
       
  2004 /*!
       
  2005     \fn void QMenuBar::triggered(QAction *action)
       
  2006 
       
  2007     This signal is emitted when an action in a menu belonging to this menubar
       
  2008     is triggered as a result of a mouse click; \a action is the action that
       
  2009     caused the signal to be emitted.
       
  2010 
       
  2011     Normally, you connect each menu action to a single slot using
       
  2012     QAction::triggered(), but sometimes you will want to connect
       
  2013     several items to a single slot (most often if the user selects
       
  2014     from an array). This signal is useful in such cases.
       
  2015 
       
  2016     \sa hovered(), QAction::triggered()
       
  2017 */
       
  2018 
       
  2019 /*!
       
  2020     \fn void QMenuBar::hovered(QAction *action)
       
  2021 
       
  2022     This signal is emitted when a menu action is highlighted; \a action
       
  2023     is the action that caused the event to be sent.
       
  2024 
       
  2025     Often this is used to update status information.
       
  2026 
       
  2027     \sa triggered(), QAction::hovered()
       
  2028 */
       
  2029 
       
  2030 
       
  2031 #ifdef QT3_SUPPORT
       
  2032 /*!
       
  2033     Use style()->pixelMetric(QStyle::PM_MenuBarPanelWidth, this)
       
  2034     instead.
       
  2035 */
       
  2036 int QMenuBar::frameWidth() const
       
  2037 {
       
  2038     return style()->pixelMetric(QStyle::PM_MenuBarPanelWidth, 0, this);
       
  2039 }
       
  2040 
       
  2041 int QMenuBar::insertAny(const QIcon *icon, const QString *text, const QObject *receiver, const char *member,
       
  2042                         const QKeySequence *shortcut, const QMenu *popup, int id, int index)
       
  2043 {
       
  2044     QAction *act = popup ? popup->menuAction() : new QAction(this);
       
  2045     if(id != -1)
       
  2046         static_cast<QMenuItem*>(act)->setId(id);
       
  2047     if(icon)
       
  2048         act->setIcon(*icon);
       
  2049     if(text)
       
  2050         act->setText(*text);
       
  2051     if(shortcut)
       
  2052         act->setShortcut(*shortcut);
       
  2053     if(receiver && member)
       
  2054         QObject::connect(act, SIGNAL(triggered(bool)), receiver, member);
       
  2055     if(index == -1 || index >= actions().count())
       
  2056         addAction(act);
       
  2057     else
       
  2058         insertAction(actions().value(index), act);
       
  2059     return findIdForAction(act);
       
  2060 }
       
  2061 
       
  2062 /*!
       
  2063     \since 4.2
       
  2064 
       
  2065     Use addSeparator() or insertAction() instead.
       
  2066 
       
  2067     \oldcode
       
  2068         menuBar->insertSeparator();
       
  2069     \newcode
       
  2070         menuBar->addSeparator();
       
  2071     \endcode
       
  2072 */
       
  2073 int QMenuBar::insertSeparator(int index)
       
  2074 {
       
  2075     QAction *act = new QAction(this);
       
  2076     act->setSeparator(true);
       
  2077     if(index == -1 || index >= actions().count())
       
  2078         addAction(act);
       
  2079     else
       
  2080         insertAction(actions().value(index), act);
       
  2081     return findIdForAction(act);
       
  2082 }
       
  2083 
       
  2084 /*!
       
  2085     Use QAction::setData() instead.
       
  2086 */
       
  2087 bool QMenuBar::setItemParameter(int id, int param)
       
  2088 {
       
  2089     if(QAction *act = findActionForId(id)) {
       
  2090         act->d_func()->param = param;
       
  2091         return true;
       
  2092     }
       
  2093     return false;
       
  2094 }
       
  2095 
       
  2096 /*!
       
  2097     Use QAction::data() instead.
       
  2098 */
       
  2099 int QMenuBar::itemParameter(int id) const
       
  2100 {
       
  2101     if(QAction *act = findActionForId(id))
       
  2102         return act->d_func()->param;
       
  2103     return id;
       
  2104 }
       
  2105 
       
  2106 QAction *QMenuBar::findActionForId(int id) const
       
  2107 {
       
  2108     QList<QAction *> list = actions();
       
  2109     for (int i = 0; i < list.size(); ++i) {
       
  2110         QAction *act = list.at(i);
       
  2111         if (findIdForAction(act) == id)
       
  2112             return act;
       
  2113     }
       
  2114     return 0;
       
  2115 }
       
  2116 
       
  2117 int QMenuBar::findIdForAction(QAction *act) const
       
  2118 {
       
  2119     Q_ASSERT(act);
       
  2120     return act->d_func()->id;
       
  2121 }
       
  2122 #endif
       
  2123 
       
  2124 /*!
       
  2125     \enum QMenuBar::Separator
       
  2126 
       
  2127     \compat
       
  2128 
       
  2129     \value Never
       
  2130     \value InWindowsStyle
       
  2131 
       
  2132 */
       
  2133 
       
  2134 /*!
       
  2135     \fn void QMenuBar::addAction(QAction *action)
       
  2136     \overload
       
  2137 
       
  2138     Appends the action \a action to the menu bar's list of actions.
       
  2139 
       
  2140     \sa QMenu::addAction(), QWidget::addAction(), QWidget::actions()
       
  2141 */
       
  2142 
       
  2143 /*!
       
  2144     \fn uint QMenuBar::count() const
       
  2145 
       
  2146     Use actions().count() instead.
       
  2147 */
       
  2148 
       
  2149 /*!
       
  2150     \fn int QMenuBar::insertItem(const QString &text, const QObject *receiver, const char* member, const QKeySequence& shortcut, int id, int index)
       
  2151 
       
  2152     Use one of the insertAction() or addAction() overloads instead.
       
  2153 */
       
  2154 
       
  2155 /*!
       
  2156     \fn int QMenuBar::insertItem(const QIcon& icon, const QString &text, const QObject *receiver, const char* member, const QKeySequence& shortcut, int id, int index)
       
  2157 
       
  2158     Use one of the insertAction() or addAction() overloads instead.
       
  2159 */
       
  2160 
       
  2161 /*!
       
  2162     \fn int QMenuBar::insertItem(const QPixmap &pixmap, const QObject *receiver, const char* member, const QKeySequence& shortcut, int id, int index)
       
  2163 
       
  2164     Use one of the insertAction(), addAction(), insertMenu(), or
       
  2165     addMenu() overloads instead.
       
  2166 */
       
  2167 
       
  2168 /*!
       
  2169     \fn int QMenuBar::insertItem(const QString &text, int id, int index)
       
  2170 
       
  2171     Use one of the insertAction() or addAction() overloads instead.
       
  2172 */
       
  2173 
       
  2174 /*!
       
  2175     \fn int QMenuBar::insertItem(const QIcon& icon, const QString &text, int id, int index)
       
  2176 
       
  2177     Use one of the insertAction(), addAction(), insertMenu(), or
       
  2178     addMenu() overloads instead.
       
  2179 */
       
  2180 
       
  2181 /*!
       
  2182     \fn int QMenuBar::insertItem(const QString &text, QMenu *popup, int id, int index)
       
  2183 
       
  2184     Use one of the insertMenu(), or addMenu() overloads instead.
       
  2185 */
       
  2186 
       
  2187 /*!
       
  2188     \fn int QMenuBar::insertItem(const QIcon& icon, const QString &text, QMenu *popup, int id, int index)
       
  2189 
       
  2190     Use one of the insertMenu(), or addMenu() overloads instead.
       
  2191 */
       
  2192 
       
  2193 /*!
       
  2194     \fn int QMenuBar::insertItem(const QPixmap &pixmap, int id, int index)
       
  2195 
       
  2196     Use one of the insertAction(), addAction(), insertMenu(), or
       
  2197     addMenu() overloads instead.
       
  2198 */
       
  2199 
       
  2200 /*!
       
  2201     \fn int QMenuBar::insertItem(const QPixmap &pixmap, QMenu *popup, int id, int index)
       
  2202 
       
  2203     Use one of the insertMenu(), or addMenu() overloads instead.
       
  2204 */
       
  2205 
       
  2206 /*!
       
  2207     \fn void QMenuBar::removeItem(int id)
       
  2208 
       
  2209     Use removeAction() instead.
       
  2210 */
       
  2211 
       
  2212 /*!
       
  2213     \fn void QMenuBar::removeItemAt(int index)
       
  2214 
       
  2215     Use removeAction() instead.
       
  2216 */
       
  2217 
       
  2218 /*!
       
  2219     \fn QKeySequence QMenuBar::accel(int id) const
       
  2220 
       
  2221     Use shortcut() on the relevant QAction instead.
       
  2222 */
       
  2223 
       
  2224 /*!
       
  2225     \fn void QMenuBar::setAccel(const QKeySequence& key, int id)
       
  2226 
       
  2227     Use setShortcut() on the relevant QAction instead.
       
  2228 */
       
  2229 
       
  2230 /*!
       
  2231     \fn QIcon QMenuBar::iconSet(int id) const
       
  2232 
       
  2233     Use icon() on the relevant QAction instead.
       
  2234 */
       
  2235 
       
  2236 /*!
       
  2237     \fn QString QMenuBar::text(int id) const
       
  2238 
       
  2239     Use text() on the relevant QAction instead.
       
  2240 */
       
  2241 
       
  2242 /*!
       
  2243     \fn QPixmap QMenuBar::pixmap(int id) const
       
  2244 
       
  2245     Use QPixmap(icon()) on the relevant QAction instead.
       
  2246 */
       
  2247 
       
  2248 /*!
       
  2249     \fn void QMenuBar::setWhatsThis(int id, const QString &w)
       
  2250 
       
  2251     Use setWhatsThis() on the relevant QAction instead.
       
  2252 */
       
  2253 
       
  2254 /*!
       
  2255     \fn QString QMenuBar::whatsThis(int id) const
       
  2256 
       
  2257     Use whatsThis() on the relevant QAction instead.
       
  2258 */
       
  2259 
       
  2260 /*!
       
  2261     \fn void QMenuBar::changeItem(int id, const QString &text)
       
  2262 
       
  2263     Use setText() on the relevant QAction instead.
       
  2264 */
       
  2265 
       
  2266 /*!
       
  2267     \fn void QMenuBar::changeItem(int id, const QPixmap &pixmap)
       
  2268 
       
  2269     Use setText() on the relevant QAction instead.
       
  2270 */
       
  2271 
       
  2272 /*!
       
  2273     \fn void QMenuBar::changeItem(int id, const QIcon &icon, const QString &text)
       
  2274 
       
  2275     Use setIcon() and setText() on the relevant QAction instead.
       
  2276 */
       
  2277 
       
  2278 /*!
       
  2279     \fn bool QMenuBar::isItemActive(int id) const
       
  2280 
       
  2281     Use activeAction() instead.
       
  2282 */
       
  2283 
       
  2284 /*!
       
  2285     \fn bool QMenuBar::isItemEnabled(int id) const
       
  2286 
       
  2287     Use isEnabled() on the relevant QAction instead.
       
  2288 */
       
  2289 
       
  2290 /*!
       
  2291     \fn void QMenuBar::setItemEnabled(int id, bool enable)
       
  2292 
       
  2293     Use setEnabled() on the relevant QAction instead.
       
  2294 */
       
  2295 
       
  2296 /*!
       
  2297     \fn bool QMenuBar::isItemChecked(int id) const
       
  2298 
       
  2299     Use isChecked() on the relevant QAction instead.
       
  2300 */
       
  2301 
       
  2302 /*!
       
  2303     \fn void QMenuBar::setItemChecked(int id, bool check)
       
  2304 
       
  2305     Use setChecked() on the relevant QAction instead.
       
  2306 */
       
  2307 
       
  2308 /*!
       
  2309     \fn bool QMenuBar::isItemVisible(int id) const
       
  2310 
       
  2311     Use isVisible() on the relevant QAction instead.
       
  2312 */
       
  2313 
       
  2314 /*!
       
  2315     \fn void QMenuBar::setItemVisible(int id, bool visible)
       
  2316 
       
  2317     Use setVisible() on the relevant QAction instead.
       
  2318 */
       
  2319 
       
  2320 /*!
       
  2321     \fn int QMenuBar::indexOf(int id) const
       
  2322 
       
  2323     Use actions().indexOf(action) on the relevant QAction instead.
       
  2324 */
       
  2325 
       
  2326 /*!
       
  2327     \fn int QMenuBar::idAt(int index) const
       
  2328 
       
  2329     Use actions instead.
       
  2330 */
       
  2331 
       
  2332 /*!
       
  2333     \fn void QMenuBar::activateItemAt(int index)
       
  2334 
       
  2335     Use activate() on the relevant QAction instead.
       
  2336 */
       
  2337 
       
  2338 /*!
       
  2339     \fn bool QMenuBar::connectItem(int id, const QObject *receiver, const char* member)
       
  2340 
       
  2341     Use connect() on the relevant QAction instead.
       
  2342 */
       
  2343 
       
  2344 /*!
       
  2345     \fn bool QMenuBar::disconnectItem(int id,const QObject *receiver, const char* member)
       
  2346 
       
  2347     Use disconnect() on the relevant QAction instead.
       
  2348 */
       
  2349 
       
  2350 /*!
       
  2351     \fn QMenuItem *QMenuBar::findItem(int id) const
       
  2352 
       
  2353     Use actions instead.
       
  2354 */
       
  2355 
       
  2356 /*!
       
  2357     \fn Separator QMenuBar::separator() const
       
  2358 
       
  2359     This function is provided only to make old code compile.
       
  2360 */
       
  2361 
       
  2362 /*!
       
  2363     \fn void QMenuBar::setSeparator(Separator sep)
       
  2364 
       
  2365     This function is provided only to make old code compile.
       
  2366 */
       
  2367 
       
  2368 /*!
       
  2369     \fn QRect QMenuBar::itemRect(int index)
       
  2370 
       
  2371     Use actionGeometry() on the relevant QAction instead.
       
  2372 */
       
  2373 
       
  2374 /*!
       
  2375     \fn int QMenuBar::itemAtPos(const QPoint &p)
       
  2376 
       
  2377     There is no equivalent way to achieve this in Qt 4.
       
  2378 */
       
  2379 
       
  2380 /*!
       
  2381     \fn void QMenuBar::activated(int itemId);
       
  2382 
       
  2383     Use triggered() instead.
       
  2384 */
       
  2385 
       
  2386 /*!
       
  2387     \fn void QMenuBar::highlighted(int itemId);
       
  2388 
       
  2389     Use hovered() instead.
       
  2390 */
       
  2391 
       
  2392 /*!
       
  2393     \fn void QMenuBar::setFrameRect(QRect)
       
  2394     \internal
       
  2395 */
       
  2396 
       
  2397 /*!
       
  2398     \fn QRect QMenuBar::frameRect() const
       
  2399     \internal
       
  2400 */
       
  2401 /*!
       
  2402     \enum QMenuBar::DummyFrame
       
  2403     \internal
       
  2404 
       
  2405     \value Box
       
  2406     \value Sunken
       
  2407     \value Plain
       
  2408     \value Raised
       
  2409     \value MShadow
       
  2410     \value NoFrame
       
  2411     \value Panel
       
  2412     \value StyledPanel
       
  2413     \value HLine
       
  2414     \value VLine
       
  2415     \value GroupBoxPanel
       
  2416     \value WinPanel
       
  2417     \value ToolBarPanel
       
  2418     \value MenuBarPanel
       
  2419     \value PopupPanel
       
  2420     \value LineEditPanel
       
  2421     \value TabWidgetPanel
       
  2422     \value MShape
       
  2423 */
       
  2424 
       
  2425 /*!
       
  2426     \fn void QMenuBar::setFrameShadow(DummyFrame)
       
  2427     \internal
       
  2428 */
       
  2429 
       
  2430 /*!
       
  2431     \fn DummyFrame QMenuBar::frameShadow() const
       
  2432     \internal
       
  2433 */
       
  2434 
       
  2435 /*!
       
  2436     \fn void QMenuBar::setFrameShape(DummyFrame)
       
  2437     \internal
       
  2438 */
       
  2439 
       
  2440 /*!
       
  2441     \fn DummyFrame QMenuBar::frameShape() const
       
  2442     \internal
       
  2443 */
       
  2444 
       
  2445 /*!
       
  2446     \fn void QMenuBar::setFrameStyle(int)
       
  2447     \internal
       
  2448 */
       
  2449 
       
  2450 /*!
       
  2451     \fn int QMenuBar::frameStyle() const
       
  2452     \internal
       
  2453 */
       
  2454 
       
  2455 /*!
       
  2456     \fn void QMenuBar::setLineWidth(int)
       
  2457     \internal
       
  2458 */
       
  2459 
       
  2460 /*!
       
  2461     \fn int QMenuBar::lineWidth() const
       
  2462     \internal
       
  2463 */
       
  2464 
       
  2465 /*!
       
  2466     \fn void QMenuBar::setMargin(int margin)
       
  2467     Sets the width of the margin around the contents of the widget to \a margin.
       
  2468 
       
  2469     Use QWidget::setContentsMargins() instead.
       
  2470     \sa margin(), QWidget::setContentsMargins()
       
  2471 */
       
  2472 
       
  2473 /*!
       
  2474     \fn int QMenuBar::margin() const
       
  2475     Returns the width of the margin around the contents of the widget.
       
  2476 
       
  2477     Use QWidget::getContentsMargins() instead.
       
  2478     \sa setMargin(), QWidget::getContentsMargins()
       
  2479 */
       
  2480 
       
  2481 /*!
       
  2482     \fn void QMenuBar::setMidLineWidth(int)
       
  2483     \internal
       
  2484 */
       
  2485 
       
  2486 /*!
       
  2487     \fn int QMenuBar::midLineWidth() const
       
  2488     \internal
       
  2489 */
       
  2490 
       
  2491 // for private slots
       
  2492 
       
  2493 
       
  2494 QT_END_NAMESPACE
       
  2495 
       
  2496 #include <moc_qmenubar.cpp>
       
  2497 
       
  2498 #endif // QT_NO_MENUBAR