예제 #1
0
        public void RegisterDockableForm(string name, CSSDockableForm form)
        {
            form.Name = name;
            form.DragStopped += onFormDragStopped;
            form.TabShown += onFormTabShown;
            form.TabHidden += onFormTabHidden;
            form.Registered ();
            DockableForms.Add (form);

            flapManager.RegisterDockableForm (form);
        }
예제 #2
0
 public void RegisterDockableForm(CSSDockableForm form)
 {
     form.DragMoved += onFormDragMoved;
     form.DragStopped += onFormDragStopped;
 }
예제 #3
0
        internal void DockForm(Panel panel, CSSDockableForm form, DockDirection direction, bool loadingLayout)
        {
            if (AtLeastOneFormDocked == false) {
                AtLeastOneFormDocked = true;
                basePanel.Show ();
                basePanel.Controls.Add (CreateTabControlPanel ());
                direction = DockDirection.Center;
            }

            DockTabControlPanel tabControlPanel = null;
            TabPage tab = null;

            if (direction == DockDirection.Center) {  //dock center, just add to the tab control
                tabControlPanel = (DockTabControlPanel) panel.Controls [0];
            } else {  //not dock center, do a lot of things
                SplitContainer split = new SplitContainer ();  //the new splitcontainer that will hold the old and new stuff
                split.TabStop = false;
                split.MouseUp += onSplitMouseUp;
                split.SplitterMoved += onSplitterMoved;
                split.Dock = DockStyle.Fill;
                SplitterPanel oldPanel = null;
                SplitterPanel newPanel = null;

                //set orientation and references based on direction
                if (direction == DockDirection.Top) {
                    split.Orientation = Orientation.Horizontal;
                    oldPanel = split.Panel2;
                    newPanel = split.Panel1;
                } else if (direction == DockDirection.Bottom) {
                    split.Orientation = Orientation.Horizontal;
                    oldPanel = split.Panel1;
                    newPanel = split.Panel2;
                } else if (direction == DockDirection.Left) {
                    split.Orientation = Orientation.Vertical;
                    oldPanel = split.Panel2;
                    newPanel = split.Panel1;
                } else if (direction == DockDirection.Right) {
                    split.Orientation = Orientation.Vertical;
                    oldPanel = split.Panel1;
                    newPanel = split.Panel2;
                }

                oldPanel.Controls.Add (panel.Controls [0]);  //add the panel's current controls to the "old" panel of the new split

                tabControlPanel = CreateTabControlPanel ();
                newPanel.Controls.Add (tabControlPanel);  //add the new form's controls to the "new" panel of the new split

                if (oldPanel.Controls [0] is DockTabControlPanel) {  //add the "old" panel to the dockable panels only if it has a tab control panel
                    DockablePanels.Add (oldPanel);
                }

                DockablePanels.Add (newPanel);  //add the "new" panel to the dockable panels

                if (panel != DockablePanels [0]) {  //if the target panel is not the first panel
                    DockablePanels.Remove (panel);  //remove the target panel from the dockable panels since it now contains a split
                }

                panel.Controls.Add (split);  //the target panel now contains the split instead of its original tab control panel
            }

            tab = new TabPage (form.Text);

            foreach (Control c in form.Controls) {
                tab.Controls.Add (c);
            }

            tabControlPanel.TabControl.TabPages.Add (tab);
            tabControlPanel.TabControl.SelectedTab = tab;

            form.Hide ();
            form.Docked = true;
            form.TabVisible = true;
            form.TabControlPanel = tabControlPanel;
            form.TabControl = tabControlPanel.TabControl;
            form.TabPage = tab;
            form.TabIndex = form.TabControl.SelectedIndex;

            if (AutoSaveLayout && loadingLayout == false) {
                SaveLayout ();
            }
        }
예제 #4
0
        private void UndockForm(CSSDockableForm form)
        {
            DockTabControlPanel tabControlPanel = (DockTabControlPanel) form.TabControl.Parent;
            TabControl tabControl = form.TabControl;
            tabControl.TabPages.Remove (form.TabPage);

            foreach (Control c in form.TabPage.Controls) {
                form.Controls.Add (c);
            }

            form.Location = new Point (Cursor.Position.X - 80, Cursor.Position.Y - 15);
            form.Docked = false;
            form.Show ();
            ReleaseCapture ();
            form.TabVisible = false;
            form.TabControlPanel = null;
            form.TabControl = null;
            form.TabPage = null;

            if (tabControl.TabPages.Count <= 0) {
                if (tabControlPanel.Parent == basePanel) {
                    tabControlPanel.PanelUndocking -= onPanelUndocking;
                    tabControlPanel.TabUndocking -= onTabUndocking;
                    tabControlPanel.Parent.Controls.Remove (tabControlPanel);
                    AtLeastOneFormDocked = false;
                } else {
                    SplitContainer split = (SplitContainer) tabControlPanel.Parent.Parent;
                    Panel parentPanel = (Panel) split.Parent;
                    Panel oldPanel = null;
                    Panel deadPanel = null;

                    if (tabControlPanel.Parent == split.Panel2) {
                        oldPanel = split.Panel1;
                        deadPanel = split.Panel2;
                    } else {
                        oldPanel = split.Panel2;
                        deadPanel = split.Panel1;
                    }

                    tabControlPanel.PanelUndocking -= onPanelUndocking;
                    tabControlPanel.TabUndocking -= onTabUndocking;
                    tabControlPanel.Parent.Controls.Remove (tabControlPanel);
                    parentPanel.Controls.Remove (split);
                    parentPanel.Controls.Add (oldPanel.Controls [0]);
                    DockablePanels.Remove (oldPanel);
                    DockablePanels.Remove (deadPanel);

                    if (parentPanel != basePanel) DockablePanels.Add (parentPanel);
                }
            }

            CollapseEmptyPanels ();

            if (AutoSaveLayout) {
                SaveLayout ();
            }

            SendMessage (form.Handle, 0xA1, 0x2, 0);
        }
예제 #5
0
        private void DragReleasedOnManager(CSSDockableForm form)
        {
            if (AtLeastOneFormDocked) {
                DockDirection dir = flapManager.GetDockDirection ();

                if (dir != DockDirection.None) {
                    DockForm (GetHoveredPanel (), form, dir, false);
                    return;
                }

                dir = flapManager.GetFarDockDirection ();

                if (dir != DockDirection.None) {
                    DockForm (basePanel, form, dir, false);
                }

            } else {
                DockDirection dir = flapManager.GetFarDockDirection ();

                if (dir != DockDirection.None) {
                    DockForm (basePanel, form, DockDirection.Center, false);
                }
            }
        }