259 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			259 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| //============================================================================
 | |
| //ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C#
 | |
| //Copyright ?2007  John Champion and JCarpenter
 | |
| //
 | |
| //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;
 | |
| 
 | |
| namespace DrawGraph
 | |
| {
 | |
| 	/// <summary>
 | |
| 	/// </summary>
 | |
| 	/// <remarks>
 | |
| 	/// </remarks>
 | |
| 	/// 
 | |
| 	/// <author> John Champion and JCarpenter </author>
 | |
| 	/// <version> $Revision: 3.5 $ $Date: 2007/03/11 02:08:16 $ </version>
 | |
| 	public class Selection : CurveList
 | |
| 	{
 | |
| 		// Revision: JCarpenter 10/06
 | |
| 		/// <summary>
 | |
| 		/// Subscribe to this event to receive notice 
 | |
| 		/// that the list of selected CurveItems has changed
 | |
| 		/// </summary>
 | |
| 		public event EventHandler SelectionChangedEvent;
 | |
| 
 | |
| 	#region static properties
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// The <see cref="Border" /> type to be used for drawing "selected"
 | |
| 		/// <see cref="PieItem" />, <see cref="BarItem" />, <see cref="HiLowBarItem" />,
 | |
| 		/// <see cref="OHLCBarItem" />, and <see cref="JapaneseCandleStickItem" /> item types.
 | |
| 		/// </summary>
 | |
| 		public static Border Border = new Border( Color.Gray, 1.0f );
 | |
| 		/// <summary>
 | |
| 		/// The <see cref="Fill" /> type to be used for drawing "selected"
 | |
| 		/// <see cref="PieItem" />, <see cref="BarItem" />, <see cref="HiLowBarItem" />,
 | |
| 		/// and <see cref="JapaneseCandleStickItem" /> item types.
 | |
| 		/// </summary>
 | |
| 		public static Fill Fill = new Fill( Color.Gray );
 | |
| 		/// <summary>
 | |
| 		/// The <see cref="Line" /> type to be used for drawing "selected"
 | |
| 		/// <see cref="LineItem" /> and <see cref="StickItem" /> types
 | |
| 		/// </summary>
 | |
| 		public static Line Line = new Line( Color.Gray );
 | |
| 		//			public static ErrorBar ErrorBar = new ErrorBar( Color.Gray );
 | |
| 		/// <summary>
 | |
| 		/// The <see cref="Symbol" /> type to be used for drawing "selected"
 | |
| 		/// <see cref="LineItem" /> and <see cref="ErrorBarItem" /> types.
 | |
| 		/// </summary>
 | |
| 		public static Symbol Symbol = new Symbol( SymbolType.Circle, Color.Gray );
 | |
| 
 | |
| 		//public static Color SelectedSymbolColor = Color.Gray;
 | |
| 
 | |
| 	#endregion
 | |
| 
 | |
| 	#region Methods
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Place a <see cref="CurveItem" /> in the selection list, removing all other
 | |
| 		/// items.
 | |
| 		/// </summary>
 | |
| 		/// <param name="master">The <see cref="MasterPane" /> that is the "owner"
 | |
| 		/// of the <see cref="CurveItem" />'s.</param>
 | |
| 		/// <param name="ci">The <see cref="CurveItem" /> to be added to the list.</param>
 | |
| 		public void Select( MasterPane master, CurveItem ci )
 | |
| 		{
 | |
| 			//Clear the selection, but don't send the event,
 | |
| 			//the event will be sent in "AddToSelection" by calling "UpdateSelection"
 | |
| 			ClearSelection( master, false );
 | |
| 
 | |
| 			AddToSelection( master, ci );
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Place a list of <see cref="CurveItem" />'s in the selection list, removing all other
 | |
| 		/// items.
 | |
| 		/// </summary>
 | |
| 		/// <param name="master">The <see cref="MasterPane" /> that is the "owner"
 | |
| 		/// of the <see cref="CurveItem" />'s.</param>
 | |
| 		/// <param name="ciList">The list of <see cref="CurveItem" /> to be added to the list.</param>
 | |
| 		public void Select( MasterPane master, CurveList ciList )
 | |
| 		{
 | |
| 			//Clear the selection, but don't send the event,
 | |
| 			//the event will be sent in "AddToSelection" by calling "UpdateSelection"
 | |
| 			ClearSelection( master, false );
 | |
| 
 | |
| 			AddToSelection( master, ciList );
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Add a <see cref="CurveItem" /> to the selection list.
 | |
| 		/// </summary>
 | |
| 		/// <param name="master">The <see cref="MasterPane" /> that is the "owner"
 | |
| 		/// of the <see cref="CurveItem" />'s.</param>
 | |
| 		/// <param name="ci">The <see cref="CurveItem" /> to be added to the list.</param>
 | |
| 		public void AddToSelection( MasterPane master, CurveItem ci )
 | |
| 		{
 | |
| 			if ( this.Contains( ci ) == false )
 | |
| 				Add( ci );
 | |
| 
 | |
| 			UpdateSelection( master );
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Add a list of <see cref="CurveItem" />'s to the selection list.
 | |
| 		/// </summary>
 | |
| 		/// <param name="master">The <see cref="MasterPane" /> that is the "owner"
 | |
| 		/// of the <see cref="CurveItem" />'s.</param>
 | |
| 		/// <param name="ciList">The list of <see cref="CurveItem" />'s to be added to the list.</param>
 | |
| 		public void AddToSelection( MasterPane master, CurveList ciList )
 | |
| 		{
 | |
| 			foreach ( CurveItem ci in ciList )
 | |
| 			{
 | |
| 				if ( this.Contains( ci ) == false )
 | |
| 					this.Add( ci );
 | |
| 			}
 | |
| 
 | |
| 			UpdateSelection( master );
 | |
| 		}
 | |
| 
 | |
| #if ( DOTNET1 )
 | |
| 
 | |
| 		// Define a "Contains" method so that this class works with .Net 1.1 or 2.0
 | |
| 		internal bool Contains( CurveItem item )
 | |
| 		{
 | |
| 			foreach ( CurveItem ci in this )
 | |
| 				if ( item == ci )
 | |
| 					return true;
 | |
| 
 | |
| 			return false;
 | |
| 		}
 | |
| #endif
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Remove the specified <see cref="CurveItem" /> from the selection list.
 | |
| 		/// </summary>
 | |
| 		/// <param name="master">The <see cref="MasterPane" /> that is the "owner"
 | |
| 		/// of the <see cref="CurveItem" />'s.</param>
 | |
| 		/// <param name="ci">The <see cref="CurveItem" /> to be removed from the list.</param>
 | |
| 		public void RemoveFromSelection( MasterPane master, CurveItem ci )
 | |
| 		{
 | |
| 			if ( this.Contains( ci ) )
 | |
| 				this.Remove( ci );
 | |
| 
 | |
| 			UpdateSelection( master );
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Clear the selection list and trigger a <see cref="SelectionChangedEvent" />.
 | |
| 		/// </summary>
 | |
| 		/// <param name="master">The <see cref="MasterPane" /> that "owns" the selection list.</param>
 | |
| 		public void ClearSelection( MasterPane master )
 | |
| 		{
 | |
| 			ClearSelection( master, true );
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Clear the selection list and optionally trigger a <see cref="SelectionChangedEvent" />.
 | |
| 		/// </summary>
 | |
| 		/// <param name="master">The <see cref="MasterPane" /> that "owns" the selection list.</param>
 | |
| 		/// <param name="sendEvent">true to trigger a <see cref="SelectionChangedEvent" />,
 | |
| 		/// false otherwise.</param>
 | |
| 		public void ClearSelection( MasterPane master, bool sendEvent )
 | |
| 		{
 | |
| 			this.Clear();
 | |
| 
 | |
| 			foreach ( GraphPane pane in master.PaneList )
 | |
| 			{
 | |
| 				foreach ( CurveItem ci in pane.CurveList )
 | |
| 				{
 | |
| 					ci.IsSelected = false;
 | |
| 				}
 | |
| 			}
 | |
| 
 | |
| 			if ( sendEvent )
 | |
| 			{
 | |
| 				if ( SelectionChangedEvent != null )
 | |
| 					SelectionChangedEvent( this, new EventArgs() );
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Mark the <see cref="CurveItem" />'s that are included in the selection list
 | |
| 		/// by setting the <see cref="CurveItem.IsSelected" /> property to true.
 | |
| 		/// </summary>
 | |
| 		/// <param name="master">The <see cref="MasterPane" /> that "owns" the selection list.</param>
 | |
| 		public void UpdateSelection( MasterPane master )
 | |
| 		{
 | |
| 			if ( Count <= 0 )
 | |
| 			{
 | |
| 				ClearSelection( master );
 | |
| 				return;
 | |
| 			}
 | |
| 
 | |
| 			foreach ( GraphPane pane in master.PaneList )
 | |
| 			{
 | |
| 				foreach ( CurveItem ci in pane.CurveList )
 | |
| 				{
 | |
| 					//Make it Inactive
 | |
| 					ci.IsSelected = false;
 | |
| 				}
 | |
| 
 | |
| 			}
 | |
| 			foreach ( CurveItem ci in  this )
 | |
| 			{
 | |
| 				//Make Active
 | |
| 				ci.IsSelected = true;
 | |
| 
 | |
| 				//If it is a line / scatterplot, the selected Curve may be occluded by an unselected Curve
 | |
| 				//So, move it to the top of the ZOrder by removing it, and re-adding it.
 | |
| 
 | |
| 				//Why only do this for Lines? ...Bar and Pie Curves are less likely to overlap, 
 | |
| 				//and adding and removing Pie elements changes thier display order
 | |
| 				if ( ci.IsLine )
 | |
| 				{
 | |
| 					//I don't know how to get a Pane, from a CurveItem, so I can only do it 
 | |
| 					//if there is one and only one Pane, based on the assumption that the 
 | |
| 					//Curve's Pane is MasterPane[0]
 | |
| 
 | |
| 					//If there is only one Pane
 | |
| 					if ( master.PaneList.Count == 1 )
 | |
| 					{
 | |
| 						GraphPane pane = master.PaneList[0];
 | |
| 						pane.CurveList.Remove( ci );
 | |
| 						pane.CurveList.Insert( 0, ci );
 | |
| 					}
 | |
| 
 | |
| 				}
 | |
| 			}
 | |
| 
 | |
| 			//Send Selection Changed Event
 | |
| 			if ( SelectionChangedEvent != null )
 | |
| 				SelectionChangedEvent( this, new EventArgs() );
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 		#endregion
 | |
| 
 | |
| 
 | |
| 	}
 | |
| }
 |