1 | using System;
|
---|
2 | using System.Collections.Generic;
|
---|
3 | using System.Linq;
|
---|
4 | using System.Text;
|
---|
5 | using System.Diagnostics;
|
---|
6 |
|
---|
7 | namespace 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 | }
|
---|