* RepeatInfo.cs: When doing horizontal rendering use the repeat
[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 = true;\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                                 } else\r
127                                 {\r
128                                         ctrl = new WebControl(HtmlTextWriterTag.Span);\r
129                                         isTable = false;\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(rowsCount != 1)\r
149                                         {\r
150                                                 colSpan = rowsCount;\r
151                                                 if(hasSeps)\r
152                                                         colSpan += rowsCount;\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                         while(rowIndex < rowsCount)\r
180                         {\r
181                                 if(isTable)\r
182                                         writer.RenderBeginTag(HtmlTextWriterTag.Tr);\r
183                                 colIndex = 0;\r
184                                 while(colIndex < colsCount)\r
185                                 {\r
186                                         index = rowIndex + colIndex * rowsCount;\r
187                                         if(index < total)\r
188                                         {\r
189                                                 if(isTable)\r
190                                                 {\r
191                                                         itemStyle = user.GetItemStyle(ListItemType.Item, index);\r
192                                                         if(itemStyle != null)\r
193                                                         {\r
194                                                                 itemStyle.AddAttributesToRender(writer);\r
195                                                         }\r
196                                                         writer.RenderBeginTag(HtmlTextWriterTag.Td);\r
197                                                 }\r
198                                                 user.RenderItem(ListItemType.Item, index, this, writer);\r
199                                                 if(isTable)\r
200                                                         writer.RenderEndTag();\r
201                                                 if(hasSeps && index != (total - 1))\r
202                                                 {\r
203                                                         if(colsCount == 1)\r
204                                                         {\r
205                                                                 writer.RenderEndTag();\r
206                                                                 writer.RenderBeginTag(HtmlTextWriterTag.Tr);\r
207                                                         } else\r
208                                                         {\r
209                                                                 writer.WriteFullBeginTag("br");\r
210                                                         }\r
211                                                         if(isTable)\r
212                                                         {\r
213                                                                 itemStyle = user.GetItemStyle(ListItemType.Separator, index);\r
214                                                                 if(itemStyle != null)\r
215                                                                         itemStyle.AddAttributesToRender(writer);\r
216                                                                 writer.RenderBeginTag(HtmlTextWriterTag.Td);\r
217                                                         }\r
218                                                         if(index < total)\r
219                                                                 user.RenderItem(ListItemType.Separator, index, this, writer);\r
220                                                         if(isTable)\r
221                                                                 writer.RenderEndTag();\r
222                                                 }\r
223                                         }\r
224                                         colIndex++;\r
225                                 }\r
226                                 if(isTable)\r
227                                         writer.RenderEndTag();\r
228                                 else\r
229                                         if(rowIndex != (rowsCount - 1) || (user.HasFooter && !outerTableImp))\r
230                                                 writer.WriteFullBeginTag("br");\r
231                                 rowIndex++;\r
232                         }\r
233                         if(user.HasFooter)\r
234                         {\r
235                                 if(isTable)\r
236                                 {\r
237                                         writer.RenderBeginTag(HtmlTextWriterTag.Tr);\r
238                                         if(colsCount != 1)\r
239                                         {\r
240                                                 writer.AddAttribute(HtmlTextWriterAttribute.Colspan, colSpan.ToString(NumberFormatInfo.InvariantInfo));\r
241                                         }\r
242                                         itemStyle = user.GetItemStyle(ListItemType.Footer, -1);\r
243                                         if(itemStyle != null)\r
244                                         {\r
245                                                 itemStyle.AddAttributesToRender(writer);\r
246                                         }\r
247                                         writer.RenderBeginTag(HtmlTextWriterTag.Td);\r
248                                 }\r
249                                 user.RenderItem(ListItemType.Footer, -1, this, writer);\r
250                                 if(isTable)\r
251                                 {\r
252                                         writer.RenderEndTag();\r
253                                         writer.RenderEndTag();\r
254                                 }\r
255                         }\r
256                         if(ctrl != null)\r
257                         {\r
258                                 ctrl.RenderEndTag(writer);\r
259                         }\r
260                 }\r
261 \r
262                 private void DoHorizontalRendering (HtmlTextWriter writer,\r
263                                                     IRepeatInfoUser user,\r
264                                                     Style controlStyle,\r
265                                                     WebControl baseControl)\r
266                 {\r
267                         /* Based on DoVerticalRendering */\r
268                         int total = user.RepeatedItemCount;\r
269                         int colsCount = 0;\r
270                         int rowsCount = 0;\r
271                         WebControl ctrl = null;\r
272                         bool isTable = true;\r
273                         bool hasSeps = user.HasSeparators;\r
274                         if (!outerTableImp){\r
275                                 isTable = (RepeatLayout == RepeatLayout.Table);\r
276                                 ctrl = (isTable) ? new Table () : new WebControl (HtmlTextWriterTag.Span);\r
277                                 ctrl.ID = baseControl.ClientID;\r
278                                 ctrl.CopyBaseAttributes (baseControl);\r
279                                 ctrl.ApplyStyle (controlStyle);\r
280                                 ctrl.RenderBeginTag (writer);\r
281                         }\r
282 \r
283                         Style itemStyle;\r
284                         int colSpan = 0;\r
285                         if (user.HasHeader){\r
286                                 if (isTable){\r
287                                         writer.RenderBeginTag (HtmlTextWriterTag.Tr);\r
288                                         if (rowsCount != 1){\r
289                                                 colSpan = rowsCount;\r
290                                                 if (hasSeps)\r
291                                                         colSpan += rowsCount;\r
292                                                 writer.AddAttribute (HtmlTextWriterAttribute.Colspan,\r
293                                                      colSpan.ToString (NumberFormatInfo.InvariantInfo));\r
294                                         }\r
295                                         itemStyle = user.GetItemStyle (ListItemType.Header, -1);\r
296                                         if (itemStyle != null)\r
297                                                 itemStyle.AddAttributesToRender (writer);\r
298                                         writer.RenderBeginTag (HtmlTextWriterTag.Td);\r
299                                 }\r
300 \r
301                                 user.RenderItem (ListItemType.Header, -1, this, writer);\r
302                                 \r
303                                 if (isTable){\r
304                                         writer.RenderEndTag();\r
305                                         writer.RenderEndTag();\r
306                                 } else if (!outerTableImp)\r
307                                                 writer.WriteFullBeginTag ("br");\r
308                         }\r
309 \r
310                         for (int index = 0; index < total; index++){\r
311                                 if (isTable && index == 0)\r
312                                         writer.RenderBeginTag (HtmlTextWriterTag.Tr);\r
313 \r
314                                 if (isTable){\r
315                                         itemStyle = user.GetItemStyle (ListItemType.Item, index);\r
316                                         if (itemStyle != null)\r
317                                                 itemStyle.AddAttributesToRender(writer);\r
318                                         writer.RenderBeginTag(HtmlTextWriterTag.Td);\r
319                                 }\r
320 \r
321                                 user.RenderItem(ListItemType.Item, index, this, writer);\r
322                                 if (isTable)\r
323                                         writer.RenderEndTag ();\r
324 \r
325                                 if (hasSeps && index != (total - 1)){\r
326                                         if (isTable){\r
327                                                 itemStyle = user.GetItemStyle (ListItemType.Separator, index);\r
328                                                 if (itemStyle != null)\r
329                                                         itemStyle.AddAttributesToRender (writer);\r
330                                                 writer.RenderBeginTag (HtmlTextWriterTag.Td);\r
331                                         }\r
332                                         user.RenderItem (ListItemType.Separator, index, this, writer);\r
333                                         if (isTable)\r
334                                                 writer.RenderEndTag ();\r
335                                 }\r
336 \r
337                                 colsCount++;\r
338                                 if (colsCount == repeatColumns) {\r
339                                         if (isTable) {\r
340                                                 writer.RenderEndTag ();\r
341                                                 writer.RenderBeginTag (HtmlTextWriterTag.Tr);\r
342                                         }\r
343                                         else if (rowsCount < total)\r
344                                                 writer.WriteFullBeginTag ("br");\r
345                                         colsCount = 0;\r
346                                 }\r
347 \r
348                                 if (index == (total - 1)) {\r
349                                         if (isTable)\r
350                                                 writer.RenderEndTag ();\r
351                                         else if (rowsCount < total)\r
352                                                 writer.WriteFullBeginTag ("br");\r
353                                 }\r
354                         }\r
355 \r
356                         if (user.HasFooter){\r
357                                 if (isTable){\r
358                                         writer.RenderBeginTag (HtmlTextWriterTag.Tr);\r
359                                         if (colsCount != 1)\r
360                                                 writer.AddAttribute (HtmlTextWriterAttribute.Colspan,\r
361                                                         colSpan.ToString(NumberFormatInfo.InvariantInfo));\r
362 \r
363                                         itemStyle = user.GetItemStyle (ListItemType.Footer, -1);\r
364                                         if(itemStyle != null)\r
365                                                 itemStyle.AddAttributesToRender (writer);\r
366                                         writer.RenderBeginTag (HtmlTextWriterTag.Td);\r
367                                 }\r
368                                 user.RenderItem (ListItemType.Footer, -1, this, writer);\r
369                                 if (isTable){\r
370                                         writer.RenderEndTag ();\r
371                                         writer.RenderEndTag ();\r
372                                 }\r
373                         }\r
374 \r
375                         if (ctrl != null)\r
376                                 ctrl.RenderEndTag(writer);\r
377                 }\r
378         }\r
379 }\r