using System.Drawing;
using DevComponents.DotNetBar.Metro.ColorTables;
using DevComponents.DotNetBar.Metro.Rendering;
using DevComponents.DotNetBar.Rendering;
namespace DevComponents.DotNetBar.SuperGrid.Style
{
    /// 
    /// Create the Metro Visual Style for SuperGridControl.
    /// 
    public class MetroStyleFactory : VisualStyleFactory
    {
        private MetroPartColors _MetroPartColors;
        /// 
        /// Initializes a new instance of the MetroStyleFactory class.
        /// 
        public MetroStyleFactory()
        {
            _MetroPartColors = MetroRender.GetColorTable().MetroPartColors;
        }
        /// 
        /// Initializes a new instance of the MetroStyleFactory class.
        /// 
        /// Metro Part Colors to Initialize Style with.
        public MetroStyleFactory(MetroPartColors metroPartColors)
        {
            _MetroPartColors = metroPartColors;
            if (metroPartColors == null)
                _MetroPartColors = MetroRender.GetColorTable().MetroPartColors;
        }
        /// 
        /// Create the DefaultVisualStyle for SuperGridControl.
        /// 
        /// Color-Factory used to generate colors.
        /// New instance of DefaultVisualStyles class.s
        public override DefaultVisualStyles CreateStyle(ColorFactory factory)
        {
            DefaultVisualStyles visualStyle = new DefaultVisualStyles();
            InitGridPanelStyle(visualStyle, factory);
            InitCellStyles(visualStyle, factory);
            InitMergedCellStyles(visualStyle, factory);
            InitAltRowCellStyles(visualStyle, factory);
            InitColumnStyles(visualStyle, factory);
            InitAltColumnStyles(visualStyle, factory);
            InitColumnHeaderStyles(visualStyle, factory);
            InitRowStyles(visualStyle, factory);
            InitTextRowStyles(visualStyle, factory);
            InitGroupHeaderStyles(visualStyle, factory);
            InitFilterRowStyles(visualStyle, factory);
            InitFilterColumnHeaderStyles(visualStyle, factory);
            InitGroupByStyles(visualStyle, factory);
            return (visualStyle);
        }
        #region InitGridPanelStyle
        private void InitGridPanelStyle(DefaultVisualStyles visualStyle, ColorFactory factory)
        {
            GridPanelVisualStyle style = new GridPanelVisualStyle();
            MetroPartColors metroColors = _MetroPartColors;
            style.Background = new Background(factory.GetColor(metroColors.EditControlBackColor));
            style.BorderColor = new BorderColor(factory.GetColor(metroColors.CanvasColorDarkShade));
            style.BorderPattern.All = LinePattern.Solid;
            style.BorderThickness = new Thickness(1);
            style.TextColor = factory.GetColor(metroColors.TextColor);
            style.TreeLineColor = factory.GetColor(metroColors.CanvasColorLighterShade);
            style.HeaderLineColor = factory.GetColor(metroColors.CanvasColorDarkShade);
            style.HorizontalLineColor = factory.GetColor(metroColors.CanvasColorLighterShade);
            style.VerticalLineColor = factory.GetColor(metroColors.CanvasColorLighterShade);
            style.TreeLinePattern = LinePattern.Solid;
            style.HorizontalLinePattern = LinePattern.Solid;
            style.VerticalLinePattern = LinePattern.Solid;
            style.HeaderHLinePattern = LinePattern.Solid;
            style.HeaderVLinePattern = LinePattern.Solid;
            BaseTreeButtonVisualStyle tstyle = new BaseTreeButtonVisualStyle();
            tstyle.BorderColor = factory.GetColor(metroColors.CanvasColorDarkShade);
            tstyle.HotBorderColor = factory.GetColor(metroColors.CanvasColorDarkShade);
            tstyle.LineColor = factory.GetColor(metroColors.CanvasColorDarkShade);
            tstyle.HotLineColor = factory.GetColor(metroColors.CanvasColorDarkShade);
            tstyle.Background = new Background(factory.GetColor(metroColors.EditControlBackColor), factory.GetColor(metroColors.EditControlBackColor), 90);
            tstyle.HotBackground = new Background(factory.GetColor(metroColors.CanvasColor), factory.GetColor(metroColors.CanvasColor), 90);
            style.CircleTreeButtonStyle.CollapseButton = tstyle;
            style.CircleTreeButtonStyle.ExpandButton = tstyle;
            style.SquareTreeButtonStyle.CollapseButton = tstyle;
            style.SquareTreeButtonStyle.ExpandButton = tstyle;
            style.TriangleTreeButtonStyle.CollapseButton = tstyle;
            style.TriangleTreeButtonStyle.ExpandButton = tstyle;
            style.TriangleTreeButtonStyle.ExpandButton = tstyle;
            visualStyle.GridPanelStyle = style;
        }
        #endregion
        #region InitColumnHeaderStyles
        private void InitColumnHeaderStyles(DefaultVisualStyles visualStyle, ColorFactory factory)
        {
            ColumnHeaderRowVisualStyle style = new ColumnHeaderRowVisualStyle();
            MetroPartColors metroColors = _MetroPartColors;
            style.FilterBorderColor = factory.GetColor(metroColors.CanvasColorDarkShade);
            style.FilterBackground = new Background(
                Color.White, factory.GetColor(metroColors.CanvasColorDarkShade), 0);
            style.WhiteSpaceBackground = new Background(factory.GetColor(metroColors.CanvasColor));
            style.RowHeader.Background = new
                Background(factory.GetColor(metroColors.CanvasColorLighterShade));
            style.RowHeader.BorderHighlightColor = GetBorderHighlight();
            style.IndicatorBackground = new Background(factory.GetColor(metroColors.ComplementColor));
            style.IndicatorBorderColor = factory.GetColor(metroColors.ComplementColorDark);
            visualStyle.ColumnHeaderRowStyles[StyleType.Default] = style;
            style = style.Copy();
            style.FilterBorderColor = factory.GetColor(metroColors.ComplementColor);
            style.FilterBackground = new Background(
                Color.White, factory.GetColor(metroColors.ComplementColor), 45);
            visualStyle.ColumnHeaderRowStyles[StyleType.Selected] = style;
            style = style.Copy();
            style.FilterBorderColor = factory.GetColor(metroColors.CanvasColorDarkShade);
            
            style.FilterBackground = new Background(
                Color.White, factory.GetColor(metroColors.BaseColorDark), 0);
            style.RowHeader.Background = new Background(
                factory.GetColor(metroColors.CanvasColorLightShade));
            visualStyle.ColumnHeaderRowStyles[StyleType.MouseOver] = style;
            visualStyle.ColumnHeaderRowStyles[StyleType.SelectedMouseOver] = style;
        }
        #endregion
        #region InitTextRowStyles
        private void InitTextRowStyles(DefaultVisualStyles visualStyle, ColorFactory factory)
        {
            TextRowVisualStyle style = new TextRowVisualStyle();
            MetroPartColors metroColors = _MetroPartColors;
            style.Alignment = Alignment.MiddleCenter;
            style.AllowWrap = Tbool.True;
            style.Background = new Background(factory.GetColor(metroColors.EditControlBackColor));
            style.BorderColor = new BorderColor(factory.GetColor(metroColors.CanvasColorLighterShade));
            style.Padding.All = 2;
            style.TextColor = factory.GetColor(metroColors.TextColor);
            style.RowHeaderStyle.Background = new Background(factory.GetColor(metroColors.CanvasColorLighterShade));
            style.RowHeaderStyle.BorderHighlightColor = GetBorderHighlight();
            visualStyle.TitleStyles[StyleType.Default] = style;
            visualStyle.HeaderStyles[StyleType.Default] = style.Copy();
            visualStyle.FooterStyles[StyleType.Default] = style.Copy();
            style = style.Copy();
            style.Background = new Background(Color.Transparent);
            visualStyle.CaptionStyles[StyleType.Default] = style;
        }
        #endregion
        #region InitCellStyles
        private void InitCellStyles(DefaultVisualStyles visualStyle, ColorFactory factory)
        {
            CellVisualStyle style = new CellVisualStyle();
            MetroPartColors metroColors = _MetroPartColors;
            style.Alignment = Alignment.MiddleLeft;
            style.Background = new Background(factory.GetColor(metroColors.EditControlBackColor));
            style.BorderColor = new BorderColor(factory.GetColor(metroColors.CanvasColorLighterShade));
            style.BorderPattern.All = LinePattern.Solid;
            style.BorderThickness.All = 0;
            style.Font = SystemFonts.DefaultFont;
            style.ImageAlignment = Alignment.MiddleLeft;
            style.ImagePadding.All = 2;
            style.Margin.All = 0;
            style.ImageOverlay = ImageOverlay.None;
            style.Padding.All = 0;
            style.TextColor = metroColors.TextColor;
            visualStyle.CellStyles[StyleType.Default] = style;
            style = new CellVisualStyle();
            style.TextColor = metroColors.CanvasColorDarkShade;
            visualStyle.CellStyles[StyleType.ReadOnly] = style;
            style = new CellVisualStyle();
            style.Background = GetDefaultSelectedBackground(factory);
            style.TextColor = factory.GetColor(metroColors.BaseTextColor);
            visualStyle.CellStyles[StyleType.Selected] = style;
            visualStyle.CellStyles[StyleType.ReadOnlySelected] = style.Copy();
            style = new CellVisualStyle();
            style.Background = GetSelectedMouseOverBackground(factory);
            style.TextColor = factory.GetColor(metroColors.BaseColorLightText);
            visualStyle.CellStyles[StyleType.SelectedMouseOver] = style;
            visualStyle.CellStyles[StyleType.ReadOnlySelectedMouseOver] = style.Copy();
            style = new CellVisualStyle();
            style.Background = new Background(factory.GetColor(metroColors.EditControlBackColor));
            visualStyle.CellStyles[StyleType.Empty] = style;
        }
        #endregion
        #region InitMergedCellStyles
        private void InitMergedCellStyles(DefaultVisualStyles visualStyle, ColorFactory factory)
        {
            visualStyle.MergedCellStyles[StyleType.Default] = new CellVisualStyle();
            visualStyle.MergedCellStyles[StyleType.ReadOnly] = new CellVisualStyle();
            visualStyle.MergedCellStyles[StyleType.Selected] = new CellVisualStyle();
            visualStyle.MergedCellStyles[StyleType.ReadOnlySelected] = new CellVisualStyle();
            visualStyle.MergedCellStyles[StyleType.SelectedMouseOver] = new CellVisualStyle();
            visualStyle.MergedCellStyles[StyleType.ReadOnlySelectedMouseOver] = new CellVisualStyle();
            visualStyle.MergedCellStyles[StyleType.Empty] = new CellVisualStyle();
        }
        #endregion
        #region InitAltRowCellStyles
        private void InitAltRowCellStyles(DefaultVisualStyles visualStyle, ColorFactory factory)
        {
            MetroPartColors metroColors = _MetroPartColors;
            visualStyle.AlternateRowCellStyles[StyleType.Default].Background =
                new Background(factory.GetColor((metroColors.CanvasColor == metroColors.EditControlBackColor) ? metroColors.CanvasColorLightShade : metroColors.CanvasColor));
        }
        #endregion
        #region InitColumnStyles
        private void InitColumnStyles(DefaultVisualStyles visualStyle, ColorFactory factory)
        {
            ColumnHeaderVisualStyle colStyle = new ColumnHeaderVisualStyle();
            MetroPartColors metroColors = _MetroPartColors;
            colStyle.Alignment = Alignment.MiddleCenter;
            colStyle.BorderColor = new BorderColor(factory.GetColor(metroColors.CanvasColorLightShade));
            colStyle.BorderPattern.All = LinePattern.Solid;
            colStyle.BorderThickness.All = 0;
            colStyle.Font = SystemFonts.CaptionFont;
            colStyle.ImageAlignment = Alignment.MiddleLeft;
            colStyle.Margin.All = 0;
            colStyle.ImageOverlay = ImageOverlay.None;
            colStyle.TextColor = factory.GetColor(metroColors.TextColor);
            colStyle.Background = new Background(factory.GetColor(metroColors.CanvasColorLighterShade));
            visualStyle.ColumnHeaderStyles[StyleType.Default] = colStyle;
            visualStyle.ColumnHeaderStyles[StyleType.ReadOnly] = colStyle.Copy();
            visualStyle.ColumnHeaderStyles[StyleType.ReadOnly].Font = null;
            colStyle = new ColumnHeaderVisualStyle();
            colStyle.Background = new Background(factory.GetColor(metroColors.CanvasColorLightShade));
            visualStyle.ColumnHeaderStyles[StyleType.MouseOver] = colStyle;
            visualStyle.ColumnHeaderStyles[StyleType.ReadOnlyMouseOver] = colStyle.Copy();
            colStyle = new ColumnHeaderVisualStyle();
            colStyle.Background = GetDefaultSelectedColumnBackground(factory);
            visualStyle.ColumnHeaderStyles[StyleType.Selected] = colStyle;
            visualStyle.ColumnHeaderStyles[StyleType.ReadOnlySelected] = colStyle.Copy();
            colStyle = new ColumnHeaderVisualStyle();
            colStyle.Background = GetSelectedColumnMouseOverBackground();
            visualStyle.ColumnHeaderStyles[StyleType.SelectedMouseOver] = colStyle;
            visualStyle.ColumnHeaderStyles[StyleType.ReadOnlySelectedMouseOver] = colStyle.Copy();
        }
        #endregion
        #region InitAltColumnStyles
        private void InitAltColumnStyles(DefaultVisualStyles visualStyle, ColorFactory factory)
        {
            MetroPartColors metroColors = _MetroPartColors;
            visualStyle.AlternateColumnCellStyles[StyleType.Default].Background =
                new Background(factory.GetColor(metroColors.EditControlBackColor));
        }
        #endregion
        #region InitRowStyles
        private void InitRowStyles(DefaultVisualStyles visualStyle, ColorFactory factory)
        {
            visualStyle.RowStyles[StyleType.Default] = GetDefaultRowStyle();
            visualStyle.RowStyles[StyleType.MouseOver] = GetMouseOverRowStyle();
            visualStyle.RowStyles[StyleType.SelectedMouseOver] = GetSelectedMouseOverRowStyle(visualStyle, factory);
        }
        #region GetDefaultRowStyle
        private RowVisualStyle GetDefaultRowStyle()
        {
            MetroPartColors metroColors = _MetroPartColors;
            RowVisualStyle rowStyle = new RowVisualStyle();
            rowStyle.Background = new Background(metroColors.EditControlBackColor);
            RowHeaderVisualStyle style = new RowHeaderVisualStyle();
            style.Font = SystemFonts.DefaultFont;
            style.TextColor = metroColors.TextColor;
            Background bg = new Background(metroColors.CanvasColorLighterShade);
            style.Background = bg;
            bg = new Background(metroColors.BaseColor);
            style.ActiveRowBackground = bg;
            style.DirtyMarkerBackground = new Background(metroColors.BaseColorDarker);
            style.BorderHighlightColor = GetBorderHighlight();
            rowStyle.RowHeaderStyle = style;
            return (rowStyle);
        }
        #endregion
        #region GetMouseOverRowStyle
        private RowVisualStyle GetMouseOverRowStyle()
        {
            MetroPartColors metroColors = _MetroPartColors;
            RowVisualStyle rowStyle = new RowVisualStyle();
            rowStyle.Background = new Background(metroColors.EditControlBackColor);
            RowHeaderVisualStyle style = new RowHeaderVisualStyle();
            style.Background = new Background(metroColors.CanvasColorLighterShade);
            style.ActiveRowBackground = new Background(metroColors.CanvasColorLightShade);
            Background bg = new Background(metroColors.CanvasColorLightShade);
            style.Background = bg;
            bg = new Background(metroColors.BaseColor);
            style.ActiveRowBackground = bg;
            rowStyle.RowHeaderStyle = style;
            return (rowStyle);
        }
        #endregion
        #region GetSelectedMouseOverRowStyle
        private RowVisualStyle GetSelectedMouseOverRowStyle(DefaultVisualStyles visualStyle, ColorFactory factory)
        {
            MetroPartColors metroColors = _MetroPartColors;
            RowVisualStyle rowStyle = new RowVisualStyle();
            rowStyle.Background = GetDefaultSelectedBackground(factory);
            RowHeaderVisualStyle style = new RowHeaderVisualStyle();
            style.Background = new Background(metroColors.BaseColor);
            style.ActiveRowBackground = new Background(metroColors.BaseColor);
            rowStyle.RowHeaderStyle = style;
            visualStyle.RowStyles[StyleType.Selected] = rowStyle;
            rowStyle = new RowVisualStyle();
            rowStyle.Background = GetSelectedColumnMouseOverBackground();
            style = new RowHeaderVisualStyle();
            style.Background = new Background(metroColors.BaseColor);
            style.ActiveRowBackground = new Background(metroColors.BaseColor);
            rowStyle.RowHeaderStyle = style;
            return (rowStyle);
        }
        #endregion
        #endregion
        #region InitGroupHeaderStyles
        private void InitGroupHeaderStyles(DefaultVisualStyles visualStyle, ColorFactory factory)
        {
            MetroPartColors metroColors = _MetroPartColors;
            GroupHeaderVisualStyle style = new GroupHeaderVisualStyle();
            style.AllowWrap = Tbool.True;
            style.Alignment = Alignment.MiddleLeft;
            style.Font = SystemFonts.DefaultFont;
            style.Background = new
                Background(factory.GetColor(metroColors.EditControlBackColor));
            style.UnderlineColor = factory.GetColor(metroColors.ComplementColor);
            style.RowHeaderStyle.Background = new Background(factory.GetColor(metroColors.CanvasColorLighterShade));
            style.RowHeaderStyle.BorderHighlightColor = GetBorderHighlight();
            style.RowHeaderStyle.Font = SystemFonts.DefaultFont;
            style.TextColor = metroColors.TextColor;
            
            visualStyle.GroupHeaderStyles[StyleType.Default] = style;
        }
        #endregion
        #region GetDefaultSelectedColumnBackground
        private Background GetDefaultSelectedColumnBackground(ColorFactory factory)
        {
            MetroPartColors metroColors = _MetroPartColors;
            Background bg = new Background(factory.GetColor(metroColors.CanvasColorLighterShade),
                factory.GetColor(metroColors.CanvasColorLightShade));
            return (bg);
        }
        #endregion
        #region GetDefaultSelectedBackground
        private Background GetDefaultSelectedBackground(ColorFactory factory)
        {
            MetroPartColors metroColors = _MetroPartColors;
            Background bg = new Background(factory.GetColor(metroColors.BaseColor));
            return (bg);
        }
        #endregion
        #region GetDefaultSelectedColumnMouseOverStyle
        private Background GetSelectedColumnMouseOverBackground()
        {
            MetroPartColors metroColors = _MetroPartColors;
            return (new Background(metroColors.BaseColorLight));
        }
        #endregion
        #region GetDefaultSelectedMouseOverStyle
        private Background GetSelectedMouseOverBackground(ColorFactory factory)
        {
            MetroPartColors metroColors = _MetroPartColors;
            return (new Background(factory.GetColor(metroColors.BaseColorLight)));
        }
        #endregion
        #region InitFilterColumnHeaderStyles
        private void InitFilterColumnHeaderStyles(
            DefaultVisualStyles visualStyle, ColorFactory factory)
        {
            FilterColumnHeaderVisualStyle colStyle = new FilterColumnHeaderVisualStyle();
            MetroPartColors metroColors = _MetroPartColors;
            colStyle.Alignment = Alignment.MiddleCenter;
            colStyle.Font = SystemFonts.CaptionFont;
            colStyle.TextColor = factory.GetColor(metroColors.TextColor);
            colStyle.ErrorTextColor = factory.GetColor(metroColors.BaseColorDarker);
            colStyle.Background = new Background(factory.GetColor(metroColors.CanvasColorLighterShade));
            colStyle.GripBarBackground = new Background(factory.GetColor(metroColors.CanvasColor));
            visualStyle.FilterColumnHeaderStyles[StyleType.Default] = colStyle;
            colStyle = new FilterColumnHeaderVisualStyle();
            colStyle.Background = new Background(factory.GetColor(metroColors.CanvasColorLightShade));
            visualStyle.FilterColumnHeaderStyles[StyleType.MouseOver] = colStyle;
            colStyle = new FilterColumnHeaderVisualStyle();
            colStyle.Background = GetDefaultSelectedColumnBackground(factory);
            visualStyle.FilterColumnHeaderStyles[StyleType.Selected] = colStyle;
            colStyle = new FilterColumnHeaderVisualStyle();
            colStyle.Background = GetSelectedColumnMouseOverBackground();
            visualStyle.FilterColumnHeaderStyles[StyleType.SelectedMouseOver] = colStyle;
        }
        #endregion
        #region InitFilterRowStyles
        private void InitFilterRowStyles(
            DefaultVisualStyles visualStyle, ColorFactory factory)
        {
            FilterRowVisualStyle style = new FilterRowVisualStyle();
            MetroPartColors metroColors = _MetroPartColors;
            style.FilterBorderColor = factory.GetColor(0x787D87);
            style.FilterBackground = new Background(
                Color.White, factory.GetColor(metroColors.CanvasColorDarkShade), 0);
            style.WhiteSpaceBackground = new Background(factory.GetColor(metroColors.EditControlBackColor));
            style.RowHeader.Background = new
                Background(factory.GetColor(metroColors.CanvasColorLighterShade));
            style.RowHeader.BorderHighlightColor = GetBorderHighlight();
            visualStyle.FilterRowStyles[StyleType.Default] = style;
            style = style.Copy();
            style.FilterBackground = new Background(
                Color.White, factory.GetColor(metroColors.ComplementColor), 45);
            visualStyle.FilterRowStyles[StyleType.Selected] = style;
            style = style.Copy();
            style.FilterBackground = new Background(
                Color.White, factory.GetColor(metroColors.BaseColorDark), 0);
            style.RowHeader.Background = new
                Background(factory.GetColor(metroColors.CanvasColorLightShade));
            visualStyle.FilterRowStyles[StyleType.MouseOver] = style;
            visualStyle.FilterRowStyles[StyleType.SelectedMouseOver] = style;
        }
        #endregion
        #region InitGroupByStyles
        private void InitGroupByStyles(DefaultVisualStyles visualStyle, ColorFactory factory)
        {
            GroupByVisualStyle style = new GroupByVisualStyle();
            MetroPartColors metroColors = _MetroPartColors;
            style.Alignment = Alignment.MiddleCenter;
            style.GroupBoxConnectorColor = factory.GetColor(metroColors.BaseColorDark); // Panel border color
            style.GroupBoxBorderColor = factory.GetColor(metroColors.BaseColorDark);
            style.InsertMarkerBorderColor = factory.GetColor(metroColors.BaseColorDark);
            style.InsertMarkerBackground = GetSelectedColumnMouseOverBackground();
            style.RowHeaderStyle.Background = new Background(factory.GetColor(metroColors.CanvasColorLighterShade));
            style.RowHeaderStyle.BorderHighlightColor = GetBorderHighlight();
            style.TextColor = factory.GetColor(0x363636); // Col text color
            style.GroupBoxBackground = new Background(factory.GetColor(metroColors.CanvasColorLighterShade));  // col background
            visualStyle.GroupByStyles[StyleType.Default] = style;
            style = new GroupByVisualStyle();
            style.GroupBoxBackground = new Background(factory.GetColor(metroColors.CanvasColorLightShade));  // col background
            visualStyle.GroupByStyles[StyleType.MouseOver] = style;
            style = new GroupByVisualStyle();
            style.GroupBoxBackground = GetDefaultSelectedColumnBackground(factory);  // col background
            visualStyle.GroupByStyles[StyleType.Selected] = style;
            style = new GroupByVisualStyle();
            style.GroupBoxBackground = GetSelectedColumnMouseOverBackground();  // col background
            visualStyle.GroupByStyles[StyleType.SelectedMouseOver] = style;
        }
        #endregion
        #region GetBorderHighlight
        private Color GetBorderHighlight()
        {
            return (Color.Transparent);
        }
        #endregion
    }
}