PageRenderTime 20ms CodeModel.GetById 12ms app.highlight 5ms RepoModel.GetById 1ms app.codeStats 0ms

/Main/src/DynamicDataDisplay/Charts/PointGraphBase.cs

#
C# | 210 lines | 172 code | 33 blank | 5 comment | 20 complexity | 841c82503eccbe683426c6f638500524 MD5 | raw file
  1using System;
  2using System.Windows;
  3using Microsoft.Research.DynamicDataDisplay.DataSources;
  4using System.Collections.Generic;
  5using System.Collections.ObjectModel;
  6using Microsoft.Research.DynamicDataDisplay.Common;
  7using Microsoft.Research.DynamicDataDisplay.Charts;
  8
  9namespace Microsoft.Research.DynamicDataDisplay
 10{
 11	public abstract class PointsGraphBase : ViewportElement2D, IOneDimensionalChart
 12	{
 13		/// <summary>
 14		/// Initializes a new instance of the <see cref="PointsGraphBase"/> class.
 15		/// </summary>
 16		protected PointsGraphBase()
 17		{
 18			Viewport2D.SetIsContentBoundsHost(this, true);
 19		}
 20
 21		#region DataSource
 22
 23		public IPointDataSource DataSource
 24		{
 25			get { return (IPointDataSource)GetValue(DataSourceProperty); }
 26			set { SetValue(DataSourceProperty, value); }
 27		}
 28
 29		public static readonly DependencyProperty DataSourceProperty =
 30			DependencyProperty.Register(
 31			  "DataSource",
 32			  typeof(IPointDataSource),
 33			  typeof(PointsGraphBase),
 34			  new FrameworkPropertyMetadata
 35			  {
 36				  AffectsRender = true,
 37				  DefaultValue = null,
 38				  PropertyChangedCallback = OnDataSourceChangedCallback
 39			  }
 40			);
 41
 42		private static void OnDataSourceChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
 43		{
 44			PointsGraphBase graph = (PointsGraphBase)d;
 45			if (e.NewValue != e.OldValue)
 46			{
 47				graph.DetachDataSource(e.OldValue as IPointDataSource);
 48				graph.AttachDataSource(e.NewValue as IPointDataSource);
 49			}
 50			graph.OnDataSourceChanged(e);
 51		}
 52
 53		private void AttachDataSource(IPointDataSource source)
 54		{
 55			if (source != null)
 56			{
 57				source.DataChanged += OnDataChanged;
 58			}
 59		}
 60
 61		private void DetachDataSource(IPointDataSource source)
 62		{
 63			if (source != null)
 64			{
 65				source.DataChanged -= OnDataChanged;
 66			}
 67		}
 68
 69		private void OnDataChanged(object sender, EventArgs e)
 70		{
 71			OnDataChanged();
 72		}
 73
 74		protected virtual void OnDataChanged()
 75		{
 76			UpdateBounds(DataSource);
 77
 78			RaiseDataChanged();
 79			Update();
 80		}
 81
 82		private void RaiseDataChanged()
 83		{
 84			if (DataChanged != null)
 85			{
 86				DataChanged(this, EventArgs.Empty);
 87			}
 88		}
 89		public event EventHandler DataChanged;
 90
 91		protected virtual void OnDataSourceChanged(DependencyPropertyChangedEventArgs args)
 92		{
 93			IPointDataSource newDataSource = (IPointDataSource)args.NewValue;
 94			if (newDataSource != null)
 95			{
 96				UpdateBounds(newDataSource);
 97			}
 98
 99			Update();
100		}
101
102		private void UpdateBounds(IPointDataSource dataSource)
103		{
104			if (Plotter2D != null)
105			{
106				var transform = GetTransform();
107				DataRect bounds = BoundsHelper.GetViewportBounds(dataSource.GetPoints(), transform.DataTransform);
108				Viewport2D.SetContentBounds(this, bounds);
109			}
110		}
111
112		#endregion
113
114		#region DataTransform
115
116		private DataTransform dataTransform = null;
117		public DataTransform DataTransform
118		{
119			get { return dataTransform; }
120			set
121			{
122				if (dataTransform != value)
123				{
124					dataTransform = value;
125					Update();
126				}
127			}
128		}
129
130		protected CoordinateTransform GetTransform()
131		{
132			if (Plotter == null)
133				return null;
134
135			var transform = Plotter2D.Viewport.Transform;
136			if (dataTransform != null)
137				transform = transform.WithDataTransform(dataTransform);
138
139			return transform;
140		}
141
142		#endregion
143
144		#region VisiblePoints
145
146		public ReadOnlyCollection<Point> VisiblePoints
147		{
148			get { return GetVisiblePoints(this); }
149			protected set { SetVisiblePoints(this, value); }
150		}
151
152		public static ReadOnlyCollection<Point> GetVisiblePoints(DependencyObject obj)
153		{
154			return (ReadOnlyCollection<Point>)obj.GetValue(VisiblePointsProperty);
155		}
156
157		public static void SetVisiblePoints(DependencyObject obj, ReadOnlyCollection<Point> value)
158		{
159			obj.SetValue(VisiblePointsProperty, value);
160		}
161
162		public static readonly DependencyProperty VisiblePointsProperty = DependencyProperty.RegisterAttached(
163		  "VisiblePoints",
164		  typeof(ReadOnlyCollection<Point>),
165		  typeof(PointsGraphBase),
166		  new FrameworkPropertyMetadata(null, OnVisiblePointsChanged));
167
168		private static void OnVisiblePointsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
169		{
170			PointsGraphBase graph = d as PointsGraphBase;
171			if (graph != null)
172			{
173				graph.RaiseVisiblePointsChanged();
174			}
175		}
176
177		public event EventHandler VisiblePointsChanged;
178		protected void RaiseVisiblePointsChanged()
179		{
180			VisiblePointsChanged.Raise(this);
181		}
182
183		private bool provideVisiblePoints = false;
184		public bool ProvideVisiblePoints
185		{
186			get { return provideVisiblePoints; }
187			set
188			{
189				provideVisiblePoints = value;
190				UpdateCore();
191			}
192		}
193
194		#endregion
195
196		protected IEnumerable<Point> GetPoints()
197		{
198			return DataSource.GetPoints(GetContext());
199		}
200
201		private readonly DataSource2dContext context = new DataSource2dContext();
202		protected DependencyObject GetContext()
203		{
204			//context.VisibleRect = Plotter2D.Viewport.Visible;
205			//context.ScreenRect = Plotter2D.Viewport.Output;
206
207			return context;
208		}
209	}
210}