private void RebuildLayout(ColumnGroupLayoutNode node)
 {
     node.MinWidth = node.MaxWidth = node.Bounds.Width = node.OriginalWidth = 0.0f;
     foreach (ColumnGroupLayoutNode child in node.Children)
     {
         child.Level = node.Level + 1;
         this.RebuildLayout(child);
         node.MinWidth += child.MinWidth;
         if ((double)node.MaxWidth >= 0.0)
         {
             node.MaxWidth += child.MaxWidth;
         }
         if ((double)child.MaxWidth == 0.0)
         {
             node.MaxWidth = -1f;
         }
         node.Bounds.Width += child.Bounds.Width;
     }
     if ((double)node.MaxWidth == -1.0)
     {
         node.MaxWidth = 0.0f;
     }
     if (node.Rows != null && node.Children.Count == 0)
     {
         int num1 = 0;
         node.MaxWidth = (float)int.MaxValue;
         bool flag = false;
         foreach (GridViewColumnGroupRow row in (Collection <GridViewColumnGroupRow>)node.Rows)
         {
             int num2 = 0;
             int num3 = 0;
             int num4 = 0;
             foreach (string columnName in (Collection <string>)row.ColumnNames)
             {
                 GridViewColumn column = (GridViewColumn)this.template.Columns[columnName];
                 if (this.owner.ColumnIsVisible(column) || this.owner.IgnoreColumnVisibility)
                 {
                     flag  = true;
                     num2 += column.Width;
                     num3 += column.MinWidth;
                     if (num4 >= 0)
                     {
                         num4 += column.MaxWidth;
                     }
                     if (column.MaxWidth == 0)
                     {
                         num4 = -1;
                     }
                     ColumnGroupColumnData columnGroupColumnData = new ColumnGroupColumnData();
                     columnGroupColumnData.Row           = num1;
                     columnGroupColumnData.Bounds.Width  = (float)column.Width;
                     columnGroupColumnData.OriginalWidth = (float)column.Width;
                     columnGroupColumnData.MinWidth      = (float)column.MinWidth;
                     columnGroupColumnData.MaxWidth      = (float)column.MaxWidth;
                     columnGroupColumnData.ConstrainWidth();
                     node.ColumnData.Add(column, columnGroupColumnData);
                 }
             }
             node.Bounds.Width = Math.Max(node.Bounds.Width, (float)num2);
             node.MinWidth     = Math.Max(node.MinWidth, (float)num3);
             node.MaxWidth     = num4 != -1 ? Math.Min(node.MaxWidth, (float)num4) : node.MaxWidth;
             node.ConstrainWidth();
             ++num1;
         }
         node.MaxWidth = (double)node.MaxWidth == 2147483648.0 ? 0.0f : node.MaxWidth;
         if (!flag && this.owner.ShowEmptyGroups)
         {
             node.Bounds.Width = 50f;
         }
     }
     else
     {
         if (node.Children.Count == 0 && (node.Rows == null || node.Rows.Count == 0) && this.owner.ShowEmptyGroups)
         {
             node.Bounds.Width = 50f;
         }
         this.groupRowLevels = Math.Max(this.groupRowLevels, node.Level);
     }
     node.OriginalWidth = node.Bounds.Width;
 }