Merge pull request #1347 from ermshiperete/ImproveEllipsisHandling
authorMiguel de Icaza <miguel@gnome.org>
Sun, 2 Nov 2014 17:36:49 +0000 (12:36 -0500)
committerMiguel de Icaza <miguel@gnome.org>
Sun, 2 Nov 2014 17:36:49 +0000 (12:36 -0500)
[MWF] Improve ellipsis handling

mcs/class/Managed.Windows.Forms/System.Windows.Forms/TextRenderer.cs
mcs/class/Managed.Windows.Forms/System.Windows.Forms/ThemeWin32Classic.cs

index bda5da96f78d996a6c4122998e5c19a7568cdba0..b82629a04837a1a14e4d29c976331378722f1ac5 100644 (file)
@@ -492,9 +492,6 @@ namespace System.Windows.Forms
                                r.X += 2;
                                r.Width -= 2;
                        }
-                       if ((flags & TextFormatFlags.WordEllipsis) == TextFormatFlags.WordEllipsis || (flags & TextFormatFlags.EndEllipsis) == TextFormatFlags.EndEllipsis || (flags & TextFormatFlags.WordBreak) == TextFormatFlags.WordBreak) {
-                               r.Width -= 4;
-                       }
                        if ((flags & TextFormatFlags.VerticalCenter) == TextFormatFlags.VerticalCenter && XplatUI.RunningOnUnix) {
                                r.Y -= 1;
                        }
index 29921942b4eddbcd9cdbc0b9c29b4e12a60804a8..d6214c5e93b2e1a033a8760928e53f7bd15c777e 100644 (file)
@@ -375,16 +375,18 @@ 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);
-                                               
-                                       // Image is dependent on ImageAlign
-                                       if (image == null)
                                                return;
+                                       }
                                                
                                        int image_x = 0;
                                        int image_y = 0;
@@ -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);
@@ -449,6 +451,8 @@ namespace System.Windows.Forms
                                        LayoutTextBeforeOrAfterImage (textRectangle, true, text_size, image_size, button.TextAlign, button.ImageAlign, out textRectangle, out imageRectangle);
                                        break;
                        }
+                       if (button.Pressed)
+                               textRectangle.Offset (1, 1);
                }
 
                private void LayoutTextBeforeOrAfterImage (Rectangle totalArea, bool textFirst, Size textSize, Size imageSize, System.Drawing.ContentAlignment textAlign, System.Drawing.ContentAlignment imageAlign, out Rectangle textRect, out Rectangle imageRect)
@@ -496,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;
@@ -545,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;
                }
@@ -1092,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);