3 // Permission is hereby granted, free of charge, to any person obtaining
4 // a copy of this software and associated documentation files (the
5 // "Software"), to deal in the Software without restriction, including
6 // without limitation the rights to use, copy, modify, merge, publish,
7 // distribute, sublicense, and/or sell copies of the Software, and to
8 // permit persons to whom the Software is furnished to do so, subject to
9 // the following conditions:
11 // The above copyright notice and this permission notice shall be
12 // included in all copies or substantial portions of the Software.
14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 * Namespace: System.Web.UI.WebControls
\r
26 * Author: Gaurav Vaish
\r
27 * Maintainer: gvaish@iitk.ac.in
\r
28 * Contact: <my_scripts2001@yahoo.com>, <gvaish@iitk.ac.in>
\r
29 * Implementation: yes
\r
32 * (C) Gaurav Vaish (2002)
\r
36 using System.Globalization;
\r
38 using System.Web.UI;
\r
40 namespace System.Web.UI.WebControls
\r
42 public sealed class RepeatInfo
\r
44 private bool outerTableImp;
\r
45 private int repeatColumns;
\r
46 private RepeatDirection repeatDirection;
\r
47 private RepeatLayout repeatLayout;
\r
51 outerTableImp = false;
\r
53 repeatDirection = RepeatDirection.Vertical;
\r
54 repeatLayout = RepeatLayout.Table;
\r
57 public bool OuterTableImplied
\r
61 return outerTableImp;
\r
65 outerTableImp = value;
\r
69 public int RepeatColumns
\r
73 return repeatColumns;
\r
77 repeatColumns = value;
\r
81 public RepeatDirection RepeatDirection
\r
85 return repeatDirection;
\r
89 if(!Enum.IsDefined(typeof(RepeatDirection), value))
\r
90 throw new ArgumentException();
\r
91 repeatDirection = value;
\r
95 public RepeatLayout RepeatLayout
\r
99 return repeatLayout;
\r
103 if(!Enum.IsDefined(typeof(RepeatLayout), value))
\r
104 throw new ArgumentException();
\r
105 repeatLayout = value;
\r
109 public void RenderRepeater(HtmlTextWriter writer, IRepeatInfoUser user, Style controlStyle, WebControl baseControl)
\r
111 if(RepeatDirection == RepeatDirection.Vertical)
\r
113 DoVerticalRendering(writer, user, controlStyle, baseControl);
\r
116 DoHorizontalRendering(writer, user, controlStyle, baseControl);
\r
120 private void DoVerticalRendering(HtmlTextWriter writer, IRepeatInfoUser user, Style controlStyle, WebControl baseControl)
\r
122 int total = user.RepeatedItemCount;
\r
125 if(repeatColumns == 0 || repeatColumns==1)
\r
131 colsCount = repeatColumns;
\r
132 rowsCount = (total + repeatColumns - 1) / repeatColumns;
\r
133 if(rowsCount ==0 && total != 0)
\r
139 WebControl ctrl = null;
\r
140 bool isTable = false;
\r
141 bool hasSeps = user.HasSeparators;
\r
144 if(RepeatLayout == RepeatLayout.Table)
\r
146 ctrl = new Table();
\r
150 ctrl = new WebControl(HtmlTextWriterTag.Span);
\r
156 ctrl.ID = baseControl.ClientID;
\r
157 ctrl.CopyBaseAttributes(baseControl);
\r
158 ctrl.ApplyStyle(controlStyle);
\r
159 ctrl.RenderBeginTag(writer);
\r
168 writer.RenderBeginTag(HtmlTextWriterTag.Tr);
\r
171 colSpan = colsCount;
\r
173 colSpan += colsCount;
\r
174 writer.AddAttribute(HtmlTextWriterAttribute.Colspan, colSpan.ToString(NumberFormatInfo.InvariantInfo));
\r
176 itemStyle = user.GetItemStyle(ListItemType.Header, -1);
\r
177 if(itemStyle != null)
\r
179 itemStyle.AddAttributesToRender(writer);
\r
181 writer.RenderBeginTag(HtmlTextWriterTag.Td);
\r
183 user.RenderItem(ListItemType.Header, -1, this, writer);
\r
186 writer.RenderEndTag();
\r
187 writer.RenderEndTag();
\r
192 writer.WriteFullBeginTag("br");
\r
200 int diff = colsCount - (rowsCount*colsCount - total);
\r
202 while(rowIndex < rowsCount)
\r
205 writer.RenderBeginTag(HtmlTextWriterTag.Tr);
\r
207 while(colIndex < colsCount)
\r
209 if (rowIndex == rowsCount-1 && colIndex >= diff)
\r
212 if (colIndex < diff)
\r
213 index = rowIndex + colIndex * rowsCount;
\r
215 index = rowIndex + colIndex * (rowsCount-1) + diff;
\r
221 itemStyle = user.GetItemStyle(ListItemType.Item, index);
\r
222 if(itemStyle != null)
\r
224 itemStyle.AddAttributesToRender(writer);
\r
226 writer.RenderBeginTag(HtmlTextWriterTag.Td);
\r
228 user.RenderItem(ListItemType.Item, index, this, writer);
\r
230 writer.RenderEndTag();
\r
231 if(hasSeps && index != (total - 1))
\r
233 if(isTable && colsCount == 1)
\r
235 writer.RenderEndTag();
\r
236 writer.RenderBeginTag(HtmlTextWriterTag.Tr);
\r
239 writer.WriteFullBeginTag("br");
\r
243 itemStyle = user.GetItemStyle(ListItemType.Separator, index);
\r
244 if(itemStyle != null)
\r
245 itemStyle.AddAttributesToRender(writer);
\r
246 writer.RenderBeginTag(HtmlTextWriterTag.Td);
\r
248 user.RenderItem(ListItemType.Separator, index, this, writer);
\r
250 writer.RenderEndTag();
\r
256 writer.RenderEndTag();
\r
258 if((rowIndex != (rowsCount - 1) || user.HasFooter) && !outerTableImp)
\r
259 writer.WriteFullBeginTag("br");
\r
266 writer.RenderBeginTag(HtmlTextWriterTag.Tr);
\r
269 writer.AddAttribute(HtmlTextWriterAttribute.Colspan, colSpan.ToString(NumberFormatInfo.InvariantInfo));
\r
271 itemStyle = user.GetItemStyle(ListItemType.Footer, -1);
\r
272 if(itemStyle != null)
\r
274 itemStyle.AddAttributesToRender(writer);
\r
276 writer.RenderBeginTag(HtmlTextWriterTag.Td);
\r
278 user.RenderItem(ListItemType.Footer, -1, this, writer);
\r
281 writer.RenderEndTag();
\r
282 writer.RenderEndTag();
\r
287 ctrl.RenderEndTag(writer);
\r
291 private void DoHorizontalRendering (HtmlTextWriter writer,
\r
292 IRepeatInfoUser user,
\r
293 Style controlStyle,
\r
294 WebControl baseControl)
\r
296 /* Based on DoVerticalRendering */
\r
297 int total = user.RepeatedItemCount;
\r
300 WebControl ctrl = null;
\r
301 bool isTable = true;
\r
302 bool hasSeps = user.HasSeparators;
\r
303 if (!outerTableImp){
\r
304 isTable = (RepeatLayout == RepeatLayout.Table);
\r
305 ctrl = (isTable) ? new Table () : new WebControl (HtmlTextWriterTag.Span);
\r
306 ctrl.ID = baseControl.ClientID;
\r
307 ctrl.CopyBaseAttributes (baseControl);
\r
308 ctrl.ApplyStyle (controlStyle);
\r
309 ctrl.RenderBeginTag (writer);
\r
314 if (user.HasHeader){
\r
316 writer.RenderBeginTag (HtmlTextWriterTag.Tr);
\r
317 if (colsCount != 1){
\r
318 colSpan = colsCount;
\r
320 colSpan += colsCount;
\r
321 writer.AddAttribute (HtmlTextWriterAttribute.Colspan,
\r
322 colSpan.ToString (NumberFormatInfo.InvariantInfo));
\r
324 itemStyle = user.GetItemStyle (ListItemType.Header, -1);
\r
325 if (itemStyle != null)
\r
326 itemStyle.AddAttributesToRender (writer);
\r
327 writer.RenderBeginTag (HtmlTextWriterTag.Td);
\r
330 user.RenderItem (ListItemType.Header, -1, this, writer);
\r
333 writer.RenderEndTag();
\r
334 writer.RenderEndTag();
\r
335 } else if (repeatColumns < user.RepeatedItemCount)
\r
336 writer.WriteFullBeginTag ("br");
\r
339 for (int index = 0; index < total; index++){
\r
340 if (isTable && index == 0)
\r
341 writer.RenderBeginTag (HtmlTextWriterTag.Tr);
\r
344 itemStyle = user.GetItemStyle (ListItemType.Item, index);
\r
345 if (itemStyle != null)
\r
346 itemStyle.AddAttributesToRender(writer);
\r
347 writer.RenderBeginTag(HtmlTextWriterTag.Td);
\r
350 user.RenderItem(ListItemType.Item, index, this, writer);
\r
352 writer.RenderEndTag ();
\r
354 if (hasSeps && index != (total - 1)){
\r
356 itemStyle = user.GetItemStyle (ListItemType.Separator, index);
\r
357 if (itemStyle != null)
\r
358 itemStyle.AddAttributesToRender (writer);
\r
359 writer.RenderBeginTag (HtmlTextWriterTag.Td);
\r
361 user.RenderItem (ListItemType.Separator, index, this, writer);
\r
363 writer.RenderEndTag ();
\r
367 if (colsCount == repeatColumns) {
\r
369 writer.RenderEndTag ();
\r
370 writer.RenderBeginTag (HtmlTextWriterTag.Tr);
\r
372 else if (rowsCount < total)
\r
373 writer.WriteFullBeginTag ("br");
\r
377 if (index == (total - 1)) {
\r
379 writer.RenderEndTag ();
\r
380 else if (rowsCount < total)
\r
381 writer.WriteFullBeginTag ("br");
\r
385 if (user.HasFooter){
\r
387 writer.RenderBeginTag (HtmlTextWriterTag.Tr);
\r
388 if (colsCount != 1)
\r
389 writer.AddAttribute (HtmlTextWriterAttribute.Colspan,
\r
390 colSpan.ToString(NumberFormatInfo.InvariantInfo));
\r
392 itemStyle = user.GetItemStyle (ListItemType.Footer, -1);
\r
393 if(itemStyle != null)
\r
394 itemStyle.AddAttributesToRender (writer);
\r
395 writer.RenderBeginTag (HtmlTextWriterTag.Td);
\r
397 user.RenderItem (ListItemType.Footer, -1, this, writer);
\r
399 writer.RenderEndTag ();
\r
400 writer.RenderEndTag ();
\r
405 ctrl.RenderEndTag(writer);
\r