//============================================================================ //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 { /// /// /// /// /// /// John Champion and JCarpenter /// $Revision: 3.5 $ $Date: 2007/03/11 02:08:16 $ public class Selection : CurveList { // Revision: JCarpenter 10/06 /// /// Subscribe to this event to receive notice /// that the list of selected CurveItems has changed /// public event EventHandler SelectionChangedEvent; #region static properties /// /// The type to be used for drawing "selected" /// , , , /// , and item types. /// public static Border Border = new Border( Color.Gray, 1.0f ); /// /// The type to be used for drawing "selected" /// , , , /// and item types. /// public static Fill Fill = new Fill( Color.Gray ); /// /// The type to be used for drawing "selected" /// and types /// public static Line Line = new Line( Color.Gray ); // public static ErrorBar ErrorBar = new ErrorBar( Color.Gray ); /// /// The type to be used for drawing "selected" /// and types. /// public static Symbol Symbol = new Symbol( SymbolType.Circle, Color.Gray ); //public static Color SelectedSymbolColor = Color.Gray; #endregion #region Methods /// /// Place a in the selection list, removing all other /// items. /// /// The that is the "owner" /// of the 's. /// The to be added to the list. 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 ); } /// /// Place a list of 's in the selection list, removing all other /// items. /// /// The that is the "owner" /// of the 's. /// The list of to be added to the list. 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 ); } /// /// Add a to the selection list. /// /// The that is the "owner" /// of the 's. /// The to be added to the list. public void AddToSelection( MasterPane master, CurveItem ci ) { if ( this.Contains( ci ) == false ) Add( ci ); UpdateSelection( master ); } /// /// Add a list of 's to the selection list. /// /// The that is the "owner" /// of the 's. /// The list of 's to be added to the list. 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 /// /// Remove the specified from the selection list. /// /// The that is the "owner" /// of the 's. /// The to be removed from the list. public void RemoveFromSelection( MasterPane master, CurveItem ci ) { if ( this.Contains( ci ) ) this.Remove( ci ); UpdateSelection( master ); } /// /// Clear the selection list and trigger a . /// /// The that "owns" the selection list. public void ClearSelection( MasterPane master ) { ClearSelection( master, true ); } /// /// Clear the selection list and optionally trigger a . /// /// The that "owns" the selection list. /// true to trigger a , /// false otherwise. 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() ); } } /// /// Mark the 's that are included in the selection list /// by setting the property to true. /// /// The that "owns" the selection list. 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 } }