304 lines
9.5 KiB
C#
304 lines
9.5 KiB
C#
//============================================================================
|
|
//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.Collections;
|
|
using System.Runtime.Serialization;
|
|
using System.Security.Permissions;
|
|
|
|
namespace DrawGraph
|
|
{
|
|
/// <summary>
|
|
/// A class that maintains hyperlink information for a clickable object on the graph.
|
|
/// </summary>
|
|
///
|
|
/// <author> John Champion </author>
|
|
/// <version> $Revision: 3.6 $ $Date: 2007/04/16 00:03:02 $ </version>
|
|
// /// <seealso cref="ZedGraph.Web.IsImageMap"/>
|
|
[Serializable]
|
|
public class Link : ISerializable, ICloneable
|
|
{
|
|
|
|
#region Fields
|
|
|
|
/// <summary>
|
|
/// Internal field that stores the title string for this link.
|
|
/// </summary>
|
|
internal string _title;
|
|
|
|
/// <summary>
|
|
/// Internal field that stores the url string for this link
|
|
/// </summary>
|
|
internal string _url;
|
|
|
|
/// <summary>
|
|
/// Internal field that stores the target string for this link
|
|
/// </summary>
|
|
internal string _target;
|
|
|
|
/// <summary>
|
|
/// Internal field that determines if this link is "live".
|
|
/// </summary>
|
|
internal bool _isEnabled;
|
|
|
|
#endregion
|
|
|
|
#region Properties
|
|
|
|
/// <summary>
|
|
/// Gets or sets the title string for this link.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// For web controls, this title will be shown as a tooltip when the mouse
|
|
/// hovers over the area of the object that owns this link. Set the value to
|
|
/// <see cref="String.Empty" /> to have no title.
|
|
/// </remarks>
|
|
public string Title
|
|
{
|
|
get { return _title; }
|
|
set { _title = value; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets the url string for this link.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// Set this value to <see cref="String.Empty" /> if you don't want to have
|
|
/// a hyperlink associated with the object to which this link belongs.
|
|
/// </remarks>
|
|
public string Url
|
|
{
|
|
get { return _url; }
|
|
set { _url = value; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets the target string for this link.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// This value should be set to a valid target associated with the "Target"
|
|
/// property of an html hyperlink. Typically, this would be "_blank" to open
|
|
/// a new browser window, or "_self" to open in the current browser.
|
|
/// </remarks>
|
|
public string Target
|
|
{
|
|
get { return _target != string.Empty ? _target : "_self"; }
|
|
set { _target = value; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// A tag object for use by the user. This can be used to store additional
|
|
/// information associated with the <see cref="Link"/>. ZedGraph does
|
|
/// not use this value for any purpose.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// Note that, if you are going to Serialize ZedGraph data, then any type
|
|
/// that you store in <see cref="Tag"/> must be a serializable type (or
|
|
/// it will cause an exception).
|
|
/// </remarks>
|
|
public object Tag;
|
|
|
|
/// <summary>
|
|
/// Gets or sets a property that determines if this link is active. True to have
|
|
/// a clickable link, false to ignore the link.
|
|
/// </summary>
|
|
public bool IsEnabled
|
|
{
|
|
get { return _isEnabled; }
|
|
set { _isEnabled = value; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets a value that indicates if this <see cref="Link" /> is enabled
|
|
/// (see <see cref="IsEnabled" />), and that either the
|
|
/// <see cref="Url" /> or the <see cref="Title" /> is non-null.
|
|
/// </summary>
|
|
public bool IsActive
|
|
{
|
|
get { return _isEnabled && ( _url != null || _title != null ); }
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Constructors
|
|
|
|
/// <summary>
|
|
/// Default constructor. Set all properties to string.Empty, or null.
|
|
/// </summary>
|
|
public Link()
|
|
{
|
|
_title = string.Empty;
|
|
_url = string.Empty;
|
|
_target = string.Empty;
|
|
this.Tag = null;
|
|
_isEnabled = false;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Construct a Link instance from a specified title, url, and target.
|
|
/// </summary>
|
|
/// <param name="title">The title for the link (which shows up in the tooltip).</param>
|
|
/// <param name="url">The URL destination for the link.</param>
|
|
/// <param name="target">The target for the link (typically "_blank" or "_self").</param>
|
|
public Link( string title, string url, string target )
|
|
{
|
|
_title = title;
|
|
_url = url;
|
|
_target = target;
|
|
Tag = null;
|
|
_isEnabled = true;
|
|
}
|
|
|
|
/// <summary>
|
|
/// The Copy Constructor
|
|
/// </summary>
|
|
/// <param name="rhs">The <see cref="Link"/> object from which to copy</param>
|
|
public Link( Link rhs )
|
|
{
|
|
// Copy value types
|
|
_title = rhs._title;
|
|
_url = rhs._url;
|
|
_target = rhs._target;
|
|
_isEnabled = false;
|
|
|
|
// copy reference types by cloning
|
|
if ( rhs.Tag is ICloneable )
|
|
this.Tag = ((ICloneable) rhs.Tag).Clone();
|
|
else
|
|
this.Tag = rhs.Tag;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Implement the <see cref="ICloneable" /> interface in a typesafe manner by just
|
|
/// calling the typed version of <see cref="Clone" />
|
|
/// </summary>
|
|
/// <returns>A deep copy of this object</returns>
|
|
object ICloneable.Clone()
|
|
{
|
|
return this.Clone();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Typesafe, deep-copy clone method.
|
|
/// </summary>
|
|
/// <returns>A new, independent copy of this class</returns>
|
|
public Link Clone()
|
|
{
|
|
return new Link( this );
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
#region methods
|
|
|
|
/// <summary>
|
|
/// Create a URL for a <see cref="CurveItem" /> that includes the index of the
|
|
/// point that was selected.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// An "index" parameter is added to the <see cref="Url" /> property for this
|
|
/// link to indicate which point was selected. Further, if the
|
|
/// X or Y axes that correspond to this <see cref="CurveItem" /> are of
|
|
/// <see cref="AxisType.Text" />, then an
|
|
/// additional parameter will be added containing the text value that
|
|
/// corresponds to the <paramref name="index" /> of the selected point.
|
|
/// The <see cref="XAxis" /> text parameter will be labeled "xtext", and
|
|
/// the <see cref="YAxis" /> text parameter will be labeled "ytext".
|
|
/// </remarks>
|
|
/// <param name="index">The zero-based index of the selected point</param>
|
|
/// <param name="pane">The <see cref="GraphPane" /> of interest</param>
|
|
/// <param name="curve">The <see cref="CurveItem" /> for which to
|
|
/// make the url string.</param>
|
|
/// <returns>A string containing the url with an index parameter added.</returns>
|
|
public virtual string MakeCurveItemUrl( GraphPane pane, CurveItem curve, int index )
|
|
{
|
|
string url = _url;
|
|
|
|
if ( url.IndexOf( '?' ) >= 0 )
|
|
url += "&index=" + index.ToString();
|
|
else
|
|
url += "?index=" + index.ToString();
|
|
|
|
Axis xAxis = curve.GetXAxis( pane );
|
|
if ( xAxis.Type == AxisType.Text && index >= 0 &&
|
|
xAxis.Scale.TextLabels != null &&
|
|
index <= xAxis.Scale.TextLabels.Length )
|
|
url += "&xtext=" + xAxis.Scale.TextLabels[index];
|
|
|
|
Axis yAxis = curve.GetYAxis( pane );
|
|
if ( yAxis != null && yAxis.Type == AxisType.Text && index >= 0 &&
|
|
yAxis.Scale.TextLabels != null &&
|
|
index <= yAxis.Scale.TextLabels.Length )
|
|
url += "&ytext=" + yAxis.Scale.TextLabels[index];
|
|
|
|
return url;
|
|
}
|
|
#endregion
|
|
|
|
#region Serialization
|
|
|
|
/// <summary>
|
|
/// Current schema value that defines the version of the serialized file
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// schema started with 10 for ZedGraph version 5
|
|
/// </remarks>
|
|
public const int schema = 10;
|
|
|
|
/// <summary>
|
|
/// Constructor for deserializing objects
|
|
/// </summary>
|
|
/// <param name="info">A <see cref="SerializationInfo"/> instance that defines the serialized data
|
|
/// </param>
|
|
/// <param name="context">A <see cref="StreamingContext"/> instance that contains the serialized data
|
|
/// </param>
|
|
protected Link( 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" );
|
|
|
|
_title = info.GetString( "title" );
|
|
_url = info.GetString( "url" );
|
|
_target = info.GetString( "target" );
|
|
_isEnabled = info.GetBoolean( "isEnabled" );
|
|
Tag = info.GetValue( "Tag", typeof(object) );
|
|
}
|
|
/// <summary>
|
|
/// Populates a <see cref="SerializationInfo"/> instance with the data needed to serialize the target object
|
|
/// </summary>
|
|
/// <param name="info">A <see cref="SerializationInfo"/> instance that defines the serialized data</param>
|
|
/// <param name="context">A <see cref="StreamingContext"/> instance that contains the serialized data</param>
|
|
[SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)]
|
|
public virtual void GetObjectData( SerializationInfo info, StreamingContext context )
|
|
{
|
|
info.AddValue( "schema", schema );
|
|
info.AddValue( "title", _title );
|
|
info.AddValue( "url", _url );
|
|
info.AddValue( "target", _target );
|
|
info.AddValue( "isEnabled", _isEnabled );
|
|
info.AddValue( "Tag", Tag );
|
|
}
|
|
|
|
#endregion
|
|
|
|
}
|
|
} |