//============================================================================ //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.Runtime.Serialization; using System.Security.Permissions; namespace DrawGraph { /// /// A class than contains information about the position of an object on the graph. /// /// /// John Champion /// $Revision: 3.14 $ $Date: 2006/06/24 20:26:43 $ [Serializable] public class Location : ICloneable, ISerializable { #region Private Fields /// Private field to store the vertical alignment property for /// this object. Use the public property /// to access this value. The value of this field is a enum. /// private AlignV _alignV; /// Private field to store the horizontal alignment property for /// this object. Use the public property /// to access this value. The value of this field is a enum. /// private AlignH _alignH; /// Private fields to store the X and Y coordinate positions for /// this object. Use the public properties and /// to access these values. The coordinate type stored here is /// dependent upon the setting of . /// private double _x, _y, _width, _height; /// /// Private field to store the coordinate system to be used for defining the /// object position. Use the public property /// to access this value. The coordinate system /// is defined with the enum. /// private CoordType _coordinateFrame; #endregion #region Properties /// /// A horizontal alignment parameter for this object specified /// using the enum type. /// public AlignH AlignH { get { return _alignH; } set { _alignH = value; } } /// /// A vertical alignment parameter for this object specified /// using the enum type. /// public AlignV AlignV { get { return _alignV; } set { _alignV = value; } } /// /// The coordinate system to be used for defining the object position /// /// The coordinate system is defined with the /// enum public CoordType CoordinateFrame { get { return _coordinateFrame; } set { _coordinateFrame = value; } } /// /// The x position of the object. /// /// /// The units of this position /// are specified by the property. /// The object will be aligned to this position based on the /// property. /// public double X { get { return _x; } set { _x = value; } } /// /// The y position of the object. /// /// /// The units of this position /// are specified by the property. /// The object will be aligned to this position based on the /// property. /// public double Y { get { return _y; } set { _y = value; } } /// /// The x1 position of the object (an alias for the x position). /// /// /// The units of this position /// are specified by the property. /// The object will be aligned to this position based on the /// property. /// public double X1 { get { return _x; } set { _x = value; } } /// /// The y1 position of the object (an alias for the y position). /// /// /// The units of this position /// are specified by the property. /// The object will be aligned to this position based on the /// property. /// public double Y1 { get { return _y; } set { _y = value; } } /// /// The width of the object. /// /// /// The units of this position are specified by the /// property. /// public double Width { get { return _width; } set { _width = value; } } /// /// The height of the object. /// /// /// The units of this position are specified by the /// property. /// public double Height { get { return _height; } set { _height = value; } } /// /// The x2 position of the object. /// /// /// The units of this position are specified by the /// property. /// The object will be aligned to this position based on the /// property. This position is only used for /// objects such as , where it makes sense /// to have a second coordinate. Note that the X2 position is stored /// internally as a offset from . /// public double X2 { get { return _x+_width; } //set { width = value-x; } } /// /// The y2 position of the object. /// /// /// The units of this position /// are specified by the property. /// The object will be aligned to this position based on the /// property. This position is only used for /// objects such as , where it makes sense /// to have a second coordinate. Note that the Y2 position is stored /// internally as a offset from . /// public double Y2 { get { return _y+_height; } //set { height = value-y; } } /// /// The for this object as defined by the /// , , , and /// properties. /// /// /// Note that this method reduces the precision of the location coordinates from double /// precision to single precision. In some cases, such as , it /// may affect the resolution of the point location. /// /// A in /// units. public RectangleF Rect { get { return new RectangleF( (float)_x, (float)_y, (float)_width, (float)_height ); } set { _x = value.X; _y = value.Y; _width = value.Width; _height = value.Height; } } /// /// The top-left for this . /// /// /// Note that this method reduces the precision of the location coordinates from double /// precision to single precision. In some cases, such as , it /// may affect the resolution of the point location. /// /// A in units. public PointF TopLeft { get { return new PointF( (float)_x, (float)_y ); } set { _x = value.X; _y = value.Y; } } /// /// The bottom-right for this . /// /// /// Note that this method reduces the precision of the location coordinates from double /// precision to single precision. In some cases, such as , it /// may affect the resolution of the point location. /// /// A in units. public PointF BottomRight { get { return new PointF( (float)this.X2, (float)this.Y2 ); } //set { this.X2 = value.X; this.Y2 = value.Y; } } #endregion #region Constructors /// /// Default constructor for the class. /// public Location() : this( 0, 0, CoordType.ChartFraction ) { } /// /// Constructor for the class that specifies the /// x, y position and the . /// /// /// The (x,y) position corresponds to the top-left corner; /// /// The x position, specified in units of . /// /// The y position, specified in units of . /// /// The enum that specifies the /// units for and public Location( double x, double y, CoordType coordType ) : this( x, y, coordType, AlignH.Left, AlignV.Top ) { } /// /// Constructor for the class that specifies the /// x, y position and the . /// /// /// The (x,y) position corresponds to the top-left corner; /// /// The x position, specified in units of . /// /// The y position, specified in units of . /// /// The enum that specifies the /// units for and /// 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 Location( double x, double y, CoordType coordType, AlignH alignH, AlignV alignV ) { _x = x; _y = y; _width = 0; _height = 0; _coordinateFrame = coordType; _alignH = alignH; _alignV = alignV; } /// /// Constructor for the class that specifies the /// (x, y), (width, height), and the . /// /// /// The (x,y) position /// corresponds to the starting position, the (x2, y2) coorresponds to the ending position /// (typically used for 's). /// /// The x position, specified in units of . /// /// The y position, specified in units of . /// /// The width, specified in units of . /// /// The height, specified in units of . /// /// The enum that specifies the /// units for and /// 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 Location( double x, double y, double width, double height, CoordType coordType, AlignH alignH, AlignV alignV ) : this( x, y, coordType, alignH, alignV ) { _width = width; _height = height; } /// /// The Copy Constructor /// /// The object from which to copy public Location( Location rhs ) { _x = rhs._x; _y = rhs._y; _width = rhs._width; _height = rhs._height; _coordinateFrame = rhs.CoordinateFrame; _alignH = rhs.AlignH; _alignV = rhs.AlignV; } /// /// 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 Location Clone() { return new Location( this ); } #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 Location( 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" ); _alignV = (AlignV) info.GetValue( "alignV", typeof(AlignV) ); _alignH = (AlignH) info.GetValue( "alignH", typeof(AlignH) ); _x = info.GetDouble( "x" ); _y = info.GetDouble( "y" ); _width = info.GetDouble( "width" ); _height = info.GetDouble( "height" ); _coordinateFrame = (CoordType) info.GetValue( "coordinateFrame", typeof(CoordType) ); } /// /// 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( "alignV", _alignV ); info.AddValue( "alignH", _alignH ); info.AddValue( "x", _x ); info.AddValue( "y", _y ); info.AddValue( "width", _width ); info.AddValue( "height", _height ); info.AddValue( "coordinateFrame", _coordinateFrame ); } #endregion #region Methods /// /// Transform this object to display device /// coordinates using the properties of the specified . /// /// /// A reference to the object that contains /// the classes which will be used for the transform. /// /// A point in display device coordinates that corresponds to the /// specified user point. public PointF Transform( PaneBase pane ) { return Transform( pane, _x, _y, _coordinateFrame ); } /// /// Transform a data point from the specified coordinate type /// () to display device coordinates (pixels). /// /// /// If is not of type , then /// only the transformation is available. /// /// /// A reference to the object that contains /// the classes which will be used for the transform. /// /// The x coordinate that defines the point in user /// space. /// The y coordinate that defines the point in user /// space. /// A type that defines the /// coordinate system in which the X,Y pair is defined. /// A point in display device coordinates that corresponds to the /// specified user point. public static PointF Transform( PaneBase pane, double x, double y, CoordType coord ) { return pane.TransformCoord( x, y, coord ); } /// /// Transform this from the coordinate system /// as specified by to the device coordinates /// of the specified object. /// /// /// The returned /// struct represents the top-left corner of the /// object that honors the properties. /// The and properties are honored in /// this transformation. /// /// /// A reference to the object that contains /// the classes which will be used for the transform. /// /// The width of the object in device pixels /// The height of the object in device pixels /// The top-left corner of the object public PointF TransformTopLeft( PaneBase pane, float width, float height ) { PointF pt = Transform( pane ); if ( _alignH == AlignH.Right ) pt.X -= width; else if ( _alignH == AlignH.Center ) pt.X -= width / 2.0F; if ( _alignV == AlignV.Bottom ) pt.Y -= height; else if ( _alignV == AlignV.Center ) pt.Y -= height / 2.0F; return pt; } /// /// The for this object as defined by the /// and /// properties. /// /// /// This method transforms the location to output device pixel units. /// The and properties are ignored for /// this transformation (see ). /// /// A in pixel units. public PointF TransformTopLeft( PaneBase pane ) { return Transform( pane ); } /// /// The for this object as defined by the /// and properties. /// /// /// This method transforms the location to output device pixel units. /// The and properties are ignored for /// this transformation (see ). /// /// A in pixel units. public PointF TransformBottomRight( PaneBase pane ) { return Transform( pane, this.X2, this.Y2, _coordinateFrame ); } /// /// Transform the for this object as defined by the /// , , , and /// properties. /// /// /// This method transforms the location to output device pixel units. /// The and properties are honored in /// this transformation. /// /// A in pixel units. public RectangleF TransformRect( PaneBase pane ) { PointF pix1 = TransformTopLeft( pane ); PointF pix2 = TransformBottomRight( pane ); //PointF pix3 = TransformTopLeft( pane, pix2.X - pix1.X, pix2.Y - pix1.Y ); return new RectangleF( pix1.X, pix1.Y, Math.Abs(pix2.X - pix1.X), Math.Abs(pix2.Y - pix1.Y) ); } #endregion } }