using System.Windows.Forms;
using System;
using DevComponents.DotNetBar.Rendering;
using DevComponents.DotNetBar.Metro.Rendering;
using DevComponents.DotNetBar.Controls;
namespace DevComponents.DotNetBar
{
	/// 
	/// Summary description for PainterFactory.
	/// 
	internal class PainterFactory
	{
		private static Office2003ButtonItemPainter m_Office2003Painter=new Office2003ButtonItemPainter();
        private static Office2007ButtonItemPainter m_Office2007Painter = new Office2007ButtonItemPainter();
        private static MetroButtonItemPainter m_MetroButtonPainter = new MetroButtonItemPainter();
		private static Office2003RibbonTabItemPainter m_RibbonTabItemOffice2003Painter=new Office2003RibbonTabItemPainter();
        private static Office2007ItemContainerPainter m_Office2007ItemContainerPainter = new Office2007ItemContainerPainter();
        private static Office2007BarBackgroundPainter m_Office2007BarBackgroundPainter = new Office2007BarBackgroundPainter();
        private static Office2007KeyTipsPainter m_Office2007KeyTipsPainter = new Office2007KeyTipsPainter();
        private static Office2007DialogLauncherPainter m_Office2007RibbonBarPainter = new Office2007DialogLauncherPainter();
        private static Office2007RibbonControlPainter m_Office2007RibbonControlPainter = new Office2007RibbonControlPainter();
        private static Office2007RibbonTabItemPainter m_Office2007RibbonTabItemPainter = new Office2007RibbonTabItemPainter();
        //private static Office2007RibbonTabGroupPainter m_Office2007RibbonTabGroupPainter = new Office2007RibbonTabGroupPainter();
        private static Rendering.Office2007ColorItemPainter m_Office2007ColorItemPainter = new Rendering.Office2007ColorItemPainter();
        private static Office2007SystemCaptionItemPainter m_Office2007SystemCaptionItemPainter = null;
        private static Office2007MdiSystemItemPainter m_Office2007MdiSystemItemPainter = new Office2007MdiSystemItemPainter();
        private static Office2007FormCaptionPainter m_Office2007FormCaptionPainter = new Office2007FormCaptionPainter();
        private static Rendering.Office2007RibbonOverflowPainter m_Office2007RibbonOverflowPainter = new DevComponents.DotNetBar.Rendering.Office2007RibbonOverflowPainter();
        private static Rendering.Office2007QatOverflowPainter m_Office2007QatOverflowPainter = new DevComponents.DotNetBar.Rendering.Office2007QatOverflowPainter();
        private static Rendering.Office2007QatCustomizeItemPainter m_Office2007QatCustomizePainter = new DevComponents.DotNetBar.Rendering.Office2007QatCustomizeItemPainter();
        private static Rendering.Office2007CheckBoxItemPainter m_Office2007CheckBoxItemPainter = new Rendering.Office2007CheckBoxItemPainter();
        private static Rendering.Office2007ProgressBarItemPainter m_Office2007ProgressBarPainter = new DevComponents.DotNetBar.Rendering.Office2007ProgressBarItemPainter();
        private static Rendering.Office2007NavigationPanePainter m_Office2007NavPanePainter = new DevComponents.DotNetBar.Rendering.Office2007NavigationPanePainter();
        private static Rendering.SliderPainter m_SliderPainter = new DevComponents.DotNetBar.Rendering.Office2007SliderPainter();
        private static Rendering.SideBarPainter m_SideBarPainter = new DevComponents.DotNetBar.Rendering.Office2007SideBarPainter();
        private static CrumbBarItemViewPainter m_CrumbBarItemViewPainter = null;
        private static SwitchButtonPainter m_SwitchButtonPainter = null;
        private static Office2010NavPaneButtonPainter _Office2010NavPaneButtonPainter = new Office2010NavPaneButtonPainter();
        private static Rendering.RangeSliderPainter _RangeSliderPainter = new DevComponents.DotNetBar.Rendering.Office2010RangeSliderPainter();
        public static ButtonItemPainter CreateButtonPainter(ButtonItem button)
        {
            if (button is RibbonTabItem)
            {
                return CreateRibbonTabItemPainter((RibbonTabItem)button);
            }
            if (button is TabFormItem)
            {
                return CreateTabFormItemPainter((TabFormItem)button);
            }
            else if (button is NewTabFormItem)
            {
                return CreateNewTabFormItemPainter((NewTabFormItem)button);
            }
            if (button is RibbonOverflowButtonItem)
            {
                ButtonItemPainter p = CreateRibbonOverflowButtonPainter((RibbonOverflowButtonItem)button);
                if (p != null)
                    return p;
            }
            eDotNetBarStyle buttonEffectiveStyle = button.EffectiveStyle;
            if (buttonEffectiveStyle == eDotNetBarStyle.Office2010 && button.ContainerState == eContainerState.NavigationPane)
            {
                return _Office2010NavPaneButtonPainter;
            }
            
            if (buttonEffectiveStyle == eDotNetBarStyle.Office2010 && button is ApplicationButton)
                return Office2010ApplicationButtonPainter;
            else if (button is DevComponents.DotNetBar.Metro.MetroAppButton || button is ApplicationButton && StyleManager.IsMetro(buttonEffectiveStyle))
                return MetroAppButtonPainter;
            if (BarFunctions.IsOffice2007Style(buttonEffectiveStyle))
            {
                if (StyleManager.IsMetro(buttonEffectiveStyle))
                    return m_MetroButtonPainter;
                if (button.ContainerControl is RibbonBar)
                    return m_Office2007Painter;
                return m_Office2007Painter;
            }
            return m_Office2003Painter;
        }
        private static ButtonItemPainter _Office2010ApplicationButtonPainter;
        public static ButtonItemPainter Office2010ApplicationButtonPainter
        {
            get
            {
                if (_Office2010ApplicationButtonPainter == null) _Office2010ApplicationButtonPainter = new Office2010AppButtonPainter();
                return _Office2010ApplicationButtonPainter;
            }
        }
        private static ButtonItemPainter _MetroAppButtonPainter;
        public static ButtonItemPainter MetroAppButtonPainter
        {
            get
            {
                if (_MetroAppButtonPainter == null) _MetroAppButtonPainter = new DevComponents.DotNetBar.Metro.Rendering.MetroAppButtonPainter();
                return _MetroAppButtonPainter;
            }
        }
        public static CrumbBarItemViewPainter GetCrumbBarItemViewPainter(ButtonItem button)
        {
            if (m_CrumbBarItemViewPainter == null)
                m_CrumbBarItemViewPainter = new CrumbBarItemViewPainter();
            return m_CrumbBarItemViewPainter;
        }
        public static ButtonItemPainter CreateRibbonOverflowButtonPainter(RibbonOverflowButtonItem button)
        {
            if (BarFunctions.IsOffice2007Style(button.EffectiveStyle))
                return m_Office2007RibbonOverflowPainter;
            return null;
        }
		public static ButtonItemPainter CreateRibbonTabItemPainter(RibbonTabItem tab)
		{
            if (BarFunctions.IsOffice2007Style(tab.EffectiveStyle) && !tab.IsOnMenu)
            {
                return m_Office2007RibbonTabItemPainter;
            }
            if ((tab.EffectiveStyle == eDotNetBarStyle.Office2003 || tab.EffectiveStyle == eDotNetBarStyle.VS2005) && !tab.IsOnMenu)
			{
				return m_RibbonTabItemOffice2003Painter;
			}
			
			return m_Office2003Painter;
		}
        private static OfficeTabFormItemPainter _TabFormItemPainter=new OfficeTabFormItemPainter();
        public static ButtonItemPainter CreateTabFormItemPainter(TabFormItem tab)
		{
			return _TabFormItemPainter;
		}
        private static OfficeNewTabFormItemPainter _NewTabFormItemPainter = new OfficeNewTabFormItemPainter();
        public static ButtonItemPainter CreateNewTabFormItemPainter(NewTabFormItem tab)
        {
            return _NewTabFormItemPainter;
        }
        public static ItemContainerPainter CreateItemContainerPainter(ItemContainer container)
        {
            if (BarFunctions.IsOffice2007Style(container.EffectiveStyle))
                return m_Office2007ItemContainerPainter;
            return null;
        }
        public static BarBackgroundPainter CreateBarBackgroundPainter(Bar bar)
        {
            return m_Office2007BarBackgroundPainter;
        }
        public static KeyTipsPainter CreateKeyTipsPainter()
        {
            if (StyleManager.IsMetro(StyleManager.Style))
                return MetroKeyTipsPainter;
            else
                return m_Office2007KeyTipsPainter;
        }
        private static MetroKeyTipsPainter _MetroKeyTipsPainter = null;
        private static MetroKeyTipsPainter MetroKeyTipsPainter
        {
            get
            {
                if (_MetroKeyTipsPainter == null) _MetroKeyTipsPainter = new MetroKeyTipsPainter();
                return _MetroKeyTipsPainter;
            }
        }
        public static DialogLauncherPainter CreateRibbonBarPainter(RibbonBar ribbon)
        {
            if (BarFunctions.IsOffice2007Style(ribbon.EffectiveStyle))
                return m_Office2007RibbonBarPainter;
            return null;
        }
        private static RibbonTabGroupPainter _Office2010RibbonTabGroupPainter = null;
        private static RibbonTabGroupPainter Office2010RibbonTabGroupPainter
        {
            get
            {
                if (_Office2010RibbonTabGroupPainter == null) _Office2010RibbonTabGroupPainter = new Office2010RibbonTabGroupPainter();
                return _Office2010RibbonTabGroupPainter;
            }
        }
        private static RibbonTabGroupPainter _Office2007RibbonTabGroupPainter = null;
        private static RibbonTabGroupPainter Office2007RibbonTabGroupPainter
        {
            get
            {
                if (_Office2007RibbonTabGroupPainter == null) _Office2007RibbonTabGroupPainter = new Office2007RibbonTabGroupPainter();
                return _Office2007RibbonTabGroupPainter;
            }
        }
        private static RibbonTabGroupPainter _MetroRibbonTabGroupPainter = null;
        private static RibbonTabGroupPainter MetroRibbonTabGroupPainter
        {
            get
            {
                if (_MetroRibbonTabGroupPainter == null) _MetroRibbonTabGroupPainter = new MetroRibbonTabGroupPainter();
                return _MetroRibbonTabGroupPainter;
            }
        }
        public static RibbonTabGroupPainter CreateRibbonTabGroupPainter(eDotNetBarStyle style)
        {
            if (style == eDotNetBarStyle.Office2010)
                return Office2010RibbonTabGroupPainter;
            else if (StyleManager.IsMetro(style))
                return MetroRibbonTabGroupPainter;
            else
                return Office2007RibbonTabGroupPainter;
        }
        public static Rendering.ColorItemPainter CreateColorItemPainter(ColorItem item)
        {
            return m_Office2007ColorItemPainter;
        }
        public static RibbonControlPainter CreateRibbonControlPainter(RibbonControl r)
        {
            if (BarFunctions.IsOffice2007Style(r.EffectiveStyle))
                return m_Office2007RibbonControlPainter;
            return null;
        }
        private static SystemCaptionItemPainter _MetroCaptionItemPainter = null;
        private static SystemCaptionItemPainter MetroCaptionItemPainter
        {
            get
            {
                if (_MetroCaptionItemPainter == null) _MetroCaptionItemPainter = new DevComponents.DotNetBar.Metro.Rendering.MetroCaptionItemPainter();
                return _MetroCaptionItemPainter;
            }
        }
        private static Office2010SystemCaptionItemPainter _Office2010SystemCaptionItemPainter=null;
        private static SystemCaptionItemPainter Office2010SystemCaptionItemPainter
        {
            get
            {
                if (_Office2010SystemCaptionItemPainter == null) _Office2010SystemCaptionItemPainter = new Office2010SystemCaptionItemPainter();
                return _Office2010SystemCaptionItemPainter;
            }
        }
        private static Office2007SystemCaptionItemPainter _Office2007SystemCaptionItemPainter = null;
        private static SystemCaptionItemPainter Office2007SystemCaptionItemPainter
        {
            get
            {
                if (_Office2007SystemCaptionItemPainter == null) _Office2007SystemCaptionItemPainter = new Office2007SystemCaptionItemPainter();
                return _Office2007SystemCaptionItemPainter;
            }
        }
        public static SystemCaptionItemPainter CreateSystemCaptionItemPainter(SystemCaptionItem item)
        {
            eDotNetBarStyle effectiveStyle = item.EffectiveStyle;
            if (effectiveStyle == eDotNetBarStyle.Office2010)
                return Office2010SystemCaptionItemPainter;
            if (StyleManager.IsMetro(effectiveStyle))
                return MetroCaptionItemPainter;
            if (BarFunctions.IsOffice2007Style(effectiveStyle))
                return Office2007SystemCaptionItemPainter;
            return null;
        }
        public static MdiSystemItemPainter CreateMdiSystemItemPainter(MDISystemItem mdiSystemItem)
        {
            if (BarFunctions.IsOffice2007Style(mdiSystemItem.EffectiveStyle))
                return m_Office2007MdiSystemItemPainter;
            return null;
        }
        public static FormCaptionPainter CreateFormCaptionPainter(Form form)
        {
            return m_Office2007FormCaptionPainter;
        }
        public static DevComponents.DotNetBar.Rendering.QatOverflowPainter CreateQatOverflowItemPainter(QatOverflowItem ribbonQatOverflowItem)
        {
            return m_Office2007QatOverflowPainter;
        }
        public static DevComponents.DotNetBar.Rendering.QatCustomizeItemPainter CreateQatCustomizeItemPainter(QatCustomizeItem qatCustomizeItem)
        {
            return m_Office2007QatCustomizePainter;
        }
        public static Rendering.Office2007CheckBoxItemPainter CreateCheckBoxItemPainter(CheckBoxItem item)
        {
            return m_Office2007CheckBoxItemPainter;
        }
        /// 
        /// Forces the creation of the objects inside of factory.
        /// 
        public static void InitFactory() { }
        public static DevComponents.DotNetBar.Rendering.ProgressBarItemPainter CreateProgressBarItemPainter(ProgressBarItem progressBarItem)
        {
            return m_Office2007ProgressBarPainter;
        }
        internal static DevComponents.DotNetBar.Rendering.NavigationPanePainter CreateNavigationPanePainter()
        {
            return m_Office2007NavPanePainter;
        }
        internal static DevComponents.DotNetBar.Rendering.SliderPainter CreateSliderPainter(SliderItem slider)
        {
            return m_SliderPainter;
        }
        internal static DevComponents.DotNetBar.Rendering.RangeSliderPainter CreateRangeSliderPainter(RangeSliderItem slider)
        {
            return _RangeSliderPainter;
        }
        internal static DevComponents.DotNetBar.Rendering.SideBarPainter CreateSideBarPainter()
        {
            return m_SideBarPainter;
        }
        private static MetroSwitchButtonPainter _MetroSwitchPainter = null;
        internal static SwitchButtonPainter CreateSwitchButtonPainter(SwitchButtonItem item)
        {
            if (StyleManager.IsMetro(item.EffectiveStyle))
            {
                if (_MetroSwitchPainter == null) _MetroSwitchPainter = new MetroSwitchButtonPainter();
                return _MetroSwitchPainter;
            }
            else
            {
                if (m_SwitchButtonPainter == null)
                    m_SwitchButtonPainter = new Office2010SwitchButtonPainter();
            }
            return m_SwitchButtonPainter;
        }
        //private static MetroStepItemPainter _MetroStepItemPainter = null;
        private static OfficeStepItemPainter _OfficeStepItemPainter = null;
        internal static StepItemPainter CreateStepItemPainter(StepItem item)
        {
            //if (StyleManager.IsMetro(item.EffectiveStyle))
            //{
            //    if (_MetroStepItemPainter == null) _MetroStepItemPainter = new MetroStepItemPainter();
            //    return _MetroStepItemPainter;
            //}
            //else
            //{
                if (_OfficeStepItemPainter == null)
                    _OfficeStepItemPainter = new OfficeStepItemPainter();
            //}
            return _OfficeStepItemPainter;
        }
        private static OfficeListBoxItemPainter _OfficeListBoxPainter = null;
        internal static OfficeListBoxItemPainter CreateListBoxItemPainter(ListBoxItem item)
        {
            //if (StyleManager.IsMetro(item.EffectiveStyle))
            //{
            //    if (_MetroStepItemPainter == null) _MetroStepItemPainter = new MetroStepItemPainter();
            //    return _MetroStepItemPainter;
            //}
            //else
            //{
            if (_OfficeListBoxPainter == null)
            {
                _OfficeListBoxPainter = new OfficeListBoxItemPainter();
                _OfficeListBoxPainter.CheckBoxPainter = m_Office2007CheckBoxItemPainter;
            }
            //}
            return _OfficeListBoxPainter;
        }
        private static OfficeSideNavItemPainter _OfficeSideNavItemPainter = null;
        internal static OfficeSideNavItemPainter CreateSideNavItemPainter(SideNavItem item)
        {
            //if (StyleManager.IsMetro(item.EffectiveStyle))
            //{
            //    if (_MetroStepItemPainter == null) _MetroStepItemPainter = new MetroStepItemPainter();
            //    return _MetroStepItemPainter;
            //}
            //else
            //{
            if (_OfficeSideNavItemPainter == null)
            {
                _OfficeSideNavItemPainter = new OfficeSideNavItemPainter();
            }
            //}
            return _OfficeSideNavItemPainter;
        }
	    private static TabFormStripPainter _TabFormStripPainter = null;
	    internal static TabFormStripPainter CreateTabFormStripPainter(TabFormStripControl c)
	    {
	        if(_TabFormStripPainter==null)
                _TabFormStripPainter=new OfficeTabFormStripPainter();
            return _TabFormStripPainter;
	    }
        private static TabFormPainter _TabFormPainter=new OfficeTabFormPainter();
	    internal static TabFormPainter CreateTabFormPainter(TabParentForm form)
	    {
	        return _TabFormPainter;
	    }
	}
}