View Javadoc

1   // WARNING: This file was automatically generated. Do not edit it directly,
2   //          or you will lose your changes.
3   
4   /*
5    * Licensed to the Apache Software Foundation (ASF) under one
6    * or more contributor license agreements.  See the NOTICE file
7    * distributed with this work for additional information
8    * regarding copyright ownership.  The ASF licenses this file
9    * to you under the Apache License, Version 2.0 (the
10   * "License"); you may not use this file except in compliance
11   * with the License.  You may obtain a copy of the License at
12   *
13   *   http://www.apache.org/licenses/LICENSE-2.0
14   *
15   * Unless required by applicable law or agreed to in writing,
16   * software distributed under the License is distributed on an
17   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
18   * KIND, either express or implied.  See the License for the
19   * specific language governing permissions and limitations
20   * under the License.
21  */
22  package org.apache.myfaces.trinidad.component.core.data;
23  
24  import java.util.Arrays;
25  import java.util.Collection;
26  import java.util.Collections;
27  import java.util.List;
28  import java.util.Map;
29  import javax.faces.component.UIComponent;
30  import javax.faces.component.behavior.ClientBehavior;
31  import javax.faces.component.behavior.ClientBehaviorHolder;
32  import org.apache.myfaces.trinidad.bean.FacesBean;
33  import org.apache.myfaces.trinidad.bean.PropertyKey;
34  import org.apache.myfaces.trinidad.util.ComponentUtils;
35  
36  /**
37   *
38   * The Trinidad Table is used to display tabular data. It also supports selection
39   * (both single and multiple), sorting, record navigation and
40   * detail-disclosure.
41   * 
42   *          <section name="Table Model">
43   *            <p>
44   *             The Trinidad Table component uses a model to access the data
45   *             in the underlying list. The specific model class is
46   *             <code>org.apache.myfaces.trinidad.model.CollectionModel</code>.
47   *             You may also use other model instances, e.g.,
48   *             <code>java.util.List</code>  ,
49   *             array, and  <code>javax.faces.model.DataModel</code>.
50   *             The Table will automatically convert the instance
51   *             into a CollectionModel.
52   *            </p>
53   *          </section>
54   * 
55   * 
56   *         <section name="Columns">
57   *           <P>
58   *             The immediate children of a Table component must all be
59   *             <code>&lt;tr:column&gt;</code> components. Each visible Trinidad Column
60   *             component creates a separate column in the Table.
61   *             For more information see the documentation for
62   *             <code>&lt;column&gt;</code>
63   *           </P>
64   *         </section>
65   * 
66   * 
67   *         <section name="Range Navigation">
68   *           <P>
69   *             When the list being displayed by a Table is huge, you can enable the Table
70   *             to break up the list into ranges and display a single range at a time.
71   *             Range controls are provided on the Table to let the user scroll to the next range,
72   *             or to go back to the previous range. If the total size of the list is known, a
73   *             control to let the user jump directly to a particular part of the list is also
74   *             provided on the Table. Use the Table attributes &quot;rows&quot; and &quot;first&quot; to control the
75   *             range navigation feature.
76   *             When the user changes the range, the Table fires a <code>RangeChangeEvent</code>.
77   *           </P>
78   *         </section>
79   * 
80   * 
81   *         <section name="Displaying Details">
82   *           <P>
83   *             You can configure the Table to display or hide additional details of a
84   *             particular row in response to a user gesture. When the details feature
85   *             is enabled, a new column containing a toggle (per row) will render in
86   *             the Table. When a toggle is activated, the details for that row are
87   *             displayed. When a toggle is deactivated, the details for the row are
88   *             hidden. The user can also display or hide the details for all rows at
89   *             the same time (the controls for this feature are enabled by setting
90   *             the &quot;allDetailsEnabled&quot; property to true.)
91   *           </P>
92   *           <P>
93   *             To enable the details feature set the &quot;detailStamp&quot; facet on the
94   *             Table. Place the components that are used to show the details (of a
95   *             row), inside this facet. In the following example, the Person's age is
96   *             displayed in the details section:
97   * 
98   *             <pre>
99   *     &lt;tr:table var="row"&gt;
100  *       &lt;f:facet name="detailStamp"&gt;
101  *         &lt;tr:outputText value="#{row.age}"/&gt;
102  *       &lt;/f:facet&gt;
103  *     &lt;/tr:table&gt;
104  *             </pre>
105  *           </P>
106  *           <P>
107  *             When a detail row is shown or hidden the Table generates a
108  *             <code>DisclosureEvent</code>. If all detail rows are shown or hidden
109  *             the Table fires a <code>DisclosureAllEvent</code>.
110  *           </P>
111  *         </section>
112  * 
113  *         <section name="Selection">
114  *           <p>
115  *             The selection feature of a Table lets the user select one
116  *             or more rows in the list.  The user can then perform some operation on
117  *             the selected rows by activating an appropriate ActionSource component (e.g.,
118  *             by clicking on a commandButton).
119  *           </p>
120  *           <p>
121  *             There are two types of selection - single and multiple. The type of
122  *             selection is determined by the "rowSelection" attribute, which
123  *             can be set to "single" or "multiple".
124  *           </p>
125  *         </section>
126  * 
127  *         <section name="Sorting">
128  *           <p>
129  *             The Table component supports sorting columns in ascending or descending
130  *             order. A special 3D border on a column header lets the user know
131  *             that the column is sortable. When the user clicks on a column header
132  *             to sort a previously unsorted column, the Table sorts the
133  *             column data in ascending order. Subsequent clicks on the same
134  *             header sorts the data in the reverse order.
135  *           </p>
136  *           <p>
137  *         There are three requirements to enable sorting: the underlying table
138  *         model must support sorting, the &quot;sortProperty&quot; and &quot;sortable&quot;
139  *         attributes must be set on the column to enable the sort capability for
140  *         that column.
141  *           </p>
142  *           <P>
143  *             To support sorting, the <code>CollectionModel</code> instance
144  *             must implement the following methods:</P>
145  *             <pre>
146  *     public boolean isSortable(String propertyName)
147  *     public void setSortCriteria(List criteria)
148  *     public List getSortCriteria()
149  *             </pre>
150  *           <P>
151  *             If the underlying model is not a <code>CollectionModel</code>, the
152  *             Table automatically examines the actual data to determine which properties are
153  *             sortable. Any column that has data that
154  *             implements <code>java.lang.Comparable</code> is sortable.  This
155  *             automatic support cannot be nearly as efficient as coding sorting
156  *             directly into a <code>CollectionModel</code> (for instance,
157  *             by translating the sort into an &quot;ORDER BY&quot; SQL clause), but
158  *             is sufficient for small data sets.
159  *           </P>
160  *           <P>
161  *         To associate a column with a particular property-name to be used for
162  *         sorting purposes, use the &quot;sortProperty&quot; attribute on the column.
163  *         To enable the UI for sorting a particular column, set the
164  *         &quot;sortable&quot; property to <code>true</code>.
165  *             For more information see the documentation for
166  *             <code>&lt;column&gt;</code>.
167  *           </P>
168  *           <P>
169  *             In the following example,
170  *             both columns are sortable. Sorting the first column sorts by the
171  *             &quot;firstname&quot; property; sorting the second column sorts by the &quot;lastname&quot;
172  *             property.
173  *           </P>
174  *           <pre>
175  *     &lt;tr:table value="..."&gt;
176  *       &lt;tr:column sortProperty="firstname" sortable="true"&gt;
177  *         &lt;f:facet name="header"&gt;
178  *           &lt;tr:outputText value="Firstname" /&gt;
179  *         &lt;/f:facet&gt;
180  *         ...
181  *       &lt;/tr:column&gt;
182  *       &lt;tr:column sortProperty="lastname" sortable="true"&gt;
183  *         &lt;f:facet name="header"&gt;
184  *           &lt;tr:outputText value="Lastname" /&gt;
185  *         &lt;/f:facet&gt;
186  *         ...
187  *       &lt;/tr:column&gt;
188  *     &lt;/tr:table&gt;
189  *           </pre>
190  *         </section>
191  * 
192  *         <section name="Banding">
193  *           <P>
194  *             Banding is a technique where groups of rows (or columns)
195  *             are displayed with alternating background colors. This helps to
196  *             differentiate between adjacent rows (or columns).
197  *           </P>
198  *           <P>
199  *             The &quot;banding&quot; attribute on the Table controls the type of banding to
200  *             use.  The &quot;bandingInterval&quot; attribute controls
201  *             the number of consecutive rows (or columns) that are colored the same.
202  *           </P>
203  *           <P>
204  *             Note that the above banding attributes on the Table are ignored when
205  *             the &quot;bandingShade&quot; attribute is used on the Column.
206  *           </P>
207  *         </section>
208  *
209  * <h4>Events:</h4>
210  * <table border="1" width="100%" cellpadding="3" summary="">
211  * <tr bgcolor="#CCCCFF" class="TableHeadingColor">
212  * <th align="left">Type</th>
213  * <th align="left">Phases</th>
214  * <th align="left">Description</th>
215  * </tr>
216  * <tr class="TableRowColor">
217  * <td valign="top"><code>org.apache.myfaces.trinidad.event.RowDisclosureEvent</code></td>
218  * <td valign="top" nowrap>Apply<br>Request<br>Values<br>Invoke<br>Application</td>
219  * <td valign="top">The expansion event is generated for a table when the detail facet of a row is expanded or collapsed. For tree or a treeTable, the expansion
220                        event is generated when tree nodes are expanded or collapsed.</td>
221  * </tr>
222  * <tr class="TableRowColor">
223  * <td valign="top"><code>org.apache.myfaces.trinidad.event.SelectionEvent</code></td>
224  * <td valign="top" nowrap>Apply<br>Request<br>Values<br>Invoke<br>Application</td>
225  * <td valign="top">The selection event is delivered when the table selection
226                        changes.</td>
227  * </tr>
228  * <tr class="TableRowColor">
229  * <td valign="top"><code>org.apache.myfaces.trinidad.event.RangeChangeEvent</code></td>
230  * <td valign="top" nowrap>Apply<br>Request<br>Values<br>Invoke<br>Application</td>
231  * <td valign="top">The range change event is delivered when the user
232                        navigates.</td>
233  * </tr>
234  * <tr class="TableRowColor">
235  * <td valign="top"><code>org.apache.myfaces.trinidad.event.SortEvent</code></td>
236  * <td valign="top" nowrap>Apply<br>Request<br>Values<br>Invoke<br>Application</td>
237  * <td valign="top">The sort event is delivered when the table column sort
238                        criteria is changed.</td>
239  * </tr>
240  * <tr class="TableRowColor">
241  * <td valign="top"><code>org.apache.myfaces.trinidad.event.AttributeChangeEvent</code></td>
242  * <td valign="top" nowrap>Invoke<br>Application<br>Apply<br>Request<br>Values</td>
243  * <td valign="top">Event delivered to describe an attribute change.  Attribute change events are not delivered for any programmatic change to a property.  They are only delivered when a renderer changes a property without the application's specific request.  An example of an attribute change event might include the width of a column that supported client-side resizing.</td>
244  * </tr>
245  * </table>
246  */
247 public class CoreTable extends org.apache.myfaces.trinidad.component.UIXTable
248                        implements ClientBehaviorHolder
249 {
250   static public final String ROW_SELECTION_NONE = "none";
251   static public final String ROW_SELECTION_SINGLE = "single";
252   static public final String ROW_SELECTION_MULTIPLE = "multiple";
253   static public final FacesBean.Type TYPE = new FacesBean.Type(
254     org.apache.myfaces.trinidad.component.UIXTable.TYPE);
255   static public final PropertyKey HORIZONTAL_GRID_VISIBLE_KEY =
256     TYPE.registerKey("horizontalGridVisible", Boolean.class, Boolean.TRUE);
257   static public final PropertyKey VERTICAL_GRID_VISIBLE_KEY =
258     TYPE.registerKey("verticalGridVisible", Boolean.class, Boolean.TRUE);
259   static public final PropertyKey EMPTY_TEXT_KEY =
260     TYPE.registerKey("emptyText", String.class);
261   static public final PropertyKey COLUMN_BANDING_INTERVAL_KEY =
262     TYPE.registerKey("columnBandingInterval", Integer.class, Integer.valueOf(0));
263   static public final PropertyKey ROW_BANDING_INTERVAL_KEY =
264     TYPE.registerKey("rowBandingInterval", Integer.class, Integer.valueOf(0));
265   static public final PropertyKey ROW_SELECTION_KEY =
266     TYPE.registerKey("rowSelection", String.class, "none");
267   static public final PropertyKey AUTO_SUBMIT_KEY =
268     TYPE.registerKey("autoSubmit", Boolean.class, Boolean.FALSE);
269   static public final PropertyKey WIDTH_KEY =
270     TYPE.registerKey("width", String.class);
271   static public final PropertyKey SUMMARY_KEY =
272     TYPE.registerKey("summary", String.class);
273   static public final PropertyKey INLINE_STYLE_KEY =
274     TYPE.registerKey("inlineStyle", String.class);
275   static public final PropertyKey STYLE_CLASS_KEY =
276     TYPE.registerKey("styleClass", String.class);
277   static public final PropertyKey SHORT_DESC_KEY =
278     TYPE.registerKey("shortDesc", String.class);
279   static public final PropertyKey PARTIAL_TRIGGERS_KEY =
280     TYPE.registerKey("partialTriggers", String[].class, null, 0, PropertyKey.Mutable.RARELY);
281   static public final PropertyKey ONCLICK_KEY =
282     TYPE.registerKey("onclick", String.class);
283   static public final PropertyKey ONDBLCLICK_KEY =
284     TYPE.registerKey("ondblclick", String.class);
285   static public final PropertyKey ONMOUSEDOWN_KEY =
286     TYPE.registerKey("onmousedown", String.class);
287   static public final PropertyKey ONMOUSEUP_KEY =
288     TYPE.registerKey("onmouseup", String.class);
289   static public final PropertyKey ONMOUSEOVER_KEY =
290     TYPE.registerKey("onmouseover", String.class);
291   static public final PropertyKey ONMOUSEMOVE_KEY =
292     TYPE.registerKey("onmousemove", String.class);
293   static public final PropertyKey ONMOUSEOUT_KEY =
294     TYPE.registerKey("onmouseout", String.class);
295   static public final PropertyKey ONKEYPRESS_KEY =
296     TYPE.registerKey("onkeypress", String.class);
297   static public final PropertyKey ONKEYDOWN_KEY =
298     TYPE.registerKey("onkeydown", String.class);
299   static public final PropertyKey ONKEYUP_KEY =
300     TYPE.registerKey("onkeyup", String.class);
301   static public final PropertyKey ALL_DETAILS_ENABLED_KEY =
302     TYPE.registerKey("allDetailsEnabled", Boolean.class, Boolean.FALSE);
303   static public final String FOOTER_FACET = "footer";
304   static public final String HEADER_FACET = "header";
305   static public final String ACTIONS_FACET = "actions";
306 
307   static public final String COMPONENT_FAMILY =
308     "org.apache.myfaces.trinidad.Table";
309   static public final String COMPONENT_TYPE =
310     "org.apache.myfaces.trinidad.CoreTable";
311   // Supported client events for client behaviors:
312   private final static Collection<String> _EVENT_NAMES = Collections.unmodifiableCollection(
313     Arrays.asList(
314       "click", "dblclick", "mousedown", "mouseup", "mouseover", "mousemove",
315       "mouseout", "keypress", "keydown", "keyup"
316     ));
317 
318   /**
319    * Construct an instance of the CoreTable.
320    */
321   public CoreTable()
322   {
323     super("org.apache.myfaces.trinidad.Table");
324   }
325 
326   /**
327    * the component used to render the table footer.
328    */
329   final public UIComponent getFooter()
330   {
331     return getFacet(FOOTER_FACET);
332   }
333 
334   /**
335    * the component used to render the table footer.
336    */
337   @SuppressWarnings("unchecked")
338   final public void setFooter(UIComponent footerFacet)
339   {
340     getFacets().put(FOOTER_FACET, footerFacet);
341   }
342 
343   /**
344    * the component used to render the table header.
345    */
346   final public UIComponent getHeader()
347   {
348     return getFacet(HEADER_FACET);
349   }
350 
351   /**
352    * the component used to render the table header.
353    */
354   @SuppressWarnings("unchecked")
355   final public void setHeader(UIComponent headerFacet)
356   {
357     getFacets().put(HEADER_FACET, headerFacet);
358   }
359 
360   /**
361    * content to be rendered inline with the navigation bar.
362    */
363   final public UIComponent getActions()
364   {
365     return getFacet(ACTIONS_FACET);
366   }
367 
368   /**
369    * content to be rendered inline with the navigation bar.
370    */
371   @SuppressWarnings("unchecked")
372   final public void setActions(UIComponent actionsFacet)
373   {
374     getFacets().put(ACTIONS_FACET, actionsFacet);
375   }
376 
377   /**
378    * Gets if the horizontal grid lines will be drawn.
379    *
380    * @return  the new horizontalGridVisible value
381    */
382   final public boolean isHorizontalGridVisible()
383   {
384     return ComponentUtils.resolveBoolean(getProperty(HORIZONTAL_GRID_VISIBLE_KEY), true);
385   }
386 
387   /**
388    * Sets if the horizontal grid lines will be drawn.
389    * 
390    * @param horizontalGridVisible  the new horizontalGridVisible value
391    */
392   final public void setHorizontalGridVisible(boolean horizontalGridVisible)
393   {
394     setProperty(HORIZONTAL_GRID_VISIBLE_KEY, horizontalGridVisible ? Boolean.TRUE : Boolean.FALSE);
395   }
396 
397   /**
398    * Gets if the vertical grid lines will be drawn.
399    *
400    * @return  the new verticalGridVisible value
401    */
402   final public boolean isVerticalGridVisible()
403   {
404     return ComponentUtils.resolveBoolean(getProperty(VERTICAL_GRID_VISIBLE_KEY), true);
405   }
406 
407   /**
408    * Sets if the vertical grid lines will be drawn.
409    * 
410    * @param verticalGridVisible  the new verticalGridVisible value
411    */
412   final public void setVerticalGridVisible(boolean verticalGridVisible)
413   {
414     setProperty(VERTICAL_GRID_VISIBLE_KEY, verticalGridVisible ? Boolean.TRUE : Boolean.FALSE);
415   }
416 
417   /**
418    * Gets text displayed when a table is empty.
419    *
420    * @return  the new emptyText value
421    */
422   final public String getEmptyText()
423   {
424     return ComponentUtils.resolveString(getProperty(EMPTY_TEXT_KEY));
425   }
426 
427   /**
428    * Sets text displayed when a table is empty.
429    * 
430    * @param emptyText  the new emptyText value
431    */
432   final public void setEmptyText(String emptyText)
433   {
434     setProperty(EMPTY_TEXT_KEY, (emptyText));
435   }
436 
437   /**
438    * Gets the interval between which the column banding alternates.  For example, a columnBandingInterval of 1 would display alternately banded columns.
439    *
440    * @return  the new columnBandingInterval value
441    */
442   final public int getColumnBandingInterval()
443   {
444     return ComponentUtils.resolveInteger(getProperty(COLUMN_BANDING_INTERVAL_KEY), 0);
445   }
446 
447   /**
448    * Sets the interval between which the column banding alternates.  For example, a columnBandingInterval of 1 would display alternately banded columns.
449    * 
450    * @param columnBandingInterval  the new columnBandingInterval value
451    */
452   final public void setColumnBandingInterval(int columnBandingInterval)
453   {
454     setProperty(COLUMN_BANDING_INTERVAL_KEY, Integer.valueOf(columnBandingInterval));
455   }
456 
457   /**
458    * Gets the interval between which the row banding alternates.  For example, rowBandingInterval=1 would displayalternately banded rows in the Grid.
459    *
460    * @return  the new rowBandingInterval value
461    */
462   final public int getRowBandingInterval()
463   {
464     return ComponentUtils.resolveInteger(getProperty(ROW_BANDING_INTERVAL_KEY), 0);
465   }
466 
467   /**
468    * Sets the interval between which the row banding alternates.  For example, rowBandingInterval=1 would displayalternately banded rows in the Grid.
469    * 
470    * @param rowBandingInterval  the new rowBandingInterval value
471    */
472   final public void setRowBandingInterval(int rowBandingInterval)
473   {
474     setProperty(ROW_BANDING_INTERVAL_KEY, Integer.valueOf(rowBandingInterval));
475   }
476 
477   /**
478    * Gets whether rows in this table selectable. Valid values are "none", "single", "multiple"
479    *
480    * @return  the new rowSelection value
481    */
482   final public String getRowSelection()
483   {
484     return ComponentUtils.resolveString(getProperty(ROW_SELECTION_KEY), "none");
485   }
486 
487   /**
488    * Sets whether rows in this table selectable. Valid values are "none", "single", "multiple"
489    * 
490    * @param rowSelection  the new rowSelection value
491    */
492   final public void setRowSelection(String rowSelection)
493   {
494     setProperty(ROW_SELECTION_KEY, (rowSelection));
495   }
496 
497   /**
498    * Gets If set to TRUE on a form element, the component will automatically submit
499    *      the enclosing form when an appropriate action takes place (a click, text
500    *      change, etc.).  This only takes effect if rowSelection attribute enabled.
501    *
502    * @return  the new autoSubmit value
503    */
504   final public boolean isAutoSubmit()
505   {
506     return ComponentUtils.resolveBoolean(getProperty(AUTO_SUBMIT_KEY), false);
507   }
508 
509   /**
510    * Sets If set to TRUE on a form element, the component will automatically submit
511    *      the enclosing form when an appropriate action takes place (a click, text
512    *      change, etc.).  This only takes effect if rowSelection attribute enabled.
513    * 
514    * @param autoSubmit  the new autoSubmit value
515    */
516   final public void setAutoSubmit(boolean autoSubmit)
517   {
518     setProperty(AUTO_SUBMIT_KEY, autoSubmit ? Boolean.TRUE : Boolean.FALSE);
519   }
520 
521   /**
522    * Gets the width of the table.  The value must either be a number of pixels or a percentage - it is not a CSS width.
523    *
524    * @return  the new width value
525    */
526   final public String getWidth()
527   {
528     return ComponentUtils.resolveString(getProperty(WIDTH_KEY));
529   }
530 
531   /**
532    * Sets the width of the table.  The value must either be a number of pixels or a percentage - it is not a CSS width.
533    * 
534    * @param width  the new width value
535    */
536   final public void setWidth(String width)
537   {
538     setProperty(WIDTH_KEY, (width));
539   }
540 
541   /**
542    * Gets the summary of this table's purpose and structure
543    *          for user agents rendering to non-visual media.
544    *
545    * @return  the new summary value
546    */
547   final public String getSummary()
548   {
549     return ComponentUtils.resolveString(getProperty(SUMMARY_KEY));
550   }
551 
552   /**
553    * Sets the summary of this table's purpose and structure
554    *          for user agents rendering to non-visual media.
555    * 
556    * @param summary  the new summary value
557    */
558   final public void setSummary(String summary)
559   {
560     setProperty(SUMMARY_KEY, (summary));
561   }
562 
563   /**
564    * Gets the CSS styles to use for this component.
565    *
566    * @return  the new inlineStyle value
567    */
568   final public String getInlineStyle()
569   {
570     return ComponentUtils.resolveString(getProperty(INLINE_STYLE_KEY));
571   }
572 
573   /**
574    * Sets the CSS styles to use for this component.
575    * 
576    * @param inlineStyle  the new inlineStyle value
577    */
578   final public void setInlineStyle(String inlineStyle)
579   {
580     setProperty(INLINE_STYLE_KEY, (inlineStyle));
581   }
582 
583   /**
584    * Gets a CSS style class to use for this component.
585    *
586    * @return  the new styleClass value
587    */
588   final public String getStyleClass()
589   {
590     return ComponentUtils.resolveString(getProperty(STYLE_CLASS_KEY));
591   }
592 
593   /**
594    * Sets a CSS style class to use for this component.
595    * 
596    * @param styleClass  the new styleClass value
597    */
598   final public void setStyleClass(String styleClass)
599   {
600     setProperty(STYLE_CLASS_KEY, (styleClass));
601   }
602 
603   /**
604    * Gets The short description of the component. This text is commonly used by user agents to display tooltip help text.
605    *
606    * @return  the new shortDesc value
607    */
608   final public String getShortDesc()
609   {
610     return ComponentUtils.resolveString(getProperty(SHORT_DESC_KEY));
611   }
612 
613   /**
614    * Sets The short description of the component. This text is commonly used by user agents to display tooltip help text.
615    * 
616    * @param shortDesc  the new shortDesc value
617    */
618   final public void setShortDesc(String shortDesc)
619   {
620     setProperty(SHORT_DESC_KEY, (shortDesc));
621   }
622 
623   /**
624    * Gets the IDs of the components that should trigger a partial update.
625    *         <p>
626    *         This component will listen on the trigger components. If one of the
627    *         trigger components receives an event that will cause it to update
628    *         in some way, this component will request to be updated too.</p>
629    *         <p>
630    *         Separate multiple triggers with a space. e.g., partialTriggers="cmp1 cmp2"
631    *         </p>
632    *         <p>
633    *         Identifiers must account for NamingContainers.  You can use a single colon to start the search from the root,
634    *         or use multiple colons to move up through the NamingContainer. For example,
635    *         "::" will pop out of this component's naming container (it pops out of itself if it is a naming container), 
636    *         ":::" will pop out of two naming containers, etc. The search for
637    *         the partialTrigger begins from there. e.g., partialTriggers=":::commandButton1" the search begins for the 
638    *         component with id = commandButton1 after popping out of two naming containers relative to this component.
639    *         To go into naming containers, you separate the naming containers with ':', e.g.,partialTriggers= "nc1:nc2:nc3:componentId".</p>
640    *
641    * @return  the new partialTriggers value
642    */
643   final public String[] getPartialTriggers()
644   {
645     return (String[])getProperty(PARTIAL_TRIGGERS_KEY);
646   }
647 
648   /**
649    * Sets the IDs of the components that should trigger a partial update.
650    *         <p>
651    *         This component will listen on the trigger components. If one of the
652    *         trigger components receives an event that will cause it to update
653    *         in some way, this component will request to be updated too.</p>
654    *         <p>
655    *         Separate multiple triggers with a space. e.g., partialTriggers="cmp1 cmp2"
656    *         </p>
657    *         <p>
658    *         Identifiers must account for NamingContainers.  You can use a single colon to start the search from the root,
659    *         or use multiple colons to move up through the NamingContainer. For example,
660    *         "::" will pop out of this component's naming container (it pops out of itself if it is a naming container), 
661    *         ":::" will pop out of two naming containers, etc. The search for
662    *         the partialTrigger begins from there. e.g., partialTriggers=":::commandButton1" the search begins for the 
663    *         component with id = commandButton1 after popping out of two naming containers relative to this component.
664    *         To go into naming containers, you separate the naming containers with ':', e.g.,partialTriggers= "nc1:nc2:nc3:componentId".</p>
665    * 
666    * @param partialTriggers  the new partialTriggers value
667    */
668   final public void setPartialTriggers(String[] partialTriggers)
669   {
670     setProperty(PARTIAL_TRIGGERS_KEY, (partialTriggers));
671   }
672 
673   /**
674    * Gets an onclick Javascript handler.
675    *
676    * @return  the new onclick value
677    */
678   final public String getOnclick()
679   {
680     return ComponentUtils.resolveString(getProperty(ONCLICK_KEY));
681   }
682 
683   /**
684    * Sets an onclick Javascript handler.
685    * 
686    * @param onclick  the new onclick value
687    */
688   final public void setOnclick(String onclick)
689   {
690     setProperty(ONCLICK_KEY, (onclick));
691   }
692 
693   /**
694    * Gets an ondblclick Javascript handler.
695    *
696    * @return  the new ondblclick value
697    */
698   final public String getOndblclick()
699   {
700     return ComponentUtils.resolveString(getProperty(ONDBLCLICK_KEY));
701   }
702 
703   /**
704    * Sets an ondblclick Javascript handler.
705    * 
706    * @param ondblclick  the new ondblclick value
707    */
708   final public void setOndblclick(String ondblclick)
709   {
710     setProperty(ONDBLCLICK_KEY, (ondblclick));
711   }
712 
713   /**
714    * Gets an onmousedown Javascript handler.
715    *
716    * @return  the new onmousedown value
717    */
718   final public String getOnmousedown()
719   {
720     return ComponentUtils.resolveString(getProperty(ONMOUSEDOWN_KEY));
721   }
722 
723   /**
724    * Sets an onmousedown Javascript handler.
725    * 
726    * @param onmousedown  the new onmousedown value
727    */
728   final public void setOnmousedown(String onmousedown)
729   {
730     setProperty(ONMOUSEDOWN_KEY, (onmousedown));
731   }
732 
733   /**
734    * Gets an onmouseup Javascript handler.
735    *
736    * @return  the new onmouseup value
737    */
738   final public String getOnmouseup()
739   {
740     return ComponentUtils.resolveString(getProperty(ONMOUSEUP_KEY));
741   }
742 
743   /**
744    * Sets an onmouseup Javascript handler.
745    * 
746    * @param onmouseup  the new onmouseup value
747    */
748   final public void setOnmouseup(String onmouseup)
749   {
750     setProperty(ONMOUSEUP_KEY, (onmouseup));
751   }
752 
753   /**
754    * Gets an onmouseover Javascript handler.
755    *
756    * @return  the new onmouseover value
757    */
758   final public String getOnmouseover()
759   {
760     return ComponentUtils.resolveString(getProperty(ONMOUSEOVER_KEY));
761   }
762 
763   /**
764    * Sets an onmouseover Javascript handler.
765    * 
766    * @param onmouseover  the new onmouseover value
767    */
768   final public void setOnmouseover(String onmouseover)
769   {
770     setProperty(ONMOUSEOVER_KEY, (onmouseover));
771   }
772 
773   /**
774    * Gets an onmousemove Javascript handler.
775    *
776    * @return  the new onmousemove value
777    */
778   final public String getOnmousemove()
779   {
780     return ComponentUtils.resolveString(getProperty(ONMOUSEMOVE_KEY));
781   }
782 
783   /**
784    * Sets an onmousemove Javascript handler.
785    * 
786    * @param onmousemove  the new onmousemove value
787    */
788   final public void setOnmousemove(String onmousemove)
789   {
790     setProperty(ONMOUSEMOVE_KEY, (onmousemove));
791   }
792 
793   /**
794    * Gets an onmouseout Javascript handler.
795    *
796    * @return  the new onmouseout value
797    */
798   final public String getOnmouseout()
799   {
800     return ComponentUtils.resolveString(getProperty(ONMOUSEOUT_KEY));
801   }
802 
803   /**
804    * Sets an onmouseout Javascript handler.
805    * 
806    * @param onmouseout  the new onmouseout value
807    */
808   final public void setOnmouseout(String onmouseout)
809   {
810     setProperty(ONMOUSEOUT_KEY, (onmouseout));
811   }
812 
813   /**
814    * Gets an onkeypress Javascript handler.
815    *
816    * @return  the new onkeypress value
817    */
818   final public String getOnkeypress()
819   {
820     return ComponentUtils.resolveString(getProperty(ONKEYPRESS_KEY));
821   }
822 
823   /**
824    * Sets an onkeypress Javascript handler.
825    * 
826    * @param onkeypress  the new onkeypress value
827    */
828   final public void setOnkeypress(String onkeypress)
829   {
830     setProperty(ONKEYPRESS_KEY, (onkeypress));
831   }
832 
833   /**
834    * Gets an onkeydown Javascript handler.
835    *
836    * @return  the new onkeydown value
837    */
838   final public String getOnkeydown()
839   {
840     return ComponentUtils.resolveString(getProperty(ONKEYDOWN_KEY));
841   }
842 
843   /**
844    * Sets an onkeydown Javascript handler.
845    * 
846    * @param onkeydown  the new onkeydown value
847    */
848   final public void setOnkeydown(String onkeydown)
849   {
850     setProperty(ONKEYDOWN_KEY, (onkeydown));
851   }
852 
853   /**
854    * Gets an onkeyup Javascript handler.
855    *
856    * @return  the new onkeyup value
857    */
858   final public String getOnkeyup()
859   {
860     return ComponentUtils.resolveString(getProperty(ONKEYUP_KEY));
861   }
862 
863   /**
864    * Sets an onkeyup Javascript handler.
865    * 
866    * @param onkeyup  the new onkeyup value
867    */
868   final public void setOnkeyup(String onkeyup)
869   {
870     setProperty(ONKEYUP_KEY, (onkeyup));
871   }
872 
873   /**
874    * Gets whether or not to enable the show/hide all
875    *               links above the table,
876    *               which allow the user to show/hide all the detail rows.
877    *               To enable the detail rows, a "detailStamp" facet must be set on
878    *               this Table.
879    *
880    * @return  the new allDetailsEnabled value
881    */
882   final public boolean isAllDetailsEnabled()
883   {
884     return ComponentUtils.resolveBoolean(getProperty(ALL_DETAILS_ENABLED_KEY), false);
885   }
886 
887   /**
888    * Sets whether or not to enable the show/hide all
889    *               links above the table,
890    *               which allow the user to show/hide all the detail rows.
891    *               To enable the detail rows, a "detailStamp" facet must be set on
892    *               this Table.
893    * 
894    * @param allDetailsEnabled  the new allDetailsEnabled value
895    */
896   final public void setAllDetailsEnabled(boolean allDetailsEnabled)
897   {
898     setProperty(ALL_DETAILS_ENABLED_KEY, allDetailsEnabled ? Boolean.TRUE : Boolean.FALSE);
899   }
900 
901   @Override
902   public String getDefaultEventName()
903   {
904     return "click";
905   }
906 
907   @Override
908   public Collection<String> getEventNames()
909   {
910     return _EVENT_NAMES;
911   }
912 
913   @Override
914   public Map<String, List<ClientBehavior>> getClientBehaviors()
915   {
916     return super.getClientBehaviors();
917   }
918 
919   @Override
920   public void addClientBehavior(
921     String         eventName,
922     ClientBehavior behavior)
923   {
924     super.addClientBehavior(eventName, behavior);
925   }
926 
927   @Override
928   public String getFamily()
929   {
930     return COMPONENT_FAMILY;
931   }
932 
933   @Override
934   protected FacesBean.Type getBeanType()
935   {
936     return TYPE;
937   }
938 
939   /**
940    * Construct an instance of the CoreTable.
941    */
942   protected CoreTable(
943     String rendererType
944     )
945   {
946     super(rendererType);
947   }
948 
949   static
950   {
951     TYPE.lockAndRegister("org.apache.myfaces.trinidad.Table","org.apache.myfaces.trinidad.Table");
952   }
953 }