Esempio n. 1
0
 public override void DrawRect(CoreGraphics.CGRect dirtyRect)
 {
     NSColor.Red.Set();
     NSBezierPath.StrokeRect(this.Bounds);
 }
Esempio n. 2
0
        public override void DrawRect(CGRect dirtyRect)
        {
            var context = NSGraphicsContext.CurrentContext.GraphicsPort;

            // Engine.Instance.Stats.Charts.Hit (RandomGenerator.GetInt (1024, 1024 * 1024), RandomGenerator.GetInt (1024, 1024 * 1024)); // Debugging

            context.SetFillColor(m_colorBackground);
            context.FillRect(dirtyRect);

            NSColor.Gray.Set();
            NSBezierPath.StrokeRect(Bounds);


            nfloat DX = this.Bounds.Size.Width;
            nfloat DY = this.Bounds.Size.Height;

            m_chartDX     = DX;
            m_chartDY     = DY - m_legendDY;
            m_chartStartX = 0;
            m_chartStartY = m_chartDY;


            float maxY = m_chart.GetMax();

            if (maxY <= 0)
            {
                maxY = 4096;
            }
            else if (maxY > 1000000000000)
            {
                maxY = 1000000000000;
            }

            CGPoint lastPointDown = new CGPoint(-1, -1);
            CGPoint lastPointUp   = new CGPoint(-1, -1);

            nfloat stepX = (m_chartDX - 0) / m_chart.Resolution;

            // Grid lines
            for (int g = 0; g < m_chart.Grid; g++)
            {
                nfloat x = ((m_chartDX - 0) / m_chart.Grid) * g;
                DrawLine(context, m_colorGrid, m_chartStartX + x, 0, m_chartStartX + x, m_chartStartY);
            }

            // Axis line
            DrawLine(context, m_colorAxis, 0, m_chartStartY, m_chartDX, m_chartStartY);

            // Legend

            /*
             * {
             *      string legend = "";
             *      legend += Messages.ChartRange + ": " + Utils.FormatSeconds(m_chart.Resolution * m_chart.TimeStep);
             *      legend += "   ";
             *      legend += Messages.ChartGrid + ": " + Utils.FormatSeconds(m_chart.Resolution / m_chart.Grid * m_chart.TimeStep);
             *      legend += "   ";
             *      legend += Messages.ChartStep + ": " + Utils.FormatSeconds(m_chart.TimeStep);
             *
             *      Point mp = Cursor.Position;
             *      mp = PointToClient(mp);
             *      if ((mp.X > 0) && (mp.Y < chartDX) && (mp.Y > chartDY) && (mp.Y < DY))
             *              legend += " - " + Messages.ChartClickToChangeResolution;
             *
             *      e.Graphics.DrawString(legend, FontLabel, BrushLegendText, ChartRectangle(0, chartStartY, chartDX, m_legendDY), formatTopCenter);
             * }
             */


            // Graph
            for (int i = 0; i < m_chart.Resolution; i++)
            {
                int p = i + m_chart.Pos + 1;
                if (p >= m_chart.Resolution)
                {
                    p -= m_chart.Resolution;
                }

                nfloat downY = ((m_chart.Download[p]) * (m_chartDY - m_marginTopY)) / maxY;
                nfloat upY   = ((m_chart.Upload[p]) * (m_chartDY - m_marginTopY)) / maxY;

                CGPoint pointDown = ChartPoint(m_chartStartX + stepX * i, m_chartStartY - downY);
                CGPoint pointUp   = ChartPoint(m_chartStartX + stepX * i, m_chartStartY - upY);

                //e.Graphics.DrawLine(Pens.Green, new Point(0,0), point);

                if (lastPointDown.X != -1)
                {
                    DrawLine(context, m_colorDownloadGraph, lastPointDown, pointDown);
                    DrawLine(context, m_colorUploadGraph, lastPointUp, pointUp);
                }

                lastPointDown = pointDown;
                lastPointUp   = pointUp;
            }

            // Download line
            nfloat downCurY = 0;
            {
                long v = m_chart.GetLastDownload();
                downCurY = ((v) * (m_chartDY - m_marginTopY)) / maxY;
                DrawLine(context, m_colorDownloadLine, 0, m_chartStartY - downCurY, m_chartDX, m_chartStartY - downCurY);
                DrawStringOutline(context, Messages.ChartDownload + ": " + ValToDesc(v), m_colorDownloadText, ChartRectangle(0, 0, m_chartDX - 10, m_chartStartY - downCurY), 8);
            }

            // Upload line
            {
                long   v   = m_chart.GetLastUpload();
                nfloat y   = ((v) * (m_chartDY - m_marginTopY)) / maxY;
                nfloat dly = 0;
                if (Math.Abs(downCurY - y) < 10)
                {
                    dly = 15;                                              // Download and upload overwrap, distance it.
                }
                DrawLine(context, m_colorUploadLine, 0, m_chartStartY - y, m_chartDX, m_chartStartY - y);
                DrawStringOutline(context, Messages.ChartUpload + ": " + ValToDesc(v), m_colorUploadText, ChartRectangle(0, 0, m_chartDX - 10, m_chartStartY - y - dly), 8);
            }

            // Mouse lines
            {
                CGPoint mp = Window.MouseLocationOutsideOfEventStream;
                mp.X -= this.Frame.Left;
                mp.Y -= this.Frame.Top;
                //mp = ParentWindow.ConvertPointToView (mp, this);

                mp = Invert(mp);

                //mp = Window.ConvertScreenToBase (mp);

                if ((mp.X > 0) && (mp.Y < m_chartDX) && (mp.Y > 0) && (mp.Y < m_chartDY))
                {
                    DrawLine(context, m_colorMouse, 0, mp.Y, m_chartDX, mp.Y);
                    DrawLine(context, m_colorMouse, mp.X, 0, mp.X, m_chartDY);

                    nfloat i = (m_chartDX - (mp.X - m_chartStartX)) / stepX;

                    int t = Conversions.ToInt32(i * m_chart.TimeStep);

                    //float y = mp.Y * maxY / (chartDY - m_marginTopY);
                    nfloat y = (m_chartStartY - (mp.Y - m_marginTopY)) * maxY / m_chartDY;

                    String label = ValToDesc(Conversions.ToInt64(y)) + ", " + Utils.FormatSeconds(t) + " ago";

                    int formatAlign = 6;

                    CGRect rect = new CGRect();
                    if (DX - mp.X > DX / 2)
                    //if (mp.X < DX - 200)
                    {
                        if (DY - mp.Y > DY / 2)
                        //if (mp.Y < 20)
                        {
                            formatAlign = 0;
                            rect.X      = mp.X + 5;
                            rect.Y      = mp.Y + 5;
                            rect.Width  = DX;
                            rect.Height = DX;
                        }
                        else
                        {
                            formatAlign = 6;
                            rect.X      = mp.X + 5;
                            rect.Y      = 0;
                            rect.Width  = DX;
                            rect.Height = mp.Y - 5;
                        }
                    }
                    else
                    {
                        if (DY - mp.Y > DY / 2)
                        //if (mp.Y < 40)
                        {
                            formatAlign = 2;
                            rect.X      = 0;
                            rect.Y      = mp.Y;
                            rect.Width  = mp.X - 5;
                            rect.Height = DY;
                        }
                        else
                        {
                            formatAlign = 8;
                            rect.X      = 0;
                            rect.Y      = 0;
                            rect.Width  = mp.X - 5;
                            rect.Height = mp.Y - 5;
                        }
                    }

                    DrawStringOutline(context, label, m_colorMouse, rect, formatAlign);
                }
            }
        }