Ejemplo n.º 1
0
        public void Dock(IDockContent nextTo, IDockContent newContent, DockTo dockTo)
        {
            IDockLayout targetChild = null;

            if (nextTo != null)
            {
                foreach (IDockLayout child in m_children)
                {
                    if (child.HasChild(nextTo))
                    {
                        targetChild = child;
                        break;
                    }
                }
            }
            if (targetChild == null)
            {
                foreach (IDockLayout child in m_children)
                {
                    if (child.HasDescendant(nextTo))
                    {
                        child.Dock(nextTo, newContent, dockTo);
                        // child was docked, nothing else is necessary
                        return;
                    }
                }
            }
            if (dockTo == DockTo.Center && m_children.Count == 1)
            {
                m_children[0].Dock(null, newContent, dockTo);
            }
            else if (m_children.Count < 2)
            {
                if (dockTo == DockTo.Center)
                {
                    dockTo = DockTo.Right;
                }
                if (dockTo == DockTo.Top || dockTo == DockTo.Bottom)
                {
                    m_orientation = Orientation.Vertical;
                }
                else
                {
                    m_orientation = Orientation.Horizontal;
                }
                DockedWindow newChild = new DockedWindow(Root, newContent);
                if (Children.Count == 0)
                {
                    AddFirstChild(newChild);
                }
                else
                {
                    if (targetChild == null)
                    {
                        if (dockTo == DockTo.Top || dockTo == DockTo.Left)
                        {
                            targetChild = m_children[0];
                        }
                        else
                        {
                            targetChild = m_children[m_children.Count - 1];
                        }
                    }
                    FrameworkElement control = (FrameworkElement)targetChild;
                    int index = m_children.IndexOf(targetChild);
                    if (dockTo == DockTo.Left || dockTo == DockTo.Right)
                    {
                        GridSplitter     splitter  = NewGridSplitter(Orientation.Horizontal);
                        int              column    = (int)control.GetValue(Grid.ColumnProperty);
                        ColumnDefinition oldColumn = ColumnDefinitions[index * 2];

                        ContentSettings contentSettings = (newContent is TabLayout) ? ((TabLayout)newContent).Children[0].Settings : ((DockContent)newContent).Settings;
                        double          totalWidth      = ((FrameworkElement)targetChild).ActualWidth;
                        double          width           = Math.Max(Math.Min(contentSettings.Size.Width, (totalWidth - splitter.Width) / 2), (totalWidth - splitter.Width) / 5);
                        double          ratioNew        = width / totalWidth;
                        double          ratioOld        = (totalWidth - width - splitter.Width) / totalWidth;

                        if (dockTo == DockTo.Left)
                        {
                            ColumnDefinition leftColumn  = NewColumnDefinition(new GridLength(oldColumn.Width.Value * ratioNew, oldColumn.Width.GridUnitType), m_minGridSize.Width);
                            ColumnDefinition rightColumn = NewColumnDefinition(new GridLength(oldColumn.Width.Value * ratioOld, oldColumn.Width.GridUnitType), m_minGridSize.Width);
                            ColumnDefinitions[index * 2] = leftColumn;
                            ColumnDefinitions.Insert(index * 2 + 1, rightColumn);
                            ColumnDefinitions.Insert(index * 2 + 1, NewColumnDefinition(new GridLength(1, GridUnitType.Auto), 0));
                            m_children.Insert(index, newChild);

                            Children.Insert(index * 2, splitter);
                            Children.Insert(index * 2, newChild);
                        }
                        else
                        {
                            ColumnDefinition leftColumn  = NewColumnDefinition(new GridLength(oldColumn.Width.Value * ratioOld, oldColumn.Width.GridUnitType), m_minGridSize.Width);
                            ColumnDefinition rightColumn = NewColumnDefinition(new GridLength(oldColumn.Width.Value * ratioNew, oldColumn.Width.GridUnitType), m_minGridSize.Width);
                            ColumnDefinitions[index * 2] = leftColumn;
                            ColumnDefinitions.Insert(index * 2 + 1, rightColumn);
                            ColumnDefinitions.Insert(index * 2 + 1, NewColumnDefinition(new GridLength(1, GridUnitType.Auto), 0));
                            m_children.Insert(index + 1, newChild);
                            Children.Insert(index * 2 + 1, newChild);
                            Children.Insert(index * 2 + 1, splitter);
                        }
                        for (int i = index * 2; i < Children.Count; i++)
                        {
                            Grid.SetColumn(Children[i], i);
                        }
                    }
                    else
                    {
                        GridSplitter  splitter = NewGridSplitter(Orientation.Vertical);
                        int           row      = (int)control.GetValue(Grid.RowProperty);
                        RowDefinition oldRow   = RowDefinitions[index * 2];

                        ContentSettings contentSettings = (newContent is TabLayout) ? ((TabLayout)newContent).Children[0].Settings : ((DockContent)newContent).Settings;
                        double          totalHeight     = ((FrameworkElement)targetChild).ActualHeight;
                        double          height          = Math.Max(Math.Min(contentSettings.Size.Height, (totalHeight - splitter.Height) / 2), (totalHeight - splitter.Height) / 5);
                        double          ratioNew        = height / totalHeight;
                        double          ratioOld        = (totalHeight - height - splitter.Height) / totalHeight;

                        if (dockTo == DockTo.Top)
                        {
                            RowDefinition topRow    = NewRowDefinition(new GridLength(oldRow.Height.Value * ratioNew, oldRow.Height.GridUnitType), m_minGridSize.Height);
                            RowDefinition bottomRow = NewRowDefinition(new GridLength(oldRow.Height.Value * ratioOld, oldRow.Height.GridUnitType), m_minGridSize.Height);
                            RowDefinitions[index * 2] = topRow;
                            RowDefinitions.Insert(index * 2 + 1, bottomRow);
                            RowDefinitions.Insert(index * 2 + 1, NewRowDefinition(new GridLength(1, GridUnitType.Auto), 0));
                            m_children.Insert(index, newChild);
                            Children.Insert(index * 2, splitter);
                            Children.Insert(index * 2, newChild);
                        }
                        else
                        {
                            RowDefinition topRow    = NewRowDefinition(new GridLength(oldRow.Height.Value * ratioOld, oldRow.Height.GridUnitType), m_minGridSize.Height);
                            RowDefinition bottomRow = NewRowDefinition(new GridLength(oldRow.Height.Value * ratioNew, oldRow.Height.GridUnitType), m_minGridSize.Height);
                            RowDefinitions[index * 2] = topRow;
                            RowDefinitions.Insert(index * 2 + 1, bottomRow);
                            RowDefinitions.Insert(index * 2 + 1, NewRowDefinition(new GridLength(1, GridUnitType.Auto), 0));
                            m_children.Insert(index + 1, newChild);
                            Children.Insert(index * 2 + 1, newChild);
                            Children.Insert(index * 2 + 1, splitter);
                        }
                        for (int i = index * 2; i < Children.Count; i++)
                        {
                            Grid.SetRow(Children[i], i);
                        }
                    }
                }
            }
            else if (dockTo == DockTo.Left || dockTo == DockTo.Right || dockTo == DockTo.Top || dockTo == DockTo.Bottom)
            {
                DockedWindow dockedWindow = (DockedWindow)targetChild;
                int          index        = m_children.IndexOf(targetChild);
                GridLayout   gridLayout   = new GridLayout(Root);
                gridLayout.SetValue(Grid.ColumnProperty, dockedWindow.GetValue(Grid.ColumnProperty));
                gridLayout.SetValue(Grid.RowProperty, dockedWindow.GetValue(Grid.RowProperty));
                Children.Remove(dockedWindow);
                IDockContent content = dockedWindow.DockedContent;
                dockedWindow.Undock(content);
                m_children[index] = gridLayout;
                Children.Insert(index * 2, gridLayout);
                gridLayout.Dock(null, content, DockTo.Center);
                UpdateLayout();
                gridLayout.Dock(content, newContent, dockTo);
            }
            else if (targetChild != null)
            {
                targetChild.Dock(nextTo, newContent, dockTo);
            }
        }