Index: /trunk/src/VBox/Frontends/VirtualBox/src/extensions/QIStateIndicator.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/extensions/QIStateIndicator.cpp	(revision 26757)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/extensions/QIStateIndicator.cpp	(revision 26758)
@@ -35,4 +35,12 @@
  *  the state of some thing, as described by the state property.
  */
+
+QIStateIndicator::QIStateIndicator(QWidget *pParent /* = 0 */)
+  : QFrame(pParent)
+  , mState(0)
+  , mSize(0, 0)
+{
+    setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
+}
 
 /**
Index: /trunk/src/VBox/Frontends/VirtualBox/src/extensions/QIStateIndicator.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/extensions/QIStateIndicator.h	(revision 26757)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/extensions/QIStateIndicator.h	(revision 26758)
@@ -34,4 +34,5 @@
 public:
 
+    QIStateIndicator (QWidget *pParent = 0);
     QIStateIndicator (int aState);
     ~QIStateIndicator();
@@ -43,4 +44,6 @@
     QPixmap stateIcon (int aState) const;
     void setStateIcon (int aState, const QPixmap &aPixmap);
+
+    virtual void updateAppearance() {}
 
 public slots:
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIIndicatorsPool.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIIndicatorsPool.cpp	(revision 26757)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIIndicatorsPool.cpp	(revision 26758)
@@ -24,13 +24,17 @@
 /* Local includes */
 #include "UIIndicatorsPool.h"
+#include "VBoxGlobal.h"
 #include "COMDefs.h"
-
-class UIIndicatorHardDisks : public QIStateIndicator
-{
-    Q_OBJECT;
-
-public:
-
-    UIIndicatorHardDisks() : QIStateIndicator(KDeviceActivity_Idle)
+#include "QIWithRetranslateUI.h"
+
+class UIIndicatorHardDisks : public QIWithRetranslateUI<QIStateIndicator>
+{
+    Q_OBJECT;
+
+public:
+
+    UIIndicatorHardDisks(CSession &session)
+      : QIWithRetranslateUI<QIStateIndicator>()
+      , m_session(session)
     {
         setStateIcon(KDeviceActivity_Idle, QPixmap(":/hd_16px.png"));
@@ -38,14 +42,63 @@
         setStateIcon(KDeviceActivity_Writing, QPixmap(":/hd_write_16px.png"));
         setStateIcon(KDeviceActivity_Null, QPixmap(":/hd_disabled_16px.png"));
-    }
-};
-
-class UIIndicatorOpticalDisks : public QIStateIndicator
-{
-    Q_OBJECT;
-
-public:
-
-    UIIndicatorOpticalDisks() : QIStateIndicator(KDeviceActivity_Idle)
+
+        retranslateUi();
+    }
+
+    void retranslateUi()
+    {
+        updateAppearance();
+    }
+
+    void updateAppearance()
+    {
+        const CMachine &machine = m_session.GetMachine();
+
+        QString strToolTip = tr("<p style='white-space:pre'><nobr>Indicates the activity "
+                                "of the virtual hard disks:</nobr>%1</p>", "HDD tooltip");
+
+        QString strFullData;
+        bool bAttachmentsPresent = false;
+
+        CStorageControllerVector controllers = machine.GetStorageControllers();
+        foreach (const CStorageController &controller, controllers)
+        {
+            QString strAttData;
+            CMediumAttachmentVector attachments = machine.GetMediumAttachmentsOfController(controller.GetName());
+            foreach (const CMediumAttachment &attachment, attachments)
+            {
+                if (attachment.GetType() != KDeviceType_HardDisk)
+                    continue;
+                strAttData += QString("<br>&nbsp;<nobr>%1:&nbsp;%2</nobr>")
+                    .arg(vboxGlobal().toString(StorageSlot(controller.GetBus(), attachment.GetPort(), attachment.GetDevice())))
+                    .arg(VBoxMedium(attachment.GetMedium(), VBoxDefs::MediumType_HardDisk).location());
+                bAttachmentsPresent = true;
+            }
+            if (!strAttData.isNull())
+                strFullData += QString("<br><nobr><b>%1</b></nobr>").arg(controller.GetName()) + strAttData;
+        }
+
+        if (!bAttachmentsPresent)
+            strFullData += tr("<br><nobr><b>No hard disks attached</b></nobr>", "HDD tooltip");
+
+        setToolTip(strToolTip.arg(strFullData));
+        setState(bAttachmentsPresent ? KDeviceActivity_Idle : KDeviceActivity_Null);
+    }
+
+protected:
+    /* For compatibility reason we do it here, later this should be moved to
+     * QIStateIndicator. */
+    CSession &m_session;
+};
+
+class UIIndicatorOpticalDisks : public QIWithRetranslateUI<QIStateIndicator>
+{
+    Q_OBJECT;
+
+public:
+
+    UIIndicatorOpticalDisks(CSession &session)
+      : QIWithRetranslateUI<QIStateIndicator>()
+      , m_session(session)
     {
         setStateIcon(KDeviceActivity_Idle, QPixmap(":/cd_16px.png"));
@@ -53,14 +106,65 @@
         setStateIcon(KDeviceActivity_Writing, QPixmap(":/cd_write_16px.png"));
         setStateIcon(KDeviceActivity_Null, QPixmap(":/cd_disabled_16px.png"));
-    }
-};
-
-class UIIndicatorFloppyDisks : public QIStateIndicator
-{
-    Q_OBJECT;
-
-public:
-
-    UIIndicatorFloppyDisks() : QIStateIndicator(KDeviceActivity_Idle)
+
+        retranslateUi();
+    }
+
+    void retranslateUi()
+    {
+        updateAppearance();
+    }
+
+    void updateAppearance()
+    {
+        const CMachine &machine = m_session.GetMachine();
+
+        QString strToolTip = tr("<p style='white-space:pre'><nobr>Indicates the activity "
+                                "of the CD/DVD devices:</nobr>%1</p>", "CD/DVD tooltip");
+
+        QString strFullData;
+        bool bAttachmentsPresent = false;
+
+        CStorageControllerVector controllers = machine.GetStorageControllers();
+        foreach (const CStorageController &controller, controllers)
+        {
+            QString strAttData;
+            CMediumAttachmentVector attachments = machine.GetMediumAttachmentsOfController(controller.GetName());
+            foreach (const CMediumAttachment &attachment, attachments)
+            {
+                if (attachment.GetType() != KDeviceType_DVD)
+                    continue;
+                VBoxMedium vboxMedium(attachment.GetMedium(), VBoxDefs::MediumType_DVD);
+                strAttData += QString("<br>&nbsp;<nobr>%1:&nbsp;%2</nobr>")
+                    .arg(vboxGlobal().toString(StorageSlot(controller.GetBus(), attachment.GetPort(), attachment.GetDevice())))
+                    .arg(vboxMedium.isNull() || vboxMedium.isHostDrive() ? vboxMedium.name() : vboxMedium.location());
+                if (!vboxMedium.isNull())
+                    bAttachmentsPresent = true;
+            }
+            if (!strAttData.isNull())
+                strFullData += QString("<br><nobr><b>%1</b></nobr>").arg(controller.GetName()) + strAttData;
+        }
+
+        if (strFullData.isNull())
+            strFullData = tr("<br><nobr><b>No CD/DVD devices attached</b></nobr>", "CD/DVD tooltip");
+
+        setToolTip(strToolTip.arg(strFullData));
+        setState(bAttachmentsPresent ? KDeviceActivity_Idle : KDeviceActivity_Null);
+    }
+
+protected:
+    /* For compatibility reason we do it here, later this should be moved to
+     * QIStateIndicator. */
+    CSession &m_session;
+};
+
+class UIIndicatorFloppyDisks : public QIWithRetranslateUI<QIStateIndicator>
+{
+    Q_OBJECT;
+
+public:
+
+    UIIndicatorFloppyDisks(CSession &session)
+      : QIWithRetranslateUI<QIStateIndicator>()
+      , m_session(session)
     {
         setStateIcon(KDeviceActivity_Idle, QPixmap(":/fd_16px.png"));
@@ -68,14 +172,64 @@
         setStateIcon(KDeviceActivity_Writing, QPixmap(":/fd_write_16px.png"));
         setStateIcon(KDeviceActivity_Null, QPixmap(":/fd_disabled_16px.png"));
-    }
-};
-
-class UIIndicatorNetworkAdapters : public QIStateIndicator
-{
-    Q_OBJECT;
-
-public:
-
-    UIIndicatorNetworkAdapters() : QIStateIndicator(KDeviceActivity_Idle)
+
+        retranslateUi();
+    }
+
+    void retranslateUi()
+    {
+        updateAppearance();
+    }
+
+    void updateAppearance()
+    {
+        const CMachine &machine = m_session.GetMachine();
+
+        QString tip = tr ("<p style='white-space:pre'><nobr>Indicates the activity "
+                          "of the floppy devices:</nobr>%1</p>", "FD tooltip");
+        QString data;
+        bool attachmentsPresent = false;
+
+        CStorageControllerVector controllers = machine.GetStorageControllers();
+        foreach (const CStorageController &controller, controllers)
+        {
+            QString attData;
+            CMediumAttachmentVector attachments = machine.GetMediumAttachmentsOfController (controller.GetName());
+            foreach (const CMediumAttachment &attachment, attachments)
+            {
+                if (attachment.GetType() != KDeviceType_Floppy)
+                    continue;
+                VBoxMedium vboxMedium (attachment.GetMedium(), VBoxDefs::MediumType_Floppy);
+                attData += QString ("<br>&nbsp;<nobr>%1:&nbsp;%2</nobr>")
+                    .arg (vboxGlobal().toString (StorageSlot (controller.GetBus(), attachment.GetPort(), attachment.GetDevice())))
+                    .arg (vboxMedium.isNull() || vboxMedium.isHostDrive() ? vboxMedium.name() : vboxMedium.location());
+                if (!vboxMedium.isNull())
+                    attachmentsPresent = true;
+            }
+            if (!attData.isNull())
+                data += QString ("<br><nobr><b>%1</b></nobr>").arg (controller.GetName()) + attData;
+        }
+
+        if (data.isNull())
+            data = tr ("<br><nobr><b>No floppy devices attached</b></nobr>", "FD tooltip");
+
+        setToolTip (tip.arg (data));
+        setState (attachmentsPresent ? KDeviceActivity_Idle : KDeviceActivity_Null);
+    }
+
+protected:
+    /* For compatibility reason we do it here, later this should be moved to
+     * QIStateIndicator. */
+    CSession &m_session;
+};
+
+class UIIndicatorNetworkAdapters : public QIWithRetranslateUI<QIStateIndicator>
+{
+    Q_OBJECT;
+
+public:
+
+    UIIndicatorNetworkAdapters(CSession &session)
+      : QIWithRetranslateUI<QIStateIndicator>()
+      , m_session(session)
     {
         setStateIcon(KDeviceActivity_Idle, QPixmap(":/nw_16px.png"));
@@ -83,14 +237,61 @@
         setStateIcon(KDeviceActivity_Writing, QPixmap(":/nw_write_16px.png"));
         setStateIcon(KDeviceActivity_Null, QPixmap(":/nw_disabled_16px.png"));
-    }
-};
-
-class UIIndicatorUSBDevices : public QIStateIndicator
-{
-    Q_OBJECT;
-
-public:
-
-    UIIndicatorUSBDevices() : QIStateIndicator(KDeviceActivity_Idle)
+
+        retranslateUi();
+    }
+
+    void retranslateUi()
+    {
+        updateAppearance();
+    }
+
+    void updateAppearance()
+    {
+        const CMachine &machine = m_session.GetMachine();
+
+        ulong uMaxCount = vboxGlobal().virtualBox().GetSystemProperties().GetNetworkAdapterCount();
+        ulong uCount = 0;
+        for (ulong uSlot = 0; uSlot < uMaxCount; ++ uSlot)
+            if (machine.GetNetworkAdapter(uSlot).GetEnabled())
+                ++ uCount;
+        setState(uCount > 0 ? KDeviceActivity_Idle : KDeviceActivity_Null);
+
+        QString strToolTip = tr("<p style='white-space:pre'><nobr>Indicates the activity of the "
+                                "network interfaces:</nobr>%1</p>", "Network adapters tooltip");
+        QString strFullData;
+
+        for (ulong uSlot = 0; uSlot < uMaxCount; ++ uSlot)
+        {
+            CNetworkAdapter adapter = machine.GetNetworkAdapter(uSlot);
+            if (adapter.GetEnabled())
+                strFullData += tr("<br><nobr><b>Adapter %1 (%2)</b>: cable %3</nobr>", "Network adapters tooltip")
+                    .arg(uSlot + 1)
+                    .arg(vboxGlobal().toString(adapter.GetAttachmentType()))
+                    .arg(adapter.GetCableConnected() ?
+                          tr("connected", "Network adapters tooltip") :
+                          tr("disconnected", "Network adapters tooltip"));
+        }
+
+        if (strFullData.isNull())
+            strFullData = tr("<br><nobr><b>All network adapters are disabled</b></nobr>", "Network adapters tooltip");
+
+        setToolTip(strToolTip.arg(strFullData));
+    }
+
+protected:
+    /* For compatibility reason we do it here, later this should be moved to
+     * QIStateIndicator. */
+    CSession &m_session;
+};
+
+class UIIndicatorUSBDevices : public QIWithRetranslateUI<QIStateIndicator>
+{
+    Q_OBJECT;
+
+public:
+
+    UIIndicatorUSBDevices(CSession &session)
+      : QIWithRetranslateUI<QIStateIndicator>()
+      , m_session(session)
     {
         setStateIcon(KDeviceActivity_Idle, QPixmap(":/usb_16px.png"));
@@ -98,14 +299,56 @@
         setStateIcon(KDeviceActivity_Writing, QPixmap(":/usb_write_16px.png"));
         setStateIcon(KDeviceActivity_Null, QPixmap(":/usb_disabled_16px.png"));
-    }
-};
-
-class UIIndicatorSharedFolders : public QIStateIndicator
-{
-    Q_OBJECT;
-
-public:
-
-    UIIndicatorSharedFolders() : QIStateIndicator(KDeviceActivity_Idle)
+
+        retranslateUi();
+    }
+
+    void retranslateUi()
+    {
+        updateAppearance();
+    }
+
+    void updateAppearance()
+    {
+        const CMachine &machine = m_session.GetMachine();
+
+        QString strToolTip = tr("<p style='white-space:pre'><nobr>Indicates the activity of "
+                                "the attached USB devices:</nobr>%1</p>", "USB device tooltip");
+        QString strFullData;
+
+        CUSBController usbctl = machine.GetUSBController();
+        if (!usbctl.isNull() && usbctl.GetEnabled())
+        {
+            const CConsole &console = m_session.GetConsole();
+
+            CUSBDeviceVector devsvec = console.GetUSBDevices();
+            for (int i = 0; i < devsvec.size(); ++ i)
+            {
+                CUSBDevice usb = devsvec[i];
+                strFullData += QString("<br><b><nobr>%1</nobr></b>").arg(vboxGlobal().details(usb));
+            }
+            if (strFullData.isNull())
+                strFullData = tr("<br><nobr><b>No USB devices attached</b></nobr>", "USB device tooltip");
+        }
+        else
+            strFullData = tr("<br><nobr><b>USB Controller is disabled</b></nobr>", "USB device tooltip");
+
+        setToolTip(strToolTip.arg(strFullData));
+    }
+
+protected:
+    /* For compatibility reason we do it here, later this should be moved to
+     * QIStateIndicator. */
+    CSession &m_session;
+};
+
+class UIIndicatorSharedFolders : public QIWithRetranslateUI<QIStateIndicator>
+{
+    Q_OBJECT;
+
+public:
+
+    UIIndicatorSharedFolders(CSession &session)
+      : QIWithRetranslateUI<QIStateIndicator>()
+      , m_session(session)
     {
         setStateIcon(KDeviceActivity_Idle, QPixmap(":/shared_folder_16px.png"));
@@ -113,27 +356,178 @@
         setStateIcon(KDeviceActivity_Writing, QPixmap(":/shared_folder_write_16px.png"));
         setStateIcon(KDeviceActivity_Null, QPixmap(":/shared_folder_disabled_16px.png"));
-    }
-};
-
-class UIIndicatorVirtualization : public QIStateIndicator
-{
-    Q_OBJECT;
-
-public:
-
-    UIIndicatorVirtualization() : QIStateIndicator(0)
+
+        retranslateUi();
+    }
+
+    void retranslateUi()
+    {
+        updateAppearance();
+    }
+
+    void updateAppearance()
+    {
+        const CMachine &machine = m_session.GetMachine();
+        const CConsole &console = m_session.GetConsole();
+
+        QString strToolTip = tr("<p style='white-space:pre'><nobr>Indicates the activity of "
+                                "the machine's shared folders:</nobr>%1</p>", "Shared folders tooltip");
+
+        QString strFullData;
+        QMap<QString, QString> sfs;
+
+        /* Permanent folders */
+        CSharedFolderVector psfvec = machine.GetSharedFolders();
+
+        for (int i = 0; i < psfvec.size(); ++ i)
+        {
+            CSharedFolder sf = psfvec[i];
+            sfs.insert(sf.GetName(), sf.GetHostPath());
+        }
+
+        /* Transient folders */
+        CSharedFolderVector tsfvec = console.GetSharedFolders();
+
+        for (int i = 0; i < tsfvec.size(); ++ i)
+        {
+            CSharedFolder sf = tsfvec[i];
+            sfs.insert(sf.GetName(), sf.GetHostPath());
+        }
+
+        for (QMap<QString, QString>::const_iterator it = sfs.constBegin(); it != sfs.constEnd(); ++ it)
+        {
+            /* Select slashes depending on the OS type */
+            if (VBoxGlobal::isDOSType(console.GetGuest().GetOSTypeId()))
+                strFullData += QString("<br><nobr><b>\\\\vboxsvr\\%1&nbsp;</b></nobr><nobr>%2</nobr>")
+                                       .arg(it.key(), it.value());
+            else
+                strFullData += QString("<br><nobr><b>%1&nbsp;</b></nobr><nobr>%2</nobr>")
+                                       .arg(it.key(), it.value());
+        }
+
+        if (sfs.count() == 0)
+            strFullData = tr("<br><nobr><b>No shared folders</b></nobr>", "Shared folders tooltip");
+
+        setToolTip(strToolTip.arg(strFullData));
+    }
+
+protected:
+    /* For compatibility reason we do it here, later this should be moved to
+     * QIStateIndicator. */
+    CSession &m_session;
+};
+
+class UIIndicatorVRDPDisks : public QIWithRetranslateUI<QIStateIndicator>
+{
+    Q_OBJECT;
+
+public:
+
+    UIIndicatorVRDPDisks(CSession &session)
+      : QIWithRetranslateUI<QIStateIndicator>()
+      , m_session(session)
+    {
+        setStateIcon(0, QPixmap (":/vrdp_disabled_16px.png"));
+        setStateIcon(1, QPixmap (":/vrdp_16px.png"));
+
+        retranslateUi();
+    }
+
+    void retranslateUi()
+    {
+        updateAppearance();
+    }
+
+    void updateAppearance()
+    {
+        CVRDPServer vrdpsrv = m_session.GetMachine().GetVRDPServer();
+        if (!vrdpsrv.isNull())
+        {
+            /* update menu&status icon state */
+            bool fVRDPEnabled = vrdpsrv.GetEnabled();
+
+            setState(fVRDPEnabled ? 1 : 0);
+
+            QString tip = tr("Indicates whether the Remote Display (VRDP Server) "
+                             "is enabled (<img src=:/vrdp_16px.png/>) or not "
+                             "(<img src=:/vrdp_disabled_16px.png/>).");
+            if (vrdpsrv.GetEnabled())
+                tip += tr ("<hr>The VRDP Server is listening on port %1").arg(vrdpsrv.GetPorts());
+            setToolTip(tip);
+        }
+    }
+
+protected:
+    /* For compatibility reason we do it here, later this should be moved to
+     * QIStateIndicator. */
+    CSession &m_session;
+};
+
+class UIIndicatorVirtualization : public QIWithRetranslateUI<QIStateIndicator>
+{
+    Q_OBJECT;
+
+public:
+
+    UIIndicatorVirtualization(CSession &session)
+      : QIWithRetranslateUI<QIStateIndicator>()
+      , m_session(session)
     {
         setStateIcon(0, QPixmap(":/vtx_amdv_disabled_16px.png"));
         setStateIcon(1, QPixmap(":/vtx_amdv_16px.png"));
-    }
-};
-
-class UIIndicatorMouse : public QIStateIndicator
-{
-    Q_OBJECT;
-
-public:
-
-    UIIndicatorMouse() : QIStateIndicator(0)
+
+        retranslateUi();
+    }
+
+    void retranslateUi()
+    {
+        updateAppearance();
+    }
+
+    void updateAppearance()
+    {
+        const CConsole &console = m_session.GetConsole();
+
+        bool bVirtEnabled = console.GetDebugger().GetHWVirtExEnabled();
+        QString virtualization = bVirtEnabled ?
+            VBoxGlobal::tr("Enabled", "details report (VT-x/AMD-V)") :
+            VBoxGlobal::tr("Disabled", "details report (VT-x/AMD-V)");
+
+        bool bNestEnabled = console.GetDebugger().GetHWVirtExNestedPagingEnabled();
+        QString nestedPaging = bNestEnabled ?
+            VBoxGlobal::tr("Enabled", "nested paging") :
+            VBoxGlobal::tr("Disabled", "nested paging");
+
+        QString tip(tr("Indicates the status of the hardware virtualization "
+                       "features used by this virtual machine:"
+                       "<br><nobr><b>%1:</b>&nbsp;%2</nobr>"
+                       "<br><nobr><b>%3:</b>&nbsp;%4</nobr>",
+                       "Virtualization Stuff LED")
+                       .arg(VBoxGlobal::tr("VT-x/AMD-V", "details report"), virtualization)
+                       .arg(VBoxGlobal::tr("Nested Paging"), nestedPaging));
+
+        int cpuCount = console.GetMachine().GetCPUCount();
+        if (cpuCount > 1)
+            tip += tr("<br><nobr><b>%1:</b>&nbsp;%2</nobr>", "Virtualization Stuff LED")
+                      .arg(VBoxGlobal::tr("Processor(s)", "details report")).arg(cpuCount);
+
+        setToolTip(tip);
+        setState(bVirtEnabled);
+    }
+
+protected:
+    /* For compatibility reason we do it here, later this should be moved to
+     * QIStateIndicator. */
+    CSession &m_session;
+};
+
+class UIIndicatorMouse : public QIWithRetranslateUI<QIStateIndicator>
+{
+    Q_OBJECT;
+
+public:
+
+    UIIndicatorMouse(CSession &session)
+      : QIWithRetranslateUI<QIStateIndicator>()
+      , m_session(session)
     {
         setStateIcon(0, QPixmap(":/mouse_disabled_16px.png"));
@@ -142,14 +536,34 @@
         setStateIcon(3, QPixmap(":/mouse_can_seamless_16px.png"));
         setStateIcon(4, QPixmap(":/mouse_can_seamless_uncaptured_16px.png"));
-    }
-};
-
-class UIIndicatorHostkey : public QIStateIndicator
-{
-    Q_OBJECT;
-
-public:
-
-    UIIndicatorHostkey() : QIStateIndicator(0)
+
+        retranslateUi();
+    }
+
+    void retranslateUi()
+    {
+        setToolTip(tr("Indicates whether the host mouse pointer is captured by the guest OS:<br>"
+                      "<nobr><img src=:/mouse_disabled_16px.png/>&nbsp;&nbsp;pointer is not captured</nobr><br>"
+                      "<nobr><img src=:/mouse_16px.png/>&nbsp;&nbsp;pointer is captured</nobr><br>"
+                      "<nobr><img src=:/mouse_seamless_16px.png/>&nbsp;&nbsp;mouse integration (MI) is On</nobr><br>"
+                      "<nobr><img src=:/mouse_can_seamless_16px.png/>&nbsp;&nbsp;MI is Off, pointer is captured</nobr><br>"
+                      "<nobr><img src=:/mouse_can_seamless_uncaptured_16px.png/>&nbsp;&nbsp;MI is Off, pointer is not captured</nobr><br>"
+                      "Note that the mouse integration feature requires Guest Additions to be installed in the guest OS."));
+    }
+
+protected:
+    /* For compatibility reason we do it here, later this should be moved to
+     * QIStateIndicator. */
+    CSession &m_session;
+};
+
+class UIIndicatorHostkey : public QIWithRetranslateUI<QIStateIndicator>
+{
+    Q_OBJECT;
+
+public:
+
+    UIIndicatorHostkey(CSession &session)
+      : QIWithRetranslateUI<QIStateIndicator>()
+      , m_session(session)
     {
         setStateIcon(0, QPixmap(":/hostkey_16px.png"));
@@ -157,9 +571,23 @@
         setStateIcon(2, QPixmap(":/hostkey_pressed_16px.png"));
         setStateIcon(3, QPixmap(":/hostkey_captured_pressed_16px.png"));
-    }
-};
-
-UIIndicatorsPool::UIIndicatorsPool(QObject *pParent)
+
+        retranslateUi();
+    }
+
+    void retranslateUi()
+    {
+        setToolTip(tr("Indicates whether the keyboard is captured by the guest OS "
+                      "(<img src=:/hostkey_captured_16px.png/>) or not (<img src=:/hostkey_16px.png/>)."));
+    }
+
+protected:
+    /* For compatibility reason we do it here, later this should be moved to
+     * QIStateIndicator. */
+    CSession &m_session;
+};
+
+UIIndicatorsPool::UIIndicatorsPool(CSession &session, QObject *pParent)
     : QObject(pParent)
+    , m_session(session)
     , m_IndicatorsPool(UIIndicatorIndex_End, 0)
 {
@@ -183,26 +611,26 @@
         {
             case UIIndicatorIndex_HardDisks:
-                m_IndicatorsPool[index] = new UIIndicatorHardDisks;
+                m_IndicatorsPool[index] = new UIIndicatorHardDisks(m_session);
                 break;
             case UIIndicatorIndex_OpticalDisks:
-                m_IndicatorsPool[index] = new UIIndicatorOpticalDisks;
+                m_IndicatorsPool[index] = new UIIndicatorOpticalDisks(m_session);
                 break;
             case UIIndicatorIndex_NetworkAdapters:
-                m_IndicatorsPool[index] = new UIIndicatorNetworkAdapters;
+                m_IndicatorsPool[index] = new UIIndicatorNetworkAdapters(m_session);
                 break;
             case UIIndicatorIndex_USBDevices:
-                m_IndicatorsPool[index] = new UIIndicatorUSBDevices;
+                m_IndicatorsPool[index] = new UIIndicatorUSBDevices(m_session);
                 break;
             case UIIndicatorIndex_SharedFolders:
-                m_IndicatorsPool[index] = new UIIndicatorSharedFolders;
+                m_IndicatorsPool[index] = new UIIndicatorSharedFolders(m_session);
                 break;
             case UIIndicatorIndex_Virtualization:
-                m_IndicatorsPool[index] = new UIIndicatorVirtualization;
+                m_IndicatorsPool[index] = new UIIndicatorVirtualization(m_session);
                 break;
             case UIIndicatorIndex_Mouse:
-                m_IndicatorsPool[index] = new UIIndicatorMouse;
+                m_IndicatorsPool[index] = new UIIndicatorMouse(m_session);
                 break;
             case UIIndicatorIndex_Hostkey:
-                m_IndicatorsPool[index] = new UIIndicatorHostkey;
+                m_IndicatorsPool[index] = new UIIndicatorHostkey(m_session);
                 break;
             default:
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIIndicatorsPool.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIIndicatorsPool.h	(revision 26757)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIIndicatorsPool.h	(revision 26758)
@@ -27,11 +27,15 @@
 #include "QIStateIndicator.h"
 
+class CSession;
+
 enum UIIndicatorIndex
 {
     UIIndicatorIndex_HardDisks,
     UIIndicatorIndex_OpticalDisks,
+    UIIndicatorIndex_FloppyDisks,
     UIIndicatorIndex_NetworkAdapters,
     UIIndicatorIndex_USBDevices,
     UIIndicatorIndex_SharedFolders,
+    UIIndicatorIndex_VRDP,
     UIIndicatorIndex_Virtualization,
     UIIndicatorIndex_Mouse,
@@ -46,5 +50,5 @@
 public:
 
-    UIIndicatorsPool(QObject *pParent);
+    UIIndicatorsPool(CSession &session, QObject *pParent);
    ~UIIndicatorsPool();
 
@@ -53,4 +57,5 @@
 private:
 
+    CSession &m_session;
     QVector<QIStateIndicator*> m_IndicatorsPool;
 };
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineWindowNormal.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineWindowNormal.cpp	(revision 26757)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineWindowNormal.cpp	(revision 26758)
@@ -47,5 +47,5 @@
     : QIWithRetranslateUI<QIMainDialog>(0)
     , UIMachineWindow(pMachineLogic)
-    , m_pIndicatorsPool(new UIIndicatorsPool(this))
+    , m_pIndicatorsPool(new UIIndicatorsPool(pMachineLogic->uisession()->session(), this))
     , m_pIdleTimer(0)
 {
@@ -296,4 +296,18 @@
     /* Translate parent class: */
     UIMachineWindow::retranslateUi();
+
+#ifdef Q_WS_MAC
+    // TODO_NEW_CORE
+//    m_pDockSettingsMenu->setTitle(tr("Dock Icon"));
+//    m_pDockDisablePreview->setText(tr("Show Application Icon"));
+//    m_pDockEnablePreviewMonitor->setText(tr("Show Monitor Preview"));
+#endif /* Q_WS_MAC */
+
+    m_pNameHostkey->setToolTip(
+        tr("Shows the currently assigned Host key.<br>"
+           "This key, when pressed alone, toggles the keyboard and mouse "
+           "capture state. It can also be used in combination with other keys "
+           "to quickly perform actions from the main menu."));
+    m_pNameHostkey->setText(QIHotKeyEdit::keyName(vboxGlobal().settings().hostKey()));
 }
 
@@ -303,214 +317,26 @@
     UIMachineWindow::updateAppearanceOf(iElement);
 
-    // TODO: Move most of this update code into indicators-pool!
-
     /* Update that machine window: */
-    CMachine machine = session().GetMachine();
-    CConsole console = session().GetConsole();
-
     if (iElement & UIVisualElement_HDStuff)
-    {
-        QString strToolTip = tr("<p style='white-space:pre'><nobr>Indicates the activity "
-                                "of the virtual hard disks:</nobr>%1</p>", "HDD tooltip");
-
-        QString strFullData;
-        bool bAttachmentsPresent = false;
-
-        CStorageControllerVector controllers = machine.GetStorageControllers();
-        foreach (const CStorageController &controller, controllers)
-        {
-            QString strAttData;
-            CMediumAttachmentVector attachments = machine.GetMediumAttachmentsOfController(controller.GetName());
-            foreach (const CMediumAttachment &attachment, attachments)
-            {
-                if (attachment.GetType() != KDeviceType_HardDisk)
-                    continue;
-                strAttData += QString("<br>&nbsp;<nobr>%1:&nbsp;%2</nobr>")
-                    .arg(vboxGlobal().toString(StorageSlot(controller.GetBus(), attachment.GetPort(), attachment.GetDevice())))
-                    .arg(VBoxMedium(attachment.GetMedium(), VBoxDefs::MediumType_HardDisk).location());
-                bAttachmentsPresent = true;
-            }
-            if (!strAttData.isNull())
-                strFullData += QString("<br><nobr><b>%1</b></nobr>").arg(controller.GetName()) + strAttData;
-        }
-
-        if (!bAttachmentsPresent)
-            strFullData += tr("<br><nobr><b>No hard disks attached</b></nobr>", "HDD tooltip");
-
-        indicatorsPool()->indicator(UIIndicatorIndex_HardDisks)->setToolTip(strToolTip.arg(strFullData));
-        indicatorsPool()->indicator(UIIndicatorIndex_HardDisks)->setState(bAttachmentsPresent ? KDeviceActivity_Idle : KDeviceActivity_Null);
-    }
+        indicatorsPool()->indicator(UIIndicatorIndex_HardDisks)->updateAppearance();
     if (iElement & UIVisualElement_CDStuff)
-    {
-        QString strToolTip = tr("<p style='white-space:pre'><nobr>Indicates the activity "
-                                "of the CD/DVD devices:</nobr>%1</p>", "CD/DVD tooltip");
-
-        QString strFullData;
-        bool bAttachmentsPresent = false;
-
-        CStorageControllerVector controllers = machine.GetStorageControllers();
-        foreach (const CStorageController &controller, controllers)
-        {
-            QString strAttData;
-            CMediumAttachmentVector attachments = machine.GetMediumAttachmentsOfController(controller.GetName());
-            foreach (const CMediumAttachment &attachment, attachments)
-            {
-                if (attachment.GetType() != KDeviceType_DVD)
-                    continue;
-                VBoxMedium vboxMedium(attachment.GetMedium(), VBoxDefs::MediumType_DVD);
-                strAttData += QString("<br>&nbsp;<nobr>%1:&nbsp;%2</nobr>")
-                    .arg(vboxGlobal().toString(StorageSlot(controller.GetBus(), attachment.GetPort(), attachment.GetDevice())))
-                    .arg(vboxMedium.isNull() || vboxMedium.isHostDrive() ? vboxMedium.name() : vboxMedium.location());
-                if (!vboxMedium.isNull())
-                    bAttachmentsPresent = true;
-            }
-            if (!strAttData.isNull())
-                strFullData += QString("<br><nobr><b>%1</b></nobr>").arg(controller.GetName()) + strAttData;
-        }
-
-        if (strFullData.isNull())
-            strFullData = tr("<br><nobr><b>No CD/DVD devices attached</b></nobr>", "CD/DVD tooltip");
-
-        indicatorsPool()->indicator(UIIndicatorIndex_OpticalDisks)->setToolTip(strToolTip.arg(strFullData));
-        indicatorsPool()->indicator(UIIndicatorIndex_OpticalDisks)->setState(bAttachmentsPresent ? KDeviceActivity_Idle : KDeviceActivity_Null);
-    }
-    if (iElement & UIVisualElement_USBStuff)
-    {
-        if (!indicatorsPool()->indicator(UIIndicatorIndex_USBDevices)->isHidden())
-        {
-            QString strToolTip = tr("<p style='white-space:pre'><nobr>Indicates the activity of "
-                                    "the attached USB devices:</nobr>%1</p>", "USB device tooltip");
-            QString strFullData;
-
-            CUSBController usbctl = machine.GetUSBController();
-            if (!usbctl.isNull() && usbctl.GetEnabled())
-            {
-                CUSBDeviceVector devsvec = console.GetUSBDevices();
-                for (int i = 0; i < devsvec.size(); ++ i)
-                {
-                    CUSBDevice usb = devsvec[i];
-                    strFullData += QString("<br><b><nobr>%1</nobr></b>").arg(vboxGlobal().details(usb));
-                }
-                if (strFullData.isNull())
-                    strFullData = tr("<br><nobr><b>No USB devices attached</b></nobr>", "USB device tooltip");
-            }
-            else
-            {
-                strFullData = tr("<br><nobr><b>USB Controller is disabled</b></nobr>", "USB device tooltip");
-            }
-
-            indicatorsPool()->indicator(UIIndicatorIndex_USBDevices)->setToolTip(strToolTip.arg(strFullData));
-        }
-    }
+        indicatorsPool()->indicator(UIIndicatorIndex_OpticalDisks)->updateAppearance();
+#if 0 /* TODO: Allow to setup status-bar! */
+    if (iElement & UIVisualElement_FDStuff)
+        indicatorsPool()->indicator(UIIndicatorIndex_FloppyDisks)->updateAppearance();
+#endif
+    if (    iElement & UIVisualElement_USBStuff
+        && !indicatorsPool()->indicator(UIIndicatorIndex_USBDevices)->isHidden())
+            indicatorsPool()->indicator(UIIndicatorIndex_USBDevices)->updateAppearance();
     if (iElement & UIVisualElement_NetworkStuff)
-    {
-        ulong uMaxCount = vboxGlobal().virtualBox().GetSystemProperties().GetNetworkAdapterCount();
-        ulong uCount = 0;
-        for (ulong uSlot = 0; uSlot < uMaxCount; ++ uSlot)
-            if (machine.GetNetworkAdapter(uSlot).GetEnabled())
-                ++ uCount;
-        indicatorsPool()->indicator(UIIndicatorIndex_NetworkAdapters)->setState(uCount > 0 ? KDeviceActivity_Idle : KDeviceActivity_Null);
-
-        QString strToolTip = tr("<p style='white-space:pre'><nobr>Indicates the activity of the "
-                                "network interfaces:</nobr>%1</p>", "Network adapters tooltip");
-        QString strFullData;
-
-        for (ulong uSlot = 0; uSlot < uMaxCount; ++ uSlot)
-        {
-            CNetworkAdapter adapter = machine.GetNetworkAdapter(uSlot);
-            if (adapter.GetEnabled())
-                strFullData += tr("<br><nobr><b>Adapter %1 (%2)</b>: cable %3</nobr>", "Network adapters tooltip")
-                    .arg(uSlot + 1)
-                    .arg(vboxGlobal().toString(adapter.GetAttachmentType()))
-                    .arg(adapter.GetCableConnected() ?
-                          tr("connected", "Network adapters tooltip") :
-                          tr("disconnected", "Network adapters tooltip"));
-        }
-
-        if (strFullData.isNull())
-            strFullData = tr("<br><nobr><b>All network adapters are disabled</b></nobr>", "Network adapters tooltip");
-
-        indicatorsPool()->indicator(UIIndicatorIndex_NetworkAdapters)->setToolTip(strToolTip.arg(strFullData));
-    }
+        indicatorsPool()->indicator(UIIndicatorIndex_NetworkAdapters)->updateAppearance();
     if (iElement & UIVisualElement_SharedFolderStuff)
-    {
-        QString strToolTip = tr("<p style='white-space:pre'><nobr>Indicates the activity of "
-                                "the machine's shared folders:</nobr>%1</p>", "Shared folders tooltip");
-
-        QString strFullData;
-        QMap<QString, QString> sfs;
-
-        /* Permanent folders */
-        CSharedFolderVector psfvec = machine.GetSharedFolders();
-
-        for (int i = 0; i < psfvec.size(); ++ i)
-        {
-            CSharedFolder sf = psfvec[i];
-            sfs.insert(sf.GetName(), sf.GetHostPath());
-        }
-
-        /* Transient folders */
-        CSharedFolderVector tsfvec = console.GetSharedFolders();
-
-        for (int i = 0; i < tsfvec.size(); ++ i)
-        {
-            CSharedFolder sf = tsfvec[i];
-            sfs.insert(sf.GetName(), sf.GetHostPath());
-        }
-
-        for (QMap<QString, QString>::const_iterator it = sfs.constBegin(); it != sfs.constEnd(); ++ it)
-        {
-            /* Select slashes depending on the OS type */
-            if (VBoxGlobal::isDOSType(console.GetGuest().GetOSTypeId()))
-                strFullData += QString("<br><nobr><b>\\\\vboxsvr\\%1&nbsp;</b></nobr><nobr>%2</nobr>")
-                                       .arg(it.key(), it.value());
-            else
-                strFullData += QString("<br><nobr><b>%1&nbsp;</b></nobr><nobr>%2</nobr>")
-                                       .arg(it.key(), it.value());
-        }
-
-        if (sfs.count() == 0)
-            strFullData = tr("<br><nobr><b>No shared folders</b></nobr>", "Shared folders tooltip");
-
-        indicatorsPool()->indicator(UIIndicatorIndex_SharedFolders)->setToolTip(strToolTip.arg(strFullData));
-    }
+        indicatorsPool()->indicator(UIIndicatorIndex_SharedFolders)->updateAppearance();
+#if 0 /* TODO: Allow to setup status-bar! */
     if (iElement & UIVisualElement_VRDPStuff)
-    {
-        CVRDPServer vrdpsrv = session().GetMachine().GetVRDPServer();
-        if (!vrdpsrv.isNull())
-        {
-            /* Update menu&status icon state */
-            bool isVRDPEnabled = vrdpsrv.GetEnabled();
-            machineLogic()->actionsPool()->action(UIActionIndex_Toggle_VRDP)->setChecked(isVRDPEnabled);
-        }
-    }
+        indicatorsPool()->indicator(UIIndicatorIndex_VRDP)->updateAppearance();
+#endif
     if (iElement & UIVisualElement_VirtualizationStuff)
-    {
-        bool bVirtEnabled = console.GetDebugger().GetHWVirtExEnabled();
-        QString virtualization = bVirtEnabled ?
-            VBoxGlobal::tr("Enabled", "details report (VT-x/AMD-V)") :
-            VBoxGlobal::tr("Disabled", "details report (VT-x/AMD-V)");
-
-        bool bNestEnabled = console.GetDebugger().GetHWVirtExNestedPagingEnabled();
-        QString nestedPaging = bNestEnabled ?
-            VBoxVMInformationDlg::tr("Enabled", "nested paging") :
-            VBoxVMInformationDlg::tr("Disabled", "nested paging");
-
-        QString tip(tr("Indicates the status of the hardware virtualization "
-                       "features used by this virtual machine:"
-                       "<br><nobr><b>%1:</b>&nbsp;%2</nobr>"
-                       "<br><nobr><b>%3:</b>&nbsp;%4</nobr>",
-                       "Virtualization Stuff LED")
-                       .arg(VBoxGlobal::tr("VT-x/AMD-V", "details report"), virtualization)
-                       .arg(VBoxVMInformationDlg::tr("Nested Paging"), nestedPaging));
-
-        int cpuCount = console.GetMachine().GetCPUCount();
-        if (cpuCount > 1)
-            tip += tr("<br><nobr><b>%1:</b>&nbsp;%2</nobr>", "Virtualization Stuff LED")
-                      .arg(VBoxGlobal::tr("Processor(s)", "details report")).arg(cpuCount);
-
-        indicatorsPool()->indicator(UIIndicatorIndex_Virtualization)->setToolTip(tip);
-        indicatorsPool()->indicator(UIIndicatorIndex_Virtualization)->setState(bVirtEnabled);
-    }
+        indicatorsPool()->indicator(UIIndicatorIndex_Virtualization)->updateAppearance();
 }
 
