//============================================================================ //ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# //Copyright ?2004 John Champion // //This library is free software; you can redistribute it and/or //modify it under the terms of the GNU Lesser General Public //License as published by the Free Software Foundation; either //version 2.1 of the License, or (at your option) any later version. // //This library is distributed in the hope that it will be useful, //but WITHOUT ANY WARRANTY; without even the implied warranty of //MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU //Lesser General Public License for more details. // //You should have received a copy of the GNU Lesser General Public //License along with this library; if not, write to the Free Software //Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA //============================================================================= using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.Runtime.Serialization; using System.Security.Permissions; namespace DrawGraph { /// /// A class that encapsulates Border (frame) properties for an object. The class /// is used in a variety of ZedGraph objects to handle the drawing of the Border around the object. /// /// /// John Champion /// $Revision: 3.18 $ $Date: 2007/03/17 18:43:44 $ [Serializable] public class Border : LineBase, ISerializable, ICloneable { #region Fields /// /// Private field that stores the amount of inflation to be done on the rectangle /// before rendering. This allows the border to be inset or outset relative to /// the actual rectangle area. Use the public property /// to access this value. /// private float _inflateFactor; #endregion #region Defaults /// /// A simple struct that defines the /// default property values for the class. /// new public struct Default { /// /// The default value for , in units of points (1/72 inch). /// /// public static float InflateFactor = 0.0F; } #endregion #region Constructors /// /// The default constructor. Initialized to default values. /// public Border() : base() { _inflateFactor = Default.InflateFactor; } /// /// Constructor that specifies the visibility, color and penWidth of the Border. /// /// Determines whether or not the Border will be drawn. /// The color of the Border /// The width, in points (1/72 inch), for the Border. public Border( bool isVisible, Color color, float width ) : base( color ) { _width = width; _isVisible = isVisible; } /// /// Constructor that specifies the color and penWidth of the Border. /// /// The color of the Border /// The width, in points (1/72 inch), for the Border. public Border( Color color, float width ) : this( !color.IsEmpty, color, width ) { } /// /// The Copy Constructor /// /// The Border object from which to copy public Border( Border rhs ) : base( rhs ) { _inflateFactor = rhs._inflateFactor; } /// /// Implement the interface in a typesafe manner by just /// calling the typed version of /// /// A deep copy of this object object ICloneable.Clone() { return this.Clone(); } /// /// Typesafe, deep-copy clone method. /// /// A new, independent copy of this class public Border Clone() { return new Border( this ); } #endregion #region Serialization /// /// Current schema value that defines the version of the serialized file /// public const int schema = 11; /// /// Constructor for deserializing objects /// /// A instance that defines the serialized data /// /// A instance that contains the serialized data /// protected Border( SerializationInfo info, StreamingContext context ) : base( info, context ) { // The schema value is just a file version parameter. You can use it to make future versions // backwards compatible as new member variables are added to classes int sch = info.GetInt32( "schema" ); _inflateFactor = info.GetSingle( "inflateFactor" ); } /// /// Populates a instance with the data needed to serialize the target object /// /// A instance that defines the serialized data /// A instance that contains the serialized data [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] public override void GetObjectData( SerializationInfo info, StreamingContext context ) { base.GetObjectData( info, context ); info.AddValue( "schema", schema ); info.AddValue( "inflateFactor", _inflateFactor ); } #endregion #region Properties /// /// Gets or sets the amount of inflation to be done on the rectangle /// before rendering. /// /// This allows the border to be inset or outset relative to /// the actual rectangle area. /// public float InflateFactor { get { return _inflateFactor; } set { _inflateFactor = value; } } #endregion #region Methods /* /// /// Create a new object from the properties of this /// object. /// /// /// Set to true to have the pen width scaled with the /// scaleFactor. /// /// /// The scaling factor for the features of the graph based on the . This /// scaling factor is calculated by the method. The scale factor /// represents a linear multiple to be applied to font sizes, symbol sizes, etc. /// /// A object with the proper color and pen width. public Pen MakePen( bool isPenWidthScaled, float scaleFactor ) { float scaledPenWidth = _width; if ( isPenWidthScaled ) scaledPenWidth = (float)(_width * scaleFactor); return new Pen( _color, scaledPenWidth ); } */ /// /// Draw the specified Border () using the properties of /// this object. /// /// /// A graphic device object to be drawn into. This is normally e.Graphics from the /// PaintEventArgs argument to the Paint() method. /// /// /// A reference to the object that is the parent or /// owner of this object. /// /// /// The scaling factor for the features of the graph based on the . This /// scaling factor is calculated by the method. The scale factor /// represents a linear multiple to be applied to font sizes, symbol sizes, etc. /// /// A struct to be drawn. public void Draw( Graphics g, PaneBase pane, float scaleFactor, RectangleF rect ) { // Need to use the RectangleF props since rounding it can cause the axisFrame to // not line up properly with the last tic mark if ( _isVisible ) { RectangleF tRect = rect; float scaledInflate = (float) ( _inflateFactor * scaleFactor ); tRect.Inflate( scaledInflate, scaledInflate ); using ( Pen pen = GetPen( pane, scaleFactor) ) g.DrawRectangle( pen, tRect.X, tRect.Y, tRect.Width, tRect.Height ); } } #endregion } }