using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace LYFZ.ComponentLibrary
{
    /// <summary>
    /// 所有内容窗体的基窗体
    /// </summary>
    public partial class BaseContentsFormMain : BaseFormRelease, LYFZ.StandardInterface.IFormMain
    {
        UCNavigationTool currentUcNavigationTool = new UCNavigationTool();
        public BaseContentsFormMain()
        {
            
            InitializeComponent();
            
           // this.ctlScrollBarH.Scroll += new EventHandler(ctlScrollBarH_Scroll);
           // this.ctlScrollBarV.Scroll += new EventHandler(ctlScrollBarV_Scroll);
            this.plExMainContainer.Resize += new EventHandler(plExMainContainer_Resize);
            this.plFormMainContent.Resize += new EventHandler(plFormMainContent_Resize);
            this.plExMainContainer.MouseMove += plExMainContainer_MouseMove;
            this.plExMainContainer.Click += plExMainContainer_Click;
            this.Resize += new EventHandler(BaseContentsFormRelease_Resize);
            this.Shown += new EventHandler(BaseContentsFormRelease_Shown);
            
            this.isOverrideOnPaint = true;
            IsCustomScrollBar = false;
            this.plExMainContainer.MouseWheel += new MouseEventHandler(plExMainContainer_MouseWheel);
           // this.ctlScrollBarV.MouseWheel += new MouseEventHandler(ctlScrollBarV_MouseWheel);
            this.plExMainContainer.BackColor = LYFZ.ComponentLibrary.GetUIResources.FrmContentBackgroundColor;
            this.FormClosing += BaseContentsFormMain_FormClosing;
            this.FormClosed += BaseContentsFormMain_FormClosed;
            //this.ctlScrollBarV.MouseEnter += ctlScrollBarV_MouseEnter;
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
        }

        bool isShowWelcomeForm = true;
        public  void ClosThisForm()
        {
            isShowWelcomeForm = false;
          this.Close();
        }

        /// <summary>
        /// 等待释放的控件集合
        /// </summary>
        static List<Form> WaitDisposeAllControls = new List<Form>();
        void BaseContentsFormMain_FormClosed(object sender, FormClosedEventArgs e)
        {
           /* try
            {
               // this.SuspendLayout();
               // ControlsDispose(this.Controls);
            }
            catch { }*/
           // 
        }

        public static void ControlsDispose(System.Windows.Forms.Control.ControlCollection controls)
        {

            int count = controls.Count;
            if (count > 0)
            {
                List<System.Windows.Forms.Control> delList = new List<Control>();
                for (int i = 0; i < count; i++)
                {
                    System.Windows.Forms.Control control = controls[i];

                   /* if (control.Controls.Count > 0)
                    {
                        ControlsDispose(control.Controls);

                    }*/

                    if (control.GetType() == typeof(System.Windows.Forms.Panel)
                        || control.GetType() == typeof(System.Windows.Forms.Label)
                        || control.GetType() == typeof(LYFZ.ComponentLibrary.PanelEx)
                        || control.GetType() == typeof(LYFZ.ComponentLibrary.LabelEx)
                        || control.GetType() == typeof(LYFZ.ComponentLibrary.CheckBoxEx)
                         || control.GetType() == typeof(System.Windows.Forms.CheckBox))
                    {
                        if (control != null && !control.IsDisposed)
                        {
                            delList.Add(control);
                        }
                    }

                }

                count = delList.Count;
                for (int i = 0; i < count; i++)
                {
                    delList[i].Dispose();
                }
                delList.Clear();

                delList = null;

            }
        }

       
        void ctlScrollBarV_MouseEnter(object sender, EventArgs e)
        {
            RefreshCtlScrollBarValue();
        }

        /// <summary>
        /// 刷新滚动条值
        /// </summary>
        void RefreshCtlScrollBarValue() {
           // this.ctlScrollBarV.Value = Math.Abs(this.plExMainContainer.AutoScrollPosition.Y);
          //  this.ctlScrollBarH.Value = Math.Abs(this.plExMainContainer.AutoScrollPosition.X);
           // scrollY = ctlScrollBarV.Value;
           // scrollX = ctlScrollBarH.Value;
        }




        void plExMainContainer_Click(object sender, EventArgs e)
        {
            this.plExMainContainer.Focus();
        }

       
        void plExMainContainer_MouseMove(object sender, MouseEventArgs e)
        {
            RefreshCtlScrollBarValue();
        }
        bool isClosedLoadWelcomeForm = true;

        public bool IsClosedLoadWelcomeForm
        {
            get { return isClosedLoadWelcomeForm; }
            set { isClosedLoadWelcomeForm = value; }
        }
        void BaseContentsFormMain_FormClosing(object sender, FormClosingEventArgs e)
        { //typeof(LYFZ.StandardInterface.IToolMenuClick).IsAssignableFrom(this.ParentForm.GetType())
            //用于判断父窗体是否实现了指定的LYFZ.StandardInterface.IToolMenuClick接口
            try
            {
                if (this.GetType().FullName != "LYFZ.Software.PhotoStudio.frmWelcomeForm" && isShowWelcomeForm)
                {
                    if (typeof(LYFZ.StandardInterface.IToolMenuClick).IsAssignableFrom(this.ParentForm.GetType()))
                    {
                        LYFZ.StandardInterface.IToolMenuClick iParentForm = (LYFZ.StandardInterface.IToolMenuClick)this.ParentForm;
                        iParentForm.ShowForm("LYFZ.Software.PhotoStudio.frmWelcomeForm", "SPS", "ShowEmbedded");
                    }
                }

       
            }
            catch { }
            finally {
                isShowWelcomeForm = true;
            }
        }
        void InitializeUcNavigationTool()
        {
            if (isShowUcNavigationTool)
            {
                if (this.plFormMainContent.Controls.Find("currentUcNavigationTool01", false).Length <= 0)
                {
                    currentUcNavigationTool.Width = this.plFormMainContent.Width;
                    currentUcNavigationTool.Visible = this.isShowUcNavigationTool;
                    currentUcNavigationTool.Location = new Point(0, 0);
                    currentUcNavigationTool.Name = "currentUcNavigationTool01";
                    this.plFormMainContent.Controls.Add(currentUcNavigationTool);
                }
            }
            else {
                try
                {
                    this.plFormMainContent.Controls.Remove(currentUcNavigationTool);
                }
                catch { }
            }
            
        }
        void SetUcNavigationTool()
        {
           
            
                if (this.isShowUcNavigationTool)
                {
                    currentUcNavigationTool.Width = this.plFormMainContent.Width;
                    this.plExMainContainer.Location = new Point(0,  40);
                }
                else
                {

                   this.plExMainContainer.Location = new Point(0, 0);

            
                }
           
        }

        /// <summary>
        /// 设置导航
        /// </summary>
        public UCNavigationTool UcNavigationTool
        {
            get { return this.currentUcNavigationTool; }
        }

        bool isShowUcNavigationTool = false;
        /// <summary>
        /// 是否显示导航栏
        /// </summary>
        public bool IsShowUcNavigationTool
        {
            get { return isShowUcNavigationTool; }
            set { isShowUcNavigationTool = value;
                InitializeUcNavigationTool();
                plFormMainContent_Resize(null,null);
            
                Invalidate(false); }
        }


        /// <summary>
        /// 重载新窗体
        /// </summary>
        /// <param name="objNewForm"></param>
        public void ReloadNewForm(object objNewForm)
        {
            LYFZ.ComponentLibrary.BaseContentsFormMain frm = (LYFZ.ComponentLibrary.BaseContentsFormMain)objNewForm;
            frm.TopLevel = this.TopLevel;
            frm.IsShadow = this.IsShadow;
            frm.MaximizeBox = this.MaximizeBox;
            frm.MinimizeBox = this.MinimizeBox;
            frm.IsShowCloseBox = this.IsShowCloseBox;
            frm.TitleBgImageHeight = this.TitleBgImageHeight;
            frm.BottomBgImageHeight = this.BottomBgImageHeight;
            frm.IsMaximized = this.IsMaximized;
            frm.FormMobile = this.FormMobile;
            frm.IsUserControlsSize = this.IsUserControlsSize;
            frm.Dock = this.Dock;
            frm.IsCustomScrollBar = this.IsCustomScrollBar;
            frm.Parent = this.Parent;
            frm.IsShowBtnFormMenu = this.IsShowBtnFormMenu;
            frm.IsShowBtnFormSkin = this.IsShowBtnFormMenu;
            frm.IsCloseForm = this.IsCloseForm;
            frm.IsMinimize = this.IsMinimize;
            if (!frm.IsMaximized && !frm.IsMinimize && !frm.IsCloseForm)
            {
                frm.SetCoverageTitleButtonEvent();
            }

            frm.Show();
            
            this.Close();
            this.Dispose();

        }

        /// <summary>
        /// 设置发生错误时显示信息
        /// </summary>
        /// <param name="msg"></param>
        public void SetError(string msg)
        {
            LabelEx tryLabMsg = new LabelEx();
            tryLabMsg.Text = msg;
            tryLabMsg.ForeColor =Color.Red;
            tryLabMsg.Font = new System.Drawing.Font("宋体", 12);
            tryLabMsg.Padding = new Padding(10);
            tryLabMsg.Dock = DockStyle.Fill;
            this.plExMainContainer.Controls.Add(tryLabMsg);
        
        }

        /// <summary>
        /// 公共plExMainContainer对象
        /// </summary>
      //  public LYFZ.ComponentLibrary.PanelEx PublicContainer = null;

        /// <summary>
        /// 系统菜单事件接口
        /// </summary>
        public LYFZ.StandardInterface.IMenuClick iMenuClick = null;

        /// <summary>
        /// 系统菜单事件设置
        /// </summary>
        /// <param name="menuItem"></param>
        protected override void SetMenuItem_Click(ToolStripMenuItem menuItem)
        {
            if (iMenuClick != null)
                iMenuClick.SetIMenuItem_Click(menuItem);
        }

        /// <summary>
        /// 覆盖窗体标题栏上最小化、最大化和关闭按钮的事件
        /// </summary>
        public void SetCoverageTitleButtonEvent()
        {
            this.btnAppFormExit.Click += new EventHandler(ParentFormBtnAppFormExit_Click);
            this.btnAppFormMaximize.Click += new EventHandler(ParentFormBtnAppFormMaximize_Click);
            this.btnAppFormMinimize.Click += new EventHandler(ParentFormBtnAppFormMinimize_Click);
            isCoverageTitleButtonEvent = true;
        }
        bool isCoverageTitleButtonEvent = false;
        protected override void btnAppFormMaximize_Move(object sender, EventArgs e)
        {
            if (isCoverageTitleButtonEvent)
            {
                this.SetFormMzximizeBtn(this.ParentForm.WindowState);
            }
            else
            {
                base.btnAppFormMaximize_Move(sender, e);
            }
        }

        /// <summary>
        /// 最小化父窗体
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected virtual void ParentFormBtnAppFormMinimize_Click(object sender, EventArgs e)
        {
            this.ParentForm.WindowState = FormWindowState.Minimized;
        }
        /// <summary>
        /// 最大化父窗体
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected virtual void ParentFormBtnAppFormMaximize_Click(object sender, EventArgs e)
        {
            if (this.ParentForm.WindowState == FormWindowState.Normal)
            {
                this.ParentForm.WindowState = FormWindowState.Maximized;
                
            }
            else {
                this.ParentForm.WindowState = FormWindowState.Normal;
            }
            
        }
        /// <summary>
        /// 关闭父窗体
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected virtual void ParentFormBtnAppFormExit_Click(object sender, EventArgs e)
        {
            this.ParentForm.Close();
        }


        #region 滚动轮滚动时滚动窗体
        /// <summary>
        /// 获取滚动轮滚动的值
        /// </summary>
        /// <param name="e"></param>
        /// <returns></returns>
        int getMouseWheelDelta(MouseEventArgs e)
        {
           // this.Text = this.ctlScrollBarV.Maximum + "/" + this.ctlScrollBarV.LargeChange.ToString() + "*" + ctlScrollBarV.Value;
            //e.Delta 在正负 120 之间
            //滚动条要滚动的值在 0 到 this.ctlScrollBarV.Maximum - this.ctlScrollBarV.LargeChange 之间
            int tempDelta = -(e.Delta);
           // if (tempDelta < this.ctlScrollBarV.Minimum)
          //  {
          //      tempDelta = this.ctlScrollBarV.Minimum;
          //  }
            //int tempDifference = this.ctlScrollBarV.Maximum - this.ctlScrollBarV.LargeChange;
          //  int tempScrollBar = tempDifference / 120;
           /* if (tempScrollBar <= 0)
            {
                tempScrollBar = 1;
            }

            if (tempDelta == 120)
            {
                tempDelta = tempDifference;
            }
            else
            {

                tempDelta = tempDelta * tempScrollBar;
                if (tempDelta > tempDifference)
                {
                    tempDelta = tempDifference;
                }
            }*/
            
            return tempDelta;

        }

        void ctlScrollBarV_MouseWheel(object sender, MouseEventArgs e)
        {
            //this.ctlScrollBarV.Value = getMouseWheelDelta(e);

            //垂直滚动
          //  scrollY = ctlScrollBarV.Value;
          //  this.plExMainContainer.AutoScrollPosition = new Point(scrollX, ctlScrollBarV.Value);
        }

        void plExMainContainer_MouseWheel(object sender, MouseEventArgs e)
        {
           // this.ctlScrollBarV.Value = getMouseWheelDelta(e);
           
            //垂直滚动
          //  scrollY = ctlScrollBarV.Value;
        }
        #endregion
        /// <summary>
        /// 记录滚动条显示时需要的宽度
        /// </summary>
        int PanlOffset = 0;
        /// <summary>
        /// 首次显示时
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void BaseContentsFormRelease_Shown(object sender, EventArgs e)
        {
            if (IsCustomScrollBar)
            {
                PanlOffset = 20;
            }
            InitializeUcNavigationTool();
            ResetControls();
            SetUcNavigationTool();
           
        }


        /// <summary>
        /// 窗体大小变化时
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void BaseContentsFormRelease_Resize(object sender, EventArgs e)
        {
            isSetplExMainContainerFocus = true;
            ResetControls();
        }
        /// <summary>
        /// 父panl大小变化时
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void plFormMainContent_Resize(object sender, EventArgs e)
        {
            
            isSetplExMainContainerFocus = true;
            ResetControls();
            SetUcNavigationTool();
        }
        /// <summary>
        /// 子panl大小变化时
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void plExMainContainer_Resize(object sender, EventArgs e)
        {
            if (!this.TopLevel)
            {
                ResetControls(); 
            }
            isSetplExMainContainerFocus = true;
           
        }
        /// <summary>
        /// 重设相关控件
        /// </summary>
        void ResetControls()
        {
            SetplExMainContainerSize(PanlOffset);
            SetScrollBarAttr();
            InitializeScrollBar();
            
        }

 
        /// <summary>
        /// 重绘控件
        /// </summary>
        /// <param name="e"></param>
        protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
        {
            base.OnPaint(e);
            SetplExMainContainerSize(PanlOffset);
          
        }
        /// <summary>
        /// 设置内容容器的大小和位置
        /// </summary>
        public void SetplExMainContainerSize(int offset = 0)
        {
            //父panl大小和位置
            this.plFormMainContent.Location = new Point(0, this.TitleBgImageHeight);


            //子panl大小和位置
           // isShowCtlScrollBarH = this.plExMainContainer.HorizontalScroll.Visible;
            //isShowCtlScrollBarV = this.plExMainContainer.VerticalScroll.Visible;

            //导航工具栏高度
            int UcNavigationToolHeight = 0;
            if (this.isShowUcNavigationTool) {
                UcNavigationToolHeight = this.currentUcNavigationTool.Height;
            }

           
                this.plFormMainContent.Width = this.Width;
                this.plFormMainContent.Height = this.Height - this.TitleBgImageHeight - this.BottomBgImageHeight;
                this.plExMainContainer.Width = this.plFormMainContent.Width;
                this.plExMainContainer.Height = this.plFormMainContent.Height - UcNavigationToolHeight;
            

            
        }
        /// <summary>
        /// 初始化滚动条
        /// </summary>
        public void InitializeScrollBar()
        {
           // this.plExMainContainer.AutoScrollPosition = new Point(scrollX, scrollY);
           /* this.ctlScrollBarV.Minimum = 0;
            this.ctlScrollBarV.Maximum = this.plExMainContainer.DisplayRectangle.Height;
            this.ctlScrollBarV.LargeChange = ctlScrollBarV.Maximum / ctlScrollBarV.Height + this.plExMainContainer.Height - 20;
            this.ctlScrollBarV.Value = Math.Abs(this.plExMainContainer.AutoScrollPosition.Y);
            this.ctlScrollBarH.Minimum = 0;
            this.ctlScrollBarH.Maximum = this.plExMainContainer.DisplayRectangle.Width;
            this.ctlScrollBarH.LargeChange = ctlScrollBarH.Maximum / ctlScrollBarH.Width + this.plExMainContainer.Width - 20;
            this.ctlScrollBarH.Value = Math.Abs(this.plExMainContainer.AutoScrollPosition.X);*/



        }

        /// <summary>
        /// 设置滚动条属性
        /// </summary>
        void SetScrollBarAttr()
        {
            if (IsCustomScrollBar)
            {
               // this.ctlScrollBarV.Location = new Point(this.plFormMainContent.Width, this.plFormMainContent.Location.Y);
              //  this.ctlScrollBarH.Location = new Point(0, this.plFormMainContent.Location.Y + this.plFormMainContent.Height);
               // this.ctlScrollBarV.Size = new Size(this.ctlScrollBarV.Width, this.plFormMainContent.Height);
               // this.ctlScrollBarH.Size = new Size(this.plFormMainContent.Width, this.ctlScrollBarH.Height);

              //  scrollX = this.ctlScrollBarH.Value;
               // scrollY = this.ctlScrollBarV.Value;
            }

        }

        bool isCustomScrollBar = false;
        /// <summary>
        /// 设置是否使用自定义滚动条
        /// </summary>
        [Browsable(false), Category("自定义窗体属性"), Description("设置是否使用自定义滚动条")]
        public bool IsCustomScrollBar
        {
            get { return isCustomScrollBar; }
            set { isCustomScrollBar = false; }
        }
        private bool isSetplExMainContainerFocus = true;
        bool isMouseEnterSetFocus = false;
        /// <summary>
        /// 是否鼠标进入窗体内容框时自动获取焦点
        /// </summary>
        [Browsable(false), Category("自定义窗体属性"), Description("是否鼠标进入窗体内容框时自动获取焦点")]
        public bool IsMouseEnterSetFocus
        {
            get { return isMouseEnterSetFocus; }
            set { isMouseEnterSetFocus = value; }
        }
        private void plExMainContainer_MouseEnter(object sender, EventArgs e)
        {
            if (IsMouseEnterSetFocus)
            {
                if (isSetplExMainContainerFocus)
                    this.plExMainContainer.Focus();

                isSetplExMainContainerFocus = false;
            }
        }

        protected override void CreateHandle()
        {
            if (!IsHandleCreated)
            {
                try
                {
                    base.CreateHandle();
                }
                catch { }
                finally
                {
                    if (!IsHandleCreated)
                    {
                        base.RecreateHandle();
                    }
                }
            }
        }   
    }
}