//============================================================================ //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.Collections; using System.Runtime.Serialization; using System.Security.Permissions; namespace DrawGraph { /// /// A class that represents a bordered and/or filled box (rectangle) object on /// the graph. A list of /// BoxObj objects is maintained by the collection class. /// /// /// John Champion /// $Revision: 3.3 $ $Date: 2007/01/25 07:56:08 $ [Serializable] public class BoxObj : GraphObj, ICloneable, ISerializable { #region Fields /// /// Private field that stores the data for this /// . Use the public property to /// access this value. /// protected Fill _fill; /// /// Private field that determines the properties of the border around this /// /// Use the public property to access this value. /// protected Border _border; #endregion #region Defaults /// /// A simple struct that defines the /// default property values for the class. /// new public struct Default { /// /// The default pen width used for the border /// ( property). Units are points (1/72 inch). /// public static float PenWidth = 1.0F; /// /// The default color used for the border /// ( property). /// public static Color BorderColor = Color.Black; /// /// The default color used for the fill /// ( property). /// public static Color FillColor = Color.White; } #endregion #region Properties /// /// Gets or sets the data for this /// . /// public Fill Fill { get { return _fill; } set { _fill = value; } } /// /// Gets or sets the object, which /// determines the properties of the border around this /// /// public Border Border { get { return _border; } set { _border = value; } } #endregion #region Constructors /// Constructors for the object /// /// A constructor that allows the position, border color, and solid fill color /// of the to be pre-specified. /// /// An arbitrary specification /// for the box border /// An arbitrary specification /// for the box fill (will be a solid color fill) /// The x location for this . This will be in units determined by /// . /// The y location for this . This will be in units determined by /// . /// The width of this . This will be in units determined by /// . /// The height of this . This will be in units determined by /// . public BoxObj( double x, double y, double width, double height, Color borderColor, Color fillColor ) : base( x, y, width, height ) { this.Border = new Border( borderColor, Default.PenWidth ); this.Fill = new Fill( fillColor ); } /// /// A constructor that allows the position /// of the to be pre-specified. Other properties are defaulted. /// /// The x location for this . This will be in units determined by /// . /// The y location for this . This will be in units determined by /// . /// The width of this . This will be in units determined by /// . /// The height of this . This will be in units determined by /// . public BoxObj( double x, double y, double width, double height ) : base( x, y, width, height ) { this.Border = new Border( Default.BorderColor, Default.PenWidth ); this.Fill = new Fill( Default.FillColor ); } /// /// A default constructor that creates a using a location of (0,0), /// and a width,height of (1,1). Other properties are defaulted. /// public BoxObj() : this( 0, 0, 1, 1 ) { } /// /// A constructor that allows the position, border color, and two-color /// gradient fill colors /// of the to be pre-specified. /// /// An arbitrary specification /// for the box border /// An arbitrary specification /// for the start of the box gradient fill /// An arbitrary specification /// for the end of the box gradient fill /// The x location for this . This will be in units determined by /// . /// The y location for this . This will be in units determined by /// . /// The width of this . This will be in units determined by /// . /// The height of this . This will be in units determined by /// . public BoxObj( double x, double y, double width, double height, Color borderColor, Color fillColor1, Color fillColor2 ) : base( x, y, width, height ) { this.Border = new Border( borderColor, Default.PenWidth ); this.Fill = new Fill( fillColor1, fillColor2 ); } /// /// The Copy Constructor /// /// The object from which to copy public BoxObj( BoxObj rhs ) : base( rhs ) { this.Border = rhs.Border.Clone(); this.Fill = rhs.Fill.Clone(); } /// /// 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 BoxObj Clone() { return new BoxObj( this ); } #endregion #region Serialization /// /// Current schema value that defines the version of the serialized file /// public const int schema2 = 10; /// /// Constructor for deserializing objects /// /// A instance that defines the serialized data /// /// A instance that contains the serialized data /// protected BoxObj( 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( "schema2" ); _fill = (Fill) info.GetValue( "fill", typeof(Fill) ); _border = (Border) info.GetValue( "border", typeof(Border) ); } /// /// 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( "schema2", schema2 ); info.AddValue( "fill", _fill ); info.AddValue( "border", _border ); } #endregion #region Rendering Methods /// /// Render this object to the specified device. /// /// /// This method is normally only called by the Draw method /// of the parent collection 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 to be used for rendering objects. This is calculated and /// passed down by the parent object using the /// method, and is used to proportionally adjust /// font sizes, etc. according to the actual size of the graph. /// override public void Draw( Graphics g, PaneBase pane, float scaleFactor ) { // Convert the arrow coordinates from the user coordinate system // to the screen coordinate system RectangleF pixRect = this.Location.TransformRect( pane ); // Clip the rect to just outside the PaneRect so we don't end up with wild coordinates. RectangleF tmpRect = pane.Rect; tmpRect.Inflate( 20, 20 ); pixRect.Intersect( tmpRect ); if ( Math.Abs( pixRect.Left ) < 100000 && Math.Abs( pixRect.Top ) < 100000 && Math.Abs( pixRect.Right ) < 100000 && Math.Abs( pixRect.Bottom ) < 100000 ) { // If the box is to be filled, fill it _fill.Draw( g, pixRect ); // Draw the border around the box if required _border.Draw( g, pane, scaleFactor, pixRect ); } } /// /// Determine if the specified screen point lies inside the bounding box of this /// . /// /// The screen point, in pixels /// /// A reference to the object that is the parent or /// owner of this object. /// /// /// A graphic device object to be drawn into. This is normally e.Graphics from the /// PaintEventArgs argument to the Paint() method. /// /// /// The scaling factor to be used for rendering objects. This is calculated and /// passed down by the parent object using the /// method, and is used to proportionally adjust /// font sizes, etc. according to the actual size of the graph. /// /// true if the point lies in the bounding box, false otherwise override public bool PointInBox( PointF pt, PaneBase pane, Graphics g, float scaleFactor ) { if ( ! base.PointInBox(pt, pane, g, scaleFactor ) ) return false; // transform the x,y location from the user-defined // coordinate frame to the screen pixel location RectangleF pixRect = _location.TransformRect( pane ); return pixRect.Contains( pt ); } /// /// Determines the shape type and Coords values for this GraphObj /// override public void GetCoords( PaneBase pane, Graphics g, float scaleFactor, out string shape, out string coords ) { // transform the x,y location from the user-defined // coordinate frame to the screen pixel location RectangleF pixRect = _location.TransformRect( pane ); shape = "rect"; coords = String.Format( "{0:f0},{1:f0},{2:f0},{3:f0}", pixRect.Left, pixRect.Top, pixRect.Right, pixRect.Bottom ); } #endregion } }