using RealTimeGraphX.EventArguments;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace RealTimeGraphX.WPF.Components
{
///
/// Represents a horizontal/vertical graph axis control.
///
///
public class GraphAxisControl : GraphSurfaceComponentBase
{
private ItemsControl _items_control;
///
/// Initializes the class.
///
static GraphAxisControl()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(GraphAxisControl), new FrameworkPropertyMetadata(typeof(GraphAxisControl)));
}
///
/// Gets or sets the control orientation.
///
public Orientation Orientation
{
get { return (Orientation)GetValue(OrientationProperty); }
set { SetValue(OrientationProperty, value); }
}
public static readonly DependencyProperty OrientationProperty =
DependencyProperty.Register("Orientation", typeof(Orientation), typeof(GraphAxisControl), new PropertyMetadata(Orientation.Vertical));
///
/// Gets or sets the tick item template.
///
public DataTemplate ItemTemplate
{
get { return (DataTemplate)GetValue(ItemTemplateProperty); }
set { SetValue(ItemTemplateProperty, value); }
}
public static readonly DependencyProperty ItemTemplateProperty =
DependencyProperty.Register("ItemTemplate", typeof(DataTemplate), typeof(GraphAxisControl), new PropertyMetadata(null));
///
/// Gets or sets the tick items.
///
internal ObservableCollection Items
{
get { return (ObservableCollection)GetValue(ItemsProperty); }
set { SetValue(ItemsProperty, value); }
}
public static readonly DependencyProperty ItemsProperty =
DependencyProperty.Register("Items", typeof(ObservableCollection), typeof(GraphAxisControl), new PropertyMetadata(null));
///
/// Gets or sets the number of ticks to display on the control.
///
public int Ticks
{
get { return (int)GetValue(TicksProperty); }
set { SetValue(TicksProperty, value); }
}
public static readonly DependencyProperty TicksProperty =
DependencyProperty.Register("Ticks", typeof(int), typeof(GraphAxisControl), new PropertyMetadata(9, (d, e) => (d as GraphAxisControl).OnTicksChanged()));
///
/// Gets or sets the string format which is used to format the ticks value.
///
public String StringFormat
{
get { return (String)GetValue(StringFormatProperty); }
set { SetValue(StringFormatProperty, value); }
}
public static readonly DependencyProperty StringFormatProperty =
DependencyProperty.Register("StringFormat", typeof(String), typeof(GraphAxisControl), new PropertyMetadata(null));
///
/// When overridden in a derived class, is invoked whenever application code or internal processes call .
///
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
_items_control = GetTemplateChild("PART_ItemsControl") as ItemsControl;
OnTicksChanged();
}
///
/// Called when the property has changed.
///
protected virtual void OnTicksChanged()
{
Items = new ObservableCollection(Enumerable.Range(0, Ticks).Select(x => new GraphAxisTickData()));
}
///
/// Called when surface painter has changed.
///
/// The painter.
protected override void OnSurfacePainterChanged(IGraphPainter painter)
{
base.OnSurfacePainterChanged(painter);
if (!this.IsInDesignMode())
{
painter.VirtualRangeXChanged += Painter_VirtualRangeXChanged;
painter.VirtualRangeYChanged += Painter_VirtualRangeYChanged;
}
}
///
/// Handles the VirtualRangeYChanged event of the surface painter.
///
/// The source of the event.
/// The instance containing the event data.
private void Painter_VirtualRangeYChanged(object sender, RangeChangedEventArgs e)
{
InvokeUI(() =>
{
if (Orientation == Orientation.Vertical)
{
if (Items != null && e.Minimum != null && e.Maximum != null)
{
var steps = e.Minimum.CreateRange(e.Minimum, e.Maximum, Ticks).Reverse().ToList();
for (int i = 0; i < steps.Count; i++)
{
var tick_data = Items[i];
tick_data.Data = steps[i];
tick_data.IsFirst = i == 0;
tick_data.IsLast = i == steps.Count - 1;
tick_data.IsEven = i % 2 == 0;
}
}
}
});
}
///
/// Handles the VirtualRangeXChanged event of the surface painter.
///
/// The source of the event.
/// The instance containing the event data.
private void Painter_VirtualRangeXChanged(object sender, RangeChangedEventArgs e)
{
InvokeUI(() =>
{
if (Orientation == Orientation.Horizontal)
{
if (Items != null)
{
var steps = e.Minimum.CreateRange(e.Minimum, e.Maximum, Ticks).ToList();
for (int i = 0; i < steps.Count; i++)
{
var tick_data = Items[i];
tick_data.Data = steps[i];
tick_data.IsFirst = i == 0;
tick_data.IsLast = i == steps.Count - 1;
tick_data.IsEven = i % 2 == 0;
}
}
}
});
}
}
}