| File: System\Drawing\Printing\Margins.cs | Web Access |
| Project: src\winforms\src\System.Drawing.Common\src\System.Drawing.Common.csproj (System.Drawing.Common) |
// 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.Runtime.Serialization; namespace System.Drawing.Printing; /// <summary> /// Specifies the margins of a printed page. /// </summary> [TypeConverter(typeof(MarginsConverter))] public partial class Margins : ICloneable { private int _left; private int _right; private int _bottom; private int _top; [OptionalField] private double _doubleLeft; [OptionalField] private double _doubleRight; [OptionalField] private double _doubleTop; [OptionalField] private double _doubleBottom; /// <summary> /// Initializes a new instance of a the <see cref='Margins'/> class with one-inch margins. /// </summary> public Margins() : this(100, 100, 100, 100) { } /// <summary> /// Initializes a new instance of a the <see cref='Margins'/> class with the specified left, right, top, and bottom margins. /// </summary> public Margins(int left, int right, int top, int bottom) { CheckMargin(left, nameof(left)); CheckMargin(right, nameof(right)); CheckMargin(top, nameof(top)); CheckMargin(bottom, nameof(bottom)); _left = left; _right = right; _top = top; _bottom = bottom; _doubleLeft = left; _doubleRight = right; _doubleTop = top; _doubleBottom = bottom; } /// <summary> /// Gets or sets the left margin, in hundredths of an inch. /// </summary> public int Left { get => _left; set { CheckMargin(value, nameof(value)); _left = value; _doubleLeft = value; } } /// <summary> /// Gets or sets the right margin, in hundredths of an inch. /// </summary> public int Right { get => _right; set { CheckMargin(value, nameof(value)); _right = value; _doubleRight = value; } } /// <summary> /// Gets or sets the top margin, in hundredths of an inch. /// </summary> public int Top { get => _top; set { CheckMargin(value, nameof(value)); _top = value; _doubleTop = value; } } /// <summary> /// Gets or sets the bottom margin, in hundredths of an inch. /// </summary> public int Bottom { get => _bottom; set { CheckMargin(value, nameof(value)); _bottom = value; _doubleBottom = value; } } /// <summary> /// Gets or sets the left margin with a double value, in hundredths of an inch. /// </summary> internal double DoubleLeft { get => _doubleLeft; set { Left = (int)Math.Round(value); _doubleLeft = value; } } /// <summary> /// Gets or sets the right margin with a double value, in hundredths of an inch. /// </summary> internal double DoubleRight { get => _doubleRight; set { Right = (int)Math.Round(value); _doubleRight = value; } } /// <summary> /// Gets or sets the top margin with a double value, in hundredths of an inch. /// </summary> internal double DoubleTop { get => _doubleTop; set { Top = (int)Math.Round(value); _doubleTop = value; } } /// <summary> /// Gets or sets the bottom margin with double value, in hundredths of an inch. /// </summary> internal double DoubleBottom { get => _doubleBottom; set { Bottom = (int)Math.Round(value); _doubleBottom = value; } } private static void CheckMargin(int margin, string name) { if (margin < 0) { throw new ArgumentOutOfRangeException(name, margin, SR.Format(SR.InvalidLowBoundArgumentEx, name, margin, 0)); } } public object Clone() => MemberwiseClone(); public override bool Equals([NotNullWhen(true)] object? obj) => obj is Margins margins && margins.Left == Left && margins.Right == Right && margins.Top == Top && margins.Bottom == Bottom; /// <summary> /// Calculates and retrieves a hash code based on the left, right, top, and bottom margins. /// </summary> public override int GetHashCode() => HashCode.Combine(Left, Right, Top, Bottom); /// <summary> /// Tests whether two <see cref='Margins'/> objects are identical. /// </summary> public static bool operator ==(Margins? m1, Margins? m2) { if (m1 is null) { return m2 is null; } if (m2 is null) { return false; } return m1.Equals(m2); } /// <summary> /// Tests whether two <see cref='Margins'/> objects are different. /// </summary> public static bool operator !=(Margins? m1, Margins? m2) => !(m1 == m2); /// <summary> /// Provides some interesting information for the Margins in String form. /// </summary> public override string ToString() => $"[Margins Left={Left} Right={Right} Top={Top} Bottom={Bottom}]"; }