Index: /trunk/src/VBox/Frontends/VirtualBox/src/medium/UIMediumManager.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/medium/UIMediumManager.cpp	(revision 49581)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/medium/UIMediumManager.cpp	(revision 49582)
@@ -146,23 +146,30 @@
 
 
-/* Medium-item iterator: */
-class UIMediumItemIterator : public QTreeWidgetItemIterator
+/** Functor allowing to check if passed UIMediumItem is suitable by ID. */
+class CheckIfSuitableByID : public CheckIfSuitableBy
 {
 public:
-
-    UIMediumItemIterator(QTreeWidget *pTree)
-        : QTreeWidgetItemIterator(pTree) {}
-
-    UIMediumItem* operator*()
-    {
-        QTreeWidgetItem *pItem = QTreeWidgetItemIterator::operator*();
-        return pItem && pItem->type() == UIMediumItem::Type ?
-            static_cast<UIMediumItem*>(pItem) : 0;
-    }
-
-    UIMediumItemIterator& operator++()
-    {
-        return static_cast<UIMediumItemIterator&>(QTreeWidgetItemIterator::operator++());
-    }
+    /** Constructor. */
+    CheckIfSuitableByID(const QString &strID) : m_strID(strID) {}
+
+private:
+    /** Determines whether passed UIMediumItem is suitable by ID. */
+    bool isItSuitable(UIMediumItem *pItem) const { return pItem->id() == m_strID; }
+    /** Holds the ID to compare to. */
+    QString m_strID;
+};
+
+/** Functor allowing to check if passed UIMediumItem is suitable by @a state. */
+class CheckIfSuitableByState : public CheckIfSuitableBy
+{
+public:
+    /** Constructor. */
+    CheckIfSuitableByState(KMediumState state) : m_state(state) {}
+
+private:
+    /** Determines whether passed UIMediumItem is suitable by @a state. */
+    bool isItSuitable(UIMediumItem *pItem) const { return pItem->state() == m_state; }
+    /** Holds the @a state to compare to. */
+    KMediumState m_state;
 };
 
@@ -345,5 +352,5 @@
     {
         pTree = treeWidget(type);
-        pMediumItem = searchItem(pTree, strMediumID);
+        pMediumItem = searchItem(pTree, CheckIfSuitableByID(strMediumID));
         if (pMediumItem)
             break;
@@ -437,7 +444,7 @@
     switch (medium.type())
     {
-        case UIMediumType_HardDisk: pMediumItem = searchItem(mTwHD, medium.id()); break;
-        case UIMediumType_DVD:      pMediumItem = searchItem(mTwCD, medium.id()); break;
-        case UIMediumType_Floppy:   pMediumItem = searchItem(mTwFD, medium.id()); break;
+        case UIMediumType_HardDisk: pMediumItem = searchItem(mTwHD, CheckIfSuitableByID(medium.id())); break;
+        case UIMediumType_DVD:      pMediumItem = searchItem(mTwCD, CheckIfSuitableByID(medium.id())); break;
+        case UIMediumType_Floppy:   pMediumItem = searchItem(mTwFD, CheckIfSuitableByID(medium.id())); break;
         default: AssertFailed();
     }
@@ -1468,18 +1475,30 @@
 }
 
-UIMediumItem* UIMediumManager::searchItem(QTreeWidget *pTree, const QString &strId) const
-{
-    /* Make sure passed ID is valid: */
-    if (strId.isNull())
+UIMediumItem* UIMediumManager::searchItem(QTreeWidget *pTree, const CheckIfSuitableBy &functor) const
+{
+    /* Make sure argument is valid: */
+    if (!pTree)
         return 0;
 
-    /* Iterate other all the mediums of passed tree: */
-    UIMediumItemIterator iterator(pTree);
-    while (*iterator)
-    {
-        if ((*iterator)->id() == strId)
-            return *iterator;
-        ++iterator;
-    }
+    /* Return wrapper: */
+    return searchItem(pTree->invisibleRootItem(), functor);
+}
+
+UIMediumItem* UIMediumManager::searchItem(QTreeWidgetItem *pParentItem, const CheckIfSuitableBy &functor) const
+{
+    /* Make sure argument is valid: */
+    if (!pParentItem)
+        return 0;
+
+    /* Verify passed item if it is of 'medium' type too: */
+    if (UIMediumItem *pMediumParentItem = toMediumItem(pParentItem))
+        if (functor.isItSuitable(pMediumParentItem))
+            return pMediumParentItem;
+
+    /* Iterate other all the children: */
+    for (int iChildIndex = 0; iChildIndex < pParentItem->childCount(); ++iChildIndex)
+        if (UIMediumItem *pMediumChildItem = toMediumItem(pParentItem->child(iChildIndex)))
+            if (UIMediumItem *pRequiredMediumChildItem = searchItem(pMediumChildItem, functor))
+                return pRequiredMediumChildItem;
 
     /* Null by default: */
@@ -1497,5 +1516,5 @@
     /* First try to create item under corresponding parent: */
     if (medium.parentID() != UIMedium::nullID())
-        if (UIMediumItem *pRoot = searchItem(pTree, medium.parentID()))
+        if (UIMediumItem *pRoot = searchItem(pTree, CheckIfSuitableByID(medium.parentID())))
             pMediumItem = new UIMediumItem(medium, pRoot);
     /* Else just create item as top-level one: */
@@ -1575,18 +1594,8 @@
             if (fCheckRest)
             {
-                *pfInaccessible = false;
-
-                QTreeWidget *pTree = pMediumItem->treeWidget();
-
-                /* Find the first pfInaccessible item to be in charge: */
-                UIMediumItemIterator it(pTree);
-                for (; *it; ++ it)
-                {
-                    if (*it != pMediumItem && (*it)->state() == KMediumState_Inaccessible)
-                    {
-                        *pfInaccessible = true;
-                        break;
-                    }
-                }
+                /* Find the first KMediumState_Inaccessible item to be in charge: */
+                UIMediumItem *pInaccessibleMediumItem =
+                    searchItem(pMediumItem->treeWidget(), CheckIfSuitableByState(KMediumState_Inaccessible));
+                *pfInaccessible = !!pInaccessibleMediumItem;
             }
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/medium/UIMediumManager.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/medium/UIMediumManager.h	(revision 49581)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/medium/UIMediumManager.h	(revision 49582)
@@ -36,4 +36,12 @@
 class UIEnumerationProgressBar;
 class UIMedium;
+
+/** Functor interface allowing to check if passed UIMediumItem is suitable. */
+class CheckIfSuitableBy
+{
+public:
+    /** Determines whether passed UIMediumItem is suitable. */
+    virtual bool isItSuitable(UIMediumItem *pItem) const = 0;
+};
 
 /* Medium Manager Dialog: */
@@ -134,5 +142,6 @@
     void setCurrentItem(QTreeWidget *pTree, QTreeWidgetItem *pItem);
     UIMediumItem* toMediumItem(QTreeWidgetItem *pItem) const;
-    UIMediumItem* searchItem(QTreeWidget *pTree, const QString &strId) const;
+    UIMediumItem* searchItem(QTreeWidget *pTree, const CheckIfSuitableBy &functor) const;
+    UIMediumItem* searchItem(QTreeWidgetItem *pParentItem, const CheckIfSuitableBy &functor) const;
     UIMediumItem* createHardDiskItem(QTreeWidget *pTree, const UIMedium &medium) const;
 
