File: System\Windows\Forms\Controls\ToolStrips\ToolStripPanelRow.ToolStripPanelRowManager.cs
Web Access
Project: src\src\System.Windows.Forms\src\System.Windows.Forms.csproj (System.Windows.Forms)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Drawing;
 
namespace System.Windows.Forms;
 
public partial class ToolStripPanelRow
{
    private abstract class ToolStripPanelRowManager
    {
        private FlowLayoutSettings? _flowLayoutSettings;
 
        public ToolStripPanelRowManager(ToolStripPanelRow owner)
        {
            Row = owner;
        }
 
        public virtual bool CanMove(ToolStrip toolStripToDrag)
        {
            if (toolStripToDrag is ISupportToolStripPanel toolStripToDragAsRaftingControl && toolStripToDragAsRaftingControl.Stretch)
            {
                return false;
            }
 
            foreach (Control control in Row.ControlsInternal)
            {
                if (control is ISupportToolStripPanel controlAsRaftingControl && controlAsRaftingControl.Stretch)
                {
                    return false;
                }
            }
 
            return true;
        }
 
        public virtual Rectangle DragBounds
        {
            get { return Rectangle.Empty; }
        }
 
        public virtual Rectangle DisplayRectangle
        {
            get { return Rectangle.Empty; }
        }
 
        public ToolStripPanel ToolStripPanel
        {
            get { return Row.ToolStripPanel; }
        }
 
        public ToolStripPanelRow Row { get; }
 
        public FlowLayoutSettings FlowLayoutSettings
        {
            get
            {
                _flowLayoutSettings ??= new FlowLayoutSettings(Row);
 
                return _flowLayoutSettings;
            }
        }
 
        protected internal virtual int FreeSpaceFromRow(int spaceToFree)
        {
            return 0;
        }
 
        protected virtual int Grow(int index, int growBy)
        {
            int freedSpace = 0;
            if (index >= 0 && index < Row.ControlsInternal.Count - 1)
            {
                ToolStripPanelCell cell = (ToolStripPanelCell)Row.Cells[index];
                if (cell.Visible)
                {
                    freedSpace = cell.Grow(growBy);
                }
            }
 
            return freedSpace;
        }
 
        public ToolStripPanelCell? GetNextVisibleCell(int index, bool forward)
        {
            if (forward)
            {
                for (int i = index; i < Row.Cells.Count; i++)
                {
                    ToolStripPanelCell cell = (ToolStripPanelCell)Row.Cells[i];
                    if ((cell.Visible || (Row.ToolStripPanel.Visible && cell.ControlInDesignMode)) && cell.ToolStripPanelRow == Row)
                    {
                        return cell;
                    }
                }
            }
            else
            {
                for (int i = index; i >= 0; i--)
                {
                    ToolStripPanelCell cell = (ToolStripPanelCell)Row.Cells[i];
                    if ((cell.Visible || (Row.ToolStripPanel.Visible && cell.ControlInDesignMode)) && cell.ToolStripPanelRow == Row)
                    {
                        return cell;
                    }
                }
            }
 
            return null;
        }
 
        /// <summary>
        ///  grows all controls after the index to be their preferred size.
        ///  reports back how much space was used.
        /// </summary>
        protected virtual int GrowControlsAfter(int index, int growBy)
        {
            if (growBy < 0)
            {
                Debug.Fail("why was a negative number given to growControlsAfter?");
                return 0;
            }
 
            int spaceToFree = growBy;
 
            for (int i = index + 1; i < Row.ControlsInternal.Count; i++)
            {
                // grow the n+1 item first if it was previously shrunk.
                int freedSpace = Grow(i, spaceToFree);
 
                if (freedSpace >= 0)
                {
                    spaceToFree -= freedSpace;
                    if (spaceToFree <= 0)
                    {
                        return growBy;
                    }
                }
            }
 
            return growBy - spaceToFree;
        }
 
        /// <summary>
        ///  grows all controls before the index to be their preferred size.
        ///  reports back how much space was used.
        /// </summary>
        protected virtual int GrowControlsBefore(int index, int growBy)
        {
            if (growBy < 0)
            {
                Debug.Fail("why was a negative number given to growControlsAfter?");
                return 0;
            }
 
            int spaceToFree = growBy;
 
            // grow the n-1 item first if it was previously shrunk.
            for (int i = index - 1; i >= 0; i--)
            {
                spaceToFree -= Grow(i, spaceToFree);
                if (spaceToFree <= 0)
                {
                    return growBy; // we've already gotten all the free space.
                }
            }
 
            return growBy - spaceToFree;
        }
 
        public virtual void MoveControl(ToolStrip movingControl, Point startClientLocation, Point endClientLocation)
        {
            // ToolStripPanel.Join(movingControl, endScreenLocation);
        }
 
        public virtual void LeaveRow(ToolStrip toolStripToDrag)
        {
        }
 
        public virtual void JoinRow(ToolStrip toolStripToDrag, Point locationToDrag)
        {
        }
 
        protected internal virtual void OnControlAdded(Control c, int index)
        {
        }
 
        protected internal virtual void OnControlRemoved(Control c, int index)
        {
        }
 
        protected internal virtual void OnBoundsChanged(Rectangle oldBounds, Rectangle newBounds)
        {
        }
    }
}