2002-01-31 Gaurav vaish <gvaish@iitk.ac.in>
[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:  90%\r
10  * \r
11  * (C) Gaurav Vaish (2002)\r
12  */\r
13 \r
14 using System;\r
15 using System.Web;\r
16 using System.Web.UI;\r
17 \r
18 namespace System.Web.UI.WebControls\r
19 {\r
20         public sealed class RepeatInfo\r
21         {\r
22                 private bool            outerTableImp;\r
23                 private int             repeatColumns;\r
24                 private RepeatDirection repeatDirection;\r
25                 private RepeatLayout    repeatLayout;\r
26                 \r
27                 public RepeatInfo()\r
28                 {\r
29                         outerTableImp   = false;\r
30                         repeatColumns   = 0;\r
31                         repeatDirection = RepeatDirection.Vertical;\r
32                         repeatLayout    = RepeatLayout.Table;\r
33                 }\r
34                 \r
35                 public bool OuterTableImplied\r
36                 {\r
37                         get\r
38                         {\r
39                                 return outerTableImp;\r
40                         }\r
41                         set\r
42                         {\r
43                                 outerTableImp = value;\r
44                         }\r
45                 }\r
46                 \r
47                 public int RepeatColumns\r
48                 {\r
49                         get\r
50                         {\r
51                                 return repeatColumns;\r
52                         }\r
53                         set\r
54                         {\r
55                                 repeatColumns = value;\r
56                         }\r
57                 }\r
58                 \r
59                 public RepeatDirection RepeatDirection\r
60                 {\r
61                         get\r
62                         {\r
63                                 return repeatDirection;\r
64                         }\r
65                         set\r
66                         {\r
67                                 if(!Enum.IsDefined(typeof(RepeatDirection), value))\r
68                                         throw new ArgumentException();\r
69                                 repeatDirection = value;\r
70                         }\r
71                 }\r
72                 \r
73                 public RepeatLayout RepeatLayout\r
74                 {\r
75                         get\r
76                         {\r
77                                 return repeatLayout;\r
78                         }\r
79                         set\r
80                         {\r
81                                 if(!Enum.IsDefined(typeof(RepeatLayout), value))\r
82                                         throw new ArgumentException();\r
83                                 repeatLayout = value;\r
84                         }\r
85                 }\r
86                 \r
87                 public void RenderRepeater(HtmlTextWriter writer, IRepeatInfoUser user, Style controlStyle, WebControl baseControl)\r
88                 {\r
89                         if(RepeatDirection == RepeatDirection.Vertical)\r
90                         {\r
91                                 DoVerticalRendering(writer, user, controlStyle, basecontrol);\r
92                         } else\r
93                         {\r
94                                 DoHorizontalRendering(writer, user, controlStyle, basecontrol);\r
95                         }\r
96                 }\r
97                 \r
98                 private void DoVerticalRendering(HtmlTextWriter writer, IRepeatInfoUser user, Style controlStyle, WebControl baseControl)\r
99                 {\r
100                         int total = user.RepeatedItemCount;\r
101                         int colsCount;\r
102                         int rowsCount;\r
103                         if(repeatColumns == 0 || repeatColumns==1)\r
104                         {\r
105                                 colsCount = 1;\r
106                                 rowsCount = total;\r
107                         } else\r
108                         {\r
109                                 colsCount = repeatColumns;\r
110                                 rowsCount = (total + repeatColumns - 1) / repeatColumns;\r
111                                 if(rowsCount ==0 && total != 0)\r
112                                 {\r
113                                         rowsCount = 1;\r
114                                         colsCount = total;\r
115                                 }\r
116                         }\r
117                         WebControl ctrl = null;\r
118                         bool isTable = true;\r
119                         bool hasSeps = user.HasSeparators;\r
120                         if(!outerTableImpl)\r
121                         {\r
122                                 if(RepeatLayout == RepeatLayout.Table)\r
123                                 {\r
124                                         ctrl = new Table();\r
125                                 } else\r
126                                 {\r
127                                         ctrl = new WebControl(HtmlTextWriterTag.Span);\r
128                                         isTable = false;\r
129                                 }\r
130                         }\r
131                         \r
132                         if(ctrl != null)\r
133                         {\r
134                                 ctrl.ID = baseControl.ClientID;\r
135                                 ctrl.CopyBaseAttributes(baseControl);\r
136                                 ctrl.ApplyControlStyle(controlStyle);\r
137                                 ctrl.RenderBeginTag(writer);\r
138                         }\r
139                         \r
140                         Style itemStyle;\r
141                         int colSpan = 0;\r
142                         if(user.HasHeader)\r
143                         {\r
144                                 if(isTable)\r
145                                 {\r
146                                         writer.RenderBeginTag(HtmlTextWriterTag.Tr);\r
147                                         if(rowsCount != 1)\r
148                                         {\r
149                                                 colSpan = rowsCount;\r
150                                                 if(hasSeps)\r
151                                                         colSpan += rowsCount;\r
152                                                 writer.AddAttribute(HtmlTextWriterAttribute.Colspan, colSpan.ToString(NumberFormatInfo.InvariantInfo));\r
153                                         }\r
154                                         itemStyle = user.GetItemStyle(ListItemType.Header, -1);\r
155                                         if(itemStyle != null)\r
156                                         {\r
157                                                 itemStyle.AddAttributesToRender(writer);\r
158                                         }\r
159                                         writer.RenderBeginTag(HtmlTextWriterTag.Td);\r
160                                 }\r
161                                 user.RenderItem(ListItemType.Header, -1, this, writer);\r
162                                 if(isTable)\r
163                                 {\r
164                                         writer.RenderEndTag();\r
165                                         writer.RenderEndTag();\r
166                                 } else\r
167                                 {\r
168                                         if(!outerTableImp)\r
169                                         {\r
170                                                 writer.WriteFullBeginTag("br");\r
171                                         }\r
172                                 }\r
173                         }\r
174                         \r
175                         int rowIndex = 0;\r
176                         int colIndex = 0;\r
177                         int index = 0;\r
178                         while(rowIndex < rowsCount)\r
179                         {\r
180                                 if(isTable)\r
181                                         writer.RenderBeginTag(HtmlTextWriterTag.Tr);\r
182                                 colIndex = 0;\r
183                                 while(colIndex < colCount)\r
184                                 {\r
185                                         index = rowIndex + colIndex * rowsCount;\r
186                                         if(index < total)\r
187                                         {\r
188                                                 if(isTable)\r
189                                                 {\r
190                                                         itemStyle = user.GetItemStyle(ListItemType.Item, index);\r
191                                                         if(itemStyle != null)\r
192                                                         {\r
193                                                                 itemStyle.AddAttributesToRender(writer);\r
194                                                         }\r
195                                                         writer.RenderBeginTag(HtmlTextWriterTag.Td);\r
196                                                 }\r
197                                                 user.RenderItem(ListItemType.Item, index, this, writer);\r
198                                                 if(isTable)\r
199                                                         writer.RenderEndTag();\r
200                                                 if(hasSeps && index != (total - 1))\r
201                                                 {\r
202                                                         if(colsCount == 1)\r
203                                                         {\r
204                                                                 writer.RenderEndTag();\r
205                                                                 writer.RenderBeginTag(HtmlTextWriterTag.Tr);\r
206                                                         } else\r
207                                                         {\r
208                                                                 writer.WriteFullBeginTag("br");\r
209                                                         }\r
210                                                         if(isTable)\r
211                                                         {\r
212                                                                 itemStyle = user.GetItemStyle(ListItemType.Separator, index);\r
213                                                                 if(itemStyle != null)\r
214                                                                         itemStyle.AddAttributesToRender(writer);\r
215                                                                 writer.RenderBeginTag(HtmlTextWriterTag.Td);\r
216                                                         }\r
217                                                         if(index < total)\r
218                                                                 user.RenderItem(ListItemType.Separator, index, this, writer);\r
219                                                         if(isTable)\r
220                                                                 writer.RenderEndTag();\r
221                                                 }\r
222                                         }\r
223                                         colIndex++;\r
224                                 }\r
225                                 if(isTable)\r
226                                         writer.RenderEndTag();\r
227                                 else\r
228                                         if(rowIndex != (rowCount - 1) || (user.hasFooter && !outerTableImp))\r
229                                                 writer.WriteFullBeginTag("br");\r
230                                 rowIndex++;\r
231                         }\r
232                         if(user.HasFooter)\r
233                         {\r
234                                 if(isTable)\r
235                                 {\r
236                                         writer.RenderBeginTag(HtmlTextWriterTag.Tr);\r
237                                         if(colsCount != 1)\r
238                                         {\r
239                                                 writer.AddAttribute(HtmlTextWriterAttribute.Colspan, colSpan.ToString(NumberFormatInfo.InvariantInfo));\r
240                                         }\r
241                                         itemStyle = user.GetItemStyle(ListItemType.Footer, -1);\r
242                                         if(itemStyle != null)\r
243                                         {\r
244                                                 itemStyle.AddAttributesToRender(writer);\r
245                                         }\r
246                                         writer.RenderBeginTag(HtmlTextWriterTag.Td);\r
247                                 }\r
248                                 user.RenderItem(ListItemType.Footer, -1, this, writer);\r
249                                 if(isTable)\r
250                                 {\r
251                                         writer.RenderEndTag();\r
252                                         writer.RenderEndTag();\r
253                                 }\r
254                         }\r
255                         if(ctrl != null)\r
256                         {\r
257                                 ctrl.RenderEndTag(writer);\r
258                         }\r
259                 }\r
260                 \r
261                 private void DoHorizontalRendering(HtmlTextWriter writer, IRepeatInfoUser user, Style controlStyle, WebControl baseControl)\r
262                 {\r
263                         \r
264                 }\r
265         }\r
266 }\r