void RenderVert (HtmlTextWriter w, IRepeatInfoUser user, Style controlStyle, WebControl baseControl)
{
int itms = user.RepeatedItemCount;
// total number of rows/columns in our table
int cols = RepeatColumns == 0 ? 1 : RepeatColumns;
// this gets ceil (itms / cols)
int rows = (itms + cols - 1) / cols;
bool sep = user.HasSeparators;
bool oti = OuterTableImplied;
int hdr_span = cols * ((sep && cols != 1) ? 2 : 1);
bool table = RepeatLayout == RepeatLayout.Table && !oti;
#if NET_2_0
bool show_empty_trailing_items = true;
bool show_empty_trailing_sep = true;
#else
bool show_empty_trailing_items = false;
bool show_empty_trailing_sep = false;
#endif
if (! oti)
RenderBeginTag (w, controlStyle, baseControl);
if (Caption.Length > 0) {
if (CaptionAlign != TableCaptionAlign.NotSet)
w.AddAttribute (HtmlTextWriterAttribute.Align, CaptionAlign.ToString());
w.RenderBeginTag (HtmlTextWriterTag.Caption);
w.Write (Caption);
w.RenderEndTag ();
}
// Render the header
if (user.HasHeader) {
if (oti)
user.RenderItem (ListItemType.Header, -1, this, w);
else if (table) {
w.RenderBeginTag (HtmlTextWriterTag.Tr);
// Make sure the header takes up the full width. We have two
// columns per item if we are using separators, otherwise
// one per item.
if (hdr_span != 1)
w.AddAttribute (HtmlTextWriterAttribute.Colspan, hdr_span.ToString (), false);
if (UseAccessibleHeader)
w.AddAttribute ("scope", "col", false);
Style s = user.GetItemStyle (ListItemType.Header, -1);
if (s != null)
s.AddAttributesToRender (w);
if (UseAccessibleHeader)
w.RenderBeginTag (HtmlTextWriterTag.Th);
else
w.RenderBeginTag (HtmlTextWriterTag.Td);
user.RenderItem (ListItemType.Header, -1, this, w);
w.RenderEndTag (); // td
w.RenderEndTag (); // tr
} else {
user.RenderItem (ListItemType.Header, -1, this, w);
RenderBr (w);
}
}
for (int r = 0; r < rows; r ++) {
if (table)
w.RenderBeginTag (HtmlTextWriterTag.Tr);
for (int c = 0; c < cols; c ++) {
// Find the item number we are in according to the repeat
// direction.
int item = index_vert (rows, cols, r, c, itms);
// This item is blank because there there not enough items
// to make a full row.
if (!show_empty_trailing_items && item >= itms)
continue;
if (table) {
Style s = null;
if (item < itms)
s = user.GetItemStyle (ListItemType.Item, item);
if (s != null)
s.AddAttributesToRender (w);
w.RenderBeginTag (HtmlTextWriterTag.Td);
}
if (item < itms)
user.RenderItem (ListItemType.Item, item, this, w);
if (table)
w.RenderEndTag (); // td
if (sep && cols != 1) {
if (table) {
if (item < itms - 1) {
Style s = user.GetItemStyle (ListItemType.Separator, item);
if (s != null)
s.AddAttributesToRender (w);
}
if (item < itms - 1 || show_empty_trailing_sep)
w.RenderBeginTag (HtmlTextWriterTag.Td);
}
if (item < itms - 1)
user.RenderItem (ListItemType.Separator, item, this, w);
if (table && (item < itms - 1 || show_empty_trailing_sep))
w.RenderEndTag (); // td
}
}
if (oti) {
} else if (table) {
w.RenderEndTag (); // tr
} else if (r != rows - 1) {
RenderBr(w);
}
if (sep && r != rows - 1 /* no sep on last item */ && cols == 1) {
if (table) {
w.RenderBeginTag (HtmlTextWriterTag.Tr);
Style s = user.GetItemStyle (ListItemType.Separator, r);
if (s != null)
s.AddAttributesToRender (w);
w.RenderBeginTag (HtmlTextWriterTag.Td);
} else if (oti) {
#if !NET_2_0
/* 2.0 doesn't render this <br /> */
RenderBr (w);
#endif
}
user.RenderItem (ListItemType.Separator, r, this, w);
if (table) {
w.RenderEndTag (); // td
w.RenderEndTag (); // tr
} else if (!oti) {
RenderBr (w);
}
}
}
// Render the footer
if (user.HasFooter) {
if (oti)
user.RenderItem (ListItemType.Footer, -1, this, w);
else if (table) {
w.RenderBeginTag (HtmlTextWriterTag.Tr);
if (hdr_span != 1)
w.AddAttribute (HtmlTextWriterAttribute.Colspan, hdr_span.ToString (), false);
Style s = user.GetItemStyle (ListItemType.Footer, -1);
if (s != null)
s.AddAttributesToRender (w);
w.RenderBeginTag (HtmlTextWriterTag.Td);
user.RenderItem (ListItemType.Footer, -1, this, w);
w.RenderEndTag (); // td
w.RenderEndTag (); // tr
} else {
// avoid dups on 0 items
if (itms != 0)
RenderBr (w);
user.RenderItem (ListItemType.Footer, -1, this, w);
}
}
if (! oti)
w.RenderEndTag (); // table/span
}