//============================================================================ //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 ellipse object on /// the graph. A list of EllipseObj objects is maintained by the /// collection class. The ellipse is defined /// as the ellipse that would be contained by the rectangular box as /// defined by the property. /// /// /// John Champion /// $Revision: 3.3 $ $Date: 2007/01/25 07:56:08 $ [Serializable] public class EllipseObj : BoxObj, ICloneable, ISerializable { #region Constructors /// Constructors for the object /// /// A constructor that allows the position and size /// 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 EllipseObj( double x, double y, double width, double height ) : base( x, y, width, height ) { } /// /// A default constructor that places the at location (0,0), /// with width/height of (1,1). Other properties are defaulted. /// public EllipseObj() : base() { } /// /// A constructor that allows the position, border color, and solid fill color /// of the to be pre-specified. /// /// An arbitrary specification /// for the ellipse border /// An arbitrary specification /// for the ellipse 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 EllipseObj( double x, double y, double width, double height, Color borderColor, Color fillColor ) : base( x, y, width, height, borderColor, fillColor ) { } /// /// 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 ellipse border /// An arbitrary specification /// for the start of the ellipse gradient fill /// An arbitrary specification /// for the end of the ellipse 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 EllipseObj( double x, double y, double width, double height, Color borderColor, Color fillColor1, Color fillColor2 ) : base( x, y, width, height, borderColor, fillColor1, fillColor2 ) { } /// /// The Copy Constructor /// /// The object from /// which to copy public EllipseObj( BoxObj rhs ) : base( rhs ) { } /// /// 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 new EllipseObj Clone() { return new EllipseObj( this ); } #endregion #region Serialization /// /// Current schema value that defines the version of the serialized file /// public const int schema3 = 10; /// /// Constructor for deserializing objects /// /// A instance that defines the serialized data /// /// A instance that contains the serialized data /// protected EllipseObj( 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( "schema3" ); } /// /// 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( "schema3", schema3 ); } #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 ); if ( Math.Abs( pixRect.Left ) < 100000 && Math.Abs( pixRect.Top ) < 100000 && Math.Abs( pixRect.Right ) < 100000 && Math.Abs( pixRect.Bottom ) < 100000 ) { if ( _fill.IsVisible ) using ( Brush brush = _fill.MakeBrush( pixRect ) ) g.FillEllipse( brush, pixRect ); if ( _border.IsVisible ) using ( Pen pen = _border.GetPen( pane, scaleFactor ) ) g.DrawEllipse( pen, 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 ); using ( GraphicsPath path = new GraphicsPath() ) { path.AddEllipse( pixRect ); return path.IsVisible( pt ); } } #endregion } }