Index: /trunk/src/VBox/Frontends/VirtualBox/src/helpbrowser/UIHelpBrowserWidget.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/helpbrowser/UIHelpBrowserWidget.cpp	(revision 86834)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/helpbrowser/UIHelpBrowserWidget.cpp	(revision 86835)
@@ -31,7 +31,9 @@
 #endif
 #include <QLabel>
+#include <QListWidget>
 #include <QMenu>
 #include <QMouseEvent>
 #include <QPixmap>
+#include <QPushButton>
 #include <QScrollBar>
 #include <QSpacerItem>
@@ -73,4 +75,61 @@
 Q_DECLARE_METATYPE(HelpBrowserTabs);
 
+const int iBookmarkUrlDataType = 6;
+
+
+/*********************************************************************************************************************************
+*   UIBookmarksListContainer definition.                                                                                         *
+*********************************************************************************************************************************/
+class UIBookmarksListWidget : public QListWidget
+{
+
+    Q_OBJECT;
+
+signals:
+
+    void sigBookmarkDoubleClick(const QUrl &url);
+
+public:
+
+    UIBookmarksListWidget(QWidget *pParent = 0);
+
+protected:
+
+    void mouseDoubleClickEvent(QMouseEvent *event) /* override */;
+
+};
+
+
+/*********************************************************************************************************************************
+*   UIBookmarksListContainer definition.                                                                                         *
+*********************************************************************************************************************************/
+class UIBookmarksListContainer : public QIWithRetranslateUI<QWidget>
+{
+
+    Q_OBJECT;
+
+signals:
+
+    void sigBookmarkDoubleClick(const QUrl &url);
+    void sigListWidgetContextMenuRequest(const QPoint &listWidgetLocalPos);
+
+public:
+
+    UIBookmarksListContainer(QWidget *pParent = 0);
+    void addBookmark(const QUrl &url, const QString &strTitle);
+    QUrl currentBookmarkUrl();
+
+protected:
+
+    void retranslateUi() /* override */;
+
+private:
+
+    void prepare();
+    int itemIndex(const QUrl &url);
+
+    QVBoxLayout  *m_pMainLayout;
+    UIBookmarksListWidget  *m_pListWidget;
+};
 
 /*********************************************************************************************************************************
@@ -182,4 +241,5 @@
     void sigTitleUpdate(const QString &strTitle);
     void sigOpenLinkInNewTab(const QUrl &url);
+    void sigAddBookmark(const QUrl &url, const QString &strTitle);
 
 public:
@@ -240,4 +300,5 @@
 
     void sigSourceChanged(const QUrl &url);
+    void sigAddBookmark(const QUrl &url, const QString &strTitle);
 
 public:
@@ -271,4 +332,83 @@
     bool m_fSwitchToNewTab;
 };
+
+
+/*********************************************************************************************************************************
+*   UIBookmarksListContainer implementation.                                                                                     *
+*********************************************************************************************************************************/
+UIBookmarksListWidget::UIBookmarksListWidget(QWidget *pParent /* = 0 */)
+    :QListWidget(pParent)
+{
+}
+
+void UIBookmarksListWidget::mouseDoubleClickEvent(QMouseEvent *event)
+{
+    QListWidgetItem *pItem = currentItem();
+    if (!pItem)
+        return;
+    emit sigBookmarkDoubleClick(pItem->data(iBookmarkUrlDataType).toUrl());
+    QListWidget::mouseDoubleClickEvent(event);
+}
+
+
+/*********************************************************************************************************************************
+*   UIBookmarksListContainer implementation.                                                                                     *
+*********************************************************************************************************************************/
+
+UIBookmarksListContainer::UIBookmarksListContainer(QWidget *pParent /* = 0 */)
+    :QIWithRetranslateUI<QWidget>(pParent)
+    , m_pMainLayout(0)
+    , m_pListWidget(0)
+{
+    prepare();
+}
+
+void UIBookmarksListContainer::addBookmark(const QUrl &url, const QString &strTitle)
+{
+    if (!m_pListWidget)
+        return;
+    if (itemIndex(url) != -1)
+        return;
+    QListWidgetItem *pNewItem = new QListWidgetItem(strTitle, m_pListWidget);
+    pNewItem->setData(iBookmarkUrlDataType, url);
+    pNewItem->setToolTip(url.toString());
+}
+
+QUrl UIBookmarksListContainer::currentBookmarkUrl()
+{
+    if (!m_pListWidget || !m_pListWidget->currentItem())
+        return QUrl();
+    return m_pListWidget->currentItem()->data(iBookmarkUrlDataType).toUrl();
+}
+
+void UIBookmarksListContainer::retranslateUi()
+{
+}
+
+void UIBookmarksListContainer::prepare()
+{
+    m_pMainLayout = new QVBoxLayout(this);
+    AssertReturnVoid(m_pMainLayout);
+    m_pListWidget = new UIBookmarksListWidget;
+    AssertReturnVoid(m_pListWidget);
+    m_pMainLayout->addWidget(m_pListWidget);
+    m_pListWidget->setContextMenuPolicy(Qt::CustomContextMenu);
+    connect(m_pListWidget, &UIBookmarksListWidget::sigBookmarkDoubleClick,
+            this, &UIBookmarksListContainer::sigBookmarkDoubleClick);
+    connect(m_pListWidget, &UIBookmarksListWidget::customContextMenuRequested,
+            this, &UIBookmarksListContainer::sigListWidgetContextMenuRequest);
+}
+
+int UIBookmarksListContainer::itemIndex(const QUrl &url)
+{
+    if (!m_pListWidget || !url.isValid())
+        return -1;
+    for (int i = 0; i < m_pListWidget->count(); ++i)
+    {
+        if (m_pListWidget->item(i)->data(iBookmarkUrlDataType).toUrl() == url)
+            return i;
+    }
+    return -1;
+}
 
 
@@ -495,5 +635,5 @@
 
     connect(m_pHomeAction, &QAction::triggered, this, &UIHelpBrowserTab::sltHandleHomeAction);
-    connect(m_pBackwardAction, &QAction::triggered, this, &UIHelpBrowserTab::sltHandleAddBookmarkAction);
+    connect(m_pAddBookmarkAction, &QAction::triggered, this, &UIHelpBrowserTab::sltHandleAddBookmarkAction);
     connect(m_pForwardAction, &QAction::triggered, this, &UIHelpBrowserTab::sltHandleForwardAction);
     connect(m_pBackwardAction, &QAction::triggered, this, &UIHelpBrowserTab::sltHandleBackwardAction);
@@ -614,4 +754,5 @@
 void UIHelpBrowserTab::sltHandleAddBookmarkAction()
 {
+    emit sigAddBookmark(source(), documentTitle());
 }
 
@@ -900,4 +1041,6 @@
    connect(pTabWidget, &UIHelpBrowserTab::sigOpenLinkInNewTab,
            this, &UIHelpBrowserTabManager::sltHandleOpenLinkInNewTab);
+   connect(pTabWidget, &UIHelpBrowserTab::sigAddBookmark,
+           this, &UIHelpBrowserTabManager::sigAddBookmark);
    if (m_fSwitchToNewTab)
        setCurrentIndex(index);
@@ -1107,5 +1250,5 @@
     m_pMainLayout->addWidget(m_pSplitter);
     m_pHelpEngine = new QHelpEngine(m_strHelpFilePath, this);
-    m_pBookmarksWidget = new QWidget(this);
+    m_pBookmarksWidget = new UIBookmarksListContainer(this);
     m_pTabWidget = new QITabWidget;
     m_pTabManager = new UIHelpBrowserTabManager(m_pHelpEngine, findIndexHtml(), loadSavedUrlList());
@@ -1125,6 +1268,6 @@
 
     m_pTabWidget->insertTab(HelpBrowserTabs_TOC, m_pContentWidget, QString());
+    m_pTabWidget->insertTab(HelpBrowserTabs_Bookmarks, m_pBookmarksWidget, QString());
     m_pTabWidget->insertTab(HelpBrowserTabs_Index, m_pIndexWidget, QString());
-    m_pTabWidget->insertTab(HelpBrowserTabs_Bookmarks, m_pBookmarksWidget, QString());
 
     m_pSplitter->addWidget(m_pTabManager);
@@ -1136,4 +1279,6 @@
     connect(m_pTabManager, &UIHelpBrowserTabManager::sigSourceChanged,
             this, &UIHelpBrowserWidget::sltHandleHelpBrowserViewerSourceChange);
+    connect(m_pTabManager, &UIHelpBrowserTabManager::sigAddBookmark,
+           this, &UIHelpBrowserWidget::sltAddNewBookmark);
     connect(m_pHelpEngine, &QHelpEngine::setupFinished,
             this, &UIHelpBrowserWidget::sltHandleHelpEngineSetupFinished);
@@ -1143,4 +1288,8 @@
             this, &UIHelpBrowserWidget::sltHandleContentsCreated);
     connect(m_pContentWidget, &QHelpContentWidget::customContextMenuRequested,
+            this, &UIHelpBrowserWidget::sltShowLinksContextMenu);
+    connect(m_pBookmarksWidget, &UIBookmarksListContainer::sigBookmarkDoubleClick,
+            this, &UIHelpBrowserWidget::sltOpenLinkWithUrl);
+    connect(m_pBookmarksWidget, &UIBookmarksListContainer::sigListWidgetContextMenuRequest,
             this, &UIHelpBrowserWidget::sltShowLinksContextMenu);
 
@@ -1459,9 +1608,19 @@
         if (!browser)
             return;
-        if (!browser->rect().contains(pos, true))
-            return;
+        // if (!browser->rect().contains(pos, true))
+        //     return;
         QPoint browserPos = browser->mapFromGlobal(m_pSearchResultWidget->mapToGlobal(pos));
         url = browser->anchorAt(browserPos);
     }
+    else if (pSender == m_pBookmarksWidget)
+    {
+        /* Assuming that only the UIBookmarksListWidget under the m_pBookmarksWidget sends the context menu request: */
+        UIBookmarksListWidget *pListWidget = m_pBookmarksWidget->findChild<UIBookmarksListWidget*>();
+        if (!pListWidget)
+            return;
+        url = m_pBookmarksWidget->currentBookmarkUrl();
+    }
+    else
+        return;
 
     if (!url.isValid())
@@ -1491,4 +1650,10 @@
 }
 
+void UIHelpBrowserWidget::sltAddNewBookmark(const QUrl &url, const QString &strTitle)
+{
+    if (m_pBookmarksWidget)
+        m_pBookmarksWidget->addBookmark(url, strTitle);
+}
+
 void UIHelpBrowserWidget::openLinkSlotHandler(QObject *pSenderObject, bool fOpenInNewTab)
 {
Index: /trunk/src/VBox/Frontends/VirtualBox/src/helpbrowser/UIHelpBrowserWidget.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/helpbrowser/UIHelpBrowserWidget.h	(revision 86834)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/helpbrowser/UIHelpBrowserWidget.h	(revision 86835)
@@ -52,4 +52,5 @@
 class QIToolBar;
 class UIActionPool;
+class UIBookmarksListContainer;
 class UIDialogPanel;
 class UIHelpBrowserTabManager;
@@ -98,4 +99,5 @@
     void sltOpenLinkInNewTab();
     void sltOpenLink();
+    void sltAddNewBookmark(const QUrl &url, const QString &strTitle);
 
 private:
@@ -157,7 +159,7 @@
     QHelpSearchEngine   *m_pSearchEngine;
     QHelpSearchQueryWidget *m_pSearchQueryWidget;
-    QHelpSearchResultWidget *m_pSearchResultWidget;
-    UIHelpBrowserTabManager *m_pTabManager;
-    QWidget             *m_pBookmarksWidget;
+    QHelpSearchResultWidget  *m_pSearchResultWidget;
+    UIHelpBrowserTabManager  *m_pTabManager;
+    UIBookmarksListContainer *m_pBookmarksWidget;
     QWidget             *m_pSearchContainerWidget;
     QAction             *m_pShowHideSideBarAction;
