[MWF] Improve ellipsis handling
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / ThemeWin32Classic.cs
index 2804060aeb83e901820b88830a5cf3bd8e5a8349..d6214c5e93b2e1a033a8760928e53f7bd15c777e 100644 (file)
@@ -375,14 +375,16 @@ namespace System.Windows.Forms
                        textRectangle = Rectangle.Inflate (content_rect, -4, -4);
                        imageRectangle = Rectangle.Empty;
                        
+                       bool displayEllipsis = (button.TextFormatFlags & (TextFormatFlags.EndEllipsis | TextFormatFlags.PathEllipsis | TextFormatFlags.WordEllipsis)) != 0;
+
                        switch (button.TextImageRelation) {
                                case TextImageRelation.Overlay:
                                        // Overlay is easy, text always goes here
 
                                        // Image is dependent on ImageAlign
                                        if (image == null) {
-                                       if (button.Pressed)
-                                               textRectangle.Offset (1, 1);
+                                               if (button.Pressed)
+                                                       textRectangle.Offset (1, 1);
                                                return;
                                        }
                                                
@@ -437,10 +439,10 @@ namespace System.Windows.Forms
                                        imageRectangle = new Rectangle (image_x, image_y, image_width, image_height);
                                        break;
                                case TextImageRelation.ImageAboveText:
-                                       LayoutTextAboveOrBelowImage (textRectangle, false, text_size, image_size, button.TextAlign, button.ImageAlign, out textRectangle, out imageRectangle);
+                                       LayoutTextAboveOrBelowImage (textRectangle, false, text_size, image_size, button.TextAlign, button.ImageAlign, displayEllipsis, out textRectangle, out imageRectangle);
                                        break;
                                case TextImageRelation.TextAboveImage:
-                                       LayoutTextAboveOrBelowImage (textRectangle, true, text_size, image_size, button.TextAlign, button.ImageAlign, out textRectangle, out imageRectangle);
+                                       LayoutTextAboveOrBelowImage (textRectangle, true, text_size, image_size, button.TextAlign, button.ImageAlign, displayEllipsis, out textRectangle, out imageRectangle);
                                        break;
                                case TextImageRelation.ImageBeforeText:
                                        LayoutTextBeforeOrAfterImage (textRectangle, false, text_size, image_size, button.TextAlign, button.ImageAlign, out textRectangle, out imageRectangle);
@@ -498,7 +500,7 @@ namespace System.Windows.Forms
                        imageRect = final_image_rect;
                }
 
-               private void LayoutTextAboveOrBelowImage (Rectangle totalArea, bool textFirst, Size textSize, Size imageSize, System.Drawing.ContentAlignment textAlign, System.Drawing.ContentAlignment imageAlign, out Rectangle textRect, out Rectangle imageRect)
+               private void LayoutTextAboveOrBelowImage (Rectangle totalArea, bool textFirst, Size textSize, Size imageSize, System.Drawing.ContentAlignment textAlign, System.Drawing.ContentAlignment imageAlign, bool displayEllipsis, out Rectangle textRect, out Rectangle imageRect)
                {
                        int element_spacing = 0;        // Spacing between the Text and the Image
                        int total_height = textSize.Height + element_spacing + imageSize.Height;
@@ -547,6 +549,12 @@ namespace System.Windows.Forms
                                        final_text_rect.Y = totalArea.Top;
                        }
 
+                       if (displayEllipsis) {
+                               // Don't use more space than is available otherwise ellipsis won't show
+                               if (final_text_rect.Height > totalArea.Bottom)
+                                       final_text_rect.Height = totalArea.Bottom - final_text_rect.Top;
+                       }
+
                        textRect = final_text_rect;
                        imageRect = final_image_rect;
                }
@@ -1094,11 +1102,11 @@ namespace System.Windows.Forms
                                        break;
                                case TextImageRelation.ImageAboveText:
                                        content_rect.Inflate (-4, -4);
-                                       LayoutTextAboveOrBelowImage (content_rect, false, text_size, image_size, button.TextAlign, button.ImageAlign, out textRectangle, out imageRectangle);
+                                       LayoutTextAboveOrBelowImage (content_rect, false, text_size, image_size, button.TextAlign, button.ImageAlign, false, out textRectangle, out imageRectangle);
                                        break;
                                case TextImageRelation.TextAboveImage:
                                        content_rect.Inflate (-4, -4);
-                                       LayoutTextAboveOrBelowImage (content_rect, true, text_size, image_size, button.TextAlign, button.ImageAlign, out textRectangle, out imageRectangle);
+                                       LayoutTextAboveOrBelowImage (content_rect, true, text_size, image_size, button.TextAlign, button.ImageAlign, false, out textRectangle, out imageRectangle);
                                        break;
                                case TextImageRelation.ImageBeforeText:
                                        content_rect.Inflate (-4, -4);