2004-05-26 Gonzalo Paniagua Javier <gonzalo@ximian.com>
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / RepeatInfo.cs
1 /**\r
2  * Namespace: System.Web.UI.WebControls\r
3  * Class:     RepeatInfo\r
4  *\r
5  * Author:  Gaurav Vaish\r
6  * Maintainer: gvaish@iitk.ac.in\r
7  * Contact: <my_scripts2001@yahoo.com>, <gvaish@iitk.ac.in>\r
8  * Implementation: yes\r
9  * Status:  100%\r
10  *\r
11  * (C) Gaurav Vaish (2002)\r
12  */\r
13 \r
14 using System;\r
15 using System.Globalization;\r
16 using System.Web;\r
17 using System.Web.UI;\r
18 \r
19 namespace System.Web.UI.WebControls\r
20 {\r
21         public sealed class RepeatInfo\r
22         {\r
23                 private bool            outerTableImp;\r
24                 private int             repeatColumns;\r
25                 private RepeatDirection repeatDirection;\r
26                 private RepeatLayout    repeatLayout;\r
27 \r
28                 public RepeatInfo()\r
29                 {\r
30                         outerTableImp   = false;\r
31                         repeatColumns   = 0;\r
32                         repeatDirection = RepeatDirection.Vertical;\r
33                         repeatLayout    = RepeatLayout.Table;\r
34                 }\r
35 \r
36                 public bool OuterTableImplied\r
37                 {\r
38                         get\r
39                         {\r
40                                 return outerTableImp;\r
41                         }\r
42                         set\r
43                         {\r
44                                 outerTableImp = value;\r
45                         }\r
46                 }\r
47 \r
48                 public int RepeatColumns\r
49                 {\r
50                         get\r
51                         {\r
52                                 return repeatColumns;\r
53                         }\r
54                         set\r
55                         {\r
56                                 repeatColumns = value;\r
57                         }\r
58                 }\r
59 \r
60                 public RepeatDirection RepeatDirection\r
61                 {\r
62                         get\r
63                         {\r
64                                 return repeatDirection;\r
65                         }\r
66                         set\r
67                         {\r
68                                 if(!Enum.IsDefined(typeof(RepeatDirection), value))\r
69                                         throw new ArgumentException();\r
70                                 repeatDirection = value;\r
71                         }\r
72                 }\r
73 \r
74                 public RepeatLayout RepeatLayout\r
75                 {\r
76                         get\r
77                         {\r
78                                 return repeatLayout;\r
79                         }\r
80                         set\r
81                         {\r
82                                 if(!Enum.IsDefined(typeof(RepeatLayout), value))\r
83                                         throw new ArgumentException();\r
84                                 repeatLayout = value;\r
85                         }\r
86                 }\r
87 \r
88                 public void RenderRepeater(HtmlTextWriter writer, IRepeatInfoUser user, Style controlStyle, WebControl baseControl)\r
89                 {\r
90                         if(RepeatDirection == RepeatDirection.Vertical)\r
91                         {\r
92                                 DoVerticalRendering(writer, user, controlStyle, baseControl);\r
93                         } else\r
94                         {\r
95                                 DoHorizontalRendering(writer, user, controlStyle, baseControl);\r
96                         }\r
97                 }\r
98 \r
99                 private void DoVerticalRendering(HtmlTextWriter writer, IRepeatInfoUser user, Style controlStyle, WebControl baseControl)\r
100                 {\r
101                         int total = user.RepeatedItemCount;\r
102                         int colsCount;\r
103                         int rowsCount;\r
104                         if(repeatColumns == 0 || repeatColumns==1)\r
105                         {\r
106                                 colsCount = 1;\r
107                                 rowsCount = total;\r
108                         } else\r
109                         {\r
110                                 colsCount = repeatColumns;\r
111                                 rowsCount = (total + repeatColumns - 1) / repeatColumns;\r
112                                 if(rowsCount ==0 && total != 0)\r
113                                 {\r
114                                         rowsCount = 1;\r
115                                         colsCount = total;\r
116                                 }\r
117                         }\r
118                         WebControl ctrl = null;\r
119                         bool isTable = false;\r
120                         bool hasSeps = user.HasSeparators;\r
121                         if(!outerTableImp)\r
122                         {\r
123                                 if(RepeatLayout == RepeatLayout.Table)\r
124                                 {\r
125                                         ctrl = new Table();\r
126                                         isTable = true;\r
127                                 } else\r
128                                 {\r
129                                         ctrl = new WebControl(HtmlTextWriterTag.Span);\r
130                                 }\r
131                         }\r
132 \r
133                         if(ctrl != null)\r
134                         {\r
135                                 ctrl.ID = baseControl.ClientID;\r
136                                 ctrl.CopyBaseAttributes(baseControl);\r
137                                 ctrl.ApplyStyle(controlStyle);\r
138                                 ctrl.RenderBeginTag(writer);\r
139                         }\r
140 \r
141                         Style itemStyle;\r
142                         int colSpan = 0;\r
143                         if(user.HasHeader)\r
144                         {\r
145                                 if(isTable)\r
146                                 {\r
147                                         writer.RenderBeginTag(HtmlTextWriterTag.Tr);\r
148                                         if(colsCount != 1)\r
149                                         {\r
150                                                 colSpan = colsCount;\r
151                                                 if(hasSeps)\r
152                                                         colSpan += colsCount;\r
153                                                 writer.AddAttribute(HtmlTextWriterAttribute.Colspan, colSpan.ToString(NumberFormatInfo.InvariantInfo));\r
154                                         }\r
155                                         itemStyle = user.GetItemStyle(ListItemType.Header, -1);\r
156                                         if(itemStyle != null)\r
157                                         {\r
158                                                 itemStyle.AddAttributesToRender(writer);\r
159                                         }\r
160                                         writer.RenderBeginTag(HtmlTextWriterTag.Td);\r
161                                 }\r
162                                 user.RenderItem(ListItemType.Header, -1, this, writer);\r
163                                 if(isTable)\r
164                                 {\r
165                                         writer.RenderEndTag();\r
166                                         writer.RenderEndTag();\r
167                                 } else\r
168                                 {\r
169                                         if(!outerTableImp)\r
170                                         {\r
171                                                 writer.WriteFullBeginTag("br");\r
172                                         }\r
173                                 }\r
174                         }\r
175 \r
176                         int rowIndex = 0;\r
177                         int colIndex = 0;\r
178                         int index = 0;\r
179                         int diff = colsCount - (rowsCount*colsCount - total);\r
180                         \r
181                         while(rowIndex < rowsCount)\r
182                         {\r
183                                 if(isTable)\r
184                                         writer.RenderBeginTag(HtmlTextWriterTag.Tr);\r
185                                 colIndex = 0;\r
186                                 while(colIndex < colsCount)\r
187                                 {\r
188                                         if (rowIndex == rowsCount-1 && colIndex >= diff)\r
189                                                 break;\r
190                                         \r
191                                         if (colIndex < diff)\r
192                                                 index = rowIndex + colIndex * rowsCount;\r
193                                         else\r
194                                                 index = rowIndex + colIndex * (rowsCount-1) + diff;\r
195 \r
196                                         if(index < total)\r
197                                         {\r
198                                                 if(isTable)\r
199                                                 {\r
200                                                         itemStyle = user.GetItemStyle(ListItemType.Item, index);\r
201                                                         if(itemStyle != null)\r
202                                                         {\r
203                                                                 itemStyle.AddAttributesToRender(writer);\r
204                                                         }\r
205                                                         writer.RenderBeginTag(HtmlTextWriterTag.Td);\r
206                                                 }\r
207                                                 user.RenderItem(ListItemType.Item, index, this, writer);\r
208                                                 if(isTable)\r
209                                                         writer.RenderEndTag();\r
210                                                 if(hasSeps && index != (total - 1))\r
211                                                 {\r
212                                                         if(colsCount == 1)\r
213                                                         {\r
214                                                                 writer.RenderEndTag();\r
215                                                                 writer.RenderBeginTag(HtmlTextWriterTag.Tr);\r
216                                                         } else\r
217                                                         {\r
218                                                                 writer.WriteFullBeginTag("br");\r
219                                                         }\r
220                                                         if(isTable)\r
221                                                         {\r
222                                                                 itemStyle = user.GetItemStyle(ListItemType.Separator, index);\r
223                                                                 if(itemStyle != null)\r
224                                                                         itemStyle.AddAttributesToRender(writer);\r
225                                                                 writer.RenderBeginTag(HtmlTextWriterTag.Td);\r
226                                                         }\r
227                                                         user.RenderItem(ListItemType.Separator, index, this, writer);\r
228                                                         if(isTable)\r
229                                                                 writer.RenderEndTag();\r
230                                                 }\r
231                                         }\r
232                                         colIndex++;\r
233                                 }\r
234                                 if(isTable)\r
235                                         writer.RenderEndTag();\r
236                                 else\r
237                                         if((rowIndex != (rowsCount - 1) || user.HasFooter) && !outerTableImp)\r
238                                                 writer.WriteFullBeginTag("br");\r
239                                 rowIndex++;\r
240                         }\r
241                         if(user.HasFooter)\r
242                         {\r
243                                 if(isTable)\r
244                                 {\r
245                                         writer.RenderBeginTag(HtmlTextWriterTag.Tr);\r
246                                         if(colsCount != 1)\r
247                                         {\r
248                                                 writer.AddAttribute(HtmlTextWriterAttribute.Colspan, colSpan.ToString(NumberFormatInfo.InvariantInfo));\r
249                                         }\r
250                                         itemStyle = user.GetItemStyle(ListItemType.Footer, -1);\r
251                                         if(itemStyle != null)\r
252                                         {\r
253                                                 itemStyle.AddAttributesToRender(writer);\r
254                                         }\r
255                                         writer.RenderBeginTag(HtmlTextWriterTag.Td);\r
256                                 }\r
257                                 user.RenderItem(ListItemType.Footer, -1, this, writer);\r
258                                 if(isTable)\r
259                                 {\r
260                                         writer.RenderEndTag();\r
261                                         writer.RenderEndTag();\r
262                                 }\r
263                         }\r
264                         if(ctrl != null)\r
265                         {\r
266                                 ctrl.RenderEndTag(writer);\r
267                         }\r
268                 }\r
269 \r
270                 private void DoHorizontalRendering (HtmlTextWriter writer,\r
271                                                     IRepeatInfoUser user,\r
272                                                     Style controlStyle,\r
273                                                     WebControl baseControl)\r
274                 {\r
275                         /* Based on DoVerticalRendering */\r
276                         int total = user.RepeatedItemCount;\r
277                         int colsCount = 0;\r
278                         int rowsCount = 0;\r
279                         WebControl ctrl = null;\r
280                         bool isTable = true;\r
281                         bool hasSeps = user.HasSeparators;\r
282                         if (!outerTableImp){\r
283                                 isTable = (RepeatLayout == RepeatLayout.Table);\r
284                                 ctrl = (isTable) ? new Table () : new WebControl (HtmlTextWriterTag.Span);\r
285                                 ctrl.ID = baseControl.ClientID;\r
286                                 ctrl.CopyBaseAttributes (baseControl);\r
287                                 ctrl.ApplyStyle (controlStyle);\r
288                                 ctrl.RenderBeginTag (writer);\r
289                         }\r
290 \r
291                         Style itemStyle;\r
292                         int colSpan = 0;\r
293                         if (user.HasHeader){\r
294                                 if (isTable){\r
295                                         writer.RenderBeginTag (HtmlTextWriterTag.Tr);\r
296                                         if (colsCount != 1){\r
297                                                 colSpan = colsCount;\r
298                                                 if (hasSeps)\r
299                                                         colSpan += colsCount;\r
300                                                 writer.AddAttribute (HtmlTextWriterAttribute.Colspan,\r
301                                                      colSpan.ToString (NumberFormatInfo.InvariantInfo));\r
302                                         }\r
303                                         itemStyle = user.GetItemStyle (ListItemType.Header, -1);\r
304                                         if (itemStyle != null)\r
305                                                 itemStyle.AddAttributesToRender (writer);\r
306                                         writer.RenderBeginTag (HtmlTextWriterTag.Td);\r
307                                 }\r
308 \r
309                                 user.RenderItem (ListItemType.Header, -1, this, writer);\r
310                                 \r
311                                 if (isTable){\r
312                                         writer.RenderEndTag();\r
313                                         writer.RenderEndTag();\r
314                                 } else if (repeatColumns < user.RepeatedItemCount)\r
315                                                 writer.WriteFullBeginTag ("br");\r
316                         }\r
317 \r
318                         for (int index = 0; index < total; index++){\r
319                                 if (isTable && index == 0)\r
320                                         writer.RenderBeginTag (HtmlTextWriterTag.Tr);\r
321 \r
322                                 if (isTable){\r
323                                         itemStyle = user.GetItemStyle (ListItemType.Item, index);\r
324                                         if (itemStyle != null)\r
325                                                 itemStyle.AddAttributesToRender(writer);\r
326                                         writer.RenderBeginTag(HtmlTextWriterTag.Td);\r
327                                 }\r
328 \r
329                                 user.RenderItem(ListItemType.Item, index, this, writer);\r
330                                 if (isTable)\r
331                                         writer.RenderEndTag ();\r
332 \r
333                                 if (hasSeps && index != (total - 1)){\r
334                                         if (isTable){\r
335                                                 itemStyle = user.GetItemStyle (ListItemType.Separator, index);\r
336                                                 if (itemStyle != null)\r
337                                                         itemStyle.AddAttributesToRender (writer);\r
338                                                 writer.RenderBeginTag (HtmlTextWriterTag.Td);\r
339                                         }\r
340                                         user.RenderItem (ListItemType.Separator, index, this, writer);\r
341                                         if (isTable)\r
342                                                 writer.RenderEndTag ();\r
343                                 }\r
344 \r
345                                 colsCount++;\r
346                                 if (colsCount == repeatColumns) {\r
347                                         if (isTable) {\r
348                                                 writer.RenderEndTag ();\r
349                                                 writer.RenderBeginTag (HtmlTextWriterTag.Tr);\r
350                                         }\r
351                                         else if (rowsCount < total)\r
352                                                 writer.WriteFullBeginTag ("br");\r
353                                         colsCount = 0;\r
354                                 }\r
355 \r
356                                 if (index == (total - 1)) {\r
357                                         if (isTable)\r
358                                                 writer.RenderEndTag ();\r
359                                         else if (rowsCount < total)\r
360                                                 writer.WriteFullBeginTag ("br");\r
361                                 }\r
362                         }\r
363 \r
364                         if (user.HasFooter){\r
365                                 if (isTable){\r
366                                         writer.RenderBeginTag (HtmlTextWriterTag.Tr);\r
367                                         if (colsCount != 1)\r
368                                                 writer.AddAttribute (HtmlTextWriterAttribute.Colspan,\r
369                                                         colSpan.ToString(NumberFormatInfo.InvariantInfo));\r
370 \r
371                                         itemStyle = user.GetItemStyle (ListItemType.Footer, -1);\r
372                                         if(itemStyle != null)\r
373                                                 itemStyle.AddAttributesToRender (writer);\r
374                                         writer.RenderBeginTag (HtmlTextWriterTag.Td);\r
375                                 }\r
376                                 user.RenderItem (ListItemType.Footer, -1, this, writer);\r
377                                 if (isTable){\r
378                                         writer.RenderEndTag ();\r
379                                         writer.RenderEndTag ();\r
380                                 }\r
381                         }\r
382 \r
383                         if (ctrl != null)\r
384                                 ctrl.RenderEndTag(writer);\r
385                 }\r
386         }\r
387 }\r