protected override void OnDrawToBuffer(PaintEventArgs paintEventArgs) { Program.AssertOnEventThread(); Rectangle rect = new Rectangle(ScrollViewRectangle.Left, ScrollViewRectangle.Top, ScrollViewRectangle.Width - 1, ScrollViewRectangle.Height - 1); paintEventArgs.Graphics.FillRectangle(Palette.PaperBrush, ScrollViewRectangle); paintEventArgs.Graphics.DrawRectangle(SystemPens.ActiveBorder, rect); if (ArchiveMaintainer == null || Axis == null) { return; } if (ArchiveMaintainer.LoadingInitialData) { paintEventArgs.Graphics.DrawString(Messages.GRAPH_LOADING, Palette.LabelFont, Palette.LabelBrush, ScrollViewRectangle.Left + 10, ScrollViewRectangle.Top + 10); return; } DataTimeRange everything = Animating ? AnimateTimeRange : CurrentArchiveRange; RectangleF clip = paintEventArgs.Graphics.ClipBounds; paintEventArgs.Graphics.SetClip(rect); foreach (DataSet set in ScrollWideArchive.Sets.ToArray()) { if (!set.Draw || !DisplayedUuids.Contains(set.Uuid)) { continue; } List <DataPoint> todraw; ArchiveInterval current = ScrollViewLeftArchiveInterval; ArchiveInterval currentwidth = ScrollViewWidthArchiveInterval; if (current == currentwidth) { todraw = new List <DataPoint>(set.Points); if (current != ArchiveInterval.FiveSecond) { if (todraw.Count > 0 && todraw[0].X < ScrollViewRight.Ticks) { todraw.InsertRange(0, GetFinerPoints( set, new DataTimeRange(todraw[0].X, ScrollViewRight.Ticks, XRange.Resolution), current)); } } } else // currentwidth must be a higer resolution archive { int setindex = ArchiveMaintainer.Archives[currentwidth].Sets.IndexOf(set); todraw = new List <DataPoint>(ArchiveMaintainer.Archives[currentwidth].Sets[setindex].Points); if (todraw.Count > 0) { set.MergePointCollection(set.BinaryChop(set.Points, new DataTimeRange(ScrollViewLeft.Ticks, todraw[todraw.Count - 1].X, GraphResolution.Ticks)), todraw); } } set.RefreshCustomY(everything, todraw); if (set.CustomYRange.ScaleMode == RangeScaleMode.Auto) { set.CustomYRange.Max = DataSet.GetMaxY(set.CurrentlyDisplayed); set.CustomYRange.RoundToNearestPowerOf10(); } } Axis.DrawToBuffer(new DrawAxisNavArgs(paintEventArgs.Graphics, ScrollViewRectangle, new DataTimeRange(everything.Max, everything.Min, -BodgeSpacing(new TimeSpan(-everything.Delta)).Ticks), true)); foreach (DataSet set in ScrollWideArchive.Sets.ToArray()) { if (!set.Draw || !DisplayedUuids.Contains(set.Uuid)) { continue; } lock (Palette.PaletteLock) { using (var normalPen = Palette.CreatePen(set.Uuid, Palette.PEN_THICKNESS_NORMAL)) { LineRenderer.Render(paintEventArgs.Graphics, ScrollViewRectangle, everything, set.CustomYRange, normalPen, null, set.CurrentlyDisplayed, false); } } } if (DataEventList != null) { DataEventList.RenderEvents(paintEventArgs.Graphics, everything, ScrollViewRectangle, 5); } paintEventArgs.Graphics.SetClip(clip); long selectedleft = LongPoint.TranslateToScreen(new LongPoint(GraphLeft.Ticks, 1), everything, DataRange.UnitRange, new LongRectangle(ScrollViewRectangle)).X; long selectedright = LongPoint.TranslateToScreen(new LongPoint(GraphRight.Ticks, 1), everything, DataRange.UnitRange, new LongRectangle(ScrollViewRectangle)).X; paintEventArgs.Graphics.FillRectangle(Palette.ShadowRangeBrush, ScrollViewRectangle.Left, ScrollViewRectangle.Top, selectedleft - (ScrollViewRectangle.Left), ScrollViewRectangle.Height); paintEventArgs.Graphics.FillRectangle(Palette.ShadowRangeBrush, selectedright, ScrollViewRectangle.Top, ScrollViewRectangle.Width + (ScrollViewRectangle.Left) - selectedright, ScrollViewRectangle.Height); DrawGripper(paintEventArgs.Graphics, selectedright); DrawGripper(paintEventArgs.Graphics, selectedleft); }
protected override void OnMouseMove(MouseEventArgs e) { base.OnMouseMove(e); if (ArchiveMaintainer == null || ArchiveMaintainer.LoadingInitialData) { return; } DataTimeRange everything = CurrentArchiveRange; LongPoint virtualclicked = LongPoint.DeTranslateFromScreen(new LongPoint(e.Location), everything, DataRange.UnitRange, new LongRectangle(ScrollViewRectangle)); long selectedleft = LongPoint.TranslateToScreen(new LongPoint(GraphLeft.Ticks, 1), everything, DataRange.UnitRange, new LongRectangle(ScrollViewRectangle)).X; long selectedright = LongPoint.TranslateToScreen(new LongPoint(GraphRight.Ticks, 1), everything, DataRange.UnitRange, new LongRectangle(ScrollViewRectangle)).X; if (MouseDragging == DragMode.Existing) { long proposedoffset = ArchiveMaintainer.GraphNow.Ticks - (virtualclicked.X + (GraphWidth.Ticks / 2)); if (proposedoffset + GraphWidth.Ticks > ScrollViewOffset.Ticks + ScrollViewWidth.Ticks) { // ------------------------- // | _______________________|____________________________________ // | | ------------- | _______-------- | // | | / \___|__________/ \ | // | |---- | ---- -| // | |_______________________|_______________________________\__/_| // ------------------------- // // we have scrolled too far left (off the scroll view) GraphOffset = TimeSpan.FromTicks(ScrollViewWidth.Ticks + ScrollViewOffset.Ticks - GraphWidth.Ticks); } else if (proposedoffset < ScrollViewOffset.Ticks) { // ------------------------- // ___________________________________|_______________________ | // | ------------- _|_____-------- | | // | / \______________/ | \ | | // |---- | ---- -| | // |____________________________________|__________________\__/_| | // ------------------------- // // we have scrolled too far right (off the scroll view) if (GraphOffset == ScrollViewOffset) { return; } GraphOffset = ScrollViewOffset; } else { // ------------------------- // ___________|_________________________|______________________ // | -----|------- __|____-------- | // | / | \______________/ | \ | // |---- | | ---- -| // |___________|_________________________|_________________\__/_| // ------------------------- // // everything is fine, we are in the middle GraphOffset = TimeSpan.FromTicks(proposedoffset > 0 ? proposedoffset : 0); } if (GraphOffset.Ticks + GraphWidth.Ticks - ScrollViewOffset.Ticks > 0.90 * ScrollViewWidth.Ticks) { ScrollStrength = TimeSpan.FromTicks(GraphOffset.Ticks + GraphWidth.Ticks - (ScrollViewOffset.Ticks + (long)(0.90 * ScrollViewWidth.Ticks))); TimerScroll = ScrollMode.Left; Scroller.Start(); } else if (GraphOffset.Ticks - ScrollViewOffset.Ticks < 0.1 * ScrollViewWidth.Ticks) { ScrollStrength = TimeSpan.FromTicks((long)(0.1 * ScrollViewWidth.Ticks) - (GraphOffset.Ticks - ScrollViewOffset.Ticks)); TimerScroll = ScrollMode.Right; Scroller.Start(); } else { TimerScroll = ScrollMode.None; } } else if (MouseDragging == DragMode.New) { LongPoint virtualstart = LongPoint.DeTranslateFromScreen(new LongPoint(MouseDragStart, 1), everything, DataRange.UnitRange, new LongRectangle(ScrollViewRectangle)); if (e.X > MouseDragStart && e.X < ScrollViewRectangle.Width) { GraphOffset = new TimeSpan(ArchiveMaintainer.GraphNow.Ticks - virtualclicked.X); GraphWidth = new TimeSpan(virtualclicked.X - virtualstart.X); } else if (e.X < MouseDragStart && e.X > 0) { GraphOffset = new TimeSpan(ArchiveMaintainer.GraphNow.Ticks - virtualstart.X); GraphWidth = new TimeSpan(virtualstart.X - virtualclicked.X); } else if (e.X < MouseDragStart) { GraphOffset = new TimeSpan(ArchiveMaintainer.GraphNow.Ticks - virtualstart.X); GraphWidth = ScrollViewOffset + ScrollViewWidth - GraphOffset; } else if (e.X > MouseDragStart) { GraphOffset = ScrollViewOffset; GraphWidth = new TimeSpan(ScrollViewRight.Ticks - virtualstart.X); } } else if (MouseResizing == ResizeMode.Left) { long proposedwidth = ArchiveMaintainer.GraphNow.Ticks - (virtualclicked.X + GraphOffset.Ticks); if (((proposedwidth * ScrollViewRectangle.Width) / ScrollViewWidth.Ticks) > 2) { GraphWidth = proposedwidth + GraphOffset.Ticks < ScrollViewWidth.Ticks + ScrollViewOffset.Ticks ? TimeSpan.FromTicks(proposedwidth) : ScrollViewWidth + ScrollViewOffset - GraphOffset; } else { GraphWidth = TimeSpan.FromTicks((2 * ScrollViewWidth.Ticks) / ScrollViewRectangle.Width); } } else if (MouseResizing == ResizeMode.Right) { long proposedwidth = virtualclicked.X - GraphRight.Ticks; if (ArchiveMaintainer.GraphNow.Ticks - virtualclicked.X < ScrollViewOffset.Ticks) { GraphWidth += GraphOffset - ScrollViewOffset; GraphOffset = ScrollViewOffset; } else if ((((GraphWidth.Ticks + proposedwidth) * ScrollViewRectangle.Width) / ScrollViewWidth.Ticks) > 2) { GraphWidth += TimeSpan.FromTicks(virtualclicked.X - GraphRight.Ticks); GraphOffset = TimeSpan.FromTicks(ArchiveMaintainer.GraphNow.Ticks - virtualclicked.X); } else { long oldwidth = GraphWidth.Ticks; GraphWidth = TimeSpan.FromTicks((2 * ScrollViewWidth.Ticks) / ScrollViewRectangle.Width); GraphOffset += TimeSpan.FromTicks(oldwidth - GraphWidth.Ticks); } } else if (e.Location.X > selectedleft - 3 && e.Location.X < selectedleft + 3) { Cursor = Cursors.SizeWE; return; } else if (e.Location.X > selectedright - 3 && e.Location.X < selectedright + 3) { Cursor = Cursors.SizeWE; return; } else if (e.Location.X > selectedleft - 3 && e.Location.X < selectedright + 3) { Cursor = Cursors.SizeAll; return; } else { Cursor = Cursors.Cross; return; } GridSpacing = BodgeSpacing(GraphWidth); RefreshXRange(false); }