Index: /trunk/src/VBox/Frontends/VirtualBox/src/medium/UIMediumSearchWidget.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/medium/UIMediumSearchWidget.cpp	(revision 77004)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/medium/UIMediumSearchWidget.cpp	(revision 77005)
@@ -25,6 +25,8 @@
 #include "QIDialogButtonBox.h"
 #include "QIToolButton.h"
+#include "QITreeWidget.h"
 #include "UIFDCreationDialog.h"
 #include "UIIconPool.h"
+#include "UIMediumItem.h"
 #include "UIMediumSearchWidget.h"
 #include "UIToolBar.h"
@@ -33,4 +35,37 @@
 # include "UIWindowMenuManager.h"
 #endif /* VBOX_WS_MAC */
+
+
+class FilterByNameUUID : public QITreeWidgetItemFilter
+{
+
+public:
+
+    FilterByNameUUID(UIMediumSearchWidget::SearchType enmSearchType, const QString &strSearchTerm)
+        : m_enmSearchType(enmSearchType)
+        , m_strSearchTerm(strSearchTerm){}
+
+    virtual bool operator()(QTreeWidgetItem *pItem) const
+    {
+        if (!pItem || m_strSearchTerm.isEmpty())
+            return false;
+        if (pItem->type() != QITreeWidgetItem::ItemType)
+            return false;
+
+        UIMediumItem *pMediumItem = static_cast<UIMediumItem*>(pItem);
+        if (!pMediumItem)
+            return false;
+        if (m_enmSearchType == UIMediumSearchWidget::SearchByUUID && !pMediumItem->id().toString().contains(m_strSearchTerm))
+            return false;
+        if (m_enmSearchType == UIMediumSearchWidget::SearchByName && !pMediumItem->name().contains(m_strSearchTerm))
+            return false;
+        return true;
+    }
+
+private:
+
+    UIMediumSearchWidget::SearchType m_enmSearchType;
+    QString m_strSearchTerm;
+};
 
 UIMediumSearchWidget::UIMediumSearchWidget(QWidget *pParent)
@@ -40,4 +75,6 @@
     , m_pShowNextMatchButton(0)
     , m_pShowPreviousMatchButton(0)
+    , m_pTreeWidget(0)
+    , m_iScrollToIndex(0)
 {
     prepareWidgets();
@@ -78,4 +115,6 @@
         m_pShowPreviousMatchButton->setIcon(UIIconPool::iconSet(":/log_viewer_search_backward_16px.png", ":/log_viewer_search_backward_disabled_16px.png"));
         connect(m_pShowPreviousMatchButton, &QIToolButton::clicked, this, &UIMediumSearchWidget::sigShowPreviousMatchingItem);
+        connect(m_pShowPreviousMatchButton, &QIToolButton::clicked, this, &UIMediumSearchWidget::sltShowPreviousMatchingItem);
+
         pLayout->addWidget(m_pShowPreviousMatchButton);
     }
@@ -85,4 +124,6 @@
         m_pShowNextMatchButton->setIcon(UIIconPool::iconSet(":/log_viewer_search_forward_16px.png", ":/log_viewer_search_forward_disabled_16px.png"));
         connect(m_pShowNextMatchButton, &QIToolButton::clicked, this, &UIMediumSearchWidget:: sigShowNextMatchingItem);
+        connect(m_pShowNextMatchButton, &QIToolButton::clicked, this, &UIMediumSearchWidget:: sltShowNextMatchingItem);
+
         pLayout->addWidget(m_pShowNextMatchButton);
     }
@@ -103,4 +144,22 @@
         return QString();
     return m_pSearchTermLineEdit->text();
+}
+
+void UIMediumSearchWidget::search(QITreeWidget* pTreeWidget)
+{
+    if (!pTreeWidget)
+        return;
+
+    m_pTreeWidget = pTreeWidget;
+    QList<QTreeWidgetItem*> allItems = pTreeWidget->filterItems(QITreeWidgetItemFilter());
+    markUnmarkItems(allItems, false);
+
+    m_matchedItemList = pTreeWidget->filterItems(FilterByNameUUID(searchType(), searchTerm()));
+    markUnmarkItems(m_matchedItemList, true);
+    if (!m_matchedItemList.isEmpty())
+    {
+        m_iScrollToIndex = 0;
+        pTreeWidget->scrollTo(pTreeWidget->itemIndex(m_matchedItemList[m_iScrollToIndex]), QAbstractItemView::PositionAtCenter);
+    }
 }
 
@@ -120,2 +179,47 @@
         m_pShowNextMatchButton->setToolTip("Show the next item matching the search term");
 }
+
+void UIMediumSearchWidget::showEvent(QShowEvent *pEvent)
+{
+    if (m_pSearchTermLineEdit)
+        m_pSearchTermLineEdit->setFocus();
+    QIWithRetranslateUI<QWidget>::showEvent(pEvent);
+}
+
+void UIMediumSearchWidget::markUnmarkItems(QList<QTreeWidgetItem*> &itemList, bool fMark)
+{
+    foreach (QTreeWidgetItem* pItem, itemList)
+    {
+        if (pItem->type() != QITreeWidgetItem::ItemType)
+            continue;
+        UIMediumItem *pMediumItem = static_cast<UIMediumItem*>(pItem);
+        if (!pMediumItem)
+            continue;
+        QFont font = pMediumItem->font(0);
+        font.setBold(fMark);
+        pMediumItem->setFont(0, font);
+    }
+}
+
+void UIMediumSearchWidget::sltShowNextMatchingItem()
+{
+    if (!m_pTreeWidget)
+        return;
+    if (++m_iScrollToIndex >= m_matchedItemList.size())
+        m_iScrollToIndex = 0;
+    if (!m_matchedItemList[m_iScrollToIndex])
+        return;
+    m_pTreeWidget->scrollTo(m_pTreeWidget->itemIndex(m_matchedItemList[m_iScrollToIndex]), QAbstractItemView::PositionAtCenter);
+}
+
+void UIMediumSearchWidget::sltShowPreviousMatchingItem()
+{
+    if (!m_pTreeWidget)
+        return;
+    if (--m_iScrollToIndex <= 0)
+        m_iScrollToIndex = m_matchedItemList.size() - 1;
+    if (!m_matchedItemList[m_iScrollToIndex])
+        return;
+    m_pTreeWidget->scrollTo(m_pTreeWidget->itemIndex(m_matchedItemList[m_iScrollToIndex]), QAbstractItemView::PositionAtCenter);
+
+}
Index: /trunk/src/VBox/Frontends/VirtualBox/src/medium/UIMediumSearchWidget.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/medium/UIMediumSearchWidget.h	(revision 77004)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/medium/UIMediumSearchWidget.h	(revision 77005)
@@ -27,8 +27,12 @@
 /* Forward declarations: */
 class QAction;
+class QTreeWidgetItem;
 class QLineEdit;
 class QIComboBox;
 class QIDialogButtonBox;
 class QIToolButton;
+class QITreeWidget;
+class UIMediumItem;
+
 
 /** QWidget extension providing a simple way to enter a earch term and search type for medium searching
@@ -58,16 +62,29 @@
     SearchType searchType() const;
     QString searchTerm() const;
+    void    search(QITreeWidget* pTreeWidget);
 
-protected:
+ protected:
 
     void retranslateUi() /* override */;
+    virtual void showEvent(QShowEvent *pEvent) /* override */;
+
+ private slots:
+
+    void sltShowNextMatchingItem();
+    void sltShowPreviousMatchingItem();
 
 private:
 
-    void              prepareWidgets();
+    void    prepareWidgets();
+    void    markUnmarkItems(QList<QTreeWidgetItem*> &itemList, bool fMark);
+
     QIComboBox       *m_pSearchComboxBox;
     QLineEdit        *m_pSearchTermLineEdit;
     QIToolButton     *m_pShowNextMatchButton;
     QIToolButton     *m_pShowPreviousMatchButton;
+
+    QList<QTreeWidgetItem*> m_matchedItemList;
+    QITreeWidget           *m_pTreeWidget;
+    int                     m_iScrollToIndex;
 };
 
