using System;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Design;
using System.Windows.Forms;
using System.Windows.Forms.Design;

namespace WeifenLuo.WinFormsUI.Docking
{
    internal class DockAreasEditor : UITypeEditor
    {
        private class DockAreasEditorControl : System.Windows.Forms.UserControl
        {
            private CheckBox checkBoxFloat;
            private CheckBox checkBoxDockLeft;
            private CheckBox checkBoxDockRight;
            private CheckBox checkBoxDockTop;
            private CheckBox checkBoxDockBottom;
            private CheckBox checkBoxDockFill;
            private DockAreas m_oldDockAreas;

            public DockAreas DockAreas
            {
                get
                {
                    DockAreas dockAreas = 0;
                    if (checkBoxFloat.Checked)
                        dockAreas |= DockAreas.Float;
                    if (checkBoxDockLeft.Checked)
                        dockAreas |= DockAreas.DockLeft;
                    if (checkBoxDockRight.Checked)
                        dockAreas |= DockAreas.DockRight;
                    if (checkBoxDockTop.Checked)
                        dockAreas |= DockAreas.DockTop;
                    if (checkBoxDockBottom.Checked)
                        dockAreas |= DockAreas.DockBottom;
                    if (checkBoxDockFill.Checked)
                        dockAreas |= DockAreas.Document;

                    if (dockAreas == 0)
                        return m_oldDockAreas;
                    else
                        return dockAreas;
                }
            }

            public DockAreasEditorControl()
            {
                checkBoxFloat = new CheckBox();
                checkBoxDockLeft = new CheckBox();
                checkBoxDockRight = new CheckBox();
                checkBoxDockTop = new CheckBox();
                checkBoxDockBottom = new CheckBox();
                checkBoxDockFill = new CheckBox();

                SuspendLayout();

                checkBoxFloat.Appearance = Appearance.Button;
                checkBoxFloat.Dock = DockStyle.Top;
                checkBoxFloat.Height = 24;
                checkBoxFloat.Text = Strings.DockAreaEditor_FloatCheckBoxText;
                checkBoxFloat.TextAlign = ContentAlignment.MiddleCenter;
                checkBoxFloat.FlatStyle = FlatStyle.System;
            
                checkBoxDockLeft.Appearance = System.Windows.Forms.Appearance.Button;
                checkBoxDockLeft.Dock = System.Windows.Forms.DockStyle.Left;
                checkBoxDockLeft.Width = 24;
                checkBoxDockLeft.FlatStyle = FlatStyle.System;

                checkBoxDockRight.Appearance = System.Windows.Forms.Appearance.Button;
                checkBoxDockRight.Dock = System.Windows.Forms.DockStyle.Right;
                checkBoxDockRight.Width = 24;
                checkBoxDockRight.FlatStyle = FlatStyle.System;

                checkBoxDockTop.Appearance = System.Windows.Forms.Appearance.Button;
                checkBoxDockTop.Dock = System.Windows.Forms.DockStyle.Top;
                checkBoxDockTop.Height = 24;
                checkBoxDockTop.FlatStyle = FlatStyle.System;

                checkBoxDockBottom.Appearance = System.Windows.Forms.Appearance.Button;
                checkBoxDockBottom.Dock = System.Windows.Forms.DockStyle.Bottom;
                checkBoxDockBottom.Height = 24;
                checkBoxDockBottom.FlatStyle = FlatStyle.System;
            
                checkBoxDockFill.Appearance = System.Windows.Forms.Appearance.Button;
                checkBoxDockFill.Dock = System.Windows.Forms.DockStyle.Fill;
                checkBoxDockFill.FlatStyle = FlatStyle.System;

                this.Controls.AddRange(new Control[] {
                                                         checkBoxDockFill,
                                                         checkBoxDockBottom,
                                                         checkBoxDockTop,
                                                         checkBoxDockRight,
                                                         checkBoxDockLeft,
                                                         checkBoxFloat});

                Size = new System.Drawing.Size(160, 144);
                BackColor = SystemColors.Control;
                ResumeLayout();
            }

            public void SetStates(DockAreas dockAreas)
            {
                m_oldDockAreas = dockAreas;
                if ((dockAreas & DockAreas.DockLeft) != 0)
                    checkBoxDockLeft.Checked = true;
                if ((dockAreas & DockAreas.DockRight) != 0)
                    checkBoxDockRight.Checked = true;
                if ((dockAreas & DockAreas.DockTop) != 0)
                    checkBoxDockTop.Checked = true;
                if ((dockAreas & DockAreas.DockTop) != 0)
                    checkBoxDockTop.Checked = true;
                if ((dockAreas & DockAreas.DockBottom) != 0)
                    checkBoxDockBottom.Checked = true;
                if ((dockAreas & DockAreas.Document) != 0)
                    checkBoxDockFill.Checked = true;
                if ((dockAreas & DockAreas.Float) != 0)
                    checkBoxFloat.Checked = true;
            }
        }

        private DockAreasEditor.DockAreasEditorControl m_ui = null;

        public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
        {
            return UITypeEditorEditStyle.DropDown;
        }

        public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
        {
            if (m_ui == null)
                m_ui = new DockAreasEditor.DockAreasEditorControl();

            m_ui.SetStates((DockAreas)value);

            IWindowsFormsEditorService edSvc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
            edSvc.DropDownControl(m_ui);

            return m_ui.DockAreas;
        }
    }
}
