using System;

using System.Drawing;

using System.Windows.Forms;



namespace WeifenLuo.WinFormsUI.Docking

{

    internal abstract class DockOutlineBase

    {

        public DockOutlineBase()

        {

            Init();

        }



        private void Init()

        {

            SetValues(Rectangle.Empty, null, DockStyle.None, -1);

            SaveOldValues();

        }



        private Rectangle m_oldFloatWindowBounds;

        protected Rectangle OldFloatWindowBounds

        {

            get { return m_oldFloatWindowBounds; }

        }



        private Control m_oldDockTo;

        protected Control OldDockTo

        {

            get { return m_oldDockTo; }

        }



        private DockStyle m_oldDock;

        protected DockStyle OldDock

        {

            get { return m_oldDock; }

        }



        private int m_oldContentIndex;

        protected int OldContentIndex

        {

            get { return m_oldContentIndex; }

        }



        protected bool SameAsOldValue

        {

            get

            {

                return FloatWindowBounds == OldFloatWindowBounds &&

                    DockTo == OldDockTo &&

                    Dock == OldDock &&

                    ContentIndex == OldContentIndex;

            }

        }



        private Rectangle m_floatWindowBounds;

        public Rectangle FloatWindowBounds

        {

            get { return m_floatWindowBounds; }

        }



        private Control m_dockTo;

        public Control DockTo

        {

            get { return m_dockTo; }

        }



        private DockStyle m_dock;

        public DockStyle Dock

        {

            get { return m_dock; }

        }



        private int m_contentIndex;

        public int ContentIndex

        {

            get { return m_contentIndex; }

        }



        public bool FlagFullEdge

        {

            get { return m_contentIndex != 0; }

        }



        private bool m_flagTestDrop = false;

        public bool FlagTestDrop

        {

            get { return m_flagTestDrop; }

            set { m_flagTestDrop = value; }

        }



        private void SaveOldValues()

        {

            m_oldDockTo = m_dockTo;

            m_oldDock = m_dock;

            m_oldContentIndex = m_contentIndex;

            m_oldFloatWindowBounds = m_floatWindowBounds;

        }



        protected abstract void OnShow();



        protected abstract void OnClose();



        private void SetValues(Rectangle floatWindowBounds, Control dockTo, DockStyle dock, int contentIndex)

        {

            m_floatWindowBounds = floatWindowBounds;

            m_dockTo = dockTo;

            m_dock = dock;

            m_contentIndex = contentIndex;

            FlagTestDrop = true;

        }



        private void TestChange()

        {

            if (m_floatWindowBounds != m_oldFloatWindowBounds ||

                m_dockTo != m_oldDockTo ||

                m_dock != m_oldDock ||

                m_contentIndex != m_oldContentIndex)

                OnShow();

        }



        public void Show()

        {

            SaveOldValues();

            SetValues(Rectangle.Empty, null, DockStyle.None, -1);

            TestChange();

        }



        public void Show(DockPane pane, DockStyle dock)

        {

            SaveOldValues();

            SetValues(Rectangle.Empty, pane, dock, -1);

            TestChange();

        }



        public void Show(DockPane pane, int contentIndex)

        {

            SaveOldValues();

            SetValues(Rectangle.Empty, pane, DockStyle.Fill, contentIndex);

            TestChange();

        }



        public void Show(DockPanel dockPanel, DockStyle dock, bool fullPanelEdge)

        {

            SaveOldValues();

            SetValues(Rectangle.Empty, dockPanel, dock, fullPanelEdge ? -1 : 0);

            TestChange();

        }



        public void Show(Rectangle floatWindowBounds)

        {

            SaveOldValues();

            SetValues(floatWindowBounds, null, DockStyle.None, -1);

            TestChange();

        }



        public void Close()

        {

            OnClose();

        }

    }

}

