using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

using MGdu.WinFormUI.MyGraphics;

namespace MGdu.WinFormUI
{
    /// <summary>
    /// SimpleObject指的是只有一种状态（不像普通按钮一样有三种状态），并且其上的元素
    /// 布局比较简单的Object
    /// </summary>
    public class SimpleObjectPainter
    {
        /// <summary>
        /// 
        /// </summary>
        /// <param name="g"></param>
        /// <param name="rect"></param>
        /// <param name="coveredColor"></param>
        /// <param name="borderColor"></param>
        /// <param name="backColor"></param>
        /// <param name="drawInnerBorder"></param>
        /// <param name="startAngle"></param>
        /// <param name="percentage"></param>
        /// <param name="drawText"></param>
        /// <param name="textFont"></param>
        public static void RenderCircleProgressBar(Graphics g, Rectangle rect, Color coveredColor, Color borderColor,
            Color backColor, bool drawInnerBorder, int startAngle, int percentage, bool drawText, Font textFont)
        {
            using (NewSmoothModeGraphics ng = new NewSmoothModeGraphics(g, SmoothingMode.AntiAlias))
            {                
                Rectangle backup = rect;
                rect.Width--;
                rect.Height--;

                if (percentage < 0)
                    percentage = 0;
                if (percentage > 360)
                    percentage = 360;

                SolidBrush brushBack = new SolidBrush(backColor);
                Pen penBorder = new Pen(borderColor);

                // fill background                
                g.FillEllipse(brushBack, rect);                

                // outter most circle                
                g.DrawEllipse(penBorder, rect);                

                // pie covered region
                rect.Inflate(-1, -1);
                if (drawInnerBorder)
                    rect.Inflate(-1, -1);
                using (SolidBrush sb = new SolidBrush(coveredColor))
                {
                    g.FillPie(sb, rect, startAngle, 360 * percentage / 100);
                }

                // inner circle background
                rect = backup;
                rect.Inflate(-rect.Width / 4, -rect.Width / 4);                
                g.FillEllipse(brushBack, rect);                

                // inner circle line
                rect.Inflate(-1, -1);
                if (drawInnerBorder)
                    rect.Inflate(-1, -1);                
                g.DrawEllipse(penBorder, rect);                

                // text
                if (drawText)
                {
                    string text = percentage.ToString() + "%";
                    TextRenderer.DrawText(g, text, textFont, backup, Color.Black,
                        TextFormatFlags.VerticalCenter | TextFormatFlags.HorizontalCenter);
                }

                brushBack.Dispose();
                penBorder.Dispose();
            }
        }
    }
}
