internal static IEnumerable<Control> BuildRows(
            List<List<CellPlaceholder>> cellPlaceholderListsForRows, IReadOnlyList<EwfTableFieldOrItemSetup> rowSetups, bool? useContrastForFirstRow,
            IReadOnlyList<EwfTableFieldOrItemSetup> columns, int firstDataColumnIndex, bool tableIsColumnPrimary)
        {
            return cellPlaceholderListsForRows.Select(
                ( row, rowIndex ) => {
                    var rowControl = new WebControl( HtmlTextWriterTag.Tr );
                    var rowClickScript = rowSetups[ rowIndex ].ClickScript;
                    if( rowClickScript != null )
                        rowClickScript.SetUpClickableControl( rowControl );
                    rowControl.Height = rowSetups[ rowIndex ].Size;
                    rowControl.CssClass =
                        rowControl.CssClass.ConcatenateWithSpace(
                            useContrastForFirstRow.HasValue && ( ( rowIndex % 2 == 1 ) ^ useContrastForFirstRow.Value ) ? EwfTable.CssElementCreator.ContrastClass : "" );
                    rowControl.CssClass = rowControl.CssClass.ConcatenateWithSpace( StringTools.ConcatenateWithDelimiter( " ", rowSetups[ rowIndex ].Classes.ToArray() ) );
                    return
                        new NamingPlaceholder(
                            rowControl.AddControlsReturnThis(
                                row.Select( ( cell, colIndex ) => new { Cell = cell as EwfTableCell, ColumnIndex = colIndex } )
                                    .Where( cellAndIndex => cellAndIndex.Cell != null )
                                    .Select(
                                        cellAndIndex => {
                                            var cellControl = new WebControl( cellAndIndex.ColumnIndex < firstDataColumnIndex ? HtmlTextWriterTag.Th : HtmlTextWriterTag.Td );

                                            var rowSpan = tableIsColumnPrimary ? cellAndIndex.Cell.Setup.FieldSpan : cellAndIndex.Cell.Setup.ItemSpan;
                                            if( rowSpan != 1 )
                                                cellControl.Attributes.Add( "rowspan", rowSpan.ToString() );

                                            var colSpan = tableIsColumnPrimary ? cellAndIndex.Cell.Setup.ItemSpan : cellAndIndex.Cell.Setup.FieldSpan;
                                            if( colSpan != 1 )
                                                cellControl.Attributes.Add( "colspan", colSpan.ToString() );

                                            var rowSetup = rowSetups[ rowIndex ];
                                            var columnSetup = columns[ cellAndIndex.ColumnIndex ];
                                            var clickScript = cellAndIndex.Cell.Setup.ClickScript ?? ( tableIsColumnPrimary || rowSetup.ClickScript == null ? columnSetup.ClickScript : null );
                                            if( clickScript != null )
                                                clickScript.SetUpClickableControl( cellControl );

                                            var columnClassString = StringTools.ConcatenateWithDelimiter( " ", columnSetup.Classes.ToArray() );
                                            var cellClassString = StringTools.ConcatenateWithDelimiter( " ", cellAndIndex.Cell.Setup.Classes.ToArray() );
                                            cellControl.CssClass = StringTools.ConcatenateWithDelimiter(
                                                " ",
                                                cellControl.CssClass,
                                                EwfTable.CssElementCreator.AllCellAlignmentsClass,
                                                textAlignmentClass( cellAndIndex.Cell, rowSetup, columnSetup ),
                                                verticalAlignmentClass( rowSetup, columnSetup ),
                                                columnClassString,
                                                cellClassString );

                                            if( ( rowSetup.ToolTipControl != null || rowSetup.ToolTip.Length > 0 ) && cellAndIndex.ColumnIndex == 0 )
                                                new ToolTip( rowSetup.ToolTipControl ?? ToolTip.GetToolTipTextControl( rowSetup.ToolTip ), rowControl );
                                            if( columnSetup.ToolTipControl != null )
                                                throw new ApplicationException( "A column cannot have a tool tip control because there is no way to clone this control to put it on every cell." );
                                            if( columnSetup.ToolTip.Length > 0 )
                                                new ToolTip( ToolTip.GetToolTipTextControl( columnSetup.ToolTip ), cellControl );
                                            if( cellAndIndex.Cell.Setup.ToolTipControl != null || cellAndIndex.Cell.Setup.ToolTip.Length > 0 )
                                                new ToolTip( cellAndIndex.Cell.Setup.ToolTipControl ?? ToolTip.GetToolTipTextControl( cellAndIndex.Cell.Setup.ToolTip ), cellControl );

                                            return cellControl.AddControlsReturnThis( cellAndIndex.Cell.Controls ) as Control;
                                        } ) ).ToSingleElementArray() );
                } );
        }
        WebControl ActionControlStyle.SetUpControl( WebControl control, string defaultText, Unit width, Unit height, Action<Unit> widthSetter )
        {
            widthSetter( width );

            var cssElement = CssElementCreator.NormalButtonStyleClass;
            if( buttonSize == ButtonSize.ShrinkWrap )
                cssElement = CssElementCreator.ShrinkWrapButtonStyleClass;
            else if( buttonSize == ButtonSize.Large )
                cssElement = CssElementCreator.LargeButtonStyleClass;
            control.CssClass = control.CssClass.ConcatenateWithSpace( CssElementCreator.AllStylesClass + " " + cssElement );

            return control.AddControlsReturnThis( ActionControlIcon.GetIconAndTextControls( icon, text.Any() ? text : defaultText ) );
        }
 WebControl ActionControlStyle.SetUpControl( WebControl control, string defaultText, Unit width, Unit height, Action<Unit> widthSetter )
 {
     control.CssClass = control.CssClass.ConcatenateWithSpace( CssElementCreator.AllStylesClass + " " + CssElementCreator.TextStyleClass );
     return control.AddControlsReturnThis( ActionControlIcon.GetIconAndTextControls( icon, Text.Any() ? Text : defaultText ) );
 }