KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > alfresco > web > ui > common > renderer > data > RichListRenderer


1 /*
2  * Copyright (C) 2005 Alfresco, Inc.
3  *
4  * Licensed under the Mozilla Public License version 1.1
5  * with a permitted attribution clause. You may obtain a
6  * copy of the License at
7  *
8  * http://www.alfresco.org/legal/license.txt
9  *
10  * Unless required by applicable law or agreed to in writing,
11  * software distributed under the License is distributed on an
12  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
13  * either express or implied. See the License for the specific
14  * language governing permissions and limitations under the
15  * License.
16  */

17 package org.alfresco.web.ui.common.renderer.data;
18
19 import java.io.IOException JavaDoc;
20 import java.util.ArrayList JavaDoc;
21 import java.util.Iterator JavaDoc;
22 import java.util.List JavaDoc;
23 import java.util.Map JavaDoc;
24
25 import javax.faces.component.UIComponent;
26 import javax.faces.context.FacesContext;
27 import javax.faces.context.ResponseWriter;
28
29 import org.alfresco.web.ui.common.Utils;
30 import org.alfresco.web.ui.common.component.data.UIColumn;
31 import org.alfresco.web.ui.common.component.data.UIRichList;
32 import org.alfresco.web.ui.common.renderer.BaseRenderer;
33 import org.apache.commons.logging.Log;
34 import org.apache.commons.logging.LogFactory;
35
36 /**
37  * @author kevinr
38  */

39 public class RichListRenderer extends BaseRenderer
40 {
41    // ------------------------------------------------------------------------------
42
// Renderer implemenation
43

44    /**
45     * @see javax.faces.render.Renderer#encodeBegin(javax.faces.context.FacesContext, javax.faces.component.UIComponent)
46     */

47    public void encodeBegin(FacesContext context, UIComponent component)
48          throws IOException JavaDoc
49    {
50       // always check for this flag - as per the spec
51
if (component.isRendered() == true)
52       {
53          ResponseWriter out = context.getResponseWriter();
54          Map JavaDoc attrs = component.getAttributes();
55          out.write("<table cellspacing=0 cellpadding=0");
56          outputAttribute(out, attrs.get("styleClass"), "class");
57          outputAttribute(out, attrs.get("style"), "style");
58          outputAttribute(out, attrs.get("width"), "width");
59          out.write(">");
60       }
61    }
62    
63    /**
64     * @see javax.faces.render.Renderer#encodeChildren(javax.faces.context.FacesContext, javax.faces.component.UIComponent)
65     */

66    public void encodeChildren(FacesContext context, UIComponent component)
67          throws IOException JavaDoc
68    {
69       if (component.isRendered() == true)
70       {
71          // the RichList component we are working with
72
UIRichList richList = (UIRichList)component;
73          
74          // prepare the component current row against the current page settings
75
richList.bind();
76          
77          // collect child column components so they can be passed to the renderer
78
List JavaDoc<UIColumn> columnList = new ArrayList JavaDoc<UIColumn>(8);
79          for (Iterator JavaDoc i=richList.getChildren().iterator(); i.hasNext(); /**/)
80          {
81             UIComponent child = (UIComponent)i.next();
82             if (child instanceof UIColumn)
83             {
84                columnList.add((UIColumn)child);
85             }
86          }
87          
88          UIColumn[] columns = new UIColumn[columnList.size()];
89          columnList.toArray(columns);
90          
91          // get the renderer instance
92
IRichListRenderer renderer = (IRichListRenderer)richList.getViewRenderer();
93          if (renderer == null)
94          {
95             throw new IllegalStateException JavaDoc("IRichListRenderer must be available in UIRichList!");
96          }
97          
98          // call render-before to output headers if required
99
ResponseWriter out = context.getResponseWriter();
100          out.write("<thead>");
101          renderer.renderListBefore(context, richList, columns);
102          out.write("</thead>");
103          out.write("<tbody>");
104          if (richList.isDataAvailable() == true)
105          {
106             while (richList.isDataAvailable() == true)
107             {
108                // render each row in turn
109
renderer.renderListRow(context, richList, columns, richList.nextRow());
110             }
111          }
112          else
113          {
114             // if no items present, render the facet with the "no items found" message
115
UIComponent emptyComponent = richList.getEmptyMessage();
116             if (emptyComponent != null)
117             {
118                emptyComponent.encodeBegin(context);
119                emptyComponent.encodeChildren(context);
120                emptyComponent.encodeEnd(context);
121             }
122          }
123          // call render-after to output footers if required
124
renderer.renderListAfter(context, richList, columns);
125          out.write("</tbody>");
126       }
127    }
128    
129    /**
130     * @see javax.faces.render.Renderer#encodeEnd(javax.faces.context.FacesContext, javax.faces.component.UIComponent)
131     */

132    public void encodeEnd(FacesContext context, UIComponent component)
133          throws IOException JavaDoc
134    {
135       // always check for this flag - as per the spec
136
if (component.isRendered() == true)
137       {
138          ResponseWriter out = context.getResponseWriter();
139          out.write("</table>");
140       }
141    }
142    
143    /**
144     * @see javax.faces.render.Renderer#getRendersChildren()
145     */

146    public boolean getRendersChildren()
147    {
148       // we are responsible for rendering our child components
149
// this renderer is a valid use of this mode - it can render the various
150
// column descriptors as a number of different list view types e.g.
151
// details, icons, list etc.
152
return true;
153    }
154    
155    
156    // ------------------------------------------------------------------------------
157
// Inner classes
158

159    /**
160     * Class to implement a Details view for the RichList component
161     *
162     * @author kevinr
163     */

164    public static class DetailsViewRenderer implements IRichListRenderer
165    {
166       public static final String JavaDoc VIEWMODEID = "details";
167       
168       /**
169        * @see org.alfresco.web.ui.common.renderer.data.IRichListRenderer#getViewModeID()
170        */

171       public String JavaDoc getViewModeID()
172       {
173          return VIEWMODEID;
174       }
175
176       /**
177        * @see org.alfresco.web.ui.common.renderer.data.IRichListRenderer#renderListBefore(javax.faces.context.FacesContext, org.alfresco.web.ui.common.component.data.UIColumn[])
178        */

179       public void renderListBefore(FacesContext context, UIRichList richList, UIColumn[] columns)
180             throws IOException JavaDoc
181       {
182          ResponseWriter out = context.getResponseWriter();
183          
184          // render column headers as labels
185
out.write("<tr");
186          outputAttribute(out, richList.getAttributes().get("headerStyleClass"), "class");
187          out.write('>');
188          for (int i=0; i<columns.length; i++)
189          {
190             UIColumn column = columns[i];
191             
192             if (column.isRendered() == true)
193             {
194                // render column header tag
195
out.write("<th");
196                outputAttribute(out, column.getAttributes().get("width"), "width");
197                outputAttribute(out, column.getAttributes().get("style"), "style");
198                outputAttribute(out, column.getAttributes().get("styleClass"), "class");
199                out.write('>');
200                
201                // output the header facet if any
202
UIComponent header = column.getHeader();
203                if (header != null)
204                {
205                   header.encodeBegin(context);
206                   if (header.getRendersChildren())
207                   {
208                      header.encodeChildren(context);
209                   }
210                   header.encodeEnd(context);
211                }
212                
213                // we don't render child controls for the header row
214
out.write("</th>");
215             }
216          }
217          out.write("</tr>");
218          
219          this.rowIndex = 0;
220       }
221       
222       /**
223        * @see org.alfresco.web.ui.common.renderer.data.IRichListRenderer#renderListRow(javax.faces.context.FacesContext, org.alfresco.web.ui.common.component.data.UIColumn[], java.lang.Object)
224        */

225       public void renderListRow(FacesContext context, UIRichList richList, UIColumn[] columns, Object JavaDoc row)
226             throws IOException JavaDoc
227       {
228          ResponseWriter out = context.getResponseWriter();
229          
230          // output row or alt style row if set
231
out.write("<tr");
232          String JavaDoc rowStyle = (String JavaDoc)richList.getAttributes().get("rowStyleClass");
233          String JavaDoc altStyle = (String JavaDoc)richList.getAttributes().get("altRowStyleClass");
234          if (altStyle != null && (this.rowIndex++ & 1) == 1)
235          {
236             rowStyle = altStyle;
237          }
238          outputAttribute(out, rowStyle, "class");
239          out.write('>');
240          
241          // find the actions column if it exists
242
UIColumn actionsColumn = null;
243          for (int i=0; i<columns.length; i++)
244          {
245             if (columns[i].isRendered() == true && columns[i].getActions() == true)
246             {
247                actionsColumn = columns[i];
248                break;
249             }
250          }
251          
252          // output each column in turn and render all children
253
boolean renderedFirst = false;
254          for (int i=0; i<columns.length; i++)
255          {
256             UIColumn column = columns[i];
257             
258             if (column.isRendered() == true)
259             {
260                out.write("<td");
261                outputAttribute(out, column.getAttributes().get("style"), "style");
262                outputAttribute(out, column.getAttributes().get("styleClass"), "class");
263                out.write('>');
264                
265                // for details view, we show the small column icon for the first column
266
if (renderedFirst == false)
267                {
268                   UIComponent smallIcon = column.getSmallIcon();
269                   if (smallIcon != null)
270                   {
271                      smallIcon.encodeBegin(context);
272                      if (smallIcon.getRendersChildren())
273                      {
274                         smallIcon.encodeChildren(context);
275                      }
276                      smallIcon.encodeEnd(context);
277                      out.write("&nbsp;");
278                   }
279                   renderedFirst = true;
280                }
281                
282                if (column.getChildCount() != 0)
283                {
284                   if (column == actionsColumn)
285                   {
286                      out.write("<nobr>");
287                   }
288                   
289                   // allow child controls inside the columns to render themselves
290
Utils.encodeRecursive(context, column);
291                   
292                   if (column == actionsColumn)
293                   {
294                      out.write("</nobr>");
295                   }
296                }
297                
298                out.write("</td>");
299             }
300          }
301          out.write("</tr>");
302       }
303       
304       /**
305        * @see org.alfresco.web.ui.common.renderer.data.IRichListRenderer#renderListAfter(javax.faces.context.FacesContext, org.alfresco.web.ui.common.component.data.UIColumn[])
306        */

307       public void renderListAfter(FacesContext context, UIRichList richList, UIColumn[] columns)
308             throws IOException JavaDoc
309       {
310          ResponseWriter out = context.getResponseWriter();
311          
312          out.write("<tr><td colspan=99 align=right>");
313          for (Iterator JavaDoc i=richList.getChildren().iterator(); i.hasNext(); /**/)
314          {
315             // output all remaining child components that are not UIColumn
316
UIComponent child = (UIComponent)i.next();
317             if (child instanceof UIColumn == false)
318             {
319                Utils.encodeRecursive(context, child);
320             }
321          }
322          out.write("</td></tr>");
323       }
324       
325       private int rowIndex = 0;
326    }
327    
328    
329    /**
330     * Class to implement a List view for the RichList component
331     *
332     * @author kevinr
333     */

334    public static class ListViewRenderer implements IRichListRenderer
335    {
336       // maximum displayable textual lines within a single item cell
337
private final static int MAX_DISPLAYABLE_LINES = 3;
338       
339       private final static String JavaDoc END_ROW_SEPARATOR = "</tr><tr><td colspan=10><div style='padding:3px'></div></td></tr>";
340       private final static String JavaDoc COLUMN_SPACER = "<td><div style='padding-left:8px'></div></td>";
341       
342       public static final String JavaDoc VIEWMODEID = "list";
343       
344       /**
345        * @see org.alfresco.web.ui.common.renderer.data.IRichListRenderer#getViewModeID()
346        */

347       public String JavaDoc getViewModeID()
348       {
349          return VIEWMODEID;
350       }
351       
352       /**
353        * @see org.alfresco.web.ui.common.renderer.data.IRichListRenderer#renderListBefore(javax.faces.context.FacesContext, org.alfresco.web.ui.common.component.data.UIColumn[])
354        */

355       public void renderListBefore(FacesContext context, UIRichList richList, UIColumn[] columns)
356             throws IOException JavaDoc
357       {
358 // ResponseWriter out = context.getResponseWriter();
359

360          // render column headers as labels
361
// TODO: add "showHeaders" to RichList to allow hiding of header facets for some view modes
362
/*
363          out.write("<tr");
364          outputAttribute(out, richList.getAttributes().get("headerStyleClass"), "class");
365          out.write('>');
366          for (int i=0; i<columns.length; i++)
367          {
368             UIColumn column = columns[i];
369             
370             if (column.isRendered() == true)
371             {
372                out.write("<th");
373                outputAttribute(out, column.getAttributes().get("width"), "width");
374                outputAttribute(out, column.getAttributes().get("style"), "style");
375                outputAttribute(out, column.getAttributes().get("styleClass"), "class");
376                out.write('>');
377                
378                // output the header facet if any
379                UIComponent header = column.getHeader();
380                if (header != null)
381                {
382                   header.encodeBegin(context);
383                   header.encodeChildren(context);
384                   header.encodeEnd(context);
385                }
386             }
387             
388             // we don't render child controls for the header row
389             out.write("</th>");
390          }
391          out.write("</tr>");
392          */

393          
394          this.rowIndex = 0;
395       }
396       
397       /**
398        * @see org.alfresco.web.ui.common.renderer.data.IRichListRenderer#renderListRow(javax.faces.context.FacesContext, org.alfresco.web.ui.common.component.data.UIColumn[], java.lang.Object)
399        */

400       public void renderListRow(FacesContext context, UIRichList richList, UIColumn[] columns, Object JavaDoc row) throws IOException JavaDoc
401       {
402          ResponseWriter out = context.getResponseWriter();
403          
404          // start new row if we are on an even column in this view
405
// we show 2 columns, left to right
406
String JavaDoc rowStyle = (String JavaDoc)richList.getAttributes().get("rowStyleClass");
407          if ((this.rowIndex & 1) == 0)
408          {
409             out.write("<tr");
410             outputAttribute(out, rowStyle, "class");
411             out.write('>');
412          }
413          
414          // find the actions column if it exists
415
// and the primary column (which must exist)
416
UIColumn primaryColumn = null;
417          UIColumn actionsColumn = null;
418          for (int i=0; i<columns.length; i++)
419          {
420             if (columns[i].isRendered() == true)
421             {
422                if (columns[i].getPrimary() == true)
423                {
424                   primaryColumn = columns[i];
425                }
426                else if (columns[i].getActions() == true)
427                {
428                   actionsColumn = columns[i];
429                }
430             }
431          }
432          if (primaryColumn == null)
433          {
434             logger.warn("No primary column found for RichList definition: " + richList.getId());
435          }
436          
437          // get the icon from the primary column
438
out.write("<td width=50%><table cellspacing=0 cellpadding=2 border=0>");
439          if (primaryColumn != null)
440          {
441             UIColumn column = primaryColumn;
442             
443             if (column.isRendered() == true)
444             {
445                out.write("<tr><td rowspan=10");
446                outputAttribute(out, column.getAttributes().get("style"), "style");
447                outputAttribute(out, column.getAttributes().get("styleClass"), "class");
448                out.write('>');
449                
450                // output the large icon for this column
451
UIComponent icon = column.getLargeIcon();
452                if (icon != null)
453                {
454                   icon.encodeBegin(context);
455                   if (icon.getRendersChildren())
456                   {
457                      icon.encodeChildren(context);
458                   }
459                   icon.encodeEnd(context);
460                }
461                out.write("</td>");
462                
463                // start the next cell which contains the first column component
464
out.write("<td width=100%");
465                outputAttribute(out, column.getAttributes().get("style"), "style");
466                outputAttribute(out, column.getAttributes().get("styleClass"), "class");
467                out.write('>');
468                if (column.getChildCount() != 0)
469                {
470                   // allow child controls inside the column to render themselves
471
Utils.encodeRecursive(context, column);
472                }
473                out.write("</td>");
474                
475                // output actions column if any
476
if (actionsColumn != null)
477                {
478                   out.write("<td");
479                   outputAttribute(out, actionsColumn.getAttributes().get("style"), "style");
480                   outputAttribute(out, actionsColumn.getAttributes().get("styleClass"), "class");
481                   out.write("><nobr>");
482                   
483                   if (actionsColumn.getChildCount() != 0)
484                   {
485                      // allow child controls inside the columns to render themselves
486
Utils.encodeRecursive(context, actionsColumn);
487                   }
488                   out.write("</nobr></td>");
489                }
490                
491                out.write("</tr>");
492             }
493          }
494          
495          // render remaining columns as lines of data up to a max display limit
496
for (int i = 0; i < columns.length; i++)
497          {
498             UIColumn column = columns[i];
499             
500             int count = 1;
501             if (column.isRendered() == true && count < MAX_DISPLAYABLE_LINES &&
502                 column.getActions() == false && column.getPrimary() == false)
503             {
504                // output row or alt style row if set
505
out.write("<tr valign=top");
506                outputAttribute(out, rowStyle, "class");
507                out.write("><td colspan=2"); // render into above actions column
508
outputAttribute(out, column.getAttributes().get("style"), "style");
509                outputAttribute(out, column.getAttributes().get("styleClass"), "class");
510                out.write('>');
511                if (column.getChildCount() != 0)
512                {
513                   // allow child controls inside the columns to render themselves
514
Utils.encodeRecursive(context, column);
515                }
516                // end this cell and end row
517
out.write("</td></tr>");
518                
519                count++;
520             }
521          }
522          
523          out.write("</table></td>");
524          
525          if ((this.rowIndex & 1) == 1)
526          {
527             // end row and output a blank padding row/div
528
out.write(END_ROW_SEPARATOR);
529          }
530          else
531          {
532             out.write(COLUMN_SPACER);
533          }
534          
535          this.rowIndex++;
536       }
537       
538       /**
539        * @see org.alfresco.web.ui.common.renderer.data.IRichListRenderer#renderListAfter(javax.faces.context.FacesContext, org.alfresco.web.ui.common.component.data.UIColumn[])
540        */

541       public void renderListAfter(FacesContext context, UIRichList richList, UIColumn[] columns)
542             throws IOException JavaDoc
543       {
544          ResponseWriter out = context.getResponseWriter();
545          
546          // finish last row if required (we used an open-ended column rendering algorithm)
547
if ( ((this.rowIndex-1) & 1) != 1)
548          {
549             out.write(END_ROW_SEPARATOR);
550          }
551          
552          out.write("<tr><td colspan=99 align=right>");
553          for (Iterator JavaDoc i=richList.getChildren().iterator(); i.hasNext(); /**/)
554          {
555             // output all remaining child components that are not UIColumn
556
UIComponent child = (UIComponent)i.next();
557             if (child instanceof UIColumn == false)
558             {
559                Utils.encodeRecursive(context, child);
560             }
561          }
562          out.write("</td></tr>");
563       }
564       
565       private int rowIndex = 0;
566    }
567    
568    
569    /**
570     * Class to implement an Icon view for the RichList component
571     *
572     * @author kevinr
573     */

574    public static class IconViewRenderer implements IRichListRenderer
575    {
576       // number of vertical columns to render before starting new row
577
private final static int COLUMNS = 3;
578       
579       // calculation for percentage of table row per column
580
private final static String JavaDoc COLUMN_PERCENT = Integer.toString(100/COLUMNS) + "%";
581       
582       // maximum displayable textual lines within a single item cell
583
private final static int MAX_DISPLAYABLE_LINES = 3;
584       
585       private final static String JavaDoc END_ROW_SEPARATOR = "</tr><tr><td colspan=10><div style='padding:3px'></div></td></tr>";
586       
587       public static final String JavaDoc VIEWMODEID = "icons";
588       
589       /**
590        * @see org.alfresco.web.ui.common.renderer.data.IRichListRenderer#getViewModeID()
591        */

592       public String JavaDoc getViewModeID()
593       {
594          return VIEWMODEID;
595       }
596       
597       /**
598        * @see org.alfresco.web.ui.common.renderer.data.IRichListRenderer#renderListBefore(javax.faces.context.FacesContext, org.alfresco.web.ui.common.component.data.UIColumn[])
599        */

600       public void renderListBefore(FacesContext context, UIRichList richList, UIColumn[] columns)
601             throws IOException JavaDoc
602       {
603          // no headers for this renderer
604
this.rowIndex = 0;
605       }
606       
607       /**
608        * @see org.alfresco.web.ui.common.renderer.data.IRichListRenderer#renderListRow(javax.faces.context.FacesContext, org.alfresco.web.ui.common.component.data.UIColumn[], java.lang.Object)
609        */

610       public void renderListRow(FacesContext context, UIRichList richList, UIColumn[] columns, Object JavaDoc row)
611             throws IOException JavaDoc
612       {
613          ResponseWriter out = context.getResponseWriter();
614          
615          // start new row as per number of columns in this icon view
616
if (this.rowIndex % COLUMNS == 0)
617          {
618             out.write("<tr");
619             outputAttribute(out, richList.getAttributes().get("rowStyleClass"), "class");
620             out.write('>');
621          }
622          
623          // find primary column (which must exist)
624
UIColumn primaryColumn = null;
625          for (int i=0; i<columns.length; i++)
626          {
627             if (columns[i].isRendered() == true && columns[i].getPrimary() == true)
628             {
629                primaryColumn = columns[i];
630                break;
631             }
632          }
633          if (primaryColumn == null)
634          {
635             logger.warn("No primary column found for RichList definition: " + richList.getId());
636          }
637          
638          // output primary column as the icon label
639
out.write("<td width=");
640          out.write(COLUMN_PERCENT);
641          out.write("><table cellspacing=0 cellpadding=2 border=0>");
642          if (primaryColumn != null)
643          {
644             UIColumn column = primaryColumn;
645             
646             if (column.isRendered() == true)
647             {
648                out.write("<tr><td rowspan=10");
649                outputAttribute(out, column.getAttributes().get("style"), "style");
650                outputAttribute(out, column.getAttributes().get("styleClass"), "class");
651                out.write('>');
652                
653                // output the large icon for this column
654
UIComponent largeIcon = column.getLargeIcon();
655                if (largeIcon != null)
656                {
657                   largeIcon.encodeBegin(context);
658                   if (largeIcon.getRendersChildren())
659                   {
660                      largeIcon.encodeChildren(context);
661                   }
662                   largeIcon.encodeEnd(context);
663                }
664                out.write("</td>");
665                
666                // start the next cell which contains the first column component
667
out.write("<td");
668                outputAttribute(out, column.getAttributes().get("style"), "style");
669                outputAttribute(out, column.getAttributes().get("styleClass"), "class");
670                out.write('>');
671                if (column.getChildCount() != 0)
672                {
673                   // allow child controls inside the columns to render themselves
674
Utils.encodeRecursive(context, column);
675                }
676                out.write("</td></tr>");
677             }
678          }
679          
680          // render remaining columns as lines of data up to a max display limit
681
for (int i=0; i<columns.length; i++)
682          {
683             UIColumn column = columns[i];
684             
685             int count = 1;
686             if (column.isRendered() == true && column.getPrimary() == false &&
687                 (count < MAX_DISPLAYABLE_LINES || column.getActions() == true) )
688             {
689                out.write("<tr><td");
690                outputAttribute(out, column.getAttributes().get("style"), "style");
691                outputAttribute(out, column.getAttributes().get("styleClass"), "class");
692                out.write('>');
693                if (column.getChildCount() != 0)
694                {
695                   // allow child controls inside the columns to render themselves
696
Utils.encodeRecursive(context, column);
697                }
698                out.write("</td></tr>");
699                
700                count++;
701             }
702          }
703          
704          out.write("</table></td>");
705          
706          if (this.rowIndex % COLUMNS == COLUMNS-1)
707          {
708             // end row and output a blank padding row/div
709
out.write(END_ROW_SEPARATOR);
710          }
711          
712          this.rowIndex++;
713       }
714       
715       /**
716        * @see org.alfresco.web.ui.common.renderer.data.IRichListRenderer#renderListAfter(javax.faces.context.FacesContext, org.alfresco.web.ui.common.component.data.UIColumn[])
717        */

718       public void renderListAfter(FacesContext context, UIRichList richList, UIColumn[] columns)
719             throws IOException JavaDoc
720       {
721          ResponseWriter out = context.getResponseWriter();
722          
723          // finish last row if required (we used an open-ended column rendering algorithm)
724
if ((this.rowIndex-1) % COLUMNS != COLUMNS-1)
725          {
726             out.write(END_ROW_SEPARATOR);
727          }
728          
729          out.write("<tr><td colspan=99 align=right>");
730          for (Iterator JavaDoc i=richList.getChildren().iterator(); i.hasNext(); /**/)
731          {
732             // output all remaining child components that are not UIColumn
733
UIComponent child = (UIComponent)i.next();
734             if (child instanceof UIColumn == false)
735             {
736                Utils.encodeRecursive(context, child);
737             }
738          }
739          out.write("</td></tr>");
740       }
741       
742       private int rowIndex = 0;
743    }
744    
745    
746    private static Log logger = LogFactory.getLog(RichListRenderer.class);
747 }
748
Popular Tags