/// <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)); } }