/Main/src/DynamicDataDisplay/DependentPlotter.cs
C# | 97 lines | 73 code | 15 blank | 9 comment | 10 complexity | 4086b4633dcdde2a4f8c20a9edcf6ef3 MD5 | raw file
Possible License(s): CC-BY-SA-3.0
1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Diagnostics; 6 7namespace Microsoft.Research.DynamicDataDisplay 8{ 9 /// <summary> 10 /// Represents a special embedded kind of plotter. 11 /// Follows an outer's plotter Visible change when this is general panning or zooming via MouseNavigation. 12 /// Does not reacts on panning or zooming only in one direction (via AxisNavigation or KeyboardNavigation. 13 /// </summary> 14 public class DependentPlotter : InjectedPlotterBase 15 { 16 /// <summary> 17 /// Initializes a new instance of the <see cref="DependentPlotter"/> class. 18 /// </summary> 19 public DependentPlotter() : base() { } 20 21 protected override DataRect CoerceVisible(DataRect newVisible, DataRect baseVisible) 22 { 23 return baseVisible; 24 } 25 26 private bool IsHandledChangeType(ChangeType changeType) 27 { 28 bool handled = false; 29 switch (changeType) 30 { 31 case ChangeType.Pan: 32 case ChangeType.Zoom: 33 handled = true; 34 break; 35 case ChangeType.PanX: 36 case ChangeType.ZoomX: 37 handled = (ConjunctionMode == ViewportConjunctionMode.X) || (ConjunctionMode == ViewportConjunctionMode.XY); 38 break; 39 case ChangeType.PanY: 40 case ChangeType.ZoomY: 41 handled = (ConjunctionMode == ViewportConjunctionMode.Y) || (ConjunctionMode == ViewportConjunctionMode.XY); 42 break; 43 } 44 return handled; 45 } 46 47 protected override void OuterViewport_PropertyChanged(ExtendedPropertyChangedEventArgs e) 48 { 49 if(e.PropertyName != Viewport2D.VisiblePropertyName) 50 return; 51 52 if (IsHandledChangeType(e.ChangeType)) 53 { 54 DataRect newRect = (DataRect)e.NewValue; 55 DataRect oldRect = (DataRect)e.OldValue; 56 57 double ratioX = newRect.Width / oldRect.Width; 58 double ratioY = newRect.Height / oldRect.Height; 59 double shiftX = (newRect.XMin - oldRect.XMin) / oldRect.Width; 60 double shiftY = (newRect.YMin - oldRect.YMin) / oldRect.Height; 61 62 DataRect visible = Viewport.Visible; 63 64 visible.XMin += shiftX * visible.Width; 65 visible.YMin += shiftY * visible.Height; 66 visible.Width *= ratioX; 67 visible.Height *= ratioY; 68 69 Viewport.Visible = visible; 70 } 71 } 72 73 public override void OnPlotterAttached(Plotter plotter) 74 { 75 base.OnPlotterAttached(plotter); 76 77 Plotter.Viewport.FittedToView += Viewport_FittedToView; 78 } 79 80 public override void OnPlotterDetaching(Plotter plotter) 81 { 82 Plotter.Viewport.FittedToView -= Viewport_FittedToView; 83 84 base.OnPlotterDetaching(plotter); 85 } 86 87 private void Viewport_FittedToView(object sender, EventArgs e) 88 { 89 FitToView(); 90 } 91 92 protected override void OnConjunctionModeChanged() 93 { 94 // do nothing 95 } 96 } 97}