//============================================================================
//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C#
//Copyright ?2006  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.Text;
using System.Runtime.Serialization;
using System.Security.Permissions;
namespace DrawGraph
{
	/// 
	/// Class that handles the properties of the charting area (where the curves are
	/// actually drawn), which is bounded by the , ,
	/// and .
	/// 
	/// 
	///  John Champion 
	///  $Revision: 3.1 $ $Date: 2006/06/24 20:26:44 $ 
	[Serializable]
	public class Chart : ICloneable, ISerializable
	{
		/// 
		/// The rectangle that contains the area bounded by the axes, in pixel units
		/// 
		internal RectangleF _rect;
		/// 
		/// Private field that stores the  data for this
		/// .  Use the public property  to
		/// access this value.
		/// 
		internal Fill _fill;
		/// 
		/// Private field that stores the  data for this
		/// .  Use the public property  to
		/// access this value.
		/// 
		internal Border _border;
		/// Private field that determines if the  will be
		/// sized automatically.  Use the public property  to access
		/// this value. 
		internal bool _isRectAuto;
	#region Constructors
		/// 
		/// Default constructor.
		/// 
		public Chart()
		{
			_isRectAuto = true;
			_border = new Border( Default.IsBorderVisible, Default.BorderColor, Default.BorderPenWidth );
			_fill = new Fill( Default.FillColor, Default.FillBrush, Default.FillType );
		}
		/// 
		/// Copy constructor
		/// 
		/// The source  to be copied.
		public Chart( Chart rhs )
		{
			_border = rhs._border.Clone();
			_fill = rhs._fill.Clone();
			_rect = rhs._rect;
			_isRectAuto = rhs._isRectAuto;
		}
		/// 
		/// 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 Chart Clone()
		{
			return new Chart( this );
		}
	#endregion
	#region Properties
		/// 
		/// Gets or sets the rectangle that contains the area bounded by the axes
		/// (, , and ).
		/// If you set this value manually, then the 
		/// value will automatically be set to false.
		/// 
		/// The rectangle units are in screen pixels
		public RectangleF Rect
		{
			get { return _rect; }
			set { _rect = value; _isRectAuto = false; }
		}
		/// 
		/// Gets or sets the  data for this
		/// .
		/// 
		public Fill Fill
		{
			get { return _fill; }
			set { _fill = value; }
		}
		/// 
		/// Gets or sets the  class for drawing the border
		/// border around the 
		/// 
		/// 
		/// 
		public Border Border
		{
			get { return _border; }
			set { _border = value; }
		}
		/// 
		/// Gets or sets a boolean value that determines whether or not the 
		///  will be calculated automatically (almost always true).
		/// 
		/// 
		/// If you have a need to set the ChartRect manually, such as you have multiple graphs
		/// on a page and you want to line up the edges perfectly, you can set this value
		/// to false.  If you set this value to false, you must also manually set
		/// the  property.
		/// You can easily determine the ChartRect that ZedGraph would have
		/// calculated by calling the  method, which returns
		/// a chart rect sized for the current data range, scale sizes, etc.
		/// 
		/// true to have ZedGraph calculate the ChartRect, false to do it yourself
		public bool IsRectAuto
		{
			get { return _isRectAuto; }
			set { _isRectAuto = value; }
		}
	#endregion
	#region Serialization
		/// 
		/// Current schema value that defines the version of the serialized file
		/// 
		public const int schema = 10;
		/// 
		/// Constructor for deserializing objects
		/// 
		/// A  instance that defines the serialized data
		/// 
		/// A  instance that contains the serialized data
		/// 
		protected Chart( 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" );
			_rect = (RectangleF)info.GetValue( "rect", typeof( RectangleF ) );
			_fill = (Fill)info.GetValue( "fill", typeof( Fill ) );
			_border = (Border)info.GetValue( "border", typeof( Border ) );
			_isRectAuto = info.GetBoolean( "isRectAuto" );
		}
		/// 
		/// 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( "rect", _rect );
			info.AddValue( "fill", _fill );
			info.AddValue( "border", _border );
			info.AddValue( "isRectAuto", _isRectAuto );
		}
	#endregion
	#region Defaults
		/// 
		/// A simple struct that defines the
		/// default property values for the  class.
		/// 
		public struct Default
		{
			/// 
			/// The default color for the  border.
			/// ( property). 
			/// 
			public static Color BorderColor = Color.Black;
			/// 
			/// The default color for the  background.
			/// ( property). 
			/// 
			public static Color FillColor = Color.White;
			/// 
			/// The default brush for the  background.
			/// ( property of ). 
			/// 
			public static Brush FillBrush = null;
			/// 
			/// The default  for the  background.
			/// ( property of ). 
			/// 
			public static FillType FillType = FillType.Brush;
			/// 
			/// The default pen width for drawing the 
			///  border
			/// ( property).
			/// Units are in points (1/72 inch).
			/// 
			public static float BorderPenWidth = 1F;
			/// 
			/// The default display mode for the  border
			/// ( property). true
			/// to show the border border, false to omit the border
			/// 
			public static bool IsBorderVisible = true;
		}
	#endregion
	}
}