Index: /trunk/src/VBox/Frontends/VirtualBox/VirtualBox1.qrc
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/VirtualBox1.qrc	(revision 86860)
+++ /trunk/src/VBox/Frontends/VirtualBox/VirtualBox1.qrc	(revision 86861)
@@ -380,4 +380,7 @@
         <file alias="hd_warning_16px.png">images/hd_warning_16px.png</file>
         <file alias="hd_write_16px.png">images/hd_write_16px.png</file>
+        <file alias="help_browser_plus_32px.png">images/help_browser_plus_32px.png</file>
+        <file alias="help_browser_minus_32px.png">images/help_browser_minus_32px.png</file>
+        <file alias="help_browser_reset_32px.png">images/help_browser_reset_32px.png</file>
         <file alias="help_browser_add_bookmark.png">images/help_browser_add_bookmark.png</file>
         <file alias="help_browser_backward_32px.png">images/help_browser_backward_32px.png</file>
Index: /trunk/src/VBox/Frontends/VirtualBox/src/helpbrowser/UIHelpBrowserWidget.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/helpbrowser/UIHelpBrowserWidget.cpp	(revision 86860)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/helpbrowser/UIHelpBrowserWidget.cpp	(revision 86861)
@@ -34,14 +34,14 @@
 #include <QMenu>
 #include <QMouseEvent>
+#include <QPainter>
 #include <QPixmap>
 #include <QtPrintSupport/QPrintDialog>
 #include <QtPrintSupport/QPrinter>
 #include <QPushButton>
-#include <QScrollBar>
 #include <QSpacerItem>
-#include <QStyle>
 #include <QSplitter>
 #include <QTextBrowser>
 #include <QVBoxLayout>
+#include <QWidgetAction>
 #ifdef RT_OS_SOLARIS
 # include <QFontDatabase>
@@ -50,4 +50,5 @@
 /* GUI includes: */
 #include "UICommon.h"
+#include "QIAdvancedSlider.h"
 #include "QIFileDialog.h"
 #include "QITabWidget.h"
@@ -77,5 +78,46 @@
 Q_DECLARE_METATYPE(HelpBrowserTabs);
 
-const int iBookmarkUrlDataType = 6;
+static const int iBookmarkUrlDataType = 6;
+static const QPair<float, float> fontScaleMinMax(0.5f, 3.f);
+
+/*********************************************************************************************************************************
+*   UIFontScaleWidget definition.                                                                                         *
+*********************************************************************************************************************************/
+class UIFontScaleWidget : public QIWithRetranslateUI<QWidget>
+{
+
+    Q_OBJECT;
+
+signals:
+
+    void sigFontPointSizeChanged(int iNewFontPointSize);
+
+public:
+
+    UIFontScaleWidget(int iInitialFontPointSize, QWidget *pParent = 0);
+    void setFontPointSize(int iFontPointSize);
+    int fontPointSize() const;
+
+protected:
+
+    void retranslateUi() /* override */;
+
+private slots:
+
+    void sltSetFontPointSize();
+
+private:
+
+    void prepare();
+    int fontPercentage() const;
+    QHBoxLayout  *m_pMainLayout;
+    QIToolButton *m_pMinusButton;
+    QIToolButton *m_pResetButton;
+    QIToolButton *m_pPlusButton;
+    QIAdvancedSlider *m_pSlider;
+    QLabel *m_pValueLabel;
+    int m_iInitialFontPointSize;
+    int m_iFontPointSize;
+};
 
 
@@ -185,4 +227,5 @@
     void sigOpenLinkInNewTab(const QUrl &url);
     void sigCloseFindInPageWidget();
+    void sigFontPointSizeChanged(int iFontPointSize);
 
 public:
@@ -193,4 +236,5 @@
     void setSource(const QUrl &url, const QString &strError);
     void toggleFindInPageWidget(bool fVisible);
+    int initialFontPointSize() const;
 
 public slots:
@@ -200,6 +244,6 @@
 
     void contextMenuEvent(QContextMenuEvent *event) /* override */;
-    virtual void paintEvent(QPaintEvent *pEvent) /* override */;
     virtual void resizeEvent(QResizeEvent *pEvent) /* override */;
+    virtual void wheelEvent(QWheelEvent *pEvent) /* override */;
 
 private slots:
@@ -228,4 +272,5 @@
     int m_iSelectedMatchIndex;
     int m_iSearchTermLength;
+    int m_iInitialFontPointSize;
 };
 
@@ -244,4 +289,5 @@
     void sigOpenLinkInNewTab(const QUrl &url);
     void sigAddBookmark(const QUrl &url, const QString &strTitle);
+    void sigFontPointSizeChanged(int iFontPointSize);
 
 public:
@@ -254,5 +300,7 @@
     QString documentTitle() const;
     void setToolBarVisible(bool fVisible);
-    void printCurrent(QPrinter &printer);
+    void print(QPrinter &printer);
+    int initialFontPointSize() const;
+    void setFontPointSize(int iPointSize);
 
 private slots:
@@ -318,4 +366,10 @@
     void setToolBarVisible(bool fVisible);
     void printCurrent(QPrinter &printer);
+    int initialFontPointSize() const;
+    void setFontPointSize(int iPointSize);
+
+protected:
+
+    virtual void paintEvent(QPaintEvent *pEvent) /* override */;
 
 private slots:
@@ -325,4 +379,5 @@
     void sltHandleTabClose(int iTabIndex);
     void sltHandleCurrentChanged(int iTabIndex);
+    void sltHandleFontSizeChange(int iFontPointSize);
 
 private:
@@ -332,8 +387,108 @@
     void addNewTab(const QUrl &initialUrl);
     const QHelpEngine* m_pHelpEngine;
+    UIFontScaleWidget *m_pFontScaleWidget;
     QUrl m_homeUrl;
     QStringList m_savedUrlList;
     bool m_fSwitchToNewTab;
 };
+
+
+/*********************************************************************************************************************************
+*   UIFontScaleWidget implementation.                                                                                            *
+*********************************************************************************************************************************/
+
+UIFontScaleWidget::UIFontScaleWidget(int iInitialFontPointSize, QWidget *pParent /* = 0 */)
+    :QIWithRetranslateUI<QWidget>(pParent)
+    , m_pMainLayout(0)
+    , m_pMinusButton(0)
+    , m_pResetButton(0)
+    , m_pPlusButton(0)
+    , m_pSlider(0)
+    , m_pValueLabel(0)
+    , m_iInitialFontPointSize(iInitialFontPointSize)
+    , m_iFontPointSize(iInitialFontPointSize)
+{
+    prepare();
+}
+
+void UIFontScaleWidget::setFontPointSize(int iFontPointSize)
+{
+    if (m_iFontPointSize == iFontPointSize)
+        return;
+    m_iFontPointSize = iFontPointSize;
+    if (m_pValueLabel && m_iInitialFontPointSize != 0)
+    {
+        m_pValueLabel->setText(QString("%1\%").arg(QString::number(fontPercentage())));
+    }
+}
+
+int UIFontScaleWidget::fontPointSize() const
+{
+    return m_iFontPointSize;
+}
+
+void UIFontScaleWidget::retranslateUi()
+{
+}
+
+void UIFontScaleWidget::prepare()
+{
+    setAutoFillBackground(true);
+    m_pMainLayout = new QHBoxLayout(this);
+    AssertReturnVoid(m_pMainLayout);
+    m_pMainLayout->setSpacing(0);
+    m_pMainLayout->setContentsMargins(0, 0, 0, 0);
+    m_pMinusButton = new QIToolButton;
+    m_pResetButton = new QIToolButton;
+    m_pPlusButton = new QIToolButton;
+    //m_pSlider = new QIAdvancedSlider;
+    m_pValueLabel = new QLabel;
+    AssertReturnVoid(m_pMinusButton &&
+                     m_pResetButton &&
+                     m_pPlusButton &&
+                     m_pValueLabel);
+
+    m_pValueLabel->setText(QString("%1\%").arg(QString::number(fontPercentage())));
+
+    m_pMinusButton->setIcon(UIIconPool::iconSet(":/help_browser_minus_32px.png"));
+    m_pResetButton->setIcon(UIIconPool::iconSet(":/help_browser_reset_32px.png"));
+    m_pPlusButton->setIcon(UIIconPool::iconSet(":/help_browser_plus_32px.png"));
+
+    connect(m_pPlusButton, &QIToolButton::pressed, this, &UIFontScaleWidget::sltSetFontPointSize);
+    connect(m_pMinusButton, &QIToolButton::pressed, this, &UIFontScaleWidget::sltSetFontPointSize);
+    connect(m_pResetButton, &QIToolButton::pressed, this, &UIFontScaleWidget::sltSetFontPointSize);
+
+    m_pMainLayout->addWidget(m_pResetButton);
+    m_pMainLayout->addWidget(m_pMinusButton);
+    //m_pMainLayout->addWidget(m_pSlider);
+    m_pMainLayout->addWidget(m_pValueLabel);
+    m_pMainLayout->addWidget(m_pPlusButton);
+}
+
+int UIFontScaleWidget::fontPercentage() const
+{
+    if (m_iInitialFontPointSize == 0)
+        return 0;
+    return 100 * m_iFontPointSize / m_iInitialFontPointSize;
+}
+
+void UIFontScaleWidget::sltSetFontPointSize()
+{
+    if (!sender())
+        return;
+    int iStep = 2;
+    int iNewSize = m_iFontPointSize;
+    if (sender() == m_pMinusButton)
+        iNewSize -= iStep;
+    else if (sender() == m_pPlusButton)
+        iNewSize += iStep;
+    else if (sender() == m_pResetButton)
+        iNewSize = m_iInitialFontPointSize;
+    if (iNewSize >= fontScaleMinMax.second * m_iInitialFontPointSize ||
+        iNewSize <= fontScaleMinMax.first * m_iInitialFontPointSize)
+        iNewSize = m_iFontPointSize;
+    setFontPointSize(iNewSize);
+    emit sigFontPointSizeChanged(m_iFontPointSize);
+}
 
 
@@ -587,9 +742,26 @@
 }
 
-void UIHelpBrowserTab::printCurrent(QPrinter &printer)
+void UIHelpBrowserTab::print(QPrinter &printer)
 {
     if (m_pContentViewer)
-    {
         m_pContentViewer->print(&printer);
+}
+
+int UIHelpBrowserTab::initialFontPointSize() const
+{
+    if (m_pContentViewer)
+        return m_pContentViewer->initialFontPointSize();
+    return 0;
+}
+
+void UIHelpBrowserTab::setFontPointSize(int iPointSize)
+{
+    if (m_pContentViewer)
+    {
+        if (m_pContentViewer->font().pointSize() == iPointSize)
+            return;
+        QFont mFont = m_pContentViewer->font();
+        mFont.setPointSize(iPointSize);
+        m_pContentViewer->setFont(mFont);
     }
 }
@@ -613,5 +785,4 @@
     m_pMainLayout->addWidget(m_pContentViewer);
     m_pContentViewer->setOpenExternalLinks(false);
-
     connect(m_pContentViewer, &UIHelpBrowserViewer::sourceChanged,
         this, &UIHelpBrowserTab::sigSourceChanged);
@@ -624,4 +795,6 @@
     connect(m_pContentViewer, &UIHelpBrowserViewer::sigCloseFindInPageWidget,
             this, &UIHelpBrowserTab::sltCloseFindInPageWidget);
+    connect(m_pContentViewer, &UIHelpBrowserViewer::sigFontPointSizeChanged,
+            this, &UIHelpBrowserTab::sigFontPointSizeChanged);
 
     m_pContentViewer->setSource(initialUrl, m_strPageNotFoundText);
@@ -794,4 +967,5 @@
     , m_iSearchTermLength(0)
 {
+    m_iInitialFontPointSize = font().pointSize();
     setUndoRedoEnabled(true);
     connect(m_pFindInPageWidget, &UIFindInPageWidget::sigDragging,
@@ -853,4 +1027,9 @@
 }
 
+int UIHelpBrowserViewer::initialFontPointSize() const
+{
+    return m_iInitialFontPointSize;
+}
+
 void UIHelpBrowserViewer::contextMenuEvent(QContextMenuEvent *event)
 {
@@ -871,9 +1050,4 @@
 }
 
-void UIHelpBrowserViewer::paintEvent(QPaintEvent *pEvent)
-{
-    QIWithRetranslateUI<QTextBrowser>::paintEvent(pEvent);
-}
-
 void UIHelpBrowserViewer::resizeEvent(QResizeEvent *pEvent)
 {
@@ -887,4 +1061,19 @@
 }
 
+void UIHelpBrowserViewer::wheelEvent(QWheelEvent *pEvent)
+{
+    int iPreviousSize = font().pointSize();
+    QTextBrowser::wheelEvent(pEvent);
+    /* Don't allow font size to get too large or small: */
+    if (font().pointSize() >= fontScaleMinMax.second * m_iInitialFontPointSize ||
+        font().pointSize() <= fontScaleMinMax.first * m_iInitialFontPointSize)
+    {
+        QFont mFont = font();
+        mFont.setPointSize(iPreviousSize);
+        setFont(mFont);
+    }
+    else
+        emit sigFontPointSizeChanged(font().pointSize());
+}
 
 void UIHelpBrowserViewer::retranslateUi()
@@ -1035,4 +1224,5 @@
     : QITabWidget(pParent)
     , m_pHelpEngine(pHelpEngine)
+    , m_pFontScaleWidget(0)
     , m_homeUrl(homeUrl)
     , m_savedUrlList(urlList)
@@ -1055,6 +1245,16 @@
    connect(pTabWidget, &UIHelpBrowserTab::sigAddBookmark,
            this, &UIHelpBrowserTabManager::sigAddBookmark);
+   connect(pTabWidget, &UIHelpBrowserTab::sigFontPointSizeChanged,
+           this, &UIHelpBrowserTabManager::sltHandleFontSizeChange);
+
    if (m_fSwitchToNewTab)
        setCurrentIndex(index);
+
+   if (!m_pFontScaleWidget)
+   {
+       m_pFontScaleWidget = new UIFontScaleWidget(initialFontPointSize(), this);
+       connect(m_pFontScaleWidget, &UIFontScaleWidget::sigFontPointSizeChanged,
+               this, &UIHelpBrowserTabManager::sltHandleFontSizeChange);
+   }
 }
 
@@ -1119,5 +1319,37 @@
     if (!pTab)
         return;
-    return pTab->printCurrent(printer);
+    return pTab->print(printer);
+}
+
+void UIHelpBrowserTabManager::paintEvent(QPaintEvent *pEvent)
+{
+    if (m_pFontScaleWidget)
+    {
+        int iMargin = 20;
+        m_pFontScaleWidget->move(width() - m_pFontScaleWidget->width() - iMargin,
+                                 height() - m_pFontScaleWidget->height() - iMargin);
+    }
+    QITabWidget::paintEvent(pEvent);
+}
+
+int UIHelpBrowserTabManager::initialFontPointSize() const
+{
+    UIHelpBrowserTab *pTab = qobject_cast<UIHelpBrowserTab*>(currentWidget());
+    if (!pTab)
+        return 0;
+    return pTab->initialFontPointSize();
+}
+
+void UIHelpBrowserTabManager::setFontPointSize(int iPointSize)
+{
+    for (int i = 0; i < count(); ++i)
+    {
+        UIHelpBrowserTab *pTab = qobject_cast<UIHelpBrowserTab*>(widget(i));
+        if (!pTab)
+            continue;
+        pTab->setFontPointSize(iPointSize);
+    }
+    if (m_pFontScaleWidget)
+        m_pFontScaleWidget->setFontPointSize(iPointSize);
 }
 
@@ -1156,4 +1388,9 @@
     Q_UNUSED(iTabIndex);
     emit sigSourceChanged(currentSource());
+}
+
+void UIHelpBrowserTabManager::sltHandleFontSizeChange(int iFontPointSize)
+{
+    setFontPointSize(iFontPointSize);
 }
 
@@ -1233,5 +1470,4 @@
 }
 
-
 bool UIHelpBrowserWidget::shouldBeMaximized() const
 {
@@ -1408,4 +1644,5 @@
     m_pViewMenu = new QMenu(tr("View"), this);
     AssertReturnVoid(m_pViewMenu);
+
     if (m_pPrintDialogAction)
         m_pFileMenu->addAction(m_pPrintDialogAction);
@@ -1717,4 +1954,5 @@
         m_pTabManager->setSource(url, false);
 }
+
 #include "UIHelpBrowserWidget.moc"
 
