[Mono-winforms-list] [Fwd: new Control.Autosize Patch]
Stefan Noack
noackstefan at googlemail.com
Mon Apr 9 16:44:02 EDT 2007
hi
ok. i will fix those issues in the next days. :) thanks!
noah
2007/4/9, Jonathan Pobst <monkey at jpobst.com>:
>
> Hey Noah, sorry this didn't go out quicker. Dunno why the list is
> eating it (or if it's just me that isn't getting it).
>
> It's good work, but there's some things that need to be fixed up before
> I can commit it.
>
> We have to match the MS public API, so the following things are issues:
> - Control.GetAutoSizeMode must be protected.
> - We can't have the overrides: Button.AutoSize, Button.GetPreferredSize,
> GroupBox.GetPreferredSize, or UserControl.GetPreferredSize.
> (Check out the ButtonBase class.)
>
> Other issues:
> - Don't call the DefaultLayout.LayoutAutoSizedChildren method on
> !NET_2_0. (Since there doesn't seem to be any work done in there for 1.1
> .)
> - Remove the MonoTODO on Control.AutoSize. Since it's implemented now,
> there's no real reason to have it.
> - In DefaultLayout.LayoutAutoSizedChildren, use BoundsSpecified.None in
> your SetBounds call.
> (http://jpobst.blogspot.com/2007/04/setboundscore.html)
> - What is the purpose for Control.GetPreferredSizeCore?
> - Please write a ChangeLog entry summarizes the changes.
>
> I think most of the patch is fine. No old tests broke, and your new
> tests pass. It just needs a little cleaning to make sure we match MS's
> public API. :-)
>
> Thanks!
> Jon
>
>
>
> Jackson Harper wrote:
> > Since this didn't get delivered to everyone on the list. Just
> > re-posting.
> >
> > Love,
> > Jackson
> >
> >
> > -------- Forwarded Message --------
> > From: Stefan Noack <noackstefan at googlemail.com>
> > To: mono-winforms-list <mono-winforms-list at lists.ximian.com>
> > Subject: [Mono-winforms-list] new Control.Autosize Patch
> > Date: Mon, 9 Apr 2007 18:02:27 +0200
> >
> > 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
> > _______________________________________________
> > Mono-winforms-list maillist - Mono-winforms-list at lists.ximian.com
> > http://lists.ximian.com/mailman/listinfo/mono-winforms-list
> >
> >
> > ------------------------------------------------------------------------
> >
> > 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 (mritvik at novell.com)
> > +// Stefan Noack (noackstefan at googlemail.com)
> > //
> >
> > 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 (monkey at jpobst.com)
> > +// Stefan Noack (noackstefan at googlemail.com)
> > //
> >
> > 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 - Mono-winforms-list at lists.ximian.com
> > http://lists.ximian.com/mailman/listinfo/mono-winforms-list
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.ximian.com/pipermail/mono-winforms-list/attachments/20070409/82ab5410/attachment-0001.html
More information about the Mono-winforms-list
mailing list