public override void OnMouseDoubleClick(BasicMouseEventArgs e)
        {
            Size2 overview = GraphUtil.CalcOverviewSize(e.Width, e.Height, main.TotalWidth(), main.TotalHeight());

            if (e.X < overview.Width && e.Y > e.Height - overview.Height)
            {
                return;
            }
            if (GraphUtil.HitsMinusButton(e.X, e.Y, e.Width, e.Height))
            {
                return;
            }
            if (GraphUtil.HitsPlusButton(e.X, e.Y, e.Width, e.Height))
            {
                return;
            }
            main.OnMouseDoubleClickMainView?.Invoke(e.Scale(main.ZoomFactor));
        }
        public override void OnMouseIsDown(BasicMouseEventArgs e)
        {
            Size2 overview = GraphUtil.CalcOverviewSize(e.Width, e.Height, main.TotalWidth(), main.TotalHeight());

            if (e.X < overview.Width && e.Y > e.Height - overview.Height)
            {
                OnMouseIsDownOverview(e.X, (int)(e.Y - e.Height + overview.Height), e.Width, e.Height);
                return;
            }
            ZoomButtonState newState = GraphUtil.GetNewZoomButtonState(e.X, e.Y, e.Width, e.Height, true);

            switch (newState)
            {
            case ZoomButtonState.PressMinus:
                main.ZoomFactor /= GraphUtil.zoomStep;
                invalidate();
                main.InvalidateScrollbars();
                main.UpdateZoom();
                break;

            case ZoomButtonState.PressPlus:
                main.ZoomFactor *= GraphUtil.zoomStep;
                invalidate();
                main.InvalidateScrollbars();
                main.UpdateZoom();
                break;

            default:
                if (newState != state)
                {
                    invalidate();
                }
                break;
            }
            state = newState;
            if (newState == ZoomButtonState.PressMinus || newState == ZoomButtonState.PressPlus)
            {
                return;
            }
            main.OnMouseIsDownMainView?.Invoke(e.Scale(main.ZoomFactor));
        }
        private void OnMouseIsDownOverview(int x, int y, int width, int height)
        {
            Size2      overview = GraphUtil.CalcOverviewSize(width, height, main.TotalWidth(), main.TotalHeight());
            Rectangle2 win      = GraphUtil.CalcWin(overview, main.TotalSize, main.VisibleWin, main.ZoomFactor, main.ZoomFactor);

            if (win.Contains(x, y))
            {
                navigatorData.Start(x, y, main.VisibleX, main.VisibleY);
            }
            else
            {
                float x1   = x - win.Width / 2;
                float y1   = y - win.Height / 2;
                int   newX = (int)Math.Round(x1 * main.TotalWidth() / overview.Width);
                int   newY = (int)Math.Round(y1 * main.TotalHeight() / overview.Height);
                newX          = (int)Math.Min(Math.Max(newX, 0), main.TotalWidth() - main.VisibleWidth / main.ZoomFactor);
                main.VisibleX = newX;
                newY          = (int)Math.Min(Math.Max(newY, 0), main.TotalHeight() - main.VisibleHeight / main.ZoomFactor);
                main.VisibleY = newY;
                invalidate();
            }
        }