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