/// <summary> /// Render all the <see cref="CurveItem"/> objects in the list to the /// specified <see cref="Graphics"/> /// device by calling the <see cref="CurveItem.Draw"/> member function of /// each <see cref="CurveItem"/> object. /// </summary> /// <param name="g"> /// A graphic device object to be drawn into. This is normally e.Graphics from the /// PaintEventArgs argument to the Paint() method. /// </param> /// <param name="pane"> /// A reference to the <see cref="GraphPane"/> object that is the parent or /// owner of this object. /// </param> /// <param name="scaleFactor"> /// The scaling factor to be used for rendering objects. This is calculated and /// passed down by the parent <see cref="GraphPane"/> object using the /// <see cref="PaneBase.CalcScaleFactor"/> method, and is used to proportionally adjust /// font sizes, etc. according to the actual size of the graph. /// </param> public void Draw(Graphics g, GraphPane pane, float scaleFactor) { // Configure the accumulator for stacked bars //Bar.ResetBarStack(); // Count the number of BarItems in the curvelist int pos = this.NumBars; // sorted overlay bars are a special case, since they are sorted independently at each // ordinal position. if (pane._barSettings.Type == BarType.SortedOverlay) { // First, create a new curveList with references (not clones) of the curves CurveList tempList = new CurveList(); foreach (CurveItem curve in this) { if (curve.IsBar) { tempList.Add((CurveItem)curve); } } // Loop through the bars, graphing each ordinal position separately for (int i = 0; i < this.maxPts; i++) { // At each ordinal position, sort the curves according to the value axis value tempList.Sort(pane._barSettings.Base == BarBase.X ? SortType.YValues : SortType.XValues, i); // plot the bars for the current ordinal position, in sorted order foreach (BarItem barItem in tempList) { barItem.Bar.DrawSingleBar(g, pane, barItem, ((BarItem)barItem).BaseAxis(pane), ((BarItem)barItem).ValueAxis(pane), 0, i, ((BarItem)barItem).GetBarWidth(pane), scaleFactor); } } } // Loop for each curve in reverse order to pick up the remaining curves // The reverse order is done so that curves that are later in the list are plotted behind // curves that are earlier in the list for (int i = this.Count - 1; i >= 0; i--) { CurveItem curve = this[i]; if (curve.IsBar) { pos--; } // Render the curve // if it's a sorted overlay bar type, it's already been done above if (!(curve.IsBar && pane._barSettings.Type == BarType.SortedOverlay)) { curve.Draw(g, pane, pos, scaleFactor); } } }
/// <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> /// The Copy Constructor /// </summary> /// <param name="rhs">The XAxis object from which to copy</param> public CurveList(CurveList rhs) { this.maxPts = rhs.maxPts; foreach (CurveItem item in rhs) { this.Add((CurveItem)((ICloneable)item).Clone()); } }
/// <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); }