Пример #1
0
        // Used to interleave specified column dimensions with automatic columns added to use
        // underlying Grid layout for main arrange of UniformGrid.
        internal void SetupColumnDefinitions(int columns)
        {
            // Mark initial definitions so we don't erase them.
            foreach (var cd in ColumnDefinitions)
            {
                if (GetAutoLayout(cd) == null)
                {
                    SetAutoLayout(cd, false);
                }
            }

            // Remove non-autolayout columns we've added and then add them in the right spots.
            if (columns != ColumnDefinitions.Count)
            {
                for (int c = ColumnDefinitions.Count - 1; c >= 0; c--)
                {
                    if (GetAutoLayout(ColumnDefinitions[c]) == true)
                    {
                        this.ColumnDefinitions.RemoveAt(c);
                    }
                }

                for (int c = ColumnDefinitions.Count; c < columns; c++)
                {
                    var cd = new ColumnDefinition();
                    SetAutoLayout(cd, true);
                    ColumnDefinitions.Insert(c, cd);
                }
            }
        }
Пример #2
0
        public RungUI AddColumn(int pos, double width, GridUnitType unit)
        {
            var col = new ColumnDefinition();

            col.Width = new GridLength(width, unit);
            ColumnDefinitions.Insert(pos, col);
            return(this);
        }
Пример #3
0
        public RungUI AddColumn(int pos)
        {
            var col = new ColumnDefinition();

            col.Width = GridLength.Auto;
            ColumnDefinitions.Insert(pos, col);
            return(this);
        }
Пример #4
0
        void CreateCorrectingColumn()
        {
            CorrectingColumn = new StdColumnDefinition();
            Binding b = new Binding("GroupedColumns.Count");

            b.Source             = View;
            b.Converter          = new GridLengthValueConverter();
            b.ConverterParameter = ((TableView)View).LeftGroupAreaIndent;
            BindingOperations.SetBinding(CorrectingColumn, System.Windows.Controls.ColumnDefinition.WidthProperty, b);
            ColumnDefinitions.Insert(0, CorrectingColumn);
        }
Пример #5
0
        private AbstractLogColumnPresenter AddColumn(ILogFileColumn column)
        {
            var columnPresenter = CreatePresenterFor(column);

            // The 2nd column is reserved for the data source name which hasn't been
            // ported to the new ILogFileColumnPresenter interface just yet
            int columnIndex;

            if (_columnPresenters.Count == 0)
            {
                columnIndex = 0;
            }
            else if (Equals(column, LogFileColumns.Message))
            {
                columnIndex = ColumnDefinitions.IndexOf(_messageColumnDefinition);
            }
            else
            {
                columnIndex = _columnPresenters.Count + 1;
            }

            columnPresenter.SetValue(RowProperty, 0);
            columnPresenter.SetValue(ColumnProperty, columnIndex);
            _columnPresenters.Add(columnPresenter.Column, columnPresenter);

            var columnDefinition = new ColumnDefinition {
                Width = new GridLength(value: 1, type: GridUnitType.Auto)
            };

            _columnDefinitionsByColumn.Add(columnPresenter.Column, columnDefinition);
            _columnsByColumnDefinition.Add(columnDefinition, columnPresenter.Column);

            int insertionIndex;

            if (_messageColumnDefinition != null)
            {
                insertionIndex = ColumnDefinitions.IndexOf(_messageColumnDefinition);
            }
            else
            {
                insertionIndex = ColumnDefinitions.Count;
            }
            ColumnDefinitions.Insert(insertionIndex, columnDefinition);

            return(columnPresenter);
        }
Пример #6
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);
            }
        }
Пример #7
0
        /// <summary>
        /// Will merge itself with given grid. Basicly it takes child grid, removes that grid, and all
        /// children of removed grid will be added to this grid. The child grid must have same orientation
        /// or maximum of 1 child.
        /// </summary>
        /// <param name="grid">Grid to merge with</param>
        internal void MergeWith(GridLayout grid)
        {
            // get the index of the grid to merge with (it is child of this grid)
            int    index       = m_children.IndexOf(grid);
            double totalValue  = 0;
            int    indexOffset = 0;

            if (Orientation == Orientation.Horizontal)
            {
                // get the column definition of child grid
                ColumnDefinition oldColumnDef = ColumnDefinitions[index * 2];
                // count the sum of columns widths of childs children
                foreach (IDockLayout newLayout in grid.Layouts)
                {
                    FrameworkElement element         = (FrameworkElement)newLayout;
                    int columnIndex                  = Grid.GetColumn(element);
                    ColumnDefinition layoutColumnDef = grid.ColumnDefinitions[columnIndex];
                    totalValue += layoutColumnDef.Width.Value;
                }
                // remove the child from our list, from view children adn from column definitions
                m_children.RemoveAt(index);
                Children.RemoveAt(index * 2);
                ColumnDefinitions.RemoveAt(index * 2);
                // move all childs children to this grid and create column definitions for each of them
                foreach (IDockLayout newLayout in grid.Layouts)
                {
                    FrameworkElement element         = (FrameworkElement)newLayout;
                    int columnIndex                  = Grid.GetColumn(element);
                    ColumnDefinition layoutColumnDef = grid.ColumnDefinitions[columnIndex];
                    double           newValue        = oldColumnDef.Width.Value * layoutColumnDef.Width.Value / totalValue;
                    ColumnDefinition newColumnDef    = NewColumnDefinition(new GridLength(newValue, GridUnitType.Star), m_minGridSize.Width);
                    grid.Children.Remove(element);
                    ColumnDefinitions.Insert((index + indexOffset) * 2, newColumnDef);
                    Children.Insert((index + indexOffset) * 2, element);
                    m_children.Insert(index + indexOffset, newLayout);
                    if (indexOffset < grid.Layouts.Count - 1)
                    {
                        // if we move more than one child, then we need to add new splitters too
                        GridSplitter splitter = NewGridSplitter(Orientation.Horizontal);
                        ColumnDefinitions.Insert((index + indexOffset) * 2 + 1, NewColumnDefinition(new GridLength(1, GridUnitType.Auto), 0));
                        Children.Insert((index + indexOffset) * 2 + 1, splitter);
                    }
                    indexOffset++;
                }
                // set the association of column indexes
                for (int i = 0; i < Children.Count; i++)
                {
                    Grid.SetColumn(Children[i], i);
                }
            }
            else
            {
                // get the row definition of child grid
                RowDefinition oldRowDef = RowDefinitions[index * 2];
                // count the sum of row heights of childs children
                foreach (IDockLayout newLayout in grid.Layouts)
                {
                    FrameworkElement element   = (FrameworkElement)newLayout;
                    int           RowIndex     = Grid.GetRow(element);
                    RowDefinition layoutRowDef = grid.RowDefinitions[RowIndex];
                    totalValue += layoutRowDef.Height.Value;
                }
                // remove the child from our list, from view children adn from row definitions
                m_children.RemoveAt(index);
                Children.RemoveAt(index * 2);
                RowDefinitions.RemoveAt(index * 2);
                // move all childs children to this grid and create row definitions for each of them
                foreach (IDockLayout newLayout in grid.Layouts)
                {
                    FrameworkElement element   = (FrameworkElement)newLayout;
                    int           RowIndex     = Grid.GetRow(element);
                    RowDefinition layoutRowDef = grid.RowDefinitions[RowIndex];
                    double        newValue     = oldRowDef.Height.Value * layoutRowDef.Height.Value / totalValue;
                    RowDefinition newRowDef    = NewRowDefinition(new GridLength(newValue, GridUnitType.Star), m_minGridSize.Height);
                    grid.Children.Remove(element);
                    RowDefinitions.Insert((index + indexOffset) * 2, newRowDef);
                    Children.Insert((index + indexOffset) * 2, element);
                    m_children.Insert(index + indexOffset, newLayout);
                    if (indexOffset < grid.Layouts.Count - 1)
                    {
                        // if we move more than one child, then we need to add new splitters too
                        GridSplitter splitter = NewGridSplitter(Orientation.Vertical);
                        RowDefinitions.Insert((index + indexOffset) * 2 + 1, NewRowDefinition(new GridLength(1, GridUnitType.Auto), 0));
                        Children.Insert((index + indexOffset) * 2 + 1, splitter);
                    }
                    indexOffset++;
                }
                // set the association of row indexes
                for (int i = 0; i < Children.Count; i++)
                {
                    Grid.SetRow(Children[i], i);
                }
            }
        }
Пример #8
0
        void LayoutChildren()
        {
            if (_childrenRearranged)
            {
                return;
            }

            _childrenRearranged = true;

            int currentRow = 0;
            int currentCol = 1;

            int childControls = VisualTreeHelper.GetChildrenCount(this);

            if (Padding.Top > 0)
            {
                var row = new RowDefinition {
                    Height = new GridLength(Padding.Top)
                };
                RowDefinitions.Add(row);
            }

            //redo this to add a border as the parent element???
            ColumnDefinitions.Insert(0, new ColumnDefinition {
                Width = new GridLength(Padding.Left)
            });
            ColumnDefinitions.Add(new ColumnDefinition {
                Width = new GridLength(Padding.Right)
            });

            int  actualColumnCount = ColumnDefinitions.Count - 2;
            int  columnsUsed       = 0;
            var  margin            = new Thickness();
            bool isFirstColumn     = true;

            for (int idx = 0; idx < childControls; idx++)
            {
                var ctrl = VisualTreeHelper.GetChild(this, idx) as FrameworkElement;
                if (ctrl == null)
                {
                    throw new ArgumentException("ctrl is null!!!");
                }

                int columnProperty     = GetColumn(ctrl);       //this will be 0 if not set, however 1 column will still be used
                int columnSpanProperty = GetColumnSpan(ctrl);   //this will be 1 if not set

                int columnsTakenByControl = (columnProperty == 0 ? 1 : columnProperty + 1) + (columnSpanProperty - 1);

                bool isLastColumn = ((columnsUsed + columnsTakenByControl) % actualColumnCount) == 0;

                if (isFirstColumn)
                {
                    //ctrl.SetValue(BackgroundProperty, Brushes.Green);
                    //first column - reset the margin. add a new row, inc the row count and reset the column to 1
                    margin = new Thickness(ControlPadding.Left, ControlPadding.Top, ControlPadding.Right,
                                           ControlPadding.Bottom);
                    var row = new RowDefinition {
                        Height = GridLength.Auto
                    };
                    RowDefinitions.Add(row);

                    currentRow++;
                    currentCol = 1;
                }
                if (isLastColumn)
                {
                    margin.Right = 0;
                }

                columnsUsed  += columnsTakenByControl;
                isFirstColumn = (columnsUsed % actualColumnCount) == 0;

                //handle manually set column
                ctrl.Margin = margin;
                if (ctrl.VerticalAlignment == VerticalAlignment.Stretch)
                {
                    ctrl.VerticalAlignment = VerticalAlignment.Center;
                }

                //if the Grid.Column property is set...
                if (columnProperty > 0)
                {
                    currentCol = columnProperty + 1;
                }

                SetColumnSpan(ctrl, columnSpanProperty);
                SetColumn(ctrl, currentCol);
                SetRow(ctrl, currentRow);

                currentCol += columnSpanProperty;
            }

            if (Padding.Bottom > 0)
            {
                var row = new RowDefinition {
                    Height = new GridLength(Padding.Bottom)
                };
                RowDefinitions.Add(row);
            }
        }