//============================================================================
//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
{
///
/// A class that maintains hyperlink information for a clickable object on the graph.
///
///
/// John Champion
/// $Revision: 3.6 $ $Date: 2007/04/16 00:03:02 $
// ///
[Serializable]
public class Link : ISerializable, ICloneable
{
#region Fields
///
/// Internal field that stores the title string for this link.
///
internal string _title;
///
/// Internal field that stores the url string for this link
///
internal string _url;
///
/// Internal field that stores the target string for this link
///
internal string _target;
///
/// Internal field that determines if this link is "live".
///
internal bool _isEnabled;
#endregion
#region Properties
///
/// Gets or sets the title string for this link.
///
///
/// 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
/// to have no title.
///
public string Title
{
get { return _title; }
set { _title = value; }
}
///
/// Gets or sets the url string for this link.
///
///
/// Set this value to if you don't want to have
/// a hyperlink associated with the object to which this link belongs.
///
public string Url
{
get { return _url; }
set { _url = value; }
}
///
/// Gets or sets the target string for this link.
///
///
/// 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.
///
public string Target
{
get { return _target != string.Empty ? _target : "_self"; }
set { _target = value; }
}
///
/// 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;
///
/// Gets or sets a property that determines if this link is active. True to have
/// a clickable link, false to ignore the link.
///
public bool IsEnabled
{
get { return _isEnabled; }
set { _isEnabled = value; }
}
///
/// Gets a value that indicates if this is enabled
/// (see ), and that either the
/// or the is non-null.
///
public bool IsActive
{
get { return _isEnabled && ( _url != null || _title != null ); }
}
#endregion
#region Constructors
///
/// Default constructor. Set all properties to string.Empty, or null.
///
public Link()
{
_title = string.Empty;
_url = string.Empty;
_target = string.Empty;
this.Tag = null;
_isEnabled = false;
}
///
/// Construct a Link instance from a specified title, url, and target.
///
/// The title for the link (which shows up in the tooltip).
/// The URL destination for the link.
/// The target for the link (typically "_blank" or "_self").
public Link( string title, string url, string target )
{
_title = title;
_url = url;
_target = target;
Tag = null;
_isEnabled = true;
}
///
/// The Copy Constructor
///
/// The object from which to copy
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;
}
///
/// 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 Link Clone()
{
return new Link( this );
}
#endregion
#region methods
///
/// Create a URL for a that includes the index of the
/// point that was selected.
///
///
/// An "index" parameter is added to the property for this
/// link to indicate which point was selected. Further, if the
/// X or Y axes that correspond to this are of
/// , then an
/// additional parameter will be added containing the text value that
/// corresponds to the of the selected point.
/// The text parameter will be labeled "xtext", and
/// the text parameter will be labeled "ytext".
///
/// The zero-based index of the selected point
/// The of interest
/// The for which to
/// make the url string.
/// A string containing the url with an index parameter added.
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
///
/// Current schema value that defines the version of the serialized file
///
///
/// schema started with 10 for ZedGraph version 5
///
public const int schema = 10;
///
/// Constructor for deserializing objects
///
/// A instance that defines the serialized data
///
/// A instance that contains the serialized data
///
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) );
}
///
/// 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( "title", _title );
info.AddValue( "url", _url );
info.AddValue( "target", _target );
info.AddValue( "isEnabled", _isEnabled );
info.AddValue( "Tag", Tag );
}
#endregion
}
}