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
49 private string caption = "";
\r
50 private TableCaptionAlign captionAlign = TableCaptionAlign.NotSet;
\r
51 private bool useAccessibleHeader = false;
\r
56 outerTableImp = false;
\r
58 repeatDirection = RepeatDirection.Vertical;
\r
59 repeatLayout = RepeatLayout.Table;
\r
62 public bool OuterTableImplied
\r
66 return outerTableImp;
\r
70 outerTableImp = value;
\r
74 public int RepeatColumns
\r
78 return repeatColumns;
\r
82 repeatColumns = value;
\r
86 public RepeatDirection RepeatDirection
\r
90 return repeatDirection;
\r
94 if(!Enum.IsDefined(typeof(RepeatDirection), value))
\r
95 throw new ArgumentException();
\r
96 repeatDirection = value;
\r
100 public RepeatLayout RepeatLayout
\r
104 return repeatLayout;
\r
108 if(!Enum.IsDefined(typeof(RepeatLayout), value))
\r
109 throw new ArgumentException();
\r
110 repeatLayout = value;
\r
114 public void RenderRepeater(HtmlTextWriter writer, IRepeatInfoUser user, Style controlStyle, WebControl baseControl)
\r
116 if(RepeatDirection == RepeatDirection.Vertical)
\r
118 DoVerticalRendering(writer, user, controlStyle, baseControl);
\r
121 DoHorizontalRendering(writer, user, controlStyle, baseControl);
\r
125 private void DoVerticalRendering(HtmlTextWriter writer, IRepeatInfoUser user, Style controlStyle, WebControl baseControl)
\r
127 int total = user.RepeatedItemCount;
\r
130 if(repeatColumns == 0 || repeatColumns==1)
\r
136 colsCount = repeatColumns;
\r
137 rowsCount = (total + repeatColumns - 1) / repeatColumns;
\r
138 if(rowsCount ==0 && total != 0)
\r
144 WebControl ctrl = null;
\r
145 bool isTable = false;
\r
146 bool hasSeps = user.HasSeparators;
\r
149 if(RepeatLayout == RepeatLayout.Table)
\r
151 ctrl = new Table();
\r
153 if (Caption.Length != 0)
\r
155 ((Table) ctrl).CaptionAlign = CaptionAlign;
\r
156 ((Table) ctrl).Caption = Caption;
\r
162 ctrl = new WebControl(HtmlTextWriterTag.Span);
\r
168 ctrl.ID = baseControl.ClientID;
\r
169 ctrl.CopyBaseAttributes(baseControl);
\r
170 ctrl.ApplyStyle(controlStyle);
\r
171 ctrl.RenderBeginTag(writer);
\r
180 writer.RenderBeginTag(HtmlTextWriterTag.Tr);
\r
183 colSpan = colsCount;
\r
185 colSpan += colsCount;
\r
186 writer.AddAttribute(HtmlTextWriterAttribute.Colspan, colSpan.ToString(NumberFormatInfo.InvariantInfo));
\r
189 if (UseAccessibleHeader)
\r
190 writer.AddAttribute("scope", "col", false);
\r
193 itemStyle = user.GetItemStyle(ListItemType.Header, -1);
\r
194 if(itemStyle != null)
\r
196 itemStyle.AddAttributesToRender(writer);
\r
199 if (UseAccessibleHeader)
\r
200 writer.RenderBeginTag(HtmlTextWriterTag.Th);
\r
202 writer.RenderBeginTag(HtmlTextWriterTag.Td);
\r
204 writer.RenderBeginTag(HtmlTextWriterTag.Td);
\r
207 user.RenderItem(ListItemType.Header, -1, this, writer);
\r
210 writer.RenderEndTag();
\r
211 writer.RenderEndTag();
\r
216 writer.WriteFullBeginTag("br");
\r
224 int diff = colsCount - (rowsCount*colsCount - total);
\r
226 while(rowIndex < rowsCount)
\r
229 writer.RenderBeginTag(HtmlTextWriterTag.Tr);
\r
231 while(colIndex < colsCount)
\r
233 if (rowIndex == rowsCount-1 && colIndex >= diff)
\r
236 if (colIndex < diff)
\r
237 index = rowIndex + colIndex * rowsCount;
\r
239 index = rowIndex + colIndex * (rowsCount-1) + diff;
\r
245 itemStyle = user.GetItemStyle(ListItemType.Item, index);
\r
246 if(itemStyle != null)
\r
248 itemStyle.AddAttributesToRender(writer);
\r
250 writer.RenderBeginTag(HtmlTextWriterTag.Td);
\r
252 user.RenderItem(ListItemType.Item, index, this, writer);
\r
254 writer.RenderEndTag();
\r
255 if(hasSeps && index != (total - 1))
\r
257 if(isTable && colsCount == 1)
\r
259 writer.RenderEndTag();
\r
260 writer.RenderBeginTag(HtmlTextWriterTag.Tr);
\r
263 writer.WriteFullBeginTag("br");
\r
267 itemStyle = user.GetItemStyle(ListItemType.Separator, index);
\r
268 if(itemStyle != null)
\r
269 itemStyle.AddAttributesToRender(writer);
\r
270 writer.RenderBeginTag(HtmlTextWriterTag.Td);
\r
272 user.RenderItem(ListItemType.Separator, index, this, writer);
\r
274 writer.RenderEndTag();
\r
280 writer.RenderEndTag();
\r
282 if((rowIndex != (rowsCount - 1) || user.HasFooter) && !outerTableImp)
\r
283 writer.WriteFullBeginTag("br");
\r
290 writer.RenderBeginTag(HtmlTextWriterTag.Tr);
\r
293 writer.AddAttribute(HtmlTextWriterAttribute.Colspan, colSpan.ToString(NumberFormatInfo.InvariantInfo));
\r
295 itemStyle = user.GetItemStyle(ListItemType.Footer, -1);
\r
296 if(itemStyle != null)
\r
298 itemStyle.AddAttributesToRender(writer);
\r
300 writer.RenderBeginTag(HtmlTextWriterTag.Td);
\r
302 user.RenderItem(ListItemType.Footer, -1, this, writer);
\r
305 writer.RenderEndTag();
\r
306 writer.RenderEndTag();
\r
311 ctrl.RenderEndTag(writer);
\r
315 private void DoHorizontalRendering (HtmlTextWriter writer,
\r
316 IRepeatInfoUser user,
\r
317 Style controlStyle,
\r
318 WebControl baseControl)
\r
320 /* Based on DoVerticalRendering */
\r
321 int total = user.RepeatedItemCount;
\r
324 WebControl ctrl = null;
\r
325 bool isTable = true;
\r
326 bool hasSeps = user.HasSeparators;
\r
327 if (!outerTableImp){
\r
328 isTable = (RepeatLayout == RepeatLayout.Table);
\r
331 ctrl = new Table ();
\r
333 if (Caption.Length != 0)
\r
335 ((Table) ctrl).CaptionAlign = CaptionAlign;
\r
336 ((Table) ctrl).Caption = Caption;
\r
341 ctrl = new WebControl (HtmlTextWriterTag.Span);
\r
342 ctrl.ID = baseControl.ClientID;
\r
343 ctrl.CopyBaseAttributes (baseControl);
\r
344 ctrl.ApplyStyle (controlStyle);
\r
345 ctrl.RenderBeginTag (writer);
\r
350 if (user.HasHeader){
\r
352 writer.RenderBeginTag (HtmlTextWriterTag.Tr);
\r
353 if (colsCount != 1){
\r
354 colSpan = colsCount;
\r
356 colSpan += colsCount;
\r
357 writer.AddAttribute (HtmlTextWriterAttribute.Colspan,
\r
358 colSpan.ToString (NumberFormatInfo.InvariantInfo));
\r
361 if (UseAccessibleHeader)
\r
362 writer.AddAttribute("scope", "col", false);
\r
364 itemStyle = user.GetItemStyle (ListItemType.Header, -1);
\r
365 if (itemStyle != null)
\r
366 itemStyle.AddAttributesToRender (writer);
\r
368 if (UseAccessibleHeader)
\r
369 writer.RenderBeginTag(HtmlTextWriterTag.Th);
\r
371 writer.RenderBeginTag(HtmlTextWriterTag.Td);
\r
373 writer.RenderBeginTag (HtmlTextWriterTag.Td);
\r
377 user.RenderItem (ListItemType.Header, -1, this, writer);
\r
380 writer.RenderEndTag();
\r
381 writer.RenderEndTag();
\r
382 } else if (repeatColumns < user.RepeatedItemCount)
\r
383 writer.WriteFullBeginTag ("br");
\r
386 for (int index = 0; index < total; index++){
\r
387 if (isTable && index == 0)
\r
388 writer.RenderBeginTag (HtmlTextWriterTag.Tr);
\r
391 itemStyle = user.GetItemStyle (ListItemType.Item, index);
\r
392 if (itemStyle != null)
\r
393 itemStyle.AddAttributesToRender(writer);
\r
394 writer.RenderBeginTag(HtmlTextWriterTag.Td);
\r
397 user.RenderItem(ListItemType.Item, index, this, writer);
\r
399 writer.RenderEndTag ();
\r
401 if (hasSeps && index != (total - 1)){
\r
403 itemStyle = user.GetItemStyle (ListItemType.Separator, index);
\r
404 if (itemStyle != null)
\r
405 itemStyle.AddAttributesToRender (writer);
\r
406 writer.RenderBeginTag (HtmlTextWriterTag.Td);
\r
408 user.RenderItem (ListItemType.Separator, index, this, writer);
\r
410 writer.RenderEndTag ();
\r
414 if (colsCount == repeatColumns) {
\r
416 writer.RenderEndTag ();
\r
417 writer.RenderBeginTag (HtmlTextWriterTag.Tr);
\r
419 else if (rowsCount < total)
\r
420 writer.WriteFullBeginTag ("br");
\r
424 if (index == (total - 1)) {
\r
426 writer.RenderEndTag ();
\r
427 else if (rowsCount < total)
\r
428 writer.WriteFullBeginTag ("br");
\r
432 if (user.HasFooter){
\r
434 writer.RenderBeginTag (HtmlTextWriterTag.Tr);
\r
435 if (colsCount != 1)
\r
436 writer.AddAttribute (HtmlTextWriterAttribute.Colspan,
\r
437 colSpan.ToString(NumberFormatInfo.InvariantInfo));
\r
439 itemStyle = user.GetItemStyle (ListItemType.Footer, -1);
\r
440 if(itemStyle != null)
\r
441 itemStyle.AddAttributesToRender (writer);
\r
442 writer.RenderBeginTag (HtmlTextWriterTag.Td);
\r
444 user.RenderItem (ListItemType.Footer, -1, this, writer);
\r
446 writer.RenderEndTag ();
\r
447 writer.RenderEndTag ();
\r
452 ctrl.RenderEndTag(writer);
\r
457 public string Caption
\r
459 get {return caption;}
\r
460 set { caption = value; }
\r
463 public TableCaptionAlign CaptionAlign
\r
465 get {return captionAlign;}
\r
466 set { captionAlign = value; }
\r
471 public bool UseAccessibleHeader
\r
473 get {return useAccessibleHeader;}
\r
474 set { useAccessibleHeader = value; }
\r