|
// 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)
{
}
}
}
|