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(); } }
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); }
internal bool IsParentOf(DockPaneNode paneNode) { for (DockPaneSplit split = paneNode.Parent; split != null; split = split.Parent) { if (split == this) { return(true); } } return(false); }
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); } }
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)); }
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)); }
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); }
internal void SetParent(DockPaneSplit split) { Debug.Assert(split != null); Debug.Assert(_parent == null); SetParentCore(split); }