/// <summary>
 /// Creates a new instance of BreakSliderEventArgs
 /// </summary>
 public BreakSliderEventArgs(BreakSlider slider)
 {
     _slider = slider;
 }
        /// <summary>
        ///
        /// </summary>
        public void UpdateRasterBreaks()
        {
            if (_rasterLayer == null) return;
            IColorCategory selectedBrk = null;
            if (_selectedSlider != null) selectedBrk = _selectedSlider.Category as IColorCategory;
            _breaks.Clear();
            Statistics stats = _rasterSymbolizer.Scheme.Statistics;
            Rectangle gb = _graph.GetGraphBounds();
            _graph.ColorRanges.Clear();
            foreach (IColorCategory category in _rasterSymbolizer.Scheme.Categories)
            {
                ColorRange cr = new ColorRange(category.LowColor, category.Range);
                _graph.ColorRanges.Add(cr);
                BreakSlider bs = new BreakSlider(gb, _graph.Minimum, _graph.Maximum, cr);
                bs.Color = _breakColor;
                bs.SelectColor = _selectedBreakColor;
                if (selectedBrk != null && category == selectedBrk)
                {
                    bs.Selected = true;
                    _selectedSlider = bs;
                    _graph.SelectedRange = cr;
                }
                if (category.Maximum != null)
                {
                    bs.Value = double.Parse(category.Maximum.ToString());
                }
                else
                {
                    bs.Value = stats.Maximum;
                }
                bs.Category = category;
                _breaks.Add(bs);
            }
            _breaks.Sort();
            // Moving a break generally affects both a maximum and a minimum.
            // Point to the next category to actuate that.
            for (int i = 0; i < _breaks.Count - 1; i++)
            {
                _breaks[i].NextCategory = _breaks[i + 1].Category;
                // We use the maximums to set up breaks.  Minimums should simply
                // be set to work with the maximums of the previous category.
                _breaks[i + 1].Category.Minimum = _breaks[i].Value;
            }

            if (_breaks.Count == 0) return;
            int breakIndex = 0;
            BreakSlider nextSlider = _breaks[breakIndex];
            int count = 0;
            if (_graph == null || _graph.Bins == null) return;
            foreach (double value in _values)
            {
                if (value < nextSlider.Value)
                {
                    count++;
                    continue;
                }
                nextSlider.Count = count;
                while (value > nextSlider.Value)
                {
                    breakIndex++;
                    if (breakIndex >= _breaks.Count)
                    {
                        break;
                    }
                    nextSlider = _breaks[breakIndex];
                }
                count = 0;
            }
        }
 /// <summary>
 /// Given a break slider's new position, this will update the category related to that
 /// break.
 /// </summary>
 /// <param name="slider"></param>
 public void UpdateCategory(BreakSlider slider)
 {
     slider.Category.Maximum = slider.Value;
     slider.Category.ApplyMinMax(_scheme.EditorSettings);
     int index = _breaks.IndexOf(slider);
     if (index < 0) return;
     if (index < _breaks.Count - 1)
     {
         _breaks[index + 1].Category.Minimum = slider.Value;
         _breaks[index + 1].Category.ApplyMinMax(_scheme.EditorSettings);
     }
 }
        /// <summary>
        /// Occurs when the mose down occurs
        /// </summary>
        /// <param name="e"></param>
        protected override void OnMouseDown(MouseEventArgs e)
        {
            Focus();
            if (e.Button == MouseButtons.Right)
            {
                _contextMenu.Show(this, e.Location);
                return;
            }

            foreach (BreakSlider slider in _breaks)
            {
                if (!slider.Bounds.Contains(e.Location) && !slider.HandleBounds.Contains(e.Location)) continue;
                // not sure if this works right.  Hopefully, just the little rectangles form a double region.

                Region rg = new Region();
                if (_selectedSlider != null)
                {
                    rg.Union(_selectedSlider.Bounds);
                    _selectedSlider.Selected = false;
                }
                _selectedSlider = slider;
                slider.Selected = true;
                rg.Union(_selectedSlider.Bounds);
                Invalidate(rg);
                _isDragging = true;
                OnSliderMoving();
                return;
            }

            if (_selectedSlider != null) _selectedSlider.Selected = false;
            _selectedSlider = null;
            base.OnMouseDown(e);
        }
        /// <summary>
        /// Selects one of the specific breaks.
        /// </summary>
        /// <param name="slider"></param>
        public void SelectBreak(BreakSlider slider)
        {
            if (_selectedSlider != null) _selectedSlider.Selected = false;
            _selectedSlider = slider;

            if (_selectedSlider != null)
            {
                _selectedSlider.Selected = true;
                _graph.SelectedRange = _selectedSlider.Range;
            }
        }
 /// <summary>
 /// Fires the SliderSelected event
 /// </summary>
 /// <param name="slider"></param>
 protected virtual void OnSliderSelected(BreakSlider slider)
 {
     if (SliderSelected != null)
     {
         SliderSelected(this, new BreakSliderEventArgs(slider));
     }
 }