Пример #1
0
        internal void RemovePane(DockPane pane)
        {
            Debug.Assert(pane.DockTree == this);
            Debug.Assert(pane.Items.Count == 0);

            RemovePaneFromCollection(pane);

            DockPaneSplit splitToRemove = pane.Parent;

            if (splitToRemove == null)
            {
                SetRootNode(null);
            }
            else
            {
                AddDirtyNode(splitToRemove);

                DockPaneNode siblingNode = splitToRemove.GetSibling(pane);
                Debug.Assert(siblingNode != null);
                AddDirtyNode(siblingNode);
                DockPaneSplit grandParent = splitToRemove.Parent;
                splitToRemove.ClearChildren();
                if (grandParent == null)
                {
                    SetRootNode(siblingNode);
                }
                else
                {
                    AddDirtyNode(grandParent);
                    grandParent.SetSibling(grandParent.GetSibling(splitToRemove), siblingNode);
                }

                splitToRemove.ClearParent();
            }
        }
Пример #2
0
        private static DockPane FindPane(DockPaneNode node, bool isAutoHide)
        {
            DockPane pane = node as DockPane;

            if (pane != null && pane.IsAutoHide == isAutoHide)
            {
                return(pane);
            }

            DockPaneSplit split = node as DockPaneSplit;

            if (split != null)
            {
                pane = FindPane(split.Child1, isAutoHide);
                if (pane != null)
                {
                    return(pane);
                }
                pane = FindPane(split.Child2, isAutoHide);
                if (pane != null)
                {
                    return(pane);
                }
            }

            return(null);
        }
Пример #3
0
 internal bool IsParentOf(DockPaneNode paneNode)
 {
     for (DockPaneSplit split = paneNode.Parent; split != null; split = split.Parent)
     {
         if (split == this)
         {
             return(true);
         }
     }
     return(false);
 }
Пример #4
0
        private void RefreshDockPosition()
        {
            DockPosition oldDockPosition = DockPosition;
            DockPosition newDockPosition = GetDockPosition();

            if (oldDockPosition != newDockPosition)
            {
                SetValue(DockPositionPropertyKey, newDockPosition);
                DockPaneSplit parent = Parent;
                if (parent != null)
                {
                    parent.InvalidateState();
                }
                OnDockPositionChanged(oldDockPosition, newDockPosition);
            }
        }
Пример #5
0
            private static ShowAction GetShowAsSidePaneAction(DockItem item, DockPane pane)
            {
                DockPaneSplit split = pane.Parent;

                Debug.Assert(split != null);
                DockPaneNode targetPaneNode = split.Child1 == pane ? split.Child2 : split.Child1;

                Debug.Assert(targetPaneNode != null);
                DockPaneNodeStruct targetPaneNodeStruct = DockPaneNodeStruct.FromDockPaneNode(targetPaneNode);
                bool swapChildren = split.Child1 == targetPaneNode;
                Dock side;

                if (split.Orientation == Orientation.Horizontal)
                {
                    if (split.IsSplitterTopLeft)
                    {
                        side = Dock.Left;
                    }
                    else
                    {
                        side = Dock.Right;
                    }
                }
                else
                {
                    if (split.IsSplitterTopLeft)
                    {
                        side = Dock.Top;
                    }
                    else
                    {
                        side = Dock.Bottom;
                    }
                }
                SplitterDistance splitterDistance = split.SplitterDistance;

                int  source                   = pane.DockControl.DockItems.IndexOf(item);
                int  targetIndex              = targetPaneNodeStruct.ItemIndex;
                bool isFloating               = targetPaneNodeStruct.IsFloating;
                int  ancestorLevel            = targetPaneNodeStruct.AncestorLevel;
                bool isAutoHide               = pane.IsAutoHide;
                DockItemShowMethod showMethod = GetShowMethod(item, pane);

                return(new ShowAsSidePaneAction(source, targetIndex, isFloating, ancestorLevel, isAutoHide, side, splitterDistance, swapChildren, showMethod));
            }
Пример #6
0
        private ShowAsSidePaneAction GetShowAsSidePaneAction(DockItem sourceItem, DockPane sourcePane, DockPane targetPane, int ancestorSplitLevel, DockPaneSplit split, DockItemShowMethod showMethod)
        {
            Debug.Assert(sourceItem != null);
            Debug.Assert(targetPane != null);

            Dock side;

            if (split.Orientation == Orientation.Horizontal)
            {
                if (split.IsSplitterTopLeft)
                {
                    side = Dock.Left;
                }
                else
                {
                    side = Dock.Right;
                }
            }
            else
            {
                if (split.IsSplitterTopLeft)
                {
                    side = Dock.Top;
                }
                else
                {
                    side = Dock.Bottom;
                }
            }

            SplitterDistance splitterDistance = split.SplitterDistance;

            DockPaneSplit child1Split  = split.Child1 as DockPaneSplit;
            bool          swapChildren = split.Child1 == targetPane || (child1Split != null && child1Split.IsParentOf(targetPane));

            int      source     = GetIndex(sourceItem);
            DockItem targetItem = GetItems(targetPane)[0];

            Debug.Assert(targetPane.Items.Contains(targetItem));
            int  targetIndex = GetIndex(targetItem);
            bool isAutoHide  = sourcePane.IsAutoHide;

            return(new ShowAsSidePaneAction(source, targetIndex, targetPane.IsFloating, ancestorSplitLevel, isAutoHide, side, splitterDistance, swapChildren, showMethod));
        }
Пример #7
0
        internal DockPane AddItem(DockItem item, DockPaneNode targetPaneNode, bool isAutoHide, Dock side, SplitterDistance size, bool isSizeForTarget)
        {
            Debug.Assert(targetPaneNode.DockTree == this);

            DockPane pane = DockControl.PaneManager.CreatePane(item, isAutoHide);

            AddDirtyNode(pane);
            AddDirtyNode(targetPaneNode);

            DockPaneSplit parent            = targetPaneNode.Parent;
            DockPaneNode  child1            = side == Dock.Left || side == Dock.Top ? pane : targetPaneNode;
            DockPaneNode  child2            = side == Dock.Left || side == Dock.Top ? targetPaneNode : pane;
            Orientation   orientation       = side == Dock.Left || side == Dock.Right ? Orientation.Horizontal : Orientation.Vertical;
            bool          isSplitterTopLeft = isSizeForTarget ? child1 == targetPaneNode : child2 == targetPaneNode;

            targetPaneNode.ClearParent();
            DockPaneSplit newSplit;

            newSplit = new DockPaneSplit(child1, child2, orientation, isSplitterTopLeft, size);
            AddDirtyNode(newSplit);
            if (parent != null)
            {
                AddDirtyNode(parent);
                parent.SetSibling(parent.GetSibling(targetPaneNode), newSplit);
            }
            else
            {
                SetRootNode(newSplit, false);
            }
            AddPaneToCollection(pane);
            Debug.Assert(newSplit.Child1 != null);
            Debug.Assert(newSplit.Child1.Parent == newSplit);
            Debug.Assert(newSplit.Child2 != null);
            Debug.Assert(newSplit.Child2.Parent == newSplit);
            return(pane);
        }
Пример #8
0
 internal void SetParent(DockPaneSplit split)
 {
     Debug.Assert(split != null);
     Debug.Assert(_parent == null);
     SetParentCore(split);
 }