// 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; using System.Windows.Forms.Layout; namespace System.Windows.Forms; public partial class ToolStripMenuItem { private class ToolStripMenuItemInternalLayout : ToolStripItemInternalLayout { private readonly ToolStripMenuItem _ownerItem; public ToolStripMenuItemInternalLayout(ToolStripMenuItem ownerItem) : base(ownerItem) { _ownerItem = ownerItem; } public bool ShowCheckMargin { get { if (_ownerItem.Owner is ToolStripDropDownMenu menu) { return menu.ShowCheckMargin; } return false; } } public bool ShowImageMargin { get { if (_ownerItem.Owner is ToolStripDropDownMenu menu) { return menu.ShowImageMargin; } return false; } } public bool PaintCheck { get { return ShowCheckMargin || ShowImageMargin; } } public bool PaintImage { get { return ShowImageMargin; } } public Rectangle ArrowRectangle { get { if (UseMenuLayout) { if (_ownerItem.Owner is ToolStripDropDownMenu menu) { // since menuItem.Padding isn't taken into consideration, we've got to recalc the centering of // the arrow rect per item Rectangle arrowRect = menu.ArrowRectangle; arrowRect.Y = LayoutUtils.VAlign(arrowRect.Size, _ownerItem.ClientBounds, ContentAlignment.MiddleCenter).Y; return arrowRect; } } return Rectangle.Empty; } } public Rectangle CheckRectangle { get { if (UseMenuLayout) { if (_ownerItem.Owner is ToolStripDropDownMenu menu) { Rectangle checkRectangle = menu.CheckRectangle; if (_ownerItem.CheckedImage is not null) { int imageHeight = _ownerItem.CheckedImage.Height; // make sure we're vertically centered checkRectangle.Y += (checkRectangle.Height - imageHeight) / 2; checkRectangle.Height = imageHeight; return checkRectangle; } } } return Rectangle.Empty; } } public override Rectangle ImageRectangle { get { if (UseMenuLayout) { if (_ownerItem.Owner is ToolStripDropDownMenu menu) { // since menuItem.Padding isn't taken into consideration, we've got to recalc the centering of // the image rect per item Rectangle imageRect = menu.ImageRectangle; if (_ownerItem.ImageScaling == ToolStripItemImageScaling.SizeToFit) { imageRect.Size = menu.ImageScalingSize; } else { // If we don't have an image, use the CheckedImage. Image? image = _ownerItem.Image ?? _ownerItem.CheckedImage; Debug.Assert(image is not null); imageRect.Size = image?.Size ?? menu.ImageScalingSize; } imageRect.Y = LayoutUtils.VAlign(imageRect.Size, _ownerItem.ClientBounds, ContentAlignment.MiddleCenter).Y; return imageRect; } } return base.ImageRectangle; } } public override Rectangle TextRectangle { get { if (UseMenuLayout) { if (_ownerItem.Owner is ToolStripDropDownMenu menu) { return menu.TextRectangle; } } return base.TextRectangle; } } public bool UseMenuLayout { get { return _ownerItem.Owner is ToolStripDropDownMenu; } } public override Size GetPreferredSize(Size constrainingSize) { if (UseMenuLayout) { if (_ownerItem.Owner is ToolStripDropDownMenu menu) { return menu.MaxItemSize; } } return base.GetPreferredSize(constrainingSize); } } } |