using System;
using System.Collections.Generic;
using System.Drawing;
using System.Text;
namespace DevComponents.Tree
{
    /// 
    /// Provides High DPI support for DotNetBar controls.
    /// 
    public static class Dpi
    {
        private static SizeF _Factor = new SizeF(1f, 1f);
        private static bool _UseFactor = false;
        private static bool _NormalizeScaleFactor = false;
        static Dpi()
        {
            //Debug.WriteLine("Static constructor");
        }
        /// 
        /// Gets or sets whether scale factor when set is normalized so both Width and Height values are the same. Default value is false.
        /// If using ScaleMode=font the scale factor might not be same for Width and Height so this allows opportunity to keep existing size ratios on the DotNetBar sized controls.
        /// When set to true the scale factor Height will always be set to scale factor Width.
        /// 
        public static bool NormalizeScaleFactor
        {
            get { return _NormalizeScaleFactor; }
            set { _NormalizeScaleFactor = value; }
        }
        public static SizeF Factor
        {
            get { return _Factor; }
        }
        public static Size Size(Size size)
        {
            if (!_UseFactor) return size;
            size.Width = (int)(size.Width * _Factor.Width);
            size.Height = (int)(size.Height * _Factor.Height);
            return size;
        }
        public static Rectangle Size(Rectangle r)
        {
            if (!_UseFactor) return r;
            r.Width = (int)(r.Width * _Factor.Width);
            r.Height = (int)(r.Height * _Factor.Height);
            return r;
        }
        public static Point Size(Point p)
        {
            if (!_UseFactor) return p;
            p.X = (int)(p.X * _Factor.Width);
            p.Y = (int)(p.Y * _Factor.Height);
            return p;
        }
        //public static DevComponents.DotNetBar.Padding Size(DevComponents.DotNetBar.Padding padding)
        //{
        //    if (!_UseFactor) return padding;
        //    return new Padding((int)(padding.Left * _Factor.Width), (int)(padding.Right * _Factor.Width), (int)(padding.Top * _Factor.Height), (int)(padding.Bottom * _Factor.Height));
        //}
        public static int DescaleWidth(int width)
        {
            if (!_UseFactor) return width;
            return (int)(width / _Factor.Width);
        }
        public static int DescaleHeight(int height)
        {
            if (!_UseFactor) return height;
            return (int)(height / _Factor.Height);
        }
        internal static System.Drawing.Size Descale(System.Drawing.Size size)
        {
            if (!_UseFactor) return size;
            size.Width = (int)(size.Width / _Factor.Width);
            size.Height = (int)(size.Height / _Factor.Height);
            return size;
        }
        public static int Width(int width)
        {
            if (!_UseFactor) return width;
            return (int)(width * _Factor.Width);
        }
        public static int Height(int height)
        {
            if (!_UseFactor) return height;
            return (int)(height * _Factor.Height);
        }
        public static float Height(float height)
        {
            if (!_UseFactor) return height;
            return (height * _Factor.Height);
        }
        private static int _CaptionVerticalPadding = 10;
        public static int CaptionVerticalPadding
        {
            get
            {
                if (!_UseFactor) return 0;
                return _CaptionVerticalPadding;
            }
        }
        public static void SetScaling(SizeF factor)
        {
            if (factor == _Factor) return;
            if (_NormalizeScaleFactor)
                factor.Height = factor.Width;
            if (factor.Width == 1f && factor.Height == 1f)
            {
                _UseFactor = false;
                _Factor = factor;
            }
            else
            {
                _UseFactor = true;
                _Factor = factor;
            }
            UpdateStaticSizes();
        }
        private static void UpdateStaticSizes()
        {
            Width1 = Dpi.Width(1);
            Width2 = Dpi.Width(2);
            Width3 = Dpi.Width(3);
            Width4 = Dpi.Width(4);
            Width5 = Dpi.Width(5);
            Width6 = Dpi.Width(6);
            Width7 = Dpi.Width(7);
            Width8 = Dpi.Width(8);
            Width9 = Dpi.Width(9);
            Width10 = Dpi.Width(10);
            Width11 = Dpi.Width(11);
            Width12 = Dpi.Width(12);
            Width13 = Dpi.Width(13);
            Width14 = Dpi.Width(14);
            Width15 = Dpi.Width(15);
            Width16 = Dpi.Width(16);
            Width17 = Dpi.Width(17);
            Width18 = Dpi.Width(18);
            Width20 = Dpi.Width(20);
            Width22 = Dpi.Width(22);
            Width24 = Dpi.Width(24);
            Width25 = Dpi.Width(25);
            Width26 = Dpi.Width(26);
            Width28 = Dpi.Width(28);
            Width32 = Dpi.Width(32);
            Width34 = Dpi.Width(34);
            Height1 = Dpi.Height(1);
            Height2 = Dpi.Height(2);
            Height3 = Dpi.Height(3);
            Height4 = Dpi.Height(4);
            Height5 = Dpi.Height(5);
            Height6 = Dpi.Height(6);
            Height7 = Dpi.Height(7);
            Height8 = Dpi.Height(8);
            Height9 = Dpi.Height(9);
            Height10 = Dpi.Height(10);
            Height11 = Dpi.Height(11);
            Height12 = Dpi.Height(12);
            Height13 = Dpi.Height(13);
            Height14 = Dpi.Height(14);
            Height15 = Dpi.Height(15);
            Height16 = Dpi.Height(16);
            Height17 = Dpi.Height(17);
            Height18 = Dpi.Height(18);
            Height20 = Dpi.Height(20);
            Height22 = Dpi.Height(22);
            Height23 = Dpi.Height(23);
            Height24 = Dpi.Height(24);
            Height25 = Dpi.Height(25);
            Height28 = Dpi.Height(28);
            Height32 = Dpi.Height(32);
        }
        #region Static Sizes
        public static int Width1 = 1;
        public static int Width2 = 2;
        public static int Width3 = 3;
        public static int Width5 = 5;
        public static int Width4 = 4;
        public static int Width6 = 6;
        public static int Width7 = 7;
        public static int Width8 = 8;
        public static int Width9 = 9;
        public static int Width10 = 10;
        public static int Width11 = 11;
        public static int Width12 = 12;
        public static int Width13 = 13;
        public static int Width14 = 14;
        public static int Width15 = 15;
        public static int Width16 = 16;
        public static int Width17 = 17;
        public static int Width18 = 18;
        public static int Width20 = 20;
        public static int Width22 = 22;
        public static int Width24 = 24;
        public static int Width25 = 25;
        public static int Width26 = 26;
        public static int Width28 = 28;
        public static int Width32 = 32;
        public static int Width34 = 34;
        public static int Height1 = 1;
        public static int Height2 = 2;
        public static int Height3 = 3;
        public static int Height4 = 4;
        public static int Height5 = 5;
        public static int Height6 = 6;
        public static int Height7 = 7;
        public static int Height8 = 8;
        public static int Height9 = 9;
        public static int Height10 = 10;
        public static int Height11 = 11;
        public static int Height12 = 12;
        public static int Height13 = 13;
        public static int Height14 = 14;
        public static int Height15 = 15;
        public static int Height16 = 16;
        public static int Height17 = 17;
        public static int Height18 = 18;
        public static int Height20 = 20;
        public static int Height22 = 22;
        public static int Height23 = 23;
        public static int Height24 = 24;
        public static int Height25 = 25;
        public static int Height28 = 28;
        public static int Height32 = 32;
        #endregion
    }
}