/// <summary> /// When user click on the chart element, check if userline was selected /// </summary> private void testUserlineClick() { splitMain.Panel2Collapsed = true; selectedSeries = null; selectedLine = null; DrawingAllowed = false; if (userlines != null) { var pos = currentMouseLocation; var results = chartStock.HitTest(pos.Value.X, pos.Value.Y, false, ChartElementType.DataPoint); foreach (var result in results) { if (result.ChartElementType == ChartElementType.DataPoint && result.Series.Name.Contains("Line")) { selectedSeries = result.Series; var item = (UserLines)result.Series.Tag; DrawingAllowed = true; selectedLine = item; createUserlineInfobox(selectedLine); btnLineSubmitChanges.Visible = true; result.Series.BorderWidth = (int)item?.Thickness; } } chartStock.Invalidate(); } }
/// <summary> /// Deletes the selected userline /// </summary> public void deleteUserline(UserLines selectedLine) { if (ConnectionState == true) { var query = db.UserLines.Single(x => x.LineID == selectedLine.LineID); db.UserLines.DeleteOnSubmit(query); db.SubmitChanges(); } }
/// <summary> /// Opens the infobox and replaces fields with selected user line /// </summary> private void createUserlineInfobox(UserLines line) { splitMain.Panel2Collapsed = false; tbLineThickness.Value = (line?.Thickness >= 1) ? Convert.ToInt16(line?.Thickness) : 1; lineThickness = tbLineThickness.Value; lblLineThickness.Text = "Breite : " + tbLineThickness.Value; btnLinecolor.BackColor = ColorTranslator.FromHtml(line?.LineColor); lineColor = btnLinecolor.BackColor; btnDeleteLine.Visible = true; }
/// <summary> /// Deletes selected user line asynchronously /// </summary> private async void btnDeleteLine_Click(object sender, EventArgs e) { if (selectedLine != null) { mainForm.notifyUser(FrmMain.NotifyType.PrepareMessage, "Linie wird gelöscht..."); var model = new UserlineModel(stock); Task task = Task.Run(() => model.deleteUserline(selectedLine)); await task; refreshChartAsync(stock.symbol); mainForm.notifyUser(FrmMain.NotifyType.StatusMessage, "Bereit"); btnLineSubmitChanges.Visible = false; } selectedLine = null; }
/// <summary> /// Updates the selected userline - NOT WORKING /// </summary> public void updateUserline(UserLines selectedLine = null) { if (ConnectionState == true && selectedLine != null) { var query = db.UserLines.Single(x => x.LineID == selectedLine.LineID); if (query != null) { query.TimePoint1 = selectedLine.TimePoint1; query.TimePoint2 = selectedLine.TimePoint2; query.PricePoint1 = selectedLine.PricePoint1; query.PricePoint2 = selectedLine.PricePoint2; query.LineColor = selectedLine.LineColor; query.Thickness = selectedLine.Thickness; db.SubmitChanges(); } } }
/// <summary> /// Updates selected user line asynchronously /// </summary> private async void btnLineSubmitChanges_Click(object sender, EventArgs e) { if (selectedLine != null) { mainForm.notifyUser(FrmMain.NotifyType.PrepareMessage, "Linie wird aktualisiert..."); selectedLine.Thickness = (short)lineThickness; selectedLine.LineColor = ColorTranslator.ToHtml(lineColor); var model = new UserlineModel(stock); Task task = Task.Run(() => model.updateUserline(selectedLine)); await task; refreshChartAsync(stock.symbol); mainForm.notifyUser(FrmMain.NotifyType.StatusMessage, "Bereit"); btnLineSubmitChanges.Visible = false; } selectedLine = null; }
/// <summary> /// Inserts a new userline for the selected userline /// </summary> public UserLines insertUserline(DataPoint p1, DataPoint p2) { UserLines result = null; if (ConnectionState == true) { var newItem = new UserLines { StocksMapID = stock.StocksMapID, PricePoint1 = p1.YValues[0], PricePoint2 = p2.YValues[0], TimePoint1 = p1.XValue, TimePoint2 = p2.XValue, LineColor = ColorTranslator.ToHtml(lineColor), Thickness = Convert.ToSByte(lineThickness), }; db.UserLines.InsertOnSubmit(newItem); db.SubmitChanges(); result = newItem; } return(result); }
private void resetAttributes() { selectedSeries = null; selectedDot = null; selectedLine = null; }
/// <summary> /// Creates tooltip or crosshair /// </summary> private void chartStock_MouseMove(object sender, MouseEventArgs e) { if ((crosshairToolStripMenuItem.Checked || tooltipToolStripMenuItem.Checked) && currentMouseLocation != e.Location && e.X > 0 && e.Y > 0 && e.X < (chartStock.Width - 1)) { tooltip.RemoveAll(); currentMouseLocation = e.Location; if (selectedSeries != null && selectedDot != null) { double dateOLE = chartStock.ChartAreas[0].AxisX.PixelPositionToValue(e.X); double price = chartStock.ChartAreas[0].AxisY.PixelPositionToValue(e.Y); int index = selectedSeries.Points.IndexOf(selectedDot); if (index >= 0) { selectedSeries.Points[index].XValue = dateOLE; selectedSeries.Points[index].YValues[0] = price; var currentItem = (UserLines)selectedSeries.Tag; if (index == 0) { currentItem.TimePoint1 = dateOLE; currentItem.PricePoint1 = price; } else if (index == 1) { currentItem.TimePoint2 = dateOLE; currentItem.PricePoint2 = price; } selectedLine = currentItem; selectedSeries.Tag = selectedLine; } chartStock.Invalidate(); } else if (!DrawingAllowed) { double dateOLE = chartStock.ChartAreas[0].AxisX.PixelPositionToValue(e.X); if (!double.IsInfinity(dateOLE)) { double cursorX = Math.Round(dateOLE, 0); double cursorY = .0; decimal price = 0; decimal volume = 0; if (seriesDict.ContainsKey(cursorX) && seriesDict[cursorX] != null) { cursorY = (double)seriesDict[cursorX].Close; price = seriesDict[cursorX].Close; volume = seriesDict[cursorX].Volume; } if (crosshairToolStripMenuItem.Checked) { double verticalLinePos = chartStock.ChartAreas[0].AxisY.ValueToPixelPosition(cursorY); chartStock.ChartAreas[0].CursorX.SetCursorPixelPosition(new Point(e.X, e.Y), true); chartStock.ChartAreas[1].CursorX.SetCursorPixelPosition(new Point(e.X, e.Y), true); chartStock.ChartAreas[0].CursorY.SetCursorPixelPosition(new Point(e.X, (int)verticalLinePos), true); } if (tooltipToolStripMenuItem.Checked) { var toolTipText = String.Format(Math.Round(price, 2) + " " + currencySymbol + Environment.NewLine + "Volumen: " + String.Format("{0:#,#,0}", volume) + Environment.NewLine + DateTime.FromOADate(dateOLE).ToShortDateString()); tooltip.Show(toolTipText, chartStock, e.Location.X + 10, e.Location.Y - 15); } } } } }