//============================================================================
//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
{
///
/// An abstract base class that represents a text object on the graph. A list of
/// objects is maintained by the
/// collection class.
///
///
/// John Champion
/// $Revision: 3.1 $ $Date: 2006/06/24 20:26:44 $
[Serializable]
abstract public class GraphObj : ISerializable, ICloneable
{
#region Fields
///
/// Protected field that stores the location of this .
/// Use the public property to access this value.
///
protected Location _location;
///
/// Protected field that determines whether or not this
/// is visible in the graph. Use the public property to
/// access this value.
///
protected bool _isVisible;
///
/// Protected field that determines whether or not the rendering of this
/// will be clipped to the ChartRect. Use the public property to
/// access this value.
///
protected bool _isClippedToChartRect;
///
/// A tag object for use by the user. This can be used to store additional
/// information associated with the . ZedGraph does
/// not use this value for any purpose.
///
///
/// Note that, if you are going to Serialize ZedGraph data, then any type
/// that you store in must be a serializable type (or
/// it will cause an exception).
///
public object Tag;
///
/// Internal field that determines the z-order "depth" of this
/// item relative to other graphic objects. Use the public property
/// to access this value.
///
internal ZOrder _zOrder;
///
/// Internal field that stores the hyperlink information for this object.
///
internal Link _link;
#endregion
#region Defaults
///
/// A simple struct that defines the
/// default property values for the class.
///
public struct Default
{
// Default text item properties
///
/// Default value for the vertical
/// text alignment ( property).
/// This is specified
/// using the enum type.
///
public static AlignV AlignV = AlignV.Center;
///
/// Default value for the horizontal
/// text alignment ( property).
/// This is specified
/// using the enum type.
///
public static AlignH AlignH = AlignH.Center;
///
/// The default coordinate system to be used for defining the
/// location coordinates
/// ( property).
///
/// The coordinate system is defined with the
/// enum
public static CoordType CoordFrame = CoordType.AxisXYScale;
///
/// The default value for .
///
public static bool IsClippedToChartRect = false;
}
#endregion
#region Properties
///
/// The struct that describes the location
/// for this .
///
public Location Location
{
get { return _location; }
set { _location = value; }
}
///
/// Gets or sets a value that determines the z-order "depth" of this
/// item relative to other graphic objects.
///
/// Note that this controls the z-order with respect to
/// other elements such as 's,
/// objects, etc. The order of objects having
/// the same value is controlled by their order in
/// the . The first
/// in the list is drawn in front of other
/// objects having the same value.
public ZOrder ZOrder
{
get { return _zOrder; }
set { _zOrder = value; }
}
///
/// Gets or sets a value that determines if this will be
/// visible in the graph. true displays the item, false hides it.
///
public bool IsVisible
{
get { return _isVisible; }
set { _isVisible = value; }
}
///
/// Gets or sets a value that determines whether or not the rendering of this
/// will be clipped to the .
///
/// true to clip the to the bounds,
/// false to leave it unclipped.
public bool IsClippedToChartRect
{
get { return _isClippedToChartRect; }
set { _isClippedToChartRect = value; }
}
///
/// Gets or sets the hyperlink information for this .
///
// ///
public Link Link
{
get { return _link; }
set { _link = value; }
}
///
/// true if the of this object is set to put it in front
/// of the data points.
///
public bool IsInFrontOfData
{
get
{
return _zOrder == ZOrder.A_InFront ||
_zOrder == ZOrder.B_BehindLegend ||
_zOrder == ZOrder.C_BehindChartBorder;
}
}
#endregion
#region Constructors
///
/// Constructors for the class.
///
///
/// Default constructor that sets all properties to default
/// values as defined in the class.
///
public GraphObj() :
this( 0, 0, Default.CoordFrame, Default.AlignH, Default.AlignV )
{
}
///
/// Constructor that sets all properties to default
/// values as defined in the class.
///
/// The x position of the text. The units
/// of this position are specified by the
/// property. The text will be
/// aligned to this position based on the
/// property.
/// The y position of the text. The units
/// of this position are specified by the
/// property. The text will be
/// aligned to this position based on the
/// property.
public GraphObj( double x, double y ) :
this( x, y, Default.CoordFrame, Default.AlignH, Default.AlignV )
{
}
///
/// Constructor that creates a with the specified
/// coordinates and all other properties to defaults as specified
/// in the class..
///
///
/// The four coordinates define the starting point and ending point for
/// 's, or the topleft and bottomright points for
/// 's. For 's that only require
/// one point, the and values
/// will be ignored. The units of the coordinates are specified by the
/// property.
///
/// The x position of the item.
/// The y position of the item.
/// The x2 position of the item.
/// The x2 position of the item.
public GraphObj( double x, double y, double x2, double y2 ) :
this( x, y, x2, y2, Default.CoordFrame, Default.AlignH, Default.AlignV )
{
}
///
/// Constructor that creates a with the specified
/// position and . Other properties are set to default
/// values as defined in the class.
///
///
/// The two coordinates define the location point for the object.
/// The units of the coordinates are specified by the
/// property.
///
/// The x position of the item. The item will be
/// aligned to this position based on the
/// property.
/// The y position of the item. The item will be
/// aligned to this position based on the
/// property.
/// The enum value that
/// indicates what type of coordinate system the x and y parameters are
/// referenced to.
public GraphObj( double x, double y, CoordType coordType ) :
this( x, y, coordType, Default.AlignH, Default.AlignV )
{
}
///
/// Constructor that creates a with the specified
/// position, , , and .
/// Other properties are set to default values as defined in the class.
///
///
/// The two coordinates define the location point for the object.
/// The units of the coordinates are specified by the
/// property.
///
/// The x position of the item. The item will be
/// aligned to this position based on the
/// property.
/// The y position of the text. The units
/// of this position are specified by the
/// property. The text will be
/// aligned to this position based on the
/// property.
/// The enum value that
/// indicates what type of coordinate system the x and y parameters are
/// referenced to.
/// The enum that specifies
/// the horizontal alignment of the object with respect to the (x,y) location
/// The enum that specifies
/// the vertical alignment of the object with respect to the (x,y) location
public GraphObj( double x, double y, CoordType coordType, AlignH alignH, AlignV alignV )
{
_isVisible = true;
_isClippedToChartRect = Default.IsClippedToChartRect;
this.Tag = null;
_zOrder = ZOrder.A_InFront;
_location = new Location( x, y, coordType, alignH, alignV );
_link = new Link();
}
///
/// Constructor that creates a with the specified
/// position, , , and .
/// Other properties are set to default values as defined in the class.
///
///
/// The four coordinates define the starting point and ending point for
/// 's, or the topleft and bottomright points for
/// 's. For 's that only require
/// one point, the and values
/// will be ignored. The units of the coordinates are specified by the
/// property.
///
/// The x position of the item.
/// The y position of the item.
/// The x2 position of the item.
/// The x2 position of the item.
/// The enum value that
/// indicates what type of coordinate system the x and y parameters are
/// referenced to.
/// The enum that specifies
/// the horizontal alignment of the object with respect to the (x,y) location
/// The enum that specifies
/// the vertical alignment of the object with respect to the (x,y) location
public GraphObj( double x, double y, double x2, double y2, CoordType coordType,
AlignH alignH, AlignV alignV )
{
_isVisible = true;
_isClippedToChartRect = Default.IsClippedToChartRect;
this.Tag = null;
_zOrder = ZOrder.A_InFront;
_location = new Location( x, y, x2, y2, coordType, alignH, alignV );
_link = new Link();
}
///
/// The Copy Constructor
///
/// The object from which to copy
public GraphObj( GraphObj rhs )
{
// Copy value types
_isVisible = rhs.IsVisible;
_isClippedToChartRect = rhs._isClippedToChartRect;
_zOrder = rhs.ZOrder;
// copy reference types by cloning
if ( rhs.Tag is ICloneable )
this.Tag = ((ICloneable) rhs.Tag).Clone();
else
this.Tag = rhs.Tag;
_location = rhs.Location.Clone();
_link = rhs._link.Clone();
}
///
/// Implement the interface in a typesafe manner by just
/// calling the typed version of Clone.
///
///
/// Note that this method must be called with an explicit cast to ICloneable, and
/// that it is inherently virtual. For example:
///
/// ParentClass foo = new ChildClass();
/// ChildClass bar = (ChildClass) ((ICloneable)foo).Clone();
///
/// Assume that ChildClass is inherited from ParentClass. Even though foo is declared with
/// ParentClass, it is actually an instance of ChildClass. Calling the ICloneable implementation
/// of Clone() on foo actually calls ChildClass.Clone() as if it were a virtual function.
///
/// A deep copy of this object
object ICloneable.Clone()
{
throw new NotImplementedException( "Can't clone an abstract base type -- child types must implement ICloneable" );
//return new PaneBase( this );
}
#endregion
#region Serialization
///
/// Current schema value that defines the version of the serialized file
///
///
/// schema changed to 2 when isClippedToChartRect was added.
///
public const int schema = 10;
///
/// Constructor for deserializing objects
///
/// A instance that defines the serialized data
///
/// A instance that contains the serialized data
///
protected GraphObj( SerializationInfo info, StreamingContext 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" );
_location = (Location) info.GetValue( "location", typeof(Location) );
_isVisible = info.GetBoolean( "isVisible" );
Tag = info.GetValue( "Tag", typeof(object) );
_zOrder = (ZOrder) info.GetValue( "zOrder", typeof(ZOrder) );
_isClippedToChartRect = info.GetBoolean( "isClippedToChartRect" );
_link = (Link) info.GetValue( "link", typeof( Link ) );
}
///
/// 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 virtual void GetObjectData( SerializationInfo info, StreamingContext context )
{
info.AddValue( "schema", schema );
info.AddValue( "location", _location );
info.AddValue( "isVisible", _isVisible );
info.AddValue( "Tag", Tag );
info.AddValue( "zOrder", _zOrder );
info.AddValue( "isClippedToChartRect", _isClippedToChartRect );
info.AddValue( "link", _link );
}
#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.
///
abstract public void Draw( Graphics g, PaneBase pane, float scaleFactor );
///
/// 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
virtual public bool PointInBox( PointF pt, PaneBase pane, Graphics g, float scaleFactor )
{
GraphPane gPane = pane as GraphPane;
if ( gPane != null && _isClippedToChartRect && !gPane.Chart.Rect.Contains( pt ) )
return false;
return true;
}
///
/// Determines the shape type and Coords values for this GraphObj
///
abstract public void GetCoords( PaneBase pane, Graphics g, float scaleFactor,
out string shape, out string coords );
#endregion
}
}