示例#1
0
        private static NestedDockEntry[] GetNestedDockEntries(DockPane[] panes)
        {
            if (panes.Length == 0 || panes.Length == 1)
            {
                return(s_emptyNestedDockEntries);
            }

            NestedDockEntry[] entries = new NestedDockEntry[panes.Length - 1];
            DockPaneSplit[]   splits  = new DockPaneSplit[panes.Length - 1];
            for (int i = 1; i < panes.Length; i++)
            {
                DockPane      sourcePane = panes[i];
                DockPane      targetPane = null;
                DockPaneSplit split;
                for (split = sourcePane.Parent; split != null; split = split.Parent)
                {
                    for (int j = 0; j < i; j++)
                    {
                        if (split.IsParentOf(panes[j]))
                        {
                            targetPane = panes[j];
                            break;
                        }
                    }
                    if (targetPane != null)
                    {
                        break;
                    }
                }
                Debug.Assert(targetPane != null);
                Debug.Assert(split != null);
                int ancestorSplitLevel = 0;
                for (int j = 0; j < i - 1; j++)
                {
                    if (split.IsParentOf(splits[j]) && splits[j].IsParentOf(targetPane))
                    {
                        ancestorSplitLevel++;
                    }
                }
                entries[i - 1] = GetNestedDockEntry(sourcePane, targetPane, ancestorSplitLevel, split);
                splits[i - 1]  = split;
            }

            return(entries);
        }
示例#2
0
        private static NestedDockEntry GetNestedDockEntry(DockPane sourcePane, DockPane targetPane, int ancestorSplitLevel, DockPaneSplit split)
        {
            Debug.Assert(sourcePane != null);
            Debug.Assert(targetPane != null);
            Debug.Assert(targetPane.SelectedItem != null);

            Dock dock;

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

            SplitterDistance splitterDistance = split.SplitterDistance;

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

            return(new NestedDockEntry(sourcePane, targetPane.SelectedItem, ancestorSplitLevel, dock, splitterDistance, swapChildren));
        }