root/plot/Pybrary.Plot/DataBoundAnnotation.cs

Revision 746, 4.7 kB (checked in by mfenniak, 2 years ago)

--

Line 
1 using System;
2 using System.Collections.Generic;
3 using System.Drawing;
4
5 namespace Pybrary.Plot
6 {
7     public enum AnnotationCrosshair
8     {
9         Left,
10         Top,
11         Right,
12         Bottom
13     }
14
15     /// <summary>
16     /// An annotation that is bound to a data location.  It's location is
17     /// specified by an X and a Y coordinate, and the name of the Y axis
18     /// that the Y coordinate refers to.
19     /// </summary>
20     public class DataBoundAnnotation : Annotation
21     {
22         private float crosshairCircleRadius = 0.05f;
23         private float crosshairHandleSize = 0.05f;
24         private PenDescription crosshairPen = new PenDescription(Color.Black, 1f / 96);
25
26         private string yAxisName = "Default";
27
28         private double xCoordinate;
29         private double yCoordinate;
30
31         private AnnotationCrosshair crosshair = AnnotationCrosshair.Left;
32
33         public DataBoundAnnotation(Plot plot)
34             : base(plot)
35         {
36         }
37
38         public override void Draw(Graphics g, AdvancedRect dataArea)
39         {
40             PointF pt = new PointF(
41                 Plot.XAxis.DataToCoordinate(X, dataArea),
42                 Plot.YAxes[YAxisName].DataToCoordinate(Y, dataArea));
43
44             using (Pen p = crosshairPen.CreatePen())
45             {
46                 g.DrawLine(p, pt.X - crosshairCircleRadius, pt.Y, pt.X + crosshairCircleRadius, pt.Y);
47                 g.DrawLine(p, pt.X, pt.Y - crosshairCircleRadius, pt.X, pt.Y + crosshairCircleRadius);
48                 g.DrawEllipse(p, pt.X - crosshairCircleRadius, pt.Y - crosshairCircleRadius, crosshairCircleRadius * 2, crosshairCircleRadius * 2);
49
50                 SizeF size = Size(g);
51                 switch (crosshair)
52                 {
53                     case AnnotationCrosshair.Left:
54                         g.DrawLine(p, pt.X + crosshairCircleRadius, pt.Y, pt.X + crosshairCircleRadius + crosshairHandleSize, pt.Y);
55                         pt.X += crosshairCircleRadius;
56                         pt.X += crosshairHandleSize;
57                         pt.Y -= size.Height / 2;
58                         break;
59                     case AnnotationCrosshair.Right:
60                         g.DrawLine(p, pt.X - crosshairCircleRadius, pt.Y, pt.X - crosshairCircleRadius - crosshairHandleSize, pt.Y);
61                         pt.X -= crosshairCircleRadius;
62                         pt.X -= crosshairHandleSize;
63                         pt.X -= size.Width;
64                         pt.Y -= size.Height / 2;
65                         break;
66                     case AnnotationCrosshair.Bottom:
67                         g.DrawLine(p, pt.X, pt.Y - crosshairCircleRadius, pt.X, pt.Y - crosshairCircleRadius - crosshairHandleSize);
68                         pt.X -= size.Width / 2;
69                         pt.Y -= size.Height;
70                         pt.Y -= crosshairCircleRadius;
71                         pt.Y -= crosshairHandleSize;
72                         break;
73                     case AnnotationCrosshair.Top:
74                         g.DrawLine(p, pt.X, pt.Y + crosshairCircleRadius, pt.X, pt.Y + crosshairCircleRadius + crosshairHandleSize);
75                         pt.X -= size.Width / 2;
76                         pt.Y += crosshairCircleRadius;
77                         pt.Y += crosshairHandleSize;
78                         break;
79                 }
80             }
81             DrawTextBox(g, pt);
82         }
83
84         public AnnotationCrosshair Crosshair
85         {
86             get
87             {
88                 return crosshair;
89             }
90             set
91             {
92                 crosshair = value;
93             }
94         }
95
96         public virtual string YAxisName
97         {
98             get
99             {
100                 return yAxisName;
101             }
102             set
103             {
104                 yAxisName = value;
105                 raiseEvent();
106             }
107         }
108
109         public virtual double X
110         {
111             get
112             {
113                 return xCoordinate;
114             }
115             set
116             {
117                 xCoordinate = value;
118                 raiseEvent();
119             }
120         }
121
122         public virtual DateTime XAsDateTime
123         {
124             get
125             {
126                 return DateTime.FromOADate(xCoordinate);
127             }
128             set
129             {
130                 xCoordinate = value.ToOADate();
131                 raiseEvent();
132             }
133         }
134
135         public virtual double Y
136         {
137             get
138             {
139                 return yCoordinate;
140             }
141             set
142             {
143                 yCoordinate = value;
144                 raiseEvent();
145             }
146         }
147     }
148 }
Note: See TracBrowser for help on using the browser.