hi
here it is. related to a newer revision and without non-autosize stuff. (let
me recheck this .... yes it is ok :) it also contains a new testcase.
best, noah
Index: mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/ControlTest.cs
===================================================================
--- mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/ControlTest.cs (Revision 75536)
+++ mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/ControlTest.cs (Arbeitskopie)
@@ -3,6 +3,7 @@
//
// Authors:
// Ritvik Mayank ([EMAIL PROTECTED])
+// Stefan Noack ([EMAIL PROTECTED])
//
using System;
@@ -24,7 +25,137 @@
[TestFixture]
public class ControlTest
{
+
+#if NET_2_0
[Test]
+ public void AutoSizeTest ()
+ {
+ ControlAutoSizeTester c = new ControlAutoSizeTester (new Size (23, 17), AutoSizeMode.GrowAndShrink);
+
+ Form f = new Form();
+ f.Size = new Size (200, 200);
+ c.Parent = f;
+ f.Show();
+
+ Size s = new Size (42, 42);
+ c.Size = s;
+
+ Point l = new Point (10, 10);
+ c.Location = l;
+
+ //Check wether normal size setting is OK
+ Assert.AreEqual (s, c.Size, "#S1");
+
+ //Check wether size remains without GetPreferredSize implemented even when AutoSize turned on.
+ c.AutoSize = true;
+ f.PerformLayout();
+ Assert.AreEqual (s, c.Size, "#S2");
+
+ //Simulate a Control implementing GetPreferredSize
+ c.UseCustomPrefSize = true;
+ f.PerformLayout();
+
+ //Check wether size shrinks to preferred size
+ Assert.AreEqual (c.CustomPrefSize, c.Size, "#S3");
+ //Check wether Location stays constant
+ Assert.AreEqual (l, c.Location, "#L1");
+
+ //Check wether Dock is respected
+ c.Dock = DockStyle.Bottom;
+ Assert.AreEqual (f.ClientSize.Width, c.Width, "#D1");
+
+ //Check wether size shrinks to preferred size again
+ c.Dock = DockStyle.None;
+ Assert.AreEqual (c.CustomPrefSize, c.Size, "#S4");
+
+ //Check wether Anchor is respected for adjusting Locatioon
+ c.Anchor = AnchorStyles.Bottom;
+ f.Height += 50;
+ Assert.AreEqual (l.Y + 50, c.Top, "#A1");
+ //Check wether size is still OK
+ Assert.AreEqual (c.CustomPrefSize, c.Size, "#S5");
+
+
+ //just tidy up
+ c.Anchor = AnchorStyles.Top | AnchorStyles.Left;
+ c.Location = l;
+
+ //Check wether shrinking to zero is possible
+ c.CustomPrefSize = new Size (0, 0);
+ f.PerformLayout();
+ Assert.AreEqual (c.CustomPrefSize, c.Size, "#S6");
+
+ //Check wether MinimumSize is honored
+ c.MinimumSize = new Size (10, 12);
+ c.CustomPrefSize = new Size (5, 5);
+ f.PerformLayout();
+ Assert.AreEqual (c.MinimumSize, c.Size, "#S7");
+ c.MinimumSize = new Size (0, 0);
+
+ //Check wether MaximumSize is honored
+ c.MaximumSize = new Size (100, 120);
+ c.CustomPrefSize = new Size (500, 500);
+ f.PerformLayout();
+ Assert.AreEqual (c.MaximumSize, c.Size, "#S8");
+
+ //Check wether shrinking does not happen when GrowOnly
+ c.AutoSize = false;
+ s = new Size (23, 23);
+ c.Size = s;
+ c.CustomPrefSize = new Size (5, 5);
+ c.AutoSizeMode = AutoSizeMode.GrowOnly;
+ c.AutoSize = true;
+ f.PerformLayout();
+ Assert.AreEqual (s, c.Size, "#S9");
+ }
+
+ public class ControlAutoSizeTester : Control {
+
+
+ public ControlAutoSizeTester (Size customPrefSize, AutoSizeMode autoSizeMode)
+ {
+ custom_prefsize = customPrefSize;
+ AutoSizeMode = autoSizeMode;
+ }
+
+ public AutoSizeMode AutoSizeMode {
+ set {
+ base.SetAutoSizeMode (value);
+ }
+ }
+
+ private bool use_custom_prefsize = false;
+ public bool UseCustomPrefSize {
+ set {
+ use_custom_prefsize = value;
+ }
+ }
+
+ private Size custom_prefsize;
+
+ public Size CustomPrefSize {
+ get {
+ return custom_prefsize;
+ }
+ set {
+ custom_prefsize = value;
+ }
+ }
+
+
+ public override Size GetPreferredSize (Size proposedSize)
+ {
+ if (use_custom_prefsize) {
+ return custom_prefsize;
+ } else {
+ return base.GetPreferredSize(proposedSize);
+ }
+ }
+
+ }
+#endif
+
+ [Test]
public void InvokeTestParentHandle ()
{
Control child, parent;
Index: mcs/class/Managed.Windows.Forms/System.Windows.Forms/Button.cs
===================================================================
--- mcs/class/Managed.Windows.Forms/System.Windows.Forms/Button.cs (Revision 75536)
+++ mcs/class/Managed.Windows.Forms/System.Windows.Forms/Button.cs (Arbeitskopie)
@@ -94,6 +94,30 @@
dialog_result = value;
}
}
+
+#if NET_2_0
+
+ //Propagate that we can AutoSize
+ public override bool AutoSize {
+ get {
+ return base.AutoSize;
+ }
+ set {
+ base.AutoSize = value;
+ }
+ }
+
+ public System.Windows.Forms.AutoSizeMode AutoSizeMode {
+ set {
+ base.SetAutoSizeMode (value);
+ }
+ get {
+ return base.GetAutoSizeMode();
+ }
+ }
+
+#endif
+
#endregion // Public Instance Properties
#region Protected Instance Properties
@@ -117,6 +141,28 @@
public override string ToString() {
return base.ToString() + ", Text: " + this.Text;
}
+
+#if NET_2_0
+ public override Size GetPreferredSize (Size proposedSize)
+ {
+
+ Size retsize = new Size (0, 0);
+
+ // Figure out where our text and image should go
+ Rectangle text_rectangle;
+ Rectangle image_rectangle;
+
+ ThemeEngine.Current.CalculateButtonTextAndImageLayout (this, out text_rectangle, out image_rectangle);
+
+ // FIXME: Image should also be respected of course - not only text - depending on how they are put together
+ retsize.Width += text_rectangle.Width;
+ retsize.Height += text_rectangle.Height;
+
+ return retsize;
+ }
+
+#endif
+
#endregion // Public Instance Methods
#region Protected Instance Methods
Index: mcs/class/Managed.Windows.Forms/System.Windows.Forms/GroupBox.cs
===================================================================
--- mcs/class/Managed.Windows.Forms/System.Windows.Forms/GroupBox.cs (Revision 75536)
+++ mcs/class/Managed.Windows.Forms/System.Windows.Forms/GroupBox.cs (Arbeitskopie)
@@ -196,9 +196,63 @@
}
}
- #endregion //Public Properties
+#if NET_2_0
+ //Propagate that we can AutoSize
+ public override bool AutoSize {
+ get {
+ return base.AutoSize;
+ }
+ set {
+ base.AutoSize = value;
+ }
+ }
+
+ public System.Windows.Forms.AutoSizeMode AutoSizeMode {
+ set {
+ base.SetAutoSizeMode (value);
+ }
+ get {
+ return base.GetAutoSizeMode();
+ }
+ }
+
+#endif
+
+ #endregion // Public Instance Properties
+
#region Public Methods
+
+#if NET_2_0
+ public override Size GetPreferredSize (Size proposedSize)
+ {
+ Size retsize = new Size (0, 0);
+
+ for (int i = Controls.Count - 1; i >= 0; i--) {
+ Control child = Controls[i];
+
+ if (child.Dock != DockStyle.Top
+ && child.Dock != DockStyle.Bottom
+ && child.Bounds.Right > retsize.Width)
+ retsize.Width=child.Bounds.Right;
+
+ if (child.Dock != DockStyle.Left
+ && child.Dock != DockStyle.Right
+ && child.Bounds.Bottom > retsize.Height)
+ retsize.Height=child.Bounds.Bottom;
+
+ }
+
+ Rectangle display_r = DisplayRectangle;
+ retsize.Width += Width - display_r.Width;
+ retsize.Height += Height - display_r.Height;
+
+ return retsize;
+ }
+
+#endif
+
+
protected override void OnFontChanged (EventArgs e)
{
base.OnFontChanged (e);
Index: mcs/class/Managed.Windows.Forms/System.Windows.Forms/Control.cs
===================================================================
--- mcs/class/Managed.Windows.Forms/System.Windows.Forms/Control.cs (Revision 75536)
+++ mcs/class/Managed.Windows.Forms/System.Windows.Forms/Control.cs (Arbeitskopie)
@@ -881,7 +881,7 @@
owner.PerformLayout(ctrl, "Parent");
}
}
-
+
bool IList.IsFixedSize {
get {
return false;
@@ -2028,7 +2028,6 @@
}
}
- // XXX: Implement me!
bool auto_size;
[RefreshProperties (RefreshProperties.All)]
@@ -2037,7 +2036,7 @@
[Browsable (false)]
[EditorBrowsable (EditorBrowsableState.Never)]
[DefaultValue (false)]
- [MonoTODO("This method currently does nothing")]
+ [MonoTODO("This method now works. (Done by the LayoutEngine.) However, derived classes supposed to provide AutoSize must implement their AutoSize habits by overriding GetPreferredSize to complete this functionality")]
public virtual bool AutoSize {
get { return auto_size; }
set {
@@ -2048,6 +2047,18 @@
}
}
+ private AutoSizeMode auto_size_mode = AutoSizeMode.GrowOnly;
+
+ protected void SetAutoSizeMode (AutoSizeMode mode)
+ {
+ auto_size_mode = mode;
+ }
+
+ internal AutoSizeMode GetAutoSizeMode ()
+ {
+ return auto_size_mode;
+ }
+
#if NET_2_0
[AmbientValue ("{Width=0, Height=0}")]
#else
@@ -3485,7 +3496,7 @@
#if NET_2_0
[EditorBrowsable (EditorBrowsableState.Advanced)]
public virtual Size GetPreferredSize (Size proposedSize) {
- Size retsize = this.explicit_bounds.Size;
+ Size retsize = GetPreferredSizeCore(proposedSize);
// If we're bigger than the MaximumSize, fix that
if (this.maximum_size.Width != 0 && retsize.Width > this.maximum_size.Width)
@@ -3501,6 +3512,11 @@
return retsize;
}
+
+ internal virtual Size GetPreferredSizeCore (Size proposedSize) {
+ return this.explicit_bounds.Size;
+ }
+
#endif
public void Hide() {
Index: mcs/class/Managed.Windows.Forms/System.Windows.Forms/UserControl.cs
===================================================================
--- mcs/class/Managed.Windows.Forms/System.Windows.Forms/UserControl.cs (Revision 75536)
+++ mcs/class/Managed.Windows.Forms/System.Windows.Forms/UserControl.cs (Arbeitskopie)
@@ -68,8 +68,56 @@
base.Text = value;
}
}
+
+#if NET_2_0
+
+ //Propagate that we can AutoSize
+ public override bool AutoSize {
+ get {
+ return base.AutoSize;
+ }
+ set {
+ base.AutoSize = value;
+ }
+ }
+
+ public System.Windows.Forms.AutoSizeMode AutoSizeMode {
+ set {
+ base.SetAutoSizeMode (value);
+ }
+ get {
+ return base.GetAutoSizeMode();
+ }
+ }
+
+#endif
+
#endregion // Public Instance Properties
+#if NET_2_0
+ public override Size GetPreferredSize (Size proposedSize)
+ {
+ Size retsize = new Size (0, 0);
+
+ for (int i = Controls.Count - 1; i >= 0; i--) {
+ Control child = Controls[i];
+
+ if (child.Dock != DockStyle.Top
+ && child.Dock != DockStyle.Bottom
+ && child.Bounds.Right > retsize.Width)
+ retsize.Width=child.Bounds.Right;
+
+ if (child.Dock != DockStyle.Left
+ && child.Dock != DockStyle.Right
+ && child.Bounds.Bottom > retsize.Height)
+ retsize.Height=child.Bounds.Bottom;
+
+ }
+ return retsize;
+ }
+
+#endif
+
#region Protected Instance Methods
[EditorBrowsable(EditorBrowsableState.Advanced)]
protected override void OnCreateControl() {
@@ -96,6 +144,7 @@
protected override void WndProc(ref Message m) {
base.WndProc(ref m);
}
+
#endregion // Protected Instance Methods
#region Protected Properties
@@ -110,6 +159,7 @@
}
#endif
#endregion
+
#region Events
static object LoadEvent = new object ();
Index: mcs/class/Managed.Windows.Forms/System.Windows.Forms/ContainerControl.cs
===================================================================
--- mcs/class/Managed.Windows.Forms/System.Windows.Forms/ContainerControl.cs (Revision 75536)
+++ mcs/class/Managed.Windows.Forms/System.Windows.Forms/ContainerControl.cs (Arbeitskopie)
@@ -334,15 +334,19 @@
return null;
}
}
+
+
#endregion // Public Instance Properties
+
+
#region Protected Instance Methods
protected override CreateParams CreateParams {
get {
return base.CreateParams;
}
}
- #endregion // Public Instance Methods
+ #endregion // Protected Instance Methods
#region Public Instance Methods
[MonoTODO]
@@ -359,6 +363,7 @@
bool IContainerControl.ActivateControl(Control control) {
return Select(control);
}
+
#endregion // Public Instance Methods
#region Protected Instance Methods
Index: mcs/class/Managed.Windows.Forms/System.Windows.Forms.Layout/DefaultLayout.cs
===================================================================
--- mcs/class/Managed.Windows.Forms/System.Windows.Forms.Layout/DefaultLayout.cs (Revision 75536)
+++ mcs/class/Managed.Windows.Forms/System.Windows.Forms.Layout/DefaultLayout.cs (Arbeitskopie)
@@ -24,6 +24,7 @@
//
// Authors:
// Jonathan Pobst ([EMAIL PROTECTED])
+// Stefan Noack ([EMAIL PROTECTED])
//
using System;
@@ -111,14 +112,14 @@
left = child.Left;
top = child.Top;
-#if NET_2_0
- Size preferredsize = child.PreferredSize;
- width = preferredsize.Width;
- height = preferredsize.Height;
-#else
+//#if NET_2_0
+// Size preferredsize = child.PreferredSize;
+// width = preferredsize.Width;
+// height = preferredsize.Height;
+//#else
width = child.Width;
height = child.Height;
-#endif
+//#endif
if ((anchor & AnchorStyles.Right) != 0) {
if ((anchor & AnchorStyles.Left) != 0)
@@ -154,7 +155,65 @@
child.SetBounds (left, top, width, height, BoundsSpecified.None);
}
}
+
+ void LayoutAutoSizedChildren (Control parent, Control[] controls)
+ {
+
+ for (int i = 0; i < controls.Length; i++) {
+ int left;
+ int top;
+ int width;
+ int height;
+ Control child = controls[i];
+#if NET_2_0
+ if (!child.VisibleInternal
+ || child.ControlLayoutType == Control.LayoutType.Dock
+ || !child.AutoSize)
+ continue;
+
+
+ left = child.Left;
+ top = child.Top;
+
+
+ Size preferredsize = child.PreferredSize;
+
+ if (child.GetAutoSizeMode() == AutoSizeMode.GrowAndShrink) {
+ width = preferredsize.Width;
+ height = preferredsize.Height;
+ } else {
+ width = child.Width;
+ height = child.Height;
+ if (preferredsize.Width > width)
+ width = preferredsize.Width;
+ if (preferredsize.Height > height)
+ height = preferredsize.Height;
+
+ }
+
+
+
+ // Sanity
+ if (width < child.MinimumSize.Width)
+ width = child.MinimumSize.Width;
+
+ if (height < child.MinimumSize.Height)
+ height = child.MinimumSize.Height;
+
+
+ if (child.MaximumSize.Width != 0 && width > child.MaximumSize.Width)
+ width = child.MaximumSize.Width;
+
+ if (child.MaximumSize.Height != 0 && height > child.MaximumSize.Height)
+ height = child.MaximumSize.Height;
+
+ child.SetBounds (left, top, width, height);
+#endif
+
+ }
+ }
+
public override bool Layout (object container, LayoutEventArgs args)
{
Control parent = container as Control;
@@ -163,6 +222,7 @@
LayoutDockedChildren (parent, controls);
LayoutAnchoredChildren (parent, controls);
+ LayoutAutoSizedChildren (parent, controls);
return false;
}
_______________________________________________
Mono-winforms-list maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-winforms-list