Index: /trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItem.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItem.cpp	(revision 42557)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItem.cpp	(revision 42558)
@@ -316,4 +316,30 @@
 }
 
+/* static */
+int UIGChooserItem::textWidth(const QFont &font, int iCount)
+{
+    /* Return text width: */
+    QFontMetrics fm(font);
+    QString strString;
+    strString.fill('_', iCount);
+    return fm.width(strString);
+}
+
+/* static */
+QString UIGChooserItem::compressText(const QFont &font, QString strText, int iWidth)
+{
+    /* Check if passed text feats maximum width: */
+    QFontMetrics fm(font);
+    if (fm.width(strText) <= iWidth)
+        return strText;
+
+    /* Truncate otherwise: */
+    QString strEllipsis = QString("...");
+    int iEllipsisWidth = fm.width(strEllipsis + " ");
+    while (!strText.isEmpty() && fm.width(strText) + iEllipsisWidth > iWidth)
+        strText.truncate(strText.size() - 1);
+    return strText + strEllipsis;
+}
+
 UIGChooserItemMimeData::UIGChooserItemMimeData(UIGChooserItem *pItem)
     : m_pItem(pItem)
Index: /trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItem.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItem.h	(revision 42557)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItem.h	(revision 42558)
@@ -138,4 +138,8 @@
     void setGradient(int iGradient) { m_iGradient = iGradient; update(); }
 
+    /* Helpers: Text compression stuff: */
+    static int textWidth(const QFont &font, int iCount);
+    static QString compressText(const QFont &font, QString strText, int iWidth);
+
 private:
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItemGroup.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItemGroup.cpp	(revision 42557)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItemGroup.cpp	(revision 42558)
@@ -271,9 +271,39 @@
         }
         /* Texts: */
-        case GroupItemData_Name: return m_strName;
+        case GroupItemData_Name:
+        {
+            /* Prepare variables: */
+            int iHorizontalMargin = data(GroupItemData_HorizonalMargin).toInt();
+            int iButtonWidth = data(GroupItemData_ButtonSize).toSize().width();
+            int iMinorSpacing = data(GroupItemData_MinorSpacing).toInt();
+            int iGroupPixmapWidth = data(GroupItemData_GroupPixmapSize).toSize().width();
+            int iMachinePixmapWidth = data(GroupItemData_MachinePixmapSize).toSize().width();
+            int iGroupCountTextWidth = data(GroupItemData_GroupCountTextSize).toSize().width();
+            int iMachineCountTextWidth = data(GroupItemData_MachineCountTextSize).toSize().width();
+            int iMaximumWidth = (int)geometry().width() - iHorizontalMargin -
+                                                          iButtonWidth - iMinorSpacing -
+                                                          iHorizontalMargin -
+                                                          iGroupPixmapWidth - iMinorSpacing -
+                                                          iMachinePixmapWidth - iMinorSpacing -
+                                                          iGroupCountTextWidth - iMinorSpacing -
+                                                          iMachineCountTextWidth;
+            QString strCompressedName = compressText(data(GroupItemData_NameFont).value<QFont>(),
+                                                     m_strName, iMaximumWidth);
+            return strCompressedName;
+        }
         case GroupItemData_GroupCountText: return QString::number(m_groupItems.size());
         case GroupItemData_MachineCountText: return QString::number(m_machineItems.size());
         /* Sizes: */
         case GroupItemData_ButtonSize: return m_pButton ? m_pButton->minimumSizeHint() : QSizeF(0, 0);
+        case GroupItemData_MinimumNameSize:
+        {
+            if (isRoot())
+                return QSizeF(0, 0);
+            QFont font = data(GroupItemData_NameFont).value<QFont>();
+            QFontMetrics fm(font);
+            int iMaximumTextWidth = textWidth(font, 20);
+            QString strCompressedName = compressText(font, m_strName, iMaximumTextWidth);
+            return QSize(fm.width(strCompressedName), fm.height());
+        }
         case GroupItemData_NameSize:
         {
@@ -313,5 +343,5 @@
             int iMinorSpacing = data(GroupItemData_MinorSpacing).toInt();
             QSize buttonSize = data(GroupItemData_ButtonSize).toSize();
-            QSize nameSize = data(GroupItemData_NameSize).toSize();
+            QSize minimumNameSize = data(GroupItemData_MinimumNameSize).toSize();
             QSize groupPixmapSize = data(GroupItemData_GroupPixmapSize).toSize();
             QSize machinePixmapSize = data(GroupItemData_MachinePixmapSize).toSize();
@@ -328,6 +358,6 @@
                                         2 /* internal QLineEdit margin from Qt sources */ +
                                         1 /* internal QLineEdit align shifting from Qt sources */ +
-                                        /* Name width: */
-                                        nameSize.width() +
+                                        /* Minimum name width: */
+                                        minimumNameSize.width() +
                                         /* Spacing between name and info: */
                                         iMajorSpacing +
@@ -342,5 +372,5 @@
             QList<int> heights;
             heights << buttonSize.height()
-                    << nameSize.height()
+                    << minimumNameSize.height()
                     << groupPixmapSize.height() << machinePixmapSize.height()
                     << groupCountTextSize.height() << machineCountTextSize.height();
@@ -1058,5 +1088,4 @@
         /* Prepare variables: */
         QRect fullRect = pOption->rect;
-        int iMinorSpacing = data(GroupItemData_MinorSpacing).toInt();
         QSize groupPixmapSize = data(GroupItemData_GroupPixmapSize).toSize();
         QSize machinePixmapSize = data(GroupItemData_MachinePixmapSize).toSize();
Index: /trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItemGroup.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItemGroup.h	(revision 42557)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItemGroup.h	(revision 42558)
@@ -96,4 +96,5 @@
         /* Sizes: */
         GroupItemData_ButtonSize,
+        GroupItemData_MinimumNameSize,
         GroupItemData_NameSize,
         GroupItemData_NameEditorSize,
Index: /trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItemMachine.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItemMachine.cpp	(revision 42557)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItemMachine.cpp	(revision 42558)
@@ -148,10 +148,50 @@
         }
         /* Texts: */
-        case MachineItemData_Name: return name();
-        case MachineItemData_SnapshotName: return snapshotName();
+        case MachineItemData_Name:
+        {
+            /* Prepare variables: */
+            int iMaximumWidth = data(MachineItemData_FirstRowMaximumWidth).toInt();
+            /* Calculate name width part: */
+            QFont nameFont = data(MachineItemData_NameFont).value<QFont>();
+            QFont snapshotNameFont = data(MachineItemData_SnapshotNameFont).value<QFont>();
+            QFontMetrics nameMetrics(nameFont);
+            QFontMetrics snapshotNameMetrics(snapshotNameFont);
+            qreal dNameWidth = nameMetrics.width(name());
+            qreal dSnapshotNameWidth = snapshotNameMetrics.width(snapshotName());
+            qreal dNameRatio = dNameWidth / (dNameWidth + dSnapshotNameWidth);
+            int iNamePart = iMaximumWidth * dNameRatio;
+            /* Compress name to part width: */
+            QString strCompressedName = compressText(nameFont, name(), iNamePart);
+            return strCompressedName;
+        }
+        case MachineItemData_SnapshotName:
+        {
+            /* Prepare variables: */
+            int iMaximumWidth = data(MachineItemData_FirstRowMaximumWidth).toInt();
+            /* Calculate name width part: */
+            QFont nameFont = data(MachineItemData_NameFont).value<QFont>();
+            QFont snapshotNameFont = data(MachineItemData_SnapshotNameFont).value<QFont>();
+            QFontMetrics nameMetrics(nameFont);
+            QFontMetrics snapshotNameMetrics(snapshotNameFont);
+            qreal dNameWidth = nameMetrics.width(name());
+            qreal dSnapshotNameWidth = snapshotNameMetrics.width(snapshotName());
+            qreal dSnapshotNameRatio = dSnapshotNameWidth / (dNameWidth + dSnapshotNameWidth);
+            int iSnapshotNamePart = iMaximumWidth * dSnapshotNameRatio;
+            /* Compress name to part width: */
+            QString strCompressedName = compressText(snapshotNameFont, snapshotName(), iSnapshotNamePart);
+            return strCompressedName;
+        }
         case MachineItemData_StateText: return gpConverter->toString(machineState());
         /* Sizes: */
         case MachineItemData_PixmapSize: return osIcon().availableSizes().at(0);
         case MachineItemData_StatePixmapSize: return machineStateIcon().availableSizes().at(0);
+        case MachineItemData_MinimumNameSize:
+        {
+            QFont font = data(MachineItemData_NameFont).value<QFont>();
+            QFontMetrics fm(font);
+            int iMaximumTextWidth = textWidth(font, 15);
+            QString strCompressedName = compressText(font, name(), iMaximumTextWidth);
+            return QSize(fm.width(strCompressedName), fm.height());
+        }
         case MachineItemData_NameSize:
         {
@@ -159,8 +199,28 @@
             return QSize(fm.width(data(MachineItemData_Name).toString()), fm.height());
         }
+        case MachineItemData_MinimumSnapshotNameSize:
+        {
+            QFont font = data(MachineItemData_SnapshotNameFont).value<QFont>();
+            QFontMetrics fm(font);
+            int iMaximumTextWidth = textWidth(font, 15);
+            QString strCompressedName = compressText(font, snapshotName(), iMaximumTextWidth);
+            return QSize(fm.width(strCompressedName), fm.height());
+        }
         case MachineItemData_SnapshotNameSize:
         {
             QFontMetrics fm(data(MachineItemData_SnapshotNameFont).value<QFont>());
             return QSize(fm.width(QString("(%1)").arg(data(MachineItemData_SnapshotName).toString())), fm.height());
+        }
+        case MachineItemData_FirstRowMaximumWidth:
+        {
+            /* Prepare variables: */
+            int iMargin = data(MachineItemData_Margin).toInt();
+            int iPixmapWidth = data(MachineItemData_PixmapSize).toSize().width();
+            int iMachineItemMajorSpacing = data(MachineItemData_MajorSpacing).toInt();
+            int iToolBarWidth = data(MachineItemData_ToolBarSize).toSize().width();
+            int iMaximumWidth = (int)geometry().width() - iMargin -
+                                                          iPixmapWidth - iMachineItemMajorSpacing -
+                                                          iToolBarWidth - iMachineItemMajorSpacing;
+            return iMaximumWidth;
         }
         case MachineItemData_StateTextSize:
@@ -244,10 +304,10 @@
     int iMachineItemMajorSpacing = data(MachineItemData_MajorSpacing).toInt();
     int iMachineItemMinorSpacing = data(MachineItemData_MinorSpacing).toInt();
-    QSize machinePixmapSize = data(MachineItemData_PixmapSize).toSize();
-    QSize machineNameSize = data(MachineItemData_NameSize).toSize();
-    QSize snapshotNameSize = data(MachineItemData_SnapshotNameSize).toSize();
-    QSize machineStatePixmapSize = data(MachineItemData_StatePixmapSize).toSize();
-    QSize machineStateTextSize = data(MachineItemData_StateTextSize).toSize();
-    QSize toolBarSize = data(MachineItemData_ToolBarSize).toSize();
+    int iMachinePixmapWidth = data(MachineItemData_PixmapSize).toSize().width();
+    int iMinimumMachineNameWidth = data(MachineItemData_MinimumNameSize).toSize().width();
+    int iMinimumSnapshotNameWidth = data(MachineItemData_MinimumSnapshotNameSize).toSize().width();
+    int iMachineStatePixmapWidth = data(MachineItemData_StatePixmapSize).toSize().width();
+    int iMachineStateTextWidth = data(MachineItemData_StateTextSize).toSize().width();
+    int iToolBarWidth = data(MachineItemData_ToolBarSize).toSize().width();
 
     /* Calculating proposed width: */
@@ -258,16 +318,16 @@
     iProposedWidth += iMachineItemMargin;
     /* And machine item content to take into account: */
-    int iFirstLineWidth = machineNameSize.width() +
+    int iFirstLineWidth = iMinimumMachineNameWidth +
                           iMachineItemMinorSpacing +
-                          snapshotNameSize.width();
-    int iSecondLineWidth = machineStatePixmapSize.width() +
+                          iMinimumSnapshotNameWidth;
+    int iSecondLineWidth = iMachineStatePixmapWidth +
                            iMachineItemMinorSpacing +
-                           machineStateTextSize.width();
+                           iMachineStateTextWidth;
     int iSecondColumnWidth = qMax(iFirstLineWidth, iSecondLineWidth);
-    int iMachineItemWidth = machinePixmapSize.width() +
+    int iMachineItemWidth = iMachinePixmapWidth +
                             iMachineItemMajorSpacing +
                             iSecondColumnWidth +
                             iMachineItemMajorSpacing +
-                            toolBarSize.width() + 1;
+                            iToolBarWidth + 1;
     iProposedWidth += iMachineItemWidth;
 
@@ -281,10 +341,10 @@
     int iMachineItemMargin = data(MachineItemData_Margin).toInt();
     int iMachineItemTextSpacing = data(MachineItemData_TextSpacing).toInt();
-    QSize machinePixmapSize = data(MachineItemData_PixmapSize).toSize();
-    QSize machineNameSize = data(MachineItemData_NameSize).toSize();
-    QSize snapshotNameSize = data(MachineItemData_SnapshotNameSize).toSize();
-    QSize machineStatePixmapSize = data(MachineItemData_StatePixmapSize).toSize();
-    QSize machineStateTextSize = data(MachineItemData_StateTextSize).toSize();
-    QSize toolBarSize = data(MachineItemData_ToolBarSize).toSize();
+    int iMachinePixmapHeight = data(MachineItemData_PixmapSize).toSize().height();
+    int iMachineNameHeight = data(MachineItemData_NameSize).toSize().height();
+    int iSnapshotNameHeight = data(MachineItemData_SnapshotNameSize).toSize().height();
+    int iMachineStatePixmapHeight = data(MachineItemData_StatePixmapSize).toSize().height();
+    int iMachineStateTextHeight = data(MachineItemData_StateTextSize).toSize().height();
+    int iToolBarHeight = data(MachineItemData_ToolBarSize).toSize().height();
 
     /* Calculating proposed height: */
@@ -294,12 +354,12 @@
     iProposedHeight += 2 * iMachineItemMargin;
     /* And machine item content to take into account: */
-    int iFirstLineHeight = qMax(machineNameSize.height(), snapshotNameSize.height());
-    int iSecondLineHeight = qMax(machineStatePixmapSize.height(), machineStateTextSize.height());
+    int iFirstLineHeight = qMax(iMachineNameHeight, iSnapshotNameHeight);
+    int iSecondLineHeight = qMax(iMachineStatePixmapHeight, iMachineStateTextHeight);
     int iSecondColumnHeight = iFirstLineHeight +
                               iMachineItemTextSpacing +
                               iSecondLineHeight;
     QList<int> heights;
-    heights << machinePixmapSize.height() << iSecondColumnHeight
-            << (toolBarSize.height() - 2 * iMachineItemMargin + 2);
+    heights << iMachinePixmapHeight << iSecondColumnHeight
+            << (iToolBarHeight - 2 * iMachineItemMargin + 2);
     int iMaxHeight = 0;
     foreach (int iHeight, heights)
Index: /trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItemMachine.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItemMachine.h	(revision 42557)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItemMachine.h	(revision 42558)
@@ -80,6 +80,9 @@
         MachineItemData_PixmapSize,
         MachineItemData_StatePixmapSize,
+        MachineItemData_MinimumNameSize,
         MachineItemData_NameSize,
+        MachineItemData_MinimumSnapshotNameSize,
         MachineItemData_SnapshotNameSize,
+        MachineItemData_FirstRowMaximumWidth,
         MachineItemData_StateTextSize,
         MachineItemData_ToolBarSize
