2007-08-22 Jonathan Pobst <monkey@jpobst.com>
authorJonathan Pobst <monkey@jpobst.com>
Wed, 22 Aug 2007 21:48:16 +0000 (21:48 -0000)
committerJonathan Pobst <monkey@jpobst.com>
Wed, 22 Aug 2007 21:48:16 +0000 (21:48 -0000)
* CheckBox.cs: Implement AutoSize calculation.

2007-08-22  Jonathan Pobst  <monkey@jpobst.com>

* ComboBoxTest.cs: Add test for AutoSize behavior.

svn path=/trunk/mcs/; revision=84666

mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog
mcs/class/Managed.Windows.Forms/System.Windows.Forms/CheckBox.cs
mcs/class/Managed.Windows.Forms/System.Windows.Forms/Theme.cs
mcs/class/Managed.Windows.Forms/System.Windows.Forms/ThemeWin32Classic.cs
mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/ChangeLog
mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/ComboBoxTest.cs

index 5a89ce801e977436c004dd901da3b12768a20d46..9e359e41bd1a8529ac84328a5acc489ae48c5133 100644 (file)
@@ -1,3 +1,7 @@
+2007-08-22  Jonathan Pobst  <monkey@jpobst.com>
+
+       * CheckBox.cs: Implement AutoSize calculation.
+
 2007-08-22  Jonathan Pobst  <monkey@jpobst.com>
 
        * CheckBox.cs: Use new 2.0 rendering for 2.0.
index 6426bc493a9a7ee5124fafa43a2396a9128e04b6..df6f216bc6e32bdef6f090deb9dbf7d3651892bf 100644 (file)
@@ -140,6 +140,16 @@ namespace System.Windows.Forms {
 #endif
                }
 
+#if NET_2_0
+               internal override Size GetPreferredSizeCore (Size proposedSize)
+               {
+                       if (this.AutoSize)
+                               return ThemeEngine.Current.CalculateCheckBoxAutoSize (this);
+
+                       return base.GetPreferredSizeCore (proposedSize);
+               }
+#endif
+
                internal override void HaveDoubleClick() {
                        if (DoubleClick != null) DoubleClick(this, EventArgs.Empty);
                }
index bd8d20c199f1d0d0035f6b10d35cc83ba47057f9..e9322fad8e2ebeae2254a6738f731cfabf8d2165 100644 (file)
@@ -725,6 +725,7 @@ namespace System.Windows.Forms
 
                #region CheckBox
 #if NET_2_0
+               public abstract Size CalculateCheckBoxAutoSize (CheckBox checkBox);
                public abstract void CalculateCheckBoxTextAndImageLayout (ButtonBase b, Point offset, out Rectangle glyphArea, out Rectangle textRectangle, out Rectangle imageRectangle);
                public abstract void DrawCheckBox (Graphics g, CheckBox cb, Rectangle textBounds, Rectangle glyphArea, Rectangle imageBounds, Rectangle clipRectangle);
 #endif
index 8b813e1de7ec9ce63762f35ade5cccab402bce2f..12b2f384ab6e7d3534a8689459d30c6410877f89 100644 (file)
@@ -1022,6 +1022,46 @@ namespace System.Windows.Forms
                                        break;
                        }
                }
+
+               public override Size CalculateCheckBoxAutoSize (CheckBox checkBox)
+               {
+                       Size ret_size = Size.Empty;
+                       Size text_size = TextRenderer.MeasureTextInternal (checkBox.Text, checkBox.Font, checkBox.UseCompatibleTextRendering);
+                       Size image_size = checkBox.Image == null ? Size.Empty : checkBox.Image.Size;
+
+                       // Pad the text size
+                       if (checkBox.Text.Length != 0) {
+                               text_size.Height += 4;
+                               text_size.Width += 4;
+                       }
+
+                       switch (checkBox.TextImageRelation) {
+                               case TextImageRelation.Overlay:
+                                       ret_size.Height = Math.Max (checkBox.Text.Length == 0 ? 0 : text_size.Height, image_size.Height);
+                                       ret_size.Width = Math.Max (text_size.Width, image_size.Width);
+                                       break;
+                               case TextImageRelation.ImageAboveText:
+                               case TextImageRelation.TextAboveImage:
+                                       ret_size.Height = text_size.Height + image_size.Height;
+                                       ret_size.Width = Math.Max (text_size.Width, image_size.Width);
+                                       break;
+                               case TextImageRelation.ImageBeforeText:
+                               case TextImageRelation.TextBeforeImage:
+                                       ret_size.Height = Math.Max (text_size.Height, image_size.Height);
+                                       ret_size.Width = text_size.Width + image_size.Width;
+                                       break;
+                       }
+
+                       // Pad the result
+                       ret_size.Height += (checkBox.Padding.Vertical);
+                       ret_size.Width += (checkBox.Padding.Horizontal) + 15;
+
+                       // There seems to be a minimum height
+                       if (ret_size.Height == checkBox.Padding.Vertical)
+                               ret_size.Height += 14;
+                               
+                       return ret_size;
+               }
 #endif
 
                public override void DrawCheckBox(Graphics dc, Rectangle clip_area, CheckBox checkbox) {
index f7c8b2b7687ee1bbd51a1a7e2b6535e3fd62620e..c904d773ea49838dc2a3743dc3b515e42e8b6ad2 100644 (file)
@@ -1,3 +1,7 @@
+2007-08-22  Jonathan Pobst  <monkey@jpobst.com>
+
+       * ComboBoxTest.cs: Add test for AutoSize behavior.
+
 2007-08-21  Rolf Bjarne Kvinge <RKvinge@novell.com> 
 
        * DataGridViewCellTest.cs: Added GetClipboardContentTest,
index b551d67d3236267e125b8d3fb386f8eff8d21f2c..5aa8abf6af53c5a8c6944f2e9ab01953d91e7f9a 100644 (file)
@@ -1091,6 +1091,106 @@ namespace MonoTests.System.Windows.Forms
                }
 
 #if NET_2_0
+               [Test]
+               public void BehaviorAutoSize ()
+               {
+                       if (TestHelper.RunningOnUnix)
+                               Assert.Ignore ("Depends on font measurements, corresponds to windows");
+
+                       Form f = new Form ();
+                       f.ShowInTaskbar = false;
+
+                       f.Show ();
+
+                       Image i = new Bitmap (20, 20);
+                       String s = "My test string";
+
+                       CheckBox b = new CheckBox ();
+                       Size s_size = TextRenderer.MeasureText (s, b.Font);
+
+                       b.UseCompatibleTextRendering = false;
+                       b.Size = new Size (5, 5);
+                       b.AutoSize = true;
+                       b.Text = s;
+                       f.Controls.Add (b);
+
+                       // Text only
+                       b.TextImageRelation = TextImageRelation.Overlay;
+                       Assert.AreEqual (new Size (s_size.Width + 19, s_size.Height + 4), b.Size, "A1");
+                       b.TextImageRelation = TextImageRelation.ImageAboveText;
+                       b.Size = new Size (5, 5);
+                       Assert.AreEqual (new Size (s_size.Width + 19, s_size.Height + 4), b.Size, "A2");
+                       b.TextImageRelation = TextImageRelation.ImageBeforeText;
+                       b.Size = new Size (5, 5);
+                       Assert.AreEqual (new Size (s_size.Width + 19, s_size.Height + 4), b.Size, "A3");
+                       b.TextImageRelation = TextImageRelation.TextAboveImage;
+                       b.Size = new Size (5, 5);
+                       Assert.AreEqual (new Size (s_size.Width + 19, s_size.Height + 4), b.Size, "A4");
+                       b.TextImageRelation = TextImageRelation.TextBeforeImage;
+                       b.Size = new Size (5, 5);
+                       Assert.AreEqual (new Size (s_size.Width + 19, s_size.Height + 4), b.Size, "A5");
+
+                       // Text and Image
+                       b.Image = i;
+                       b.TextImageRelation = TextImageRelation.Overlay;
+                       b.Size = new Size (5, 5);
+                       Assert.AreEqual (new Size (s_size.Width + 19, i.Height), b.Size, "A6");
+                       b.TextImageRelation = TextImageRelation.ImageAboveText;
+                       b.Size = new Size (5, 5);
+                       Assert.AreEqual (new Size (s_size.Width + 19, s_size.Height + i.Height + 4), b.Size, "A7");
+                       b.TextImageRelation = TextImageRelation.ImageBeforeText;
+                       b.Size = new Size (5, 5);
+                       Assert.AreEqual (new Size (s_size.Width + i.Width + 19, i.Height), b.Size, "A8");
+                       b.TextImageRelation = TextImageRelation.TextAboveImage;
+                       b.Size = new Size (5, 5);
+                       Assert.AreEqual (new Size (s_size.Width + 19, s_size.Height + i.Height + 4), b.Size, "A9");
+                       b.TextImageRelation = TextImageRelation.TextBeforeImage;
+                       b.Size = new Size (5, 5);
+                       Assert.AreEqual (new Size (s_size.Width + i.Width + 19, i.Height), b.Size, "A10");
+
+                       // Image only
+                       b.Text = string.Empty;
+                       b.TextImageRelation = TextImageRelation.Overlay;
+                       b.Size = new Size (5, 5);
+                       Assert.AreEqual (new Size (i.Height + 15, i.Height), b.Size, "A11");
+                       b.TextImageRelation = TextImageRelation.ImageAboveText;
+                       b.Size = new Size (5, 5);
+                       Assert.AreEqual (new Size (i.Height + 15, i.Height), b.Size, "A12");
+                       b.TextImageRelation = TextImageRelation.ImageBeforeText;
+                       b.Size = new Size (5, 5);
+                       Assert.AreEqual (new Size (i.Height + 15, i.Height), b.Size, "A13");
+                       b.TextImageRelation = TextImageRelation.TextAboveImage;
+                       b.Size = new Size (5, 5);
+                       Assert.AreEqual (new Size (i.Height + 15, i.Height), b.Size, "A14");
+                       b.TextImageRelation = TextImageRelation.TextBeforeImage;
+                       b.Size = new Size (5, 5);
+                       Assert.AreEqual (new Size (i.Height + 15, i.Height), b.Size, "A15");
+
+                       // Neither
+                       b.Image = null;
+                       b.TextImageRelation = TextImageRelation.Overlay;
+                       b.Size = new Size (5, 5);
+                       Assert.AreEqual (new Size (15, 14), b.Size, "A16");
+                       b.TextImageRelation = TextImageRelation.ImageAboveText;
+                       b.Size = new Size (5, 5);
+                       Assert.AreEqual (new Size (15, 14), b.Size, "A17");
+                       b.TextImageRelation = TextImageRelation.ImageBeforeText;
+                       b.Size = new Size (5, 5);
+                       Assert.AreEqual (new Size (15, 14), b.Size, "A18");
+                       b.TextImageRelation = TextImageRelation.TextAboveImage;
+                       b.Size = new Size (5, 5);
+                       Assert.AreEqual (new Size (15, 14), b.Size, "A19");
+                       b.TextImageRelation = TextImageRelation.TextBeforeImage;
+                       b.Size = new Size (5, 5);
+                       Assert.AreEqual (new Size (15, 14), b.Size, "A20");
+
+                       // Padding
+                       b.Padding = new Padding (5, 10, 15, 20);
+                       Assert.AreEqual (new Size (15 + b.Padding.Horizontal, 14 + b.Padding.Vertical), b.Size, "A21");
+
+                       f.Dispose ();
+               }
+
                [Test]
                public void MethodScaleControl ()
                {
@@ -1110,7 +1210,7 @@ namespace MonoTests.System.Windows.Forms
 
                        gb.PublicScaleControl (new SizeF (.5f, .5f), BoundsSpecified.Location);
                        Assert.AreEqual (new Rectangle (5, 10, 238, 21), gb.Bounds, "A3");
-Console.WriteLine ("STARTING");
+
                        gb.PublicScaleControl (new SizeF (.5f, .5f), BoundsSpecified.Size);
                        Assert.AreEqual (new Rectangle (5, 10, 121, 21), gb.Bounds, "A4");
                        Console.WriteLine ("DONE");