// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.ComponentModel; using System.Windows.Forms.Layout; namespace System.Windows.Forms; public sealed partial class TableLayoutSettings { private class TableLayoutSettingsStub { private static ControlInformation s_defaultControlInfo = new(null, -1, -1, 1, 1); private TableLayoutColumnStyleCollection? _columnStyles; private TableLayoutRowStyleCollection? _rowStyles; private Dictionary<object, ControlInformation>? _controlsInfo; public TableLayoutSettingsStub() { } /// <summary> /// Applies settings from the stub into a full-fledged TableLayoutSettings. /// /// NOTE: this is a one-time only operation - there is data loss to the stub /// as a result of calling this function. We hand as much over to the other settings /// so we don't have to reallocate anything /// </summary> internal void ApplySettings(TableLayoutSettings settings) { // apply row,column,rowspan,colspan TableLayout.ContainerInfo containerInfo = TableLayout.GetContainerInfo(settings.Owner!); if (containerInfo.Container is Control appliedControl && _controlsInfo is not null) { // we store the control names, look up the controls // in the appliedControl's control collection and apply the row,column settings. foreach (object controlName in _controlsInfo.Keys) { ControlInformation controlInfo = _controlsInfo[controlName]; // Look for the control in our table, we have to go through // PropertyDescriptor rather than just going using appliedControl.Controls[controlName] // because the Name property is shadowed at design time foreach (Control tableControl in appliedControl.Controls) { if (tableControl is not null) { string? name = null; PropertyDescriptor? prop = TypeDescriptor.GetProperties(tableControl)["Name"]; if (prop is not null && prop.PropertyType == typeof(string)) { name = prop.GetValue(tableControl) as string; } if (WindowsFormsUtils.SafeCompareStrings(name, controlName as string, ignoreCase: false)) { settings.SetRow(tableControl, controlInfo.Row); settings.SetColumn(tableControl, controlInfo.Column); settings.SetRowSpan(tableControl, controlInfo.RowSpan); settings.SetColumnSpan(tableControl, controlInfo.ColumnSpan); break; } } } } } // Assign over the row and column styles containerInfo.RowStyles = _rowStyles; containerInfo.ColumnStyles = _columnStyles; // Since we've given over the styles to the other guy, null out. _columnStyles = null; _rowStyles = null; } public TableLayoutColumnStyleCollection ColumnStyles => _columnStyles ??= []; public TableLayoutRowStyleCollection RowStyles => _rowStyles ??= []; internal List<ControlInformation> GetControlsInformation() { if (_controlsInfo is null) { return []; } List<ControlInformation> listOfControlInfo = new(_controlsInfo.Count); foreach (object name in _controlsInfo.Keys) { ControlInformation ci = _controlsInfo[name]; ci.Name = name; listOfControlInfo.Add(ci); } return listOfControlInfo; } private ControlInformation GetControlInformation(object controlName) { if (_controlsInfo is null) { return s_defaultControlInfo; } return _controlsInfo.GetValueOrDefault(controlName, s_defaultControlInfo); } public int GetColumn(object controlName) => GetControlInformation(controlName).Column; public int GetColumnSpan(object controlName) => GetControlInformation(controlName).ColumnSpan; public int GetRow(object controlName) => GetControlInformation(controlName).Row; public int GetRowSpan(object controlName) => GetControlInformation(controlName).RowSpan; private void SetControlInformation(object controlName, ControlInformation info) { _controlsInfo ??= []; _controlsInfo[controlName] = info; } public void SetColumn(object controlName, int column) { if (GetColumn(controlName) != column) { ControlInformation info = GetControlInformation(controlName); info.Column = column; SetControlInformation(controlName, info); } } public void SetColumnSpan(object controlName, int value) { if (GetColumnSpan(controlName) != value) { ControlInformation info = GetControlInformation(controlName); info.ColumnSpan = value; SetControlInformation(controlName, info); } } public void SetRow(object controlName, int row) { if (GetRow(controlName) != row) { ControlInformation info = GetControlInformation(controlName); info.Row = row; SetControlInformation(controlName, info); } } public void SetRowSpan(object controlName, int value) { if (GetRowSpan(controlName) != value) { ControlInformation info = GetControlInformation(controlName); info.RowSpan = value; SetControlInformation(controlName, info); } } } } |