Index: /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsDisplay.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsDisplay.cpp	(revision 74836)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsDisplay.cpp	(revision 74837)
@@ -408,6 +408,6 @@
     /* Load old 'Screen' data from the cache: */
     m_pEditorVideoScreenCount->setValue(oldDisplayData.m_cGuestScreenCount);
+    m_pScaleFactorEditor->setScaleFactors(oldDisplayData.m_scaleFactors);
     m_pScaleFactorEditor->setMonitorCount(oldDisplayData.m_cGuestScreenCount);
-    m_pScaleFactorEditor->setScaleFactors(oldDisplayData.m_scaleFactors);
     m_pCheckbox3D->setChecked(oldDisplayData.m_f3dAccelerationEnabled);
 #ifdef VBOX_WITH_VIDEOHWACCEL
Index: /trunk/src/VBox/Frontends/VirtualBox/src/widgets/UIScaleFactorEditor.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/widgets/UIScaleFactorEditor.cpp	(revision 74836)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/widgets/UIScaleFactorEditor.cpp	(revision 74837)
@@ -43,7 +43,10 @@
     , m_pMaxScaleLabel(0)
     , m_pMinScaleLabel(0)
+    , m_dDefaultScaleFactor(1.0)
 {
     /* Prepare: */
     prepare();
+    /* Append a default scale factor to the list as an global scale factor: */
+    m_scaleFactors.append(1.0);
 }
 
@@ -52,54 +55,99 @@
     if (!m_pMonitorComboBox)
         return;
-    if (iMonitorCount == m_pMonitorComboBox->count())
-        return;
-
+    /* We always have 0th for global scale factor (in combo box and scale factor list): */
+    int iEndMonitorCount = iMonitorCount + 1;
+    int iCurrentMonitorCount = m_pMonitorComboBox->count();
+    if (iEndMonitorCount == iCurrentMonitorCount)
+        return;
+    m_pMonitorComboBox->setEnabled(iMonitorCount > 1);
     m_pMonitorComboBox->blockSignals(true);
-    int iCurrentMonitorCount = m_pMonitorComboBox->count();
     int iCurrentMonitorIndex = m_pMonitorComboBox->currentIndex();
-    //m_pMonitorComboBox->clear();
-    if (iCurrentMonitorCount < iMonitorCount)
-    {
-        for (int i = iCurrentMonitorCount; i < iMonitorCount; ++i)
-        {
-            m_pMonitorComboBox->addItem(QString("Monitor %1").arg(i));
-            /* In case that we have increased the # of monitors add new scale factors to the scale factor cache: */
-            if (i >= m_scaleFactors.size())
-                m_scaleFactors.append(1.0);
-        }
+    if (iCurrentMonitorCount < iEndMonitorCount)
+    {
+        for (int i = iCurrentMonitorCount; i < iEndMonitorCount; ++i)
+            m_pMonitorComboBox->insertItem(i, QString("Monitor %1").arg(i));
     }
     else
     {
-        for (int i = iCurrentMonitorCount - 1; i >= iMonitorCount; --i)
+        for (int i = iCurrentMonitorCount - 1; i >= iEndMonitorCount; --i)
             m_pMonitorComboBox->removeItem(i);
     }
+    m_pMonitorComboBox->setEnabled(iMonitorCount > 1);
+    if (iMonitorCount <= 1)
+        m_pMonitorComboBox->setCurrentIndex(0);
     m_pMonitorComboBox->blockSignals(false);
-
+    /* Update the slider and spinbox values if the combobox index has changed: */
     if (iCurrentMonitorIndex != m_pMonitorComboBox->currentIndex())
-        showMonitorScaleFactor();
+        updateValuesAfterMonitorChange();
 }
 
 void UIScaleFactorEditor::setScaleFactors(const QList<double> &scaleFactors)
 {
-    if (m_scaleFactors == scaleFactors)
-        return;
-    /* if m_scaleFactors has more items than @p scaleFactors than we keep the additional items
-       this can happen for example when extra data has 4 scale factor while machine has 5 monitors: */
-    if (m_scaleFactors.size() > scaleFactors.size())
-    {
-        for (int i = 0; i < scaleFactors.size(); ++i)
-            m_scaleFactors[i] = scaleFactors[i];
+    m_scaleFactors.clear();
+    /* If we have a single value from the extra data and we treat if as a default scale factor: */
+    if (scaleFactors.size() == 1)
+    {
+        m_dDefaultScaleFactor = scaleFactors.at(0);
+        m_scaleFactors.append(m_dDefaultScaleFactor);
+        isGlobalScaleFactor(true);
+        return;
+    }
+
+    // Insert 0th element as the global scalar value
+    m_scaleFactors.append(m_dDefaultScaleFactor);
+    m_scaleFactors.append(scaleFactors);
+    isGlobalScaleFactor(false);
+}
+
+QList<double> UIScaleFactorEditor::scaleFactors() const
+{
+    QList<double> scaleFactorList;
+    if (m_scaleFactors.size() == 0)
+        return scaleFactorList;
+
+    /* Decide if the users wants a global (not per monitor) scaling. */
+    bool globalScaleFactor = false;
+
+    /* if "All Monitors" item is selected in the combobox: */
+    if (m_pMonitorComboBox && m_pMonitorComboBox->currentIndex() == 0)
+        globalScaleFactor = true;
+    /* Also check if all of the monitor scale factors equal to the global scale factor: */
+    if (!globalScaleFactor)
+    {
+        globalScaleFactor = true;
+        for (int i = 1; i < m_scaleFactors.size() && globalScaleFactor; ++i)
+            if (m_scaleFactors[0] != m_scaleFactors[i])
+                globalScaleFactor = false;
+    }
+
+    if (globalScaleFactor)
+    {
+        scaleFactorList << m_scaleFactors.at(0);
     }
     else
     {
-        m_scaleFactors = scaleFactors;
-    }
-    showMonitorScaleFactor();
-}
-
-
-const QList<double>& UIScaleFactorEditor::scaleFactors() const
-{
-    return m_scaleFactors;
+        /* Skip the 0th scale factor: */
+        for (int i = 1; i < m_scaleFactors.size(); ++i)
+            scaleFactorList.append(m_scaleFactors.at(i));
+    }
+
+    return scaleFactorList;
+}
+
+void UIScaleFactorEditor::isGlobalScaleFactor(bool bFlag)
+{
+    if (!m_pMonitorComboBox)
+        return;
+    if (bFlag && m_pMonitorComboBox->count() >= 1)
+        m_pMonitorComboBox->setCurrentIndex(0);
+    else
+        if(m_pMonitorComboBox->count() >= 2)
+            m_pMonitorComboBox->setCurrentIndex(1);
+    updateValuesAfterMonitorChange();
+}
+
+void UIScaleFactorEditor::setDefaultScaleFactor(double dDefaultScaleFactor)
+{
+    m_dDefaultScaleFactor = dDefaultScaleFactor;
 }
 
@@ -107,12 +155,16 @@
 {
     if (m_pMaxScaleLabel)
-    {
         m_pMaxScaleLabel->setText(tr("Max"));
-    }
 
     if (m_pMinScaleLabel)
-    {
         m_pMinScaleLabel->setText(tr("Min"));
-    }
+
+    if (m_pMonitorComboBox && m_pMonitorComboBox->count() > 0)
+    {
+        m_pMonitorComboBox->setItemText(0, tr("All Monitors"));
+        for (int i = 0; i < m_pMonitorComboBox->count(); ++i)
+            m_pMonitorComboBox->setItemText(i, tr("Monitor(%1)").arg(i));
+    }
+    setToolTip(tr("Controls the guest screen scale factor"));
 }
 
@@ -131,13 +183,7 @@
 }
 
-void UIScaleFactorEditor::sltMonitorComboIndexChanged(int index)
-{
-    if (index >= m_scaleFactors.size())
-        return;
-
-    /* Update the slider and spinbox values without emitting signals: */
-    int scaleFactor = 100 * m_scaleFactors[index];
-    setSliderValue(scaleFactor);
-    setSpinBoxValue(scaleFactor);
+void UIScaleFactorEditor::sltMonitorComboIndexChanged(int)
+{
+    updateValuesAfterMonitorChange();
 }
 
@@ -153,4 +199,5 @@
     {
         m_pMainLayout->addWidget(m_pMonitorComboBox, 0, 0);
+        m_pMonitorComboBox->insertItem(0, "All Monitors");
         connect(m_pMonitorComboBox ,static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
                 this, &UIScaleFactorEditor::sltMonitorComboIndexChanged);
@@ -203,9 +250,9 @@
 void UIScaleFactorEditor::setScaleFactor(int iMonitorIndex, int iScaleFactor)
 {
-    /* Make sure we have the corresponding scale value for the @p iMonitorIndex: */
-    if (iMonitorIndex >= m_scaleFactors.size())
-    {
-        for (int i = m_scaleFactors.size(); i <= iMonitorIndex; ++i)
-            m_scaleFactors.append(1.0);
+    /* Make sure we have the corresponding scale values for all monitors: */
+    if (m_pMonitorComboBox->count() > m_scaleFactors.size())
+    {
+        for (int i = m_scaleFactors.size(); i < m_pMonitorComboBox->count(); ++i)
+            m_scaleFactors.append(m_dDefaultScaleFactor);
     }
     m_scaleFactors[iMonitorIndex] = iScaleFactor / 100.0;
@@ -232,5 +279,5 @@
 }
 
-void UIScaleFactorEditor::showMonitorScaleFactor()
+void UIScaleFactorEditor::updateValuesAfterMonitorChange()
 {
     /* Set the spinbox value for the currently selected monitor: */
@@ -238,9 +285,10 @@
     {
         int currentMonitorIndex = m_pMonitorComboBox->currentIndex();
-        if (m_scaleFactors.size() > currentMonitorIndex && m_pScaleSpinBox)
-        {
-            setSpinBoxValue(100 * m_scaleFactors.at(currentMonitorIndex));
-            setSliderValue(100 * m_scaleFactors.at(currentMonitorIndex));
-        }
-    }
-}
+        while (m_scaleFactors.size() <= currentMonitorIndex)
+            m_scaleFactors.append(m_dDefaultScaleFactor);
+
+        setSpinBoxValue(100 * m_scaleFactors.at(currentMonitorIndex));
+        setSliderValue(100 * m_scaleFactors.at(currentMonitorIndex));
+
+    }
+}
Index: /trunk/src/VBox/Frontends/VirtualBox/src/widgets/UIScaleFactorEditor.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/widgets/UIScaleFactorEditor.h	(revision 74836)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/widgets/UIScaleFactorEditor.h	(revision 74837)
@@ -35,6 +35,7 @@
 class QIAdvancedSlider;
 
-/** QWidget reimplementation
- * providing GUI with monitor scale factor editing functionality. */
+/** QWidget reimplementation providing GUI with monitor scale factor editing functionality.
+ *  It includes a combo box to select a monitor, a slider, and a spinbox to display/modify values.
+ *  The first item in the combo box is used to change the scale factor of all monitors.*/
 class SHARED_LIBRARY_STUFF UIScaleFactorEditor : public QIWithRetranslateUI<QWidget>
 {
@@ -43,9 +44,12 @@
 public:
 
-    /** Constructor, passes @a pParent to the QWidget constructor.*/
     UIScaleFactorEditor(QWidget *pParent);
-    void setMonitorCount(int iMonitorCount);
-    void setScaleFactors(const QList<double> &scaleFactors);
-    const QList<double>& scaleFactors() const;
+    void           setMonitorCount(int iMonitorCount);
+    void           setScaleFactors(const QList<double> &scaleFactors);
+    /* Returns either a single global scale factor or a list of scale factor for each monitor. */
+    QList<double>  scaleFactors() const;
+
+    void           isGlobalScaleFactor(bool bFlag);
+    void           setDefaultScaleFactor(double dDefaultScaleFactor);
 
 protected:
@@ -68,5 +72,5 @@
     void               setSpinBoxValue(int iValue);
     /* Set the spinbox and slider to scale factor of currently selected monitor */
-    void               showMonitorScaleFactor();
+    void               updateValuesAfterMonitorChange();
     QSpinBox          *m_pScaleSpinBox;
     QGridLayout       *m_pMainLayout;
@@ -75,6 +79,7 @@
     QLabel            *m_pMaxScaleLabel;
     QLabel            *m_pMinScaleLabel;
-    /* Stores the per-monitor scale factors in range [.., 1, ..] */
+    /* Stores the per-monitor scale factors. The 0th item is for all monitors (global) */
     QList<double>      m_scaleFactors;
+    double             m_dDefaultScaleFactor;
 };
 
