public static void ApplyPreferredSize(Control control) { if (AutoSizePanel.CanAutoSizeWidth(control) || AutoSizePanel.CanAutoSizeHeight(control)) { Size fitToContentsSize = AutoSizePanel.GetFitToContentsSize(control); if (control.Size != fitToContentsSize) { control.Size = AutoSizePanel.GetAutoSizeModeSize(control, fitToContentsSize); } } }
public static Size GetFitToContentsSize(Control control) { if (control.HasChildren) { int num = int.MinValue; int num2 = int.MinValue; int num3 = 0; int num4 = 0; bool flag = false; bool flag2 = true; bool flag3 = true; for (int i = 0; i < control.Controls.Count; i++) { Control control2 = control.Controls[i]; if (control2.Visible) { flag = true; switch (control2.Dock) { case DockStyle.None: { flag2 = false; flag3 = false; Size size = control2.Size; num = Math.Max(num, control2.Left + size.Width); num2 = Math.Max(num2, control2.Top + size.Height); break; } case DockStyle.Top: case DockStyle.Bottom: flag3 = false; num4 += control2.Height; break; case DockStyle.Left: case DockStyle.Right: flag2 = false; num3 += control2.Width; break; case DockStyle.Fill: num3 += control2.Width; num4 += control2.Height; break; } } } ScrollableControl scrollableControl = control as ScrollableControl; if (scrollableControl != null) { ScrollableControl.DockPaddingEdges dockPadding = scrollableControl.DockPadding; num += dockPadding.Right; num2 += dockPadding.Bottom; num3 += dockPadding.Left + dockPadding.Right; num4 += dockPadding.Top + dockPadding.Bottom; } num = Math.Max(num, num3); num2 = Math.Max(num2, num4); if (!flag || !AutoSizePanel.CanAutoSizeWidth(control) || flag2) { num = control.Size.Width; } if (!flag || !AutoSizePanel.CanAutoSizeHeight(control) || flag3) { num2 = control.Size.Height; } return(AutoSizePanel.GetAutoSizeModeSize(control, new Size(num, num2))); } return(control.Size); }