public override void OnMouseDown(ChartControl chartControl, ChartPanel chartPanel, ChartScale chartScale, ChartAnchor dataPoint) { switch (DrawingState) { case DrawingState.Building: if (StartAnchor.IsEditing) { dataPoint.CopyDataValues(StartAnchor); dataPoint.CopyDataValues(EndAnchor); StartAnchor.IsEditing = false; } else if (EndAnchor.IsEditing) { dataPoint.CopyDataValues(EndAnchor); EndAnchor.IsEditing = false; DrawingState = DrawingState.Normal; IsSelected = false; } break; case DrawingState.Normal: Point p = dataPoint.GetPoint(chartControl, chartPanel, chartScale); Cursor c = GetCursor(chartControl, chartPanel, chartScale, p); if (c == Cursors.SizeWE) { int editingAnchor = GetClosestBarAnchor(chartControl, p, false); int i = anchorBars.IndexOf(editingAnchor); if (editingAnchor != int.MinValue && i > -1) { StartAnchor.UpdateXFromPoint(new Point(anchorBars[i == 0 ? i : i - 1], chartPanel.Y + chartPanel.H), chartControl, chartScale); EndAnchor.UpdateXFromPoint(new Point(anchorBars[i == 0 ? i + 1 : i], chartPanel.Y + chartPanel.H), chartControl, chartScale); EndAnchor.IsEditing = true; DrawingState = DrawingState.Editing; } } else if (c == Cursors.SizeAll) { int editingAnchor = GetClosestBarAnchor(chartControl, p, true); int i = anchorBars.IndexOf(editingAnchor); if (editingAnchor != int.MinValue && i > -1) { StartAnchor.UpdateXFromPoint(new Point(anchorBars[i - 1], chartPanel.Y + chartPanel.H), chartControl, chartScale); EndAnchor.UpdateXFromPoint(new Point(anchorBars[i], chartPanel.Y + chartPanel.H), chartControl, chartScale); // We have to update the InitialMouseDownAnchor here because we moved our Start/End anchors InitialMouseDownAnchor = dataPoint.Clone() as ChartAnchor; DrawingState = DrawingState.Moving; } } else { IsSelected = false; } break; } }
public override void OnRender(ChartControl chartControl, ChartScale chartScale) { //Allow user to change ZOrder when manually drawn on chart if (!hasSetZOrder && !StartAnchor.IsNinjaScriptDrawn) { ZOrderType = DrawingToolZOrder.Normal; ZOrder = ChartPanel.ChartObjects.Min(z => z.ZOrder) - 1; hasSetZOrder = true; } RenderTarget.AntialiasMode = SharpDX.Direct2D1.AntialiasMode.PerPrimitive; OutlineStroke.RenderTarget = RenderTarget; ChartPanel chartPanel = chartControl.ChartPanels[PanelIndex]; // recenter region anchors to always be onscreen/centered double middleX = chartPanel.X + chartPanel.W / 2d; double middleY = chartPanel.Y + chartPanel.H / 2d; if (Mode == RegionHighlightMode.Price) { StartAnchor.UpdateXFromPoint(new Point(middleX, 0), chartControl, chartScale); EndAnchor.UpdateXFromPoint(new Point(middleX, 0), chartControl, chartScale); } else { StartAnchor.UpdateYFromDevicePoint(new Point(0, middleY), chartScale); EndAnchor.UpdateYFromDevicePoint(new Point(0, middleY), chartScale); } Point startPoint = StartAnchor.GetPoint(chartControl, chartPanel, chartScale); Point endPoint = EndAnchor.GetPoint(chartControl, chartPanel, chartScale); double width = endPoint.X - startPoint.X; AnchorLineStroke.RenderTarget = RenderTarget; OutlineStroke.RenderTarget = RenderTarget; if (!IsInHitTest && AreaBrush != null) { if (areaBrushDevice.Brush == null) { Brush brushCopy = areaBrush.Clone(); brushCopy.Opacity = areaOpacity / 100d; areaBrushDevice.Brush = brushCopy; } areaBrushDevice.RenderTarget = RenderTarget; } else { areaBrushDevice.RenderTarget = null; areaBrushDevice.Brush = null; } // align to full pixel to avoid unneeded aliasing float strokePixAdjust = Math.Abs(OutlineStroke.Width % 2d).ApproxCompare(0) == 0 ? 0.5f : 0f; SharpDX.RectangleF rect = Mode == RegionHighlightMode.Time ? new SharpDX.RectangleF((float)startPoint.X + strokePixAdjust, ChartPanel.Y - OutlineStroke.Width + strokePixAdjust, (float)width, chartPanel.Y + chartPanel.H + OutlineStroke.Width * 2) : new SharpDX.RectangleF(chartPanel.X - OutlineStroke.Width + strokePixAdjust, (float)startPoint.Y + strokePixAdjust, chartPanel.X + chartPanel.W + OutlineStroke.Width * 2, (float)(endPoint.Y - startPoint.Y)); if (!IsInHitTest && areaBrushDevice.BrushDX != null) { RenderTarget.FillRectangle(rect, areaBrushDevice.BrushDX); } SharpDX.Direct2D1.Brush tmpBrush = IsInHitTest ? chartControl.SelectionBrush : OutlineStroke.BrushDX; RenderTarget.DrawRectangle(rect, tmpBrush, OutlineStroke.Width, OutlineStroke.StrokeStyle); if (IsSelected) { tmpBrush = IsInHitTest ? chartControl.SelectionBrush : AnchorLineStroke.BrushDX; RenderTarget.DrawLine(startPoint.ToVector2(), endPoint.ToVector2(), tmpBrush, AnchorLineStroke.Width, AnchorLineStroke.StrokeStyle); } }