Implement accessibility features for NET_1_1 configuration.
[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 #if NET_1_1\r
49                 private string caption = "";\r
50                 private TableCaptionAlign captionAlign = TableCaptionAlign.NotSet;\r
51                 private  bool useAccessibleHeader = false;\r
52 #endif\r
53 \r
54                 public RepeatInfo()\r
55                 {\r
56                         outerTableImp   = false;\r
57                         repeatColumns   = 0;\r
58                         repeatDirection = RepeatDirection.Vertical;\r
59                         repeatLayout    = RepeatLayout.Table;\r
60                 }\r
61 \r
62                 public bool OuterTableImplied\r
63                 {\r
64                         get\r
65                         {\r
66                                 return outerTableImp;\r
67                         }\r
68                         set\r
69                         {\r
70                                 outerTableImp = value;\r
71                         }\r
72                 }\r
73 \r
74                 public int RepeatColumns\r
75                 {\r
76                         get\r
77                         {\r
78                                 return repeatColumns;\r
79                         }\r
80                         set\r
81                         {\r
82                                 repeatColumns = value;\r
83                         }\r
84                 }\r
85 \r
86                 public RepeatDirection RepeatDirection\r
87                 {\r
88                         get\r
89                         {\r
90                                 return repeatDirection;\r
91                         }\r
92                         set\r
93                         {\r
94                                 if(!Enum.IsDefined(typeof(RepeatDirection), value))\r
95                                         throw new ArgumentException();\r
96                                 repeatDirection = value;\r
97                         }\r
98                 }\r
99 \r
100                 public RepeatLayout RepeatLayout\r
101                 {\r
102                         get\r
103                         {\r
104                                 return repeatLayout;\r
105                         }\r
106                         set\r
107                         {\r
108                                 if(!Enum.IsDefined(typeof(RepeatLayout), value))\r
109                                         throw new ArgumentException();\r
110                                 repeatLayout = value;\r
111                         }\r
112                 }\r
113 \r
114                 public void RenderRepeater(HtmlTextWriter writer, IRepeatInfoUser user, Style controlStyle, WebControl baseControl)\r
115                 {\r
116                         if(RepeatDirection == RepeatDirection.Vertical)\r
117                         {\r
118                                 DoVerticalRendering(writer, user, controlStyle, baseControl);\r
119                         } else\r
120                         {\r
121                                 DoHorizontalRendering(writer, user, controlStyle, baseControl);\r
122                         }\r
123                 }\r
124 \r
125                 private void DoVerticalRendering(HtmlTextWriter writer, IRepeatInfoUser user, Style controlStyle, WebControl baseControl)\r
126                 {\r
127                         int total = user.RepeatedItemCount;\r
128                         int colsCount;\r
129                         int rowsCount;\r
130                         if(repeatColumns == 0 || repeatColumns==1)\r
131                         {\r
132                                 colsCount = 1;\r
133                                 rowsCount = total;\r
134                         } else\r
135                         {\r
136                                 colsCount = repeatColumns;\r
137                                 rowsCount = (total + repeatColumns - 1) / repeatColumns;\r
138                                 if(rowsCount ==0 && total != 0)\r
139                                 {\r
140                                         rowsCount = 1;\r
141                                         colsCount = total;\r
142                                 }\r
143                         }\r
144                         WebControl ctrl = null;\r
145                         bool isTable = false;\r
146                         bool hasSeps = user.HasSeparators;\r
147                         if(!outerTableImp)\r
148                         {\r
149                                 if(RepeatLayout == RepeatLayout.Table)\r
150                                 {\r
151                                         ctrl = new Table();\r
152 #if NET_1_1\r
153                                         if (Caption.Length != 0)\r
154                                         {\r
155                                                 ((Table) ctrl).CaptionAlign = CaptionAlign;\r
156                                                 ((Table) ctrl).Caption = Caption;                                               \r
157                                         }\r
158 #endif\r
159                                         isTable = true;\r
160                                 } else\r
161                                 {\r
162                                         ctrl = new WebControl(HtmlTextWriterTag.Span);\r
163                                 }\r
164                         }\r
165 \r
166                         if(ctrl != null)\r
167                         {\r
168                                 ctrl.ID = baseControl.ClientID;\r
169                                 ctrl.CopyBaseAttributes(baseControl);\r
170                                 ctrl.ApplyStyle(controlStyle);\r
171                                 ctrl.RenderBeginTag(writer);\r
172                         }\r
173 \r
174                         Style itemStyle;\r
175                         int colSpan = 0;\r
176                         if(user.HasHeader)\r
177                         {\r
178                                 if(isTable)\r
179                                 {\r
180                                         writer.RenderBeginTag(HtmlTextWriterTag.Tr);\r
181                                         if(colsCount != 1)\r
182                                         {\r
183                                                 colSpan = colsCount;\r
184                                                 if(hasSeps)\r
185                                                         colSpan += colsCount;\r
186                                                 writer.AddAttribute(HtmlTextWriterAttribute.Colspan, colSpan.ToString(NumberFormatInfo.InvariantInfo));\r
187                                         }\r
188 #if NET_1_1\r
189                                         if (UseAccessibleHeader)                                        \r
190                                                 writer.AddAttribute("scope", "col", false);\r
191  \r
192 #endif\r
193                                         itemStyle = user.GetItemStyle(ListItemType.Header, -1);\r
194                                         if(itemStyle != null)\r
195                                         {\r
196                                                 itemStyle.AddAttributesToRender(writer);\r
197                                         }\r
198 #if NET_1_1\r
199                                         if (UseAccessibleHeader)\r
200                                                 writer.RenderBeginTag(HtmlTextWriterTag.Th);\r
201                                         else\r
202                                                 writer.RenderBeginTag(HtmlTextWriterTag.Td);\r
203 #else\r
204                                         writer.RenderBeginTag(HtmlTextWriterTag.Td);\r
205 #endif\r
206                                 }\r
207                                 user.RenderItem(ListItemType.Header, -1, this, writer);\r
208                                 if(isTable)\r
209                                 {\r
210                                         writer.RenderEndTag();\r
211                                         writer.RenderEndTag();\r
212                                 } else\r
213                                 {\r
214                                         if(!outerTableImp)\r
215                                         {\r
216                                                 writer.WriteFullBeginTag("br");\r
217                                         }\r
218                                 }\r
219                         }\r
220 \r
221                         int rowIndex = 0;\r
222                         int colIndex = 0;\r
223                         int index = 0;\r
224                         int diff = colsCount - (rowsCount*colsCount - total);\r
225                         \r
226                         while(rowIndex < rowsCount)\r
227                         {\r
228                                 if(isTable)\r
229                                         writer.RenderBeginTag(HtmlTextWriterTag.Tr);\r
230                                 colIndex = 0;\r
231                                 while(colIndex < colsCount)\r
232                                 {\r
233                                         if (rowIndex == rowsCount-1 && colIndex >= diff)\r
234                                                 break;\r
235                                         \r
236                                         if (colIndex < diff)\r
237                                                 index = rowIndex + colIndex * rowsCount;\r
238                                         else\r
239                                                 index = rowIndex + colIndex * (rowsCount-1) + diff;\r
240 \r
241                                         if(index < total)\r
242                                         {\r
243                                                 if(isTable)\r
244                                                 {\r
245                                                         itemStyle = user.GetItemStyle(ListItemType.Item, index);\r
246                                                         if(itemStyle != null)\r
247                                                         {\r
248                                                                 itemStyle.AddAttributesToRender(writer);\r
249                                                         }\r
250                                                         writer.RenderBeginTag(HtmlTextWriterTag.Td);\r
251                                                 }\r
252                                                 user.RenderItem(ListItemType.Item, index, this, writer);\r
253                                                 if(isTable)\r
254                                                         writer.RenderEndTag();\r
255                                                 if(hasSeps && index != (total - 1))\r
256                                                 {\r
257                                                         if(isTable && colsCount == 1)\r
258                                                         {\r
259                                                                 writer.RenderEndTag();\r
260                                                                 writer.RenderBeginTag(HtmlTextWriterTag.Tr);\r
261                                                         } else\r
262                                                         {\r
263                                                                 writer.WriteFullBeginTag("br");\r
264                                                         }\r
265                                                         if(isTable)\r
266                                                         {\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
271                                                         }\r
272                                                         user.RenderItem(ListItemType.Separator, index, this, writer);\r
273                                                         if(isTable)\r
274                                                                 writer.RenderEndTag();\r
275                                                 }\r
276                                         }\r
277                                         colIndex++;\r
278                                 }\r
279                                 if(isTable)\r
280                                         writer.RenderEndTag();\r
281                                 else\r
282                                         if((rowIndex != (rowsCount - 1) || user.HasFooter) && !outerTableImp)\r
283                                                 writer.WriteFullBeginTag("br");\r
284                                 rowIndex++;\r
285                         }\r
286                         if(user.HasFooter)\r
287                         {\r
288                                 if(isTable)\r
289                                 {\r
290                                         writer.RenderBeginTag(HtmlTextWriterTag.Tr);\r
291                                         if(colsCount != 1)\r
292                                         {\r
293                                                 writer.AddAttribute(HtmlTextWriterAttribute.Colspan, colSpan.ToString(NumberFormatInfo.InvariantInfo));\r
294                                         }\r
295                                         itemStyle = user.GetItemStyle(ListItemType.Footer, -1);\r
296                                         if(itemStyle != null)\r
297                                         {\r
298                                                 itemStyle.AddAttributesToRender(writer);\r
299                                         }\r
300                                         writer.RenderBeginTag(HtmlTextWriterTag.Td);\r
301                                 }\r
302                                 user.RenderItem(ListItemType.Footer, -1, this, writer);\r
303                                 if(isTable)\r
304                                 {\r
305                                         writer.RenderEndTag();\r
306                                         writer.RenderEndTag();\r
307                                 }\r
308                         }\r
309                         if(ctrl != null)\r
310                         {\r
311                                 ctrl.RenderEndTag(writer);\r
312                         }\r
313                 }\r
314 \r
315                 private void DoHorizontalRendering (HtmlTextWriter writer,\r
316                                                     IRepeatInfoUser user,\r
317                                                     Style controlStyle,\r
318                                                     WebControl baseControl)\r
319                 {\r
320                         /* Based on DoVerticalRendering */\r
321                         int total = user.RepeatedItemCount;\r
322                         int colsCount = 0;\r
323                         int rowsCount = 0;\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
329                                 if (isTable)\r
330                                 {\r
331                                         ctrl = new Table ();\r
332 #if NET_1_1\r
333                                         if (Caption.Length != 0)\r
334                                         {\r
335                                                 ((Table) ctrl).CaptionAlign = CaptionAlign;\r
336                                                 ((Table) ctrl).Caption = Caption; \r
337                                         }\r
338 #endif\r
339                                 }\r
340                                 else \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
346                         }\r
347 \r
348                         Style itemStyle;\r
349                         int colSpan = 0;\r
350                         if (user.HasHeader){\r
351                                 if (isTable){\r
352                                         writer.RenderBeginTag (HtmlTextWriterTag.Tr);\r
353                                         if (colsCount != 1){\r
354                                                 colSpan = colsCount;\r
355                                                 if (hasSeps)\r
356                                                         colSpan += colsCount;\r
357                                                 writer.AddAttribute (HtmlTextWriterAttribute.Colspan,\r
358                                                      colSpan.ToString (NumberFormatInfo.InvariantInfo));\r
359                                         }\r
360 #if NET_1_1\r
361                                         if (UseAccessibleHeader)\r
362                                                 writer.AddAttribute("scope", "col", false);\r
363 #endif\r
364                                         itemStyle = user.GetItemStyle (ListItemType.Header, -1);\r
365                                         if (itemStyle != null)\r
366                                                 itemStyle.AddAttributesToRender (writer);\r
367 #if NET_1_1\r
368                                         if (UseAccessibleHeader)\r
369                                                 writer.RenderBeginTag(HtmlTextWriterTag.Th);\r
370                                         else\r
371                                                 writer.RenderBeginTag(HtmlTextWriterTag.Td);\r
372 #else\r
373                                         writer.RenderBeginTag (HtmlTextWriterTag.Td);\r
374 #endif\r
375                                 }\r
376 \r
377                                 user.RenderItem (ListItemType.Header, -1, this, writer);\r
378                                 \r
379                                 if (isTable){\r
380                                         writer.RenderEndTag();\r
381                                         writer.RenderEndTag();\r
382                                 } else if (repeatColumns < user.RepeatedItemCount)\r
383                                                 writer.WriteFullBeginTag ("br");\r
384                         }\r
385 \r
386                         for (int index = 0; index < total; index++){\r
387                                 if (isTable && index == 0)\r
388                                         writer.RenderBeginTag (HtmlTextWriterTag.Tr);\r
389 \r
390                                 if (isTable){\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
395                                 }\r
396 \r
397                                 user.RenderItem(ListItemType.Item, index, this, writer);\r
398                                 if (isTable)\r
399                                         writer.RenderEndTag ();\r
400 \r
401                                 if (hasSeps && index != (total - 1)){\r
402                                         if (isTable){\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
407                                         }\r
408                                         user.RenderItem (ListItemType.Separator, index, this, writer);\r
409                                         if (isTable)\r
410                                                 writer.RenderEndTag ();\r
411                                 }\r
412 \r
413                                 colsCount++;\r
414                                 if (colsCount == repeatColumns) {\r
415                                         if (isTable) {\r
416                                                 writer.RenderEndTag ();\r
417                                                 writer.RenderBeginTag (HtmlTextWriterTag.Tr);\r
418                                         }\r
419                                         else if (rowsCount < total)\r
420                                                 writer.WriteFullBeginTag ("br");\r
421                                         colsCount = 0;\r
422                                 }\r
423 \r
424                                 if (index == (total - 1)) {\r
425                                         if (isTable)\r
426                                                 writer.RenderEndTag ();\r
427                                         else if (rowsCount < total)\r
428                                                 writer.WriteFullBeginTag ("br");\r
429                                 }\r
430                         }\r
431 \r
432                         if (user.HasFooter){\r
433                                 if (isTable){\r
434                                         writer.RenderBeginTag (HtmlTextWriterTag.Tr);\r
435                                         if (colsCount != 1)\r
436                                                 writer.AddAttribute (HtmlTextWriterAttribute.Colspan,\r
437                                                         colSpan.ToString(NumberFormatInfo.InvariantInfo));\r
438 \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
443                                 }\r
444                                 user.RenderItem (ListItemType.Footer, -1, this, writer);\r
445                                 if (isTable){\r
446                                         writer.RenderEndTag ();\r
447                                         writer.RenderEndTag ();\r
448                                 }\r
449                         }\r
450 \r
451                         if (ctrl != null)\r
452                                 ctrl.RenderEndTag(writer);\r
453                 }\r
454 \r
455 #if NET_1_1\r
456 \r
457                 public string Caption\r
458                 {\r
459                         get {return caption;}\r
460                         set { caption = value; }\r
461                 }\r
462 \r
463                 public TableCaptionAlign CaptionAlign\r
464                 {\r
465                         get {return captionAlign;}\r
466                         set { captionAlign = value; }\r
467                 }\r
468 \r
469                 \r
470 \r
471                 public bool UseAccessibleHeader\r
472                 {\r
473                         get {return useAccessibleHeader;}\r
474                         set { useAccessibleHeader = value; }            \r
475                 }\r
476 #endif\r
477         }\r
478 }\r