using System.Windows;
using System.Windows.Media;
using Microsoft.Research.DynamicDataDisplay.DataSources;
using Microsoft.Research.DynamicDataDisplay.PointMarkers;
using Microsoft.Research.DynamicDataDisplay.Common;
namespace Microsoft.Research.DynamicDataDisplay
{
public class MarkerPointsGraph : PointsGraphBase
{
///
/// Initializes a new instance of the class.
///
public MarkerPointsGraph()
{
ManualTranslate = true;
}
///
/// Initializes a new instance of the class.
///
/// The data source.
public MarkerPointsGraph(IPointDataSource dataSource)
: this()
{
DataSource = dataSource;
}
protected override void OnVisibleChanged(DataRect newRect, DataRect oldRect)
{
base.OnVisibleChanged(newRect, oldRect);
InvalidateVisual();
}
public PointMarker Marker
{
get { return (PointMarker)GetValue(MarkerProperty); }
set { SetValue(MarkerProperty, value); }
}
public static readonly DependencyProperty MarkerProperty =
DependencyProperty.Register(
"Marker",
typeof(PointMarker),
typeof(MarkerPointsGraph),
new FrameworkPropertyMetadata { DefaultValue = null, AffectsRender = true }
);
protected override void OnRenderCore(DrawingContext dc, RenderState state)
{
if (DataSource == null) return;
if (Marker == null) return;
var transform = Plotter2D.Viewport.Transform;
DataRect bounds = DataRect.Empty;
using (IPointEnumerator enumerator = DataSource.GetEnumerator(GetContext()))
{
Point point = new Point();
while (enumerator.MoveNext())
{
enumerator.GetCurrent(ref point);
enumerator.ApplyMappings(Marker);
//Point screenPoint = point.Transform(state.Visible, state.Output);
Point screenPoint = point.DataToScreen(transform);
bounds = DataRect.Union(bounds, point);
Marker.Render(dc, screenPoint);
}
}
Viewport2D.SetContentBounds(this, bounds);
}
}
}