/// <summary>
        /// Determine Row and Column Count, and ColumnWidths
        /// </summary>
        /// <returns></returns>
        float S3_CalculateCountAndWidth(List<CssBox> userDefinedColumnBoxes)
        {
            //-----------------------------------------------------------
            //1. count columns
            int columnCount = 0;
            if (userDefinedColumnBoxes.Count > 0)
            {
                //mode 1: user defined columns
                columnCount = userDefinedColumnBoxes.Count;
            }
            else
            {   //mode 2:  anonymous column definitions, 
                int cellcount = 0;
                //find max column count in the table 
                //each row may contain different number of cell 
                for (int i = _allRowBoxes.Count - 1; i >= 0; --i)
                {
                    if ((cellcount = _allRowBoxes[i].ChildCount) > columnCount)
                    {
                        columnCount = cellcount;
                    }
                }
            }
            //-------------------------------------------------------------            
            //2. create column collection
            this.columnCollection = new TableColumnCollection(columnCount);
            float availbleWidthForAllCells = GetAvailableTableWidth() - (GetHorizontalSpacing(_tableBox) * (columnCount + 1)) - _tableBox.ActualBorderLeftWidth - _tableBox.ActualBorderRightWidth;
            //-------------------------------------------------------------
            //3. 
            if (userDefinedColumnBoxes.Count > 0)
            {
                //mode 1: user defined columns  
                // Fill ColumnWidths array by scanning column widths
                for (int i = userDefinedColumnBoxes.Count - 1; i >= 0; --i)
                {
                    CssLength colWidth = userDefinedColumnBoxes[i].Width; //Get specified width
                    if (colWidth.Number > 0) //If some width specified
                    {
                        switch (colWidth.UnitOrNames)
                        {
                            case CssUnitOrNames.Percent:
                                {
                                    return (colWidth.Number / 100) * availbleWidthForAllCells;
                                }
                            case CssUnitOrNames.Pixels:
                            case CssUnitOrNames.EmptyValue:
                                {
                                    //Get width as an absolute-pixel value
                                    columnCollection.SetColumnWidth(i, colWidth.Number);
                                }
                                break;
                        }
                    }
                }
            }
            else
            {
                //mode 2:  anonymous column definitions, 

                // Fill ColumnWidths array by scanning width in table-cell definitions
                var tmpRows = this._allRowBoxes;
                int rowCount = tmpRows.Count;
                for (int rr = 0; rr < rowCount; ++rr)
                {
                    CssBox row = tmpRows[rr];
                    //Check for column width in table-cell definitions
                    int col_limit = columnCount > MAX_COL_AT_THIS_VERSION ? MAX_COL_AT_THIS_VERSION : columnCount;
                    var cnode = row.GetFirstChild();
                    int i = 0;
                    while (cnode != null)
                    {
                        if (!columnCollection[i].HasSpecificWidth)
                        {
                            if (i < row.ChildCount)
                            {
                                var childBox = cnode;
                                if (childBox.CssDisplay == CssDisplay.TableCell)
                                {
                                    CssLength cellWidth = childBox.Width;
                                    if (cellWidth.IsAuto)
                                    {
                                        //auto width - always 0 
                                    }
                                    else
                                    {
                                        float cellBoxWidth = CssValueParser.ConvertToPx(childBox.Width, availbleWidthForAllCells, childBox);
                                        if (cellBoxWidth > 0) //If some width specified
                                        {
                                            int colspan = childBox.ColSpan;
                                            cellBoxWidth /= colspan;
                                            for (int n = i; n < i + colspan; n++)
                                            {
                                                columnCollection[n].S3_UpdateIfWider(cellBoxWidth, ColumnSpecificWidthLevel.FromCellConstraint);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        //--------------------------
                        cnode = cnode.GetNextNode();
                        i++;
                        if (i >= col_limit)
                        {
                            break;
                        }
                    }
                }
            }
            return availbleWidthForAllCells;
        }