You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by ma...@apache.org on 2010/01/05 12:50:30 UTC

svn commit: r896009 [20/30] - in /myfaces/trinidad/branches/2.0.1-branch: ./ src/site/xdoc/devguide/ trinidad-api/ trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/ trinidad-api/src/main/java/org/apache/myfaces/trinidad/bean/ ...

Modified: myfaces/trinidad/branches/2.0.1-branch/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/TreeRenderer.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/2.0.1-branch/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/TreeRenderer.java?rev=896009&r1=896008&r2=896009&view=diff
==============================================================================
--- myfaces/trinidad/branches/2.0.1-branch/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/TreeRenderer.java (original)
+++ myfaces/trinidad/branches/2.0.1-branch/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/TreeRenderer.java Tue Jan  5 11:48:54 2010
@@ -46,6 +46,7 @@
 import org.apache.myfaces.trinidad.skin.Icon;
 import org.apache.myfaces.trinidadinternal.renderkit.core.xhtml.table.TreeUtils;
 
+
 /**
  * Renderer for trees.
  *
@@ -57,13 +58,15 @@
     this(CoreTree.TYPE);
   }
 
-  protected TreeRenderer(FacesBean.Type type)
+  protected TreeRenderer(
+    FacesBean.Type type)
   {
     super(type);
   }
 
   @Override
-  protected void findTypeConstants(FacesBean.Type type)
+  protected void findTypeConstants(
+    FacesBean.Type type)
   {
     super.findTypeConstants(type);
     _immediateKey = type.findKey("immediate");
@@ -80,7 +83,9 @@
    */
   @SuppressWarnings("unchecked")
   @Override
-  public void decode(FacesContext context, UIComponent component)
+  public void decode(
+    FacesContext context,
+    UIComponent  component)
   {
     Map<String, String> parameters =
       context.getExternalContext().getRequestParameterMap();
@@ -112,7 +117,8 @@
     FacesContext     context,
     RenderingContext rc,
     UIComponent      component,
-    FacesBean        bean) throws IOException
+    FacesBean        bean
+    ) throws IOException
   {
     // Since Train is a naming container, we can be more
     // efficient about skipping its children
@@ -142,17 +148,19 @@
   }
 
   @Override
-  protected boolean shouldRenderId(FacesContext context,
-                                   UIComponent component)
+  protected boolean shouldRenderId(
+    FacesContext context,
+    UIComponent  component)
   {
     return true;
   }
 
-  private void _renderContent(FacesContext context,
-                              RenderingContext rc,
-                              UIXHierarchy tree,
-                              FacesBean bean)
-    throws IOException
+  private void _renderContent(
+    FacesContext     context,
+    RenderingContext rc,
+    UIXHierarchy     tree,
+    FacesBean        bean
+    ) throws IOException
   {
     FormData fd = rc.getFormData();
     if (fd == null)
@@ -164,8 +172,8 @@
     ResponseWriter rw = context.getResponseWriter();
     rw.startElement("div", tree);
     renderId(context, tree);
-    renderAllAttributes(context, rc, bean);
-    
+    renderAllAttributes(context, rc, tree, bean);
+
     final String id = getClientId(context, tree);
     UIComponent stamp = getFacet(tree, CoreTree.NODE_STAMP_FACET);
 
@@ -199,7 +207,7 @@
       renderScriptDeferAttribute(context, rc);
       renderScriptTypeAttribute(context, rc);
 
-      _renderTreeJS(context, rc, bean);
+      _renderTreeJS(context, rc, tree, bean);
 
       //out.writeText("_setNodes('"+name+"','"+nodesRendered+"');");
 
@@ -220,19 +228,20 @@
 
   }
 
-
   // return whether to continue with rendering
 
-  protected boolean setInitialPath(UIXHierarchy tree, FacesBean bean)
+  protected boolean setInitialPath(
+    UIXHierarchy tree,
+    FacesBean    bean)
   {
     tree.setRowKey(null);
     return true;
   }
 
-
-  private boolean _isShownSelected(UIXHierarchy tree,
-                                   Map<Object, Boolean> selectedPaths,
-                                   Object currPath)
+  private boolean _isShownSelected(
+    UIXHierarchy         tree,
+    Map<Object, Boolean> selectedPaths,
+    Object               currPath)
   {
 
     boolean selected = false;
@@ -250,7 +259,8 @@
     return false;
   }
 
-  protected Map<Object, Boolean> getSelectedPaths(Object focusPath)
+  protected Map<Object, Boolean> getSelectedPaths(
+    Object focusPath)
   {
     if (focusPath == null)
       return new HashMap<Object, Boolean>(0);
@@ -261,7 +271,8 @@
     return selectedPaths;
   }
 
-  protected RowKeySet getExpandedRowKeys(UIXHierarchy tree)
+  protected RowKeySet getExpandedRowKeys(
+    UIXHierarchy tree)
   {
     return ((UIXTree) tree).getDisclosedRowKeys();
   }
@@ -271,7 +282,8 @@
    * @param rc the RenderingContext
    * @return the value of the AF_TREE_SHOW_LINES skin property
    */
-  protected boolean isShowLines( RenderingContext rc)
+  protected boolean isShowLines(
+    RenderingContext rc)
   {
     Object showLines = rc.getSkin().getProperty(SkinProperties.AF_TREE_SHOW_LINES);
     return showLines == null || showLines.equals(Boolean.TRUE);
@@ -287,11 +299,10 @@
    * @return the URI of the icon
    */
   protected String getConnectingBackgroundIcon(
-      FacesContext context,
-      RenderingContext rc,
-      boolean isLine,
-      boolean leftToRight
-  )
+    FacesContext     context,
+    RenderingContext rc,
+    boolean          isLine,
+    boolean          leftToRight)
   {
     if (!isLine || !isShowLines(rc))
       return null;
@@ -309,11 +320,10 @@
    * @return the URI of the icon
    */
   protected String getIconBackgroundIcon(
-      FacesContext context,
-      RenderingContext rc,
-      boolean isLastSibling,
-      boolean isLeftToRight
-  )
+    FacesContext     context,
+    RenderingContext rc,
+    boolean          isLastSibling,
+    boolean          isLeftToRight)
   {
     Object showLines = rc.getSkin().getProperty(SkinProperties.AF_TREE_SHOW_LINES);
     if (!isShowLines(rc))
@@ -327,16 +337,14 @@
   // render the correct icon for a specific node
 
   protected void renderExpandCell(
-      FacesContext context,
-      RenderingContext rc,
-      UIXHierarchy tree,
-      int expanded,
-      boolean isLastSibling,
-      String onclick
-  )
-      throws IOException
+    FacesContext     context,
+    RenderingContext rc,
+    UIXHierarchy     tree,
+    int              expanded,
+    boolean          isLastSibling,
+    String           onclick
+    ) throws IOException
   {
-
     Icon icon = null;
     String iconURI = null;
 
@@ -350,8 +358,8 @@
     Object altText = null;
 
     String text = null;
-    
-    boolean isMacOS = 
+
+    boolean isMacOS =
                Agent.PLATFORM_MACOS.equals(rc.getAgent().getPlatformName());
     // add in the expandability
     switch (expanded)
@@ -434,18 +442,19 @@
       _renderTextCell(context, rc, tree, expanded, text, altText, _ICON_WIDTH, onclick,
                       SkinSelectors.TREE_DISCLOSED_SYMBOL_STYLE_CLASS);
     }
-
   }
 
-
-  private void _renderTextCell(FacesContext context,
-                               RenderingContext rc,
-                               UIXHierarchy tree,
-                               int expanded,
-                               String text,
-                               Object altText, String width,
-                               String onclick, String styleClass)
-    throws IOException
+  private void _renderTextCell(
+    FacesContext     context,
+    RenderingContext rc,
+    UIXHierarchy     tree,
+    int              expanded,
+    String           text,
+    Object           altText,
+    String           width,
+    String           onclick,
+    String           styleClass
+    ) throws IOException
   {
     ResponseWriter writer = context.getResponseWriter();
 
@@ -465,17 +474,17 @@
       }
       else
       {
-        // For Non-JavaScript browsers, render an input element(type= submit) to 
-        // submit the page. Encode the name attribute with the parameter name 
-        // and value thus it would enable the browsers to include the name of 
+        // For Non-JavaScript browsers, render an input element(type= submit) to
+        // submit the page. Encode the name attribute with the parameter name
+        // and value thus it would enable the browsers to include the name of
         // this element in its payLoad if it submits the page.
         String nameAttr = TreeUtils.renderEncodedNameAttri(
                                         context,
-                                        rc, 
+                                        rc,
                                         tree,
                                         getClientId(context, tree),
                                         expanded == EXPAND_CLOSED);
-                
+
         writer.startElement("input", null);
         writer.writeAttribute("type", "submit",null);
         writer.writeAttribute("name", nameAttr, null);
@@ -502,18 +511,17 @@
   }
 
   protected void renderExpandIconCell(
-      FacesContext context,
-      RenderingContext rc,
-      String backgroundIcon,
-      String nodeBackgroundIcon,
-      String icon,
-      boolean isIconAbsoluteURI,
-      Object altText,
-      String width,
-      String height,
-      String onclick
-  )
-      throws IOException
+    FacesContext     context,
+    RenderingContext rc,
+    String           backgroundIcon,
+    String           nodeBackgroundIcon,
+    String           icon,
+    boolean          isIconAbsoluteURI,
+    Object           altText,
+    String           width,
+    String           height,
+    String           onclick
+    ) throws IOException
   {
     ResponseWriter writer = context.getResponseWriter();
 
@@ -562,12 +570,18 @@
   }
 
 
-  protected void renderIconCell(FacesContext context, RenderingContext rc,
-                                UIXHierarchy tree, String backgroundIcon,
-                                String icon, boolean isIconAbsoluteURI,
-                                Object altText, String width,
-                                String height, String onclick)
-    throws IOException
+  protected void renderIconCell(
+    FacesContext     context,
+    RenderingContext rc,
+    UIXHierarchy     tree,
+    String           backgroundIcon,
+    String           icon,
+    boolean          isIconAbsoluteURI,
+    Object           altText,
+    String           width,
+    String           height,
+    String           onclick
+    ) throws IOException
   {
     ResponseWriter writer = context.getResponseWriter();
 
@@ -603,21 +617,25 @@
   }
 
 
-  private static String _createFocusNodeGetter(String focusNodeId) 
+  private static String _createFocusNodeGetter(
+    String focusNodeId)
   {
     return (focusNodeId != null) ? "document.getElementById('" + focusNodeId + "')" : null;
   }
 
-  private static String _callJSSelect(UIXHierarchy tree, String jsVarName)
+  private static String _callJSSelect(
+    UIXHierarchy tree,
+    String       jsVarName)
   {
     String currencyStr = tree.getClientRowKey();
     return jsVarName + ".select(this,'" + currencyStr + "');";
   }
 
-  private String _createNewJSSelectionState(String formName,
-                                                   String treeClientId,
-                                                   String selectParam,
-                                                   String focusNodeId)
+  private String _createNewJSSelectionState(
+    String formName,
+    String treeClientId,
+    String selectParam,
+    String focusNodeId)
   {
     String treeState = TreeUtils.createNewJSCollectionComponentState(formName, treeClientId);
     String focusNode = _createFocusNodeGetter(focusNodeId);
@@ -633,10 +651,12 @@
     return jsSelectionState;
   }
 
-  private void _renderTreeJS(FacesContext context,
-                             RenderingContext rc,
-                             FacesBean bean)
-    throws IOException
+  private void _renderTreeJS(
+    FacesContext     context,
+    RenderingContext rc,
+    UIComponent      component,
+    FacesBean        bean
+    ) throws IOException
   {
     if (!rc.getProperties().containsKey(_JS_RENDERED_KEY))
     {
@@ -645,7 +665,7 @@
       writer.writeText("function _adfTreeSelector(selectParam,tState,focusNode) {" +
                        "this._selectParam = selectParam;" +
                        "this.treeState = tState;" +
-                       "this._pTag = focusNode;" + 
+                       "this._pTag = focusNode;" +
                        "}" +
                        "_adfTreeSelector.prototype.select = function(tag,path) {" +
                        "if (this._pTag != null) {" +
@@ -716,7 +736,7 @@
       //         "}",
       //         null);
 
-      boolean immediate = getImmediate(bean);
+      boolean immediate = getImmediate(component, bean);
       String buff =
         TreeUtils.setupJSTreeCollectionComponent(!immediate) + ";";
       writer.writeText(buff, null);
@@ -725,18 +745,21 @@
 
   // render one row of the tree
 
-  private void _renderNode(FacesContext context,
-                           RenderingContext rc,
-                           UIXHierarchy tree,
-                           FacesBean bean,
-                           UIComponent stamp,
-                           final String varName,
-                           RowKeySet state,
-                           Map<Object, Boolean> selectedPaths,
-                           Boolean[] prepend, boolean leftToRight,
-                           boolean isFirstSibling, boolean isLastSibling,
-                           int nodeDepth)
-    throws IOException
+  private void _renderNode(
+    FacesContext         context,
+    RenderingContext     rc,
+    UIXHierarchy         tree,
+    FacesBean            bean,
+    UIComponent          stamp,
+    final String         varName,
+    RowKeySet            state,
+    Map<Object, Boolean> selectedPaths,
+    Boolean[]            prepend,
+    boolean              leftToRight,
+    boolean              isFirstSibling,
+    boolean              isLastSibling,
+    int                  nodeDepth
+    ) throws IOException
   {
     ResponseWriter writer = context.getResponseWriter();
 
@@ -819,11 +842,11 @@
   }
 
   protected void renderNodeIconCell(
-      FacesContext context,
-      RenderingContext rc,
-      UIXHierarchy tree,
-      int expand
-  ) throws IOException
+    FacesContext     context,
+    RenderingContext rc,
+    UIXHierarchy     tree,
+    int              expand
+    ) throws IOException
   {
     String nodeType = getNodeType(tree);
     Icon nodeIcon = getNodeIcon(rc, nodeType, expand);
@@ -846,8 +869,7 @@
   }
 
   protected String getNodeType(
-      UIXHierarchy tree
-  )
+    UIXHierarchy tree)
   {
     String nodeType = null;
     Object rowData = tree.getRowData();
@@ -862,22 +884,15 @@
         nodeType = (String) method.invoke(rowData);
       }
     }
-    catch (IllegalAccessException e)
-    {
-    }
-    catch (NoSuchMethodException e)
-    {
-    }
-    catch (InvocationTargetException e)
-    {
-    }
+    catch (IllegalAccessException e) { ; }
+    catch (NoSuchMethodException e) { ; }
+    catch (InvocationTargetException e) { ; }
     return nodeType;
   }
 
   protected String getNodeIconSelector(
-      String nodeType,
-      int expandedState
-  )
+    String nodeType,
+    int    expandedState)
   {
     switch (expandedState)
     {
@@ -892,9 +907,9 @@
   }
 
   protected Icon getNodeIcon(
-      RenderingContext rc,
-      String nodeType,
-      int expandedState
+    RenderingContext rc,
+    String           nodeType,
+    int              expandedState
   )
   {
     if (nodeType == null || nodeType.length() == 0)
@@ -916,14 +931,14 @@
 
 
   protected void renderStampCell(
-      FacesContext context,
-      RenderingContext rc,
-      UIXHierarchy tree,
-      UIComponent stamp,
-      String onClick,
-      String treeStyle,
-      int nodeDepth
-  ) throws IOException
+    FacesContext     context,
+    RenderingContext rc,
+    UIXHierarchy     tree,
+    UIComponent      stamp,
+    String           onClick,
+    String           treeStyle,
+    int              nodeDepth
+    ) throws IOException
   {
     ResponseWriter writer = context.getResponseWriter();
 
@@ -935,7 +950,7 @@
     writer.startElement(XhtmlConstants.SPAN_ELEMENT, null);
     writer.writeAttribute(XhtmlConstants.ID_ATTRIBUTE, getClientId(context, tree), null);
     renderStyleClass(context, rc, treeStyle);
-    
+
     if (supportsScripting(rc))
     {
       writer.writeAttribute(XhtmlConstants.ONCLICK_ATTRIBUTE, onClick, null);
@@ -949,20 +964,20 @@
   }
 
   private void _renderNodeChildren(
-      FacesContext context,
-      RenderingContext rc,
-      UIXHierarchy tree,
-      FacesBean bean,
-      UIComponent stamp,
-      final String varName,
-      RowKeySet state,
-      Map<Object, Boolean> selectedPaths,
-      Boolean[] prepend,
-      boolean leftToRight,
-      boolean isFirstSibling,
-      boolean isLastSibling,
-      int nodeDepth
-  ) throws IOException
+    FacesContext         context,
+    RenderingContext     rc,
+    UIXHierarchy         tree,
+    FacesBean            bean,
+    UIComponent          stamp,
+    final String         varName,
+    RowKeySet            state,
+    Map<Object, Boolean> selectedPaths,
+    Boolean[]            prepend,
+    boolean              leftToRight,
+    boolean              isFirstSibling,
+    boolean              isLastSibling,
+    int                  nodeDepth
+    ) throws IOException
   {
     tree.enterContainer();
     int childCount = tree.getRowCount();
@@ -994,7 +1009,9 @@
 
   // is this row childless, open, or closed?
 
-  private int _getExpandValue(UIXHierarchy tree, RowKeySet state)
+  private int _getExpandValue(
+    UIXHierarchy tree,
+    RowKeySet    state)
   {
     if (tree.isContainer())
     {
@@ -1007,13 +1024,17 @@
     return NO_CHILDREN;
   }
 
-
   // render an icon with our own special formatting
 
-  private void _renderIcon(FacesContext context, RenderingContext rc, String icon,
-                           boolean isIconAbsoluteURI, Object text,
-                           String width, String height)
-    throws IOException
+  private void _renderIcon(
+    FacesContext     context,
+    RenderingContext rc,
+    String           icon,
+    boolean          isIconAbsoluteURI,
+    Object           text,
+    String           width,
+    String           height
+    ) throws IOException
   {
     if (icon != null)
     {
@@ -1048,7 +1069,9 @@
   // add a boolean flag to the chain of icons.
   // the chain is rendered before each icon
 
-  private Boolean[] _appendIcon(Boolean[] prepend, Boolean isLine)
+  private Boolean[] _appendIcon(
+    Boolean[] prepend,
+    Boolean   isLine)
   {
     int currLength = prepend.length;
 
@@ -1074,17 +1097,19 @@
   }
 
 
-  private void _prependIcons(FacesContext context, RenderingContext rc,
-                             UIXHierarchy tree, Boolean[] prepend,
-                             boolean leftToRight)
-    throws IOException
+  private void _prependIcons(
+    FacesContext     context,
+    RenderingContext rc,
+    UIXHierarchy     tree,
+    Boolean[]        prepend,
+    boolean          leftToRight
+    ) throws IOException
   {
     int currLength = prepend.length;
     Boolean isLine;
 
     for (int i = 0; i < currLength; i++)
     {
-
       isLine = prepend[i];
 
       if (isLine != null)
@@ -1099,11 +1124,11 @@
                        _ICON_WIDTH, "100%", null);
       }
     }
-
   }
 
-
-  protected boolean getImmediate(FacesBean bean)
+  protected boolean getImmediate(
+    UIComponent component,
+    FacesBean   bean)
   {
     Object o = bean.getProperty(_immediateKey);
     if (o == null)
@@ -1112,19 +1137,17 @@
     return Boolean.TRUE.equals(o);
   }
 
-
-
   protected String getDefaultIconName()
   {
     return null;
   }
 
-
-  private void _renderStampBasedOnAccessibilty(FacesContext context,
-                                               RenderingContext rc,
-                                               UIComponent stamp,
-                                               int depth)
-    throws IOException
+  private void _renderStampBasedOnAccessibilty(
+    FacesContext     context,
+    RenderingContext rc,
+    UIComponent      stamp,
+    int              depth
+    ) throws IOException
   {
     if (isScreenReaderMode(rc))
     {
@@ -1155,7 +1178,6 @@
   private static final String _ICON_HEIGHT = "18";
   private static final String _NODE_SPACER = "3";
 
-
   // expanded states
   protected static final int NO_CHILDREN = 0;
   protected static final int EXPAND_CLOSED = 1;
@@ -1173,7 +1195,6 @@
   // Key used by StyledTextBean to query style class
   static final String _STYLE_CLASS_KEY = "_styleClass";
 
-
   private PropertyKey _immediateKey;
 
   // translation keys

Modified: myfaces/trinidad/branches/2.0.1-branch/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/ValueRenderer.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/2.0.1-branch/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/ValueRenderer.java?rev=896009&r1=896008&r2=896009&view=diff
==============================================================================
--- myfaces/trinidad/branches/2.0.1-branch/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/ValueRenderer.java (original)
+++ myfaces/trinidad/branches/2.0.1-branch/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/ValueRenderer.java Tue Jan  5 11:48:54 2010
@@ -6,9 +6,9 @@
  *  to you under the Apache License, Version 2.0 (the
  *  "License"); you may not use this file except in compliance
  *  with the License.  You may obtain a copy of the License at
- * 
+ *
  *  http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  *  Unless required by applicable law or agreed to in writing,
  *  software distributed under the License is distributed on an
  *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -26,18 +26,20 @@
 
 import org.apache.myfaces.trinidad.bean.FacesBean;
 import org.apache.myfaces.trinidad.bean.PropertyKey;
-
 import org.apache.myfaces.trinidadinternal.convert.ConverterUtils;
 
+
 abstract public class ValueRenderer extends XhtmlRenderer
 {
-  protected ValueRenderer(FacesBean.Type type)
+  protected ValueRenderer(
+    FacesBean.Type type)
   {
     super(type);
   }
 
   @Override
-  protected void findTypeConstants(FacesBean.Type type)
+  protected void findTypeConstants(
+    FacesBean.Type type)
   {
     super.findTypeConstants(type);
     _converterKey = type.findKey("converter");
@@ -49,14 +51,14 @@
     UIComponent  component,
     FacesBean    bean)
   {
-    Object value = getValue(bean);
-    Converter converter = getConverter(bean);
+    Object value = getValue(component, bean);
+    Converter converter = getConverter(component, bean);
     // If there's no explicitly set converter, and the value is non-null
     // and not a String, try to get a default converter
     if ((converter == null) &&
         (value != null) &&
         !(value instanceof String))
-      converter = getDefaultConverter(context, bean);
+      converter = getDefaultConverter(context, component, bean);
 
     if (converter != null)
     {
@@ -66,12 +68,12 @@
     return toString(value);
   }
 
-
   protected Converter getDefaultConverter(
     FacesContext context,
+    UIComponent  component,
     FacesBean    bean)
   {
-    ValueExpression expression = getValueExpression(bean);
+    ValueExpression expression = getValueExpression(component, bean);
     if (expression == null)
       return null;
 
@@ -79,7 +81,9 @@
     return ConverterUtils.createConverter(context, type);
   }
 
-  protected Object getValue(FacesBean bean)
+  protected Object getValue(
+    UIComponent component,
+    FacesBean   bean)
   {
     return bean.getProperty(_valueKey);
   }
@@ -87,12 +91,16 @@
   /**
    * Returns the ValueExpression for the "value" property.
    */
-  protected ValueExpression getValueExpression(FacesBean bean)
+  protected ValueExpression getValueExpression(
+    UIComponent component,
+    FacesBean   bean)
   {
     return bean.getValueExpression(_valueKey);
   }
 
-  protected Converter getConverter(FacesBean bean)
+  protected Converter getConverter(
+    UIComponent component,
+    FacesBean   bean)
   {
     return (Converter) bean.getProperty(_converterKey);
   }

Modified: myfaces/trinidad/branches/2.0.1-branch/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/XhtmlRenderer.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/2.0.1-branch/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/XhtmlRenderer.java?rev=896009&r1=896008&r2=896009&view=diff
==============================================================================
--- myfaces/trinidad/branches/2.0.1-branch/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/XhtmlRenderer.java (original)
+++ myfaces/trinidad/branches/2.0.1-branch/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/XhtmlRenderer.java Tue Jan  5 11:48:54 2010
@@ -6,9 +6,9 @@
  *  to you under the Apache License, Version 2.0 (the
  *  "License"); you may not use this file except in compliance
  *  with the License.  You may obtain a copy of the License at
- * 
+ *
  *  http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  *  Unless required by applicable law or agreed to in writing,
  *  software distributed under the License is distributed on an
  *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -27,24 +27,25 @@
 import javax.faces.context.ResponseWriter;
 import javax.faces.render.Renderer;
 
-import org.apache.myfaces.trinidad.logging.TrinidadLogger;
-
 import org.apache.myfaces.trinidad.bean.FacesBean;
 import org.apache.myfaces.trinidad.bean.PropertyKey;
+import org.apache.myfaces.trinidad.component.UIXCommand;
+import org.apache.myfaces.trinidad.context.PartialPageContext;
+import org.apache.myfaces.trinidad.context.RenderingContext;
+import org.apache.myfaces.trinidad.logging.TrinidadLogger;
 import org.apache.myfaces.trinidad.render.CoreRenderer;
 import org.apache.myfaces.trinidad.render.TypedRenderer;
-
 import org.apache.myfaces.trinidadinternal.agent.TrinidadAgent;
-import org.apache.myfaces.trinidad.context.PartialPageContext;
-import org.apache.myfaces.trinidad.context.RenderingContext;
 import org.apache.myfaces.trinidadinternal.util.FormattedTextParser;
 import org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl;
 
+
 /**
  *  @todo Move "supportsStyleAttributes()", etc., architecture
  */
-public class XhtmlRenderer extends CoreRenderer
-                           implements TypedRenderer, Cloneable
+public class XhtmlRenderer
+  extends CoreRenderer
+  implements TypedRenderer, Cloneable
 {
   public static final String TRANSPARENT_GIF = "t.gif";
 
@@ -95,39 +96,36 @@
    * <p>
    * See section 5.16 of xhtml modularization
    */
-  static public boolean supportsScripting(RenderingContext arc)
+  static public boolean supportsScripting(RenderingContext rc)
   {
-    Object scriptingSpeed = arc.getAgent().getCapabilities().get(
-            TrinidadAgent.CAP_SCRIPTING_SPEED);
+    Object scriptingSpeed =
+      rc.getAgent().getCapabilities().get(TrinidadAgent.CAP_SCRIPTING_SPEED);
 
     return ((scriptingSpeed != null) &&
-            (TrinidadAgent.SCRIPTING_SPEED_CAP_NONE != scriptingSpeed));
+      (TrinidadAgent.SCRIPTING_SPEED_CAP_NONE != scriptingSpeed));
   }
 
-
-  static public boolean supportsEditing(RenderingContext arc)
+  static public boolean supportsEditing(RenderingContext rc)
   {
-    Object cap = arc.getAgent().getCapabilities().get(
-                    TrinidadAgent.CAP_EDITING);
+    Object cap =
+      rc.getAgent().getCapabilities().get(TrinidadAgent.CAP_EDITING);
     return !Boolean.FALSE.equals(cap);
   }
 
-  public static boolean supportsAdvancedForms(
-    RenderingContext arc)
+  public static boolean supportsAdvancedForms(RenderingContext rc)
   {
-    Object cap = arc.getAgent().getCapabilities().get(
-                    TrinidadAgent.CAP_ADVANCED_FORMS);
+    Object cap =
+      rc.getAgent().getCapabilities().get(TrinidadAgent.CAP_ADVANCED_FORMS);
     return !Boolean.FALSE.equals(cap);
   }
 
   /**
    * See section 5.14 of xhtml modularization.
    */
-  public static boolean supportsIntrinsicEvents(
-    RenderingContext arc)
+  public static boolean supportsIntrinsicEvents(RenderingContext rc)
   {
-    Object cap = arc.getAgent().getCapabilities().get(
-                    TrinidadAgent.CAP_INTRINSIC_EVENTS);
+    Object cap =
+      rc.getAgent().getCapabilities().get(TrinidadAgent.CAP_INTRINSIC_EVENTS);
     return !Boolean.FALSE.equals(cap);
   }
 
@@ -139,18 +137,16 @@
    * <p>
    * See section 5.18 of xhtml modularization
    */
-  public static boolean supportsStyleAttributes(
-          RenderingContext arc
-          )
+  public static boolean supportsStyleAttributes(RenderingContext rc)
   {
-    return (arc.getAgent().getCapabilities().get(TrinidadAgent.CAP_STYLE_ATTRIBUTES) !=
-            TrinidadAgent.STYLES_NONE);
+    return (rc.getAgent().getCapabilities().get(TrinidadAgent.CAP_STYLE_ATTRIBUTES) !=
+      TrinidadAgent.STYLES_NONE);
   }
 
-  static public boolean supportsNavigation(RenderingContext arc)
+  static public boolean supportsNavigation(RenderingContext rc)
   {
-    Object cap = arc.getAgent().getCapabilities().get(
-                    TrinidadAgent.CAP_NAVIGATION);
+    Object cap =
+      rc.getAgent().getCapabilities().get(TrinidadAgent.CAP_NAVIGATION);
     return !Boolean.FALSE.equals(cap);
   }
 
@@ -159,55 +155,52 @@
    * <p>
    * See section 5.4.1 of xhtml modularization.
    */
-  public static boolean supportsTextPresentation(
-          RenderingContext arc
-          )
+  public static boolean supportsTextPresentation(RenderingContext rc)
   {
-    Object cap = arc.getAgent().getCapabilities().get(
-                    TrinidadAgent.CAP_TEXT_PRESENTATION);
+    Object cap =
+      rc.getAgent().getCapabilities().get(TrinidadAgent.CAP_TEXT_PRESENTATION);
     return !Boolean.FALSE.equals(cap);
   }
-  static public boolean supportsAccessKeys(RenderingContext arc)
+
+  static public boolean supportsAccessKeys(RenderingContext rc)
   {
     // In screen reader mode, disable access keys.  Despite
     // the name, they are currently considered an accessibility
     // liability
-    if (isScreenReaderMode(arc))
+    if (isScreenReaderMode(rc))
       return false;
 
-    Object cap = arc.getAgent().getCapabilities().get(
-                    TrinidadAgent.CAP_ACCESS_KEYS);
+    Object cap =
+      rc.getAgent().getCapabilities().get(TrinidadAgent.CAP_ACCESS_KEYS);
     return !Boolean.FALSE.equals(cap);
   }
 
-  static public final boolean supportsDisabledFormElements(RenderingContext arc)
+  static public final boolean supportsDisabledFormElements(RenderingContext rc)
   {
-    Object cap = arc.getAgent().getCapabilities().get(
-                    TrinidadAgent.CAP_DISABLED_FORM_ELEMENTS);
+    Object cap =
+      rc.getAgent().getCapabilities().get(TrinidadAgent.CAP_DISABLED_FORM_ELEMENTS);
     return !Boolean.FALSE.equals(cap);
 
   }
 
-  static public final boolean supportsReadonlyFormElements(RenderingContext arc)
+  static public final boolean supportsReadonlyFormElements(RenderingContext rc)
   {
-    Object cap = arc.getAgent().getCapabilities().get(
-                    TrinidadAgent.CAP_READONLY_FORM_ELEMENTS);
+    Object cap =
+      rc.getAgent().getCapabilities().get(TrinidadAgent.CAP_READONLY_FORM_ELEMENTS);
     return !Boolean.FALSE.equals(cap);
 
   }
 
-  static public final boolean supportsAutoCompleteFormElements(
-     RenderingContext arc)
+  static public final boolean supportsAutoCompleteFormElements(RenderingContext rc)
   {
-    Object cap = arc.getAgent().getCapabilities().get(
-                    TrinidadAgent.CAP_AUTO_COMPLETE_FORM_ELEMENTS);
+    Object cap =
+      rc.getAgent().getCapabilities().get(TrinidadAgent.CAP_AUTO_COMPLETE_FORM_ELEMENTS);
     return !Boolean.FALSE.equals(cap);
   }
 
-  static public final boolean supportsSeparateWindow(
-    RenderingContext arc)
+  static public final boolean supportsSeparateWindow(RenderingContext rc)
   {
-    return XhtmlUtils.supportsSeparateWindow(arc.getAgent());
+    return XhtmlUtils.supportsSeparateWindow(rc.getAgent());
   }
 
   /**
@@ -216,12 +209,10 @@
    * <p>
    * See section 5.12 of xhtml modularization.
    */
-  static public final boolean supportsTarget(
-     RenderingContext arc)
-
+  static public final boolean supportsTarget(RenderingContext rc)
   {
-    Object cap = arc.getAgent().getCapabilities().get(
-                    TrinidadAgent.CAP_TARGET);
+    Object cap =
+      rc.getAgent().getCapabilities().get(TrinidadAgent.CAP_TARGET);
     return !Boolean.FALSE.equals(cap);
   }
 
@@ -230,20 +221,17 @@
    * @param context a <code>RenderingContext</code>
    * @return a <code>boolean</code>
    */
-    
-  public static boolean supportsNarrowScreen(RenderingContext arc)
+  public static boolean supportsNarrowScreen(RenderingContext rc)
   {
-    Object cap = arc.getAgent().getCapabilities().get( 
-                                 TrinidadAgent.CAP_NARROW_SCREEN);
+    Object cap =
+      rc.getAgent().getCapabilities().get(TrinidadAgent.CAP_NARROW_SCREEN);
     return Boolean.TRUE.equals(cap);
   }
 
-
   //
   // END OF AGENT CAPABILITY CONVENIENCE METHODS
   //
 
-
   @Override
   protected boolean skipDecode(FacesContext context)
   {
@@ -264,7 +252,6 @@
     return TrinidadFilterImpl.isExecutingDialogReturn(context);
   }
 
-
   /**
    * Returns true if the component can skip its own rendering;
    * true if PPR is on for this request, is not currently active,
@@ -274,14 +261,11 @@
    * <p>
    * Call this overload if you have the clientId already.
    */
-  protected boolean canSkipRendering(
-    RenderingContext rc,
-    String           clientId)
+  protected boolean canSkipRendering(RenderingContext rc, String clientId)
   {
     PartialPageContext ppc = rc.getPartialPageContext();
-    if ((ppc == null) ||
-        ppc.isInsidePartialTarget() ||
-        ppc.isPartialTarget(clientId))
+    if ((ppc == null) || ppc.isInsidePartialTarget() ||
+      ppc.isPartialTarget(clientId))
       return false;
 
     return true;
@@ -296,14 +280,11 @@
    * <p>
    * Call this overload if you don't have the clientId already.
    */
-  protected boolean canSkipRendering(
-    FacesContext     context,
-    RenderingContext rc,
-    UIComponent      component)
+  protected boolean canSkipRendering(FacesContext context,
+    RenderingContext rc, UIComponent component)
   {
     PartialPageContext ppc = rc.getPartialPageContext();
-    if ((ppc == null) ||
-        ppc.isInsidePartialTarget())
+    if ((ppc == null) || ppc.isInsidePartialTarget())
       return false;
 
     String clientId = component.getClientId(context);
@@ -319,12 +300,11 @@
    * @todo Profile and possibly optimize.
    */
   @Override
-  protected boolean shouldRenderId(
-    FacesContext context,
-    UIComponent  component)
+  protected boolean shouldRenderId(FacesContext context,
+    UIComponent component)
   {
     // If there's partial triggers, always render an ID if possible
-    if (getPartialTriggers(getFacesBean(component)) != null)
+    if (getPartialTriggers(component, getFacesBean(component)) != null)
     {
       return true;
     }
@@ -338,12 +318,11 @@
    * @todo Since this is non-final, it can become difficult to
    * re-divide its functionality in a subclass.  Make it final???
    */
-  protected void renderAllAttributes(
-    FacesContext        context,
-    RenderingContext arc,
-    FacesBean           bean) throws IOException
+  protected void renderAllAttributes(FacesContext context,
+    RenderingContext rc, UIComponent component, FacesBean bean)
+    throws IOException
   {
-    renderAllAttributes(context, arc, bean, true);
+    renderAllAttributes(context, rc, component, bean, true);
   }
 
 
@@ -352,34 +331,32 @@
    * and all the Javascript attributes. Takes a boolean to determine if
    * renderStyleAttributes should be called, which renders "class", "style"
    */
-  protected void renderAllAttributes(
-    FacesContext        context,
-    RenderingContext arc,
-    FacesBean           bean,
-    boolean             renderStyleAttrs) throws IOException
+  protected void renderAllAttributes(FacesContext context,
+    RenderingContext rc, UIComponent component, FacesBean bean,
+    boolean renderStyleAttrs)
+    throws IOException
   {
-    renderShortDescAttribute(context, arc, bean);
+    renderShortDescAttribute(context, rc, component, bean);
     // render the events only if the browser supports JavaScript
-    if (supportsScripting(arc))
+    if (supportsScripting(rc))
     {
-      renderEventHandlers(context, bean);
+      renderEventHandlers(context, component, bean);
     }
     if (renderStyleAttrs)
-      renderStyleAttributes(context, arc, bean);
+      renderStyleAttributes(context, rc, component, bean);
 
   }
+
   /**
    * Renders the inline style attribute for the specified node
    */
-  public static void renderInlineStyleAttribute(
-    FacesContext        context,
-    RenderingContext arc,
-    String              style
-    ) throws IOException
+  public static void renderInlineStyleAttribute(FacesContext context,
+    RenderingContext rc, UIComponent component, String style)
+    throws IOException
   {
     if (style != null)
     {
-      if (supportsStyleAttributes(arc))
+      if (supportsStyleAttributes(rc))
       {
         ResponseWriter writer = context.getResponseWriter();
         writer.writeAttribute("style", style, null);
@@ -388,41 +365,38 @@
     }
   }
 
-  protected void renderInlineStyle(
-    FacesContext        context,
-    RenderingContext arc,
-    FacesBean           bean) throws IOException
+  protected void renderInlineStyle(FacesContext context,
+    RenderingContext rc, UIComponent component, FacesBean bean)
+    throws IOException
   {
-    String style = getInlineStyle(bean);
+    String style = getInlineStyle(component, bean);
     if (style != null)
     {
-      context.getResponseWriter().writeAttribute("style",
-                                                 style,
-                                                 "inlineStyle");
+      context.getResponseWriter().writeAttribute("style", style,
+          "inlineStyle");
     }
   }
 
-  protected void renderShortDescAttribute(
-    FacesContext        context,
-    RenderingContext arc,
-    FacesBean           bean) throws IOException
+  protected void renderShortDescAttribute(FacesContext context,
+    RenderingContext rc, UIComponent component, FacesBean bean)
+    throws IOException
   {
-    String shortDesc = getShortDesc(bean);
+    String shortDesc = getShortDesc(component, bean);
     if (shortDesc != null)
-      context.getResponseWriter().writeAttribute("title",
-                                                 shortDesc,
-                                                 "shortDesc");
+      context.getResponseWriter().writeAttribute("title", shortDesc,
+          "shortDesc");
   }
 
-  protected void renderStyleAttributes(
-    FacesContext        context,
-    RenderingContext arc,
-    FacesBean           bean) throws IOException
+  protected void renderStyleAttributes(FacesContext context,
+    RenderingContext rc, UIComponent component, FacesBean bean)
+    throws IOException
   {
-    renderStyleAttributes(context, arc, bean, getDefaultStyleClass(bean));
+    renderStyleAttributes(context, rc, component, bean,
+        getDefaultStyleClass(component, bean));
   }
 
-  protected String getDefaultStyleClass(FacesBean bean)
+  protected String getDefaultStyleClass(UIComponent component,
+    FacesBean bean)
   {
     return null;
   }
@@ -430,24 +404,25 @@
   /**
    * When there's a default style class pass it in to this method
    */
-  protected void renderStyleAttributes(
-    FacesContext        context,
-    RenderingContext    arc,
-    FacesBean           bean,
-    String              defaultStyleClass) throws IOException
-  {
-    String styleClass = getStyleClass(bean);
-    List<String> parsedStyleClasses = OutputUtils.parseStyleClassList(styleClass);
+  protected void renderStyleAttributes(FacesContext context,
+    RenderingContext rc, UIComponent component, FacesBean bean,
+    String defaultStyleClass)
+    throws IOException
+  {
+    String styleClass = getStyleClass(component, bean);
+    List<String> parsedStyleClasses =
+      OutputUtils.parseStyleClassList(styleClass);
 
     if (defaultStyleClass != null)
     {
-      if(styleClass!= null )
+      if (styleClass != null)
       {
         // If we've got both a defaultStyleClass and a styleClass,
         // build up an array containing each - and if the styleClass
         // is really a list of styleClasses, break it apart so it
         // can be compressed correctly
-        int styleCount = (parsedStyleClasses == null) ? 1 : parsedStyleClasses.size();
+        int styleCount =
+          (parsedStyleClasses == null)? 1: parsedStyleClasses.size();
         String[] styleClasses = new String[1 + styleCount];
         if (parsedStyleClasses != null)
         {
@@ -461,84 +436,79 @@
 
         styleClasses[styleCount] = defaultStyleClass;
 
-        renderStyleClasses(context,
-                           arc,
-                           styleClasses);
+        renderStyleClasses(context, rc, styleClasses);
       }
       else
       {
-        renderStyleClass(context, arc, defaultStyleClass);
+        renderStyleClass(context, rc, defaultStyleClass);
       }
     }
     else if (styleClass != null)
     {
       if (parsedStyleClasses == null)
       {
-        styleClass = arc.getStyleClass(styleClass);
+        styleClass = rc.getStyleClass(styleClass);
         context.getResponseWriter().writeAttribute("class",
-                                                   arc.getStyleClass(styleClass),
-                                                   "styleClass");
+            rc.getStyleClass(styleClass), "styleClass");
       }
       else
       {
-        renderStyleClasses(context,
-                           arc,
-                           parsedStyleClasses.toArray(
-                                   new String[parsedStyleClasses.size()]));
+        renderStyleClasses(context, rc,
+            parsedStyleClasses.toArray(new String[parsedStyleClasses.size()]));
       }
     }
 
-    String style = getInlineStyle(bean);
+    String style = getInlineStyle(component, bean);
     if (style != null)
     {
-      context.getResponseWriter().writeAttribute("style",
-                                                 style,
-                                                 "inlineStyle");
+      context.getResponseWriter().writeAttribute("style", style,
+          "inlineStyle");
     }
   }
 
-
   /**
    * Render all the Javascript attributes.
    */
-  protected void renderEventHandlers(
-    FacesContext context,
-    FacesBean    bean) throws IOException
+  protected void renderEventHandlers(FacesContext context,
+    UIComponent component, FacesBean bean)
+    throws IOException
   {
     ResponseWriter rw = context.getResponseWriter();
-    rw.writeAttribute("onclick", getOnclick(bean),  "onclick");
-    rw.writeAttribute("ondblclick", getOndblclick(bean),  "ondblclick");
-    rw.writeAttribute("onkeydown", getOnkeydown(bean),  "onkeydown");
-    rw.writeAttribute("onkeyup", getOnkeyup(bean),  "onkeyup");
-    rw.writeAttribute("onkeypress", getOnkeypress(bean),  "onkeypress");
-    rw.writeAttribute("onmousedown", getOnmousedown(bean),  "onmousedown");
-    rw.writeAttribute("onmousemove", getOnmousemove(bean),  "onmousemove");
-    rw.writeAttribute("onmouseout", getOnmouseout(bean),  "onmouseout");
-    rw.writeAttribute("onmouseover", getOnmouseover(bean),  "onmouseover");
-    rw.writeAttribute("onmouseup", getOnmouseup(bean),  "onmouseup");
-  }
-
-
-  protected static void renderHAlign(
-    FacesContext        context,
-    RenderingContext arc,
-    Object              hAlign) throws IOException
+    rw.writeAttribute("onclick", getOnclick(component, bean), "onclick");
+    rw.writeAttribute("ondblclick", getOndblclick(component, bean),
+        "ondblclick");
+    rw.writeAttribute("onkeydown", getOnkeydown(component, bean),
+        "onkeydown");
+    rw.writeAttribute("onkeyup", getOnkeyup(component, bean), "onkeyup");
+    rw.writeAttribute("onkeypress", getOnkeypress(component, bean),
+        "onkeypress");
+    rw.writeAttribute("onmousedown", getOnmousedown(component, bean),
+        "onmousedown");
+    rw.writeAttribute("onmousemove", getOnmousemove(component, bean),
+        "onmousemove");
+    rw.writeAttribute("onmouseout", getOnmouseout(component, bean),
+        "onmouseout");
+    rw.writeAttribute("onmouseover", getOnmouseover(component, bean),
+        "onmouseover");
+    rw.writeAttribute("onmouseup", getOnmouseup(component, bean),
+        "onmouseup");
+  }
+
+  protected static void renderHAlign(FacesContext context,
+    RenderingContext rc, Object hAlign)
+    throws IOException
   {
     if (hAlign != null)
     {
-      boolean rtl = arc.isRightToLeft();
+      boolean rtl = rc.isRightToLeft();
 
       if ("start".equals(hAlign))
       {
-        hAlign = (rtl)
-                  ? "right"
-                  : "left";
+        hAlign = (rtl)? "right": "left";
       }
       else if ("end".equals(hAlign))
       {
-        hAlign = (rtl)
-                  ? "left"
-                  : "right";
+        hAlign = (rtl)? "left": "right";
       }
 
       context.getResponseWriter().writeAttribute("align", hAlign, null);
@@ -549,11 +519,9 @@
   // FORMATTED TEXT
   //
 
-
-  final protected void renderPossiblyFormattedText(
-    FacesContext context,
-    Object       textValue
-    ) throws IOException
+  final protected void renderPossiblyFormattedText(FacesContext context,
+    Object textValue)
+    throws IOException
   {
     if (textValue != null)
     {
@@ -565,9 +533,9 @@
     }
   }
 
-  final protected void renderFormattedText(
-    FacesContext context,
-    Object       textValue) throws IOException
+  final protected void renderFormattedText(FacesContext context,
+    Object textValue)
+    throws IOException
   {
     if (textValue != null)
     {
@@ -594,23 +562,21 @@
   // SPACERS AND TRANSPARENT IMAGES
   //
 
-  static public String getAbsoluteImageUri(
-     FacesContext        context,
-     RenderingContext arc,
-     String              imagePath)
+  static public String getAbsoluteImageUri(FacesContext context,
+    RenderingContext rc, String imagePath)
   {
-    return getBaseImageUri(context, arc) + imagePath;
+    return getBaseImageUri(context, rc) + imagePath;
   }
 
   /**
    * @todo GET FROM REAL SOURCE?
    * @todo Cache concatentation
    */
-  static protected String getBaseImageUri(
-    FacesContext        context,
-    RenderingContext arc)
+  static protected String getBaseImageUri(FacesContext context,
+    RenderingContext rc)
   {
-    String contextUri = context.getExternalContext().getRequestContextPath();
+    String contextUri =
+      context.getExternalContext().getRequestContextPath();
     return contextUri + "/adf/images/";
   }
 
@@ -620,51 +586,36 @@
    * This method may only be called for decorative icons - icons
    * that are purely visual.
    */
-  protected final void renderDecorativeIcon(
-    FacesContext        context,
-    RenderingContext arc,
-    String              iconUri,
-    Object              width,
-    Object              height,
-    Object              id,
-    Object              altText
-    ) throws IOException
-  {
-    renderDecorativeIcon(context, arc, iconUri, width, height,
-                         id, altText, null);
-  }
-
-  protected final void renderDecorativeIcon(
-    FacesContext        context,
-    RenderingContext arc,
-    String              iconUri,
-    Object              width,
-    Object              height,
-    Object              id,
-    Object              altText,
-    UIComponent         comp
-    ) throws IOException
+  protected final void renderDecorativeIcon(FacesContext context,
+    RenderingContext rc, String iconUri, Object width, Object height,
+    Object id, Object altText)
+    throws IOException
+  {
+    renderDecorativeIcon(context, rc, iconUri, width, height, id, altText,
+        null);
+  }
+
+  protected final void renderDecorativeIcon(FacesContext context,
+    RenderingContext rc, String iconUri, Object width, Object height,
+    Object id, Object altText, UIComponent comp)
+    throws IOException
   {
     // Convert iconUri to an absolute uri
-    String absoluteUri = getAbsoluteImageUri(context, arc, iconUri);
+    String absoluteUri = getAbsoluteImageUri(context, rc, iconUri);
 
-    if ((altText == null) && !isInaccessibleMode(arc))
+    if ((altText == null) && !isInaccessibleMode(rc))
       altText = "";
 
-    OutputUtils.renderImage(context, arc, absoluteUri,
-                            width, height, id, altText, comp);
+    OutputUtils.renderImage(context, rc, absoluteUri, width, height, id,
+        altText, comp);
   }
 
-
   /**
    * Renders a vertical spacer for a specified non-null height.
    */
-  protected final void renderVerticalSpacer(
-    FacesContext        context,
-    Object              height,
-    Object              id,
-    UIComponent         comp
-    ) throws IOException
+  protected final void renderVerticalSpacer(FacesContext context,
+    Object height, Object id, UIComponent comp)
+    throws IOException
   {
     if (height != null)
     {
@@ -677,7 +628,8 @@
         //pu: CSS mandates specifying units, a crude sanity check if height
         //  does not already contain units, if yes treat it as pixels.
         boolean isUnitsNotSpecified =
-          Character.isDigit(heightString.charAt(heightString.length()-1));
+          Character.isDigit(heightString.charAt(heightString.length() -
+              1));
         if (isUnitsNotSpecified)
           heightString += "px";
         writer.writeAttribute("style", "margin-top:" + heightString, null);
@@ -689,107 +641,101 @@
   /**
    * Renders a spacer.
    */
-  protected final void renderSpacer(
-    FacesContext        context,
-    RenderingContext arc,
-    String              width,
-    String              height
-    ) throws IOException
+  protected final void renderSpacer(FacesContext context,
+    RenderingContext rc, String width, String height)
+    throws IOException
   {
-    renderTransparent(context, arc, width, height, false, null);
+    renderTransparent(context, rc, width, height, false, null);
   }
 
 
   /**
    * Renders a transparent gif using a script to save space.
    */
-  protected final void renderTransparent(
-    FacesContext        context,
-    RenderingContext arc,
-    String              width,
-    String              height,
-    boolean             needsQuoting,
-    Object              id
-    ) throws IOException
+  protected final void renderTransparent(FacesContext context,
+    RenderingContext rc, String width, String height, boolean needsQuoting,
+    Object id)
+    throws IOException
   {
     Counter counter =
-      (Counter) getRenderingProperty(arc, _SCRIPT_SPACER_COUNT);
+      (Counter) getRenderingProperty(rc, _SCRIPT_SPACER_COUNT);
     if (counter == null)
     {
       counter = new Counter();
-      setRenderingProperty(arc, _SCRIPT_SPACER_COUNT, counter);
+      setRenderingProperty(rc, _SCRIPT_SPACER_COUNT, counter);
     }
     int count = counter.count++;
 
     // do not use the script spacer, if we have already rendered an enormous
     // number of spacers. bug 3786394:
     boolean useScript =
-      ((count < 800)
-       && (TrinidadAgent.SCRIPTING_SPEED_CAP_FAST ==
-           arc.getAgent().getCapabilities().get(TrinidadAgent.CAP_SCRIPTING_SPEED)));
-    _renderTransparent(context, arc, width, height, needsQuoting, id, useScript);
+      ((count < 800) && (TrinidadAgent.SCRIPTING_SPEED_CAP_FAST ==
+      rc.getAgent().getCapabilities().get(TrinidadAgent.CAP_SCRIPTING_SPEED)));
+    _renderTransparent(context, rc, width, height, needsQuoting, id,
+        useScript);
   }
-  
+
   /**
-   * This method evaluates the property of the specified bean if it supports 
-   * the specified property key and if the current value is <code>null</code>, 
+   * This method evaluates the property of the specified bean if it supports
+   * the specified property key and if the current value is <code>null</code>,
    * then evaluate the default value.
    * <p>
-   * If the bean does not support the specified key, this method returns 
-   * <code>null</code>. Unsupported keys occur when the bean's type its type 
-   * returned <code>null</code> from <code>findKey</code> when 
+   * If the bean does not support the specified key, this method returns
+   * <code>null</code>. Unsupported keys occur when the bean's type its type
+   * returned <code>null</code> from <code>findKey</code> when
    * <code>findTypeConstants</code> method was called.
    * </p>
-   * 
+   *
    * @param bean the property value holder.
    * @param key  the key associated to the property to evaluate.
-   * 
-   * @return <code>null</code> if key is <code>null</code>, the current 
-   *         property value in the bean for the specified key if it was 
+   *
+   * @return <code>null</code> if key is <code>null</code>, the current
+   *         property value in the bean for the specified key if it was
    *         set, or the default value if it wasn't.
-   * 
+   *
    * @see #findTypeConstants(org.apache.myfaces.trinidad.bean.FacesBean.Type)
    */
   protected Object resolveProperty(FacesBean bean, PropertyKey key)
   {
     return resolveProperty(bean, key, true);
   }
-  
+
   /**
-   * This method evaluates the property of the specified bean if it supports 
-   * the specified property key and if the current value is <code>null</code>, 
-   * then evaluate the default value if and only if <code>checkDefault</code> 
+   * This method evaluates the property of the specified bean if it supports
+   * the specified property key and if the current value is <code>null</code>,
+   * then evaluate the default value if and only if <code>checkDefault</code>
    * is <code>true</code>.
    * <p>
-   * If the bean does not support the specified key, this method returns 
-   * <code>null</code>. Unsupported keys occur when the bean's type its type 
-   * returned <code>null</code> from <code>findKey</code> when 
+   * If the bean does not support the specified key, this method returns
+   * <code>null</code>. Unsupported keys occur when the bean's type its type
+   * returned <code>null</code> from <code>findKey</code> when
    * <code>findTypeConstants</code> method was called.
    * </p>
-   * 
+   *
    * @param bean         the property value holder.
    * @param key          the key associated to the property to evaluate.
-   * @param checkDefault a flag to tell the method to look for the default value 
+   * @param checkDefault a flag to tell the method to look for the default value
    *                     if no value was explicitely set.
-   * 
-   * @return <code>null</code> if key is <code>null</code>, the current 
-   *         property value in the bean for the specified key if it was 
-   *         set, or the default value if it wasn't and checkDefault is 
+   *
+   * @return <code>null</code> if key is <code>null</code>, the current
+   *         property value in the bean for the specified key if it was
+   *         set, or the default value if it wasn't and checkDefault is
    *         <code>true</code>.
    */
-  protected Object resolveProperty(FacesBean bean, PropertyKey key, boolean checkDefault)
+  protected Object resolveProperty(FacesBean bean, PropertyKey key,
+    boolean checkDefault)
   {
     if (key == null)
     {
       return null;
     }
-    
+
     Object value = bean.getProperty(key);
     if (value == null && checkDefault)
     {
       value = key.getDefault();
     }
-    
+
     return value;
   }
 
@@ -803,47 +749,42 @@
    * then an html IMG tag will be used.
    * @todo fixup call to addLib
    */
-  private void _renderTransparent(
-    FacesContext        context,
-    RenderingContext arc,
-    String              width,
-    String              height,
-    boolean             needsQuoting,
-    Object              id,
-    boolean             useScript
-    ) throws IOException
+  private void _renderTransparent(FacesContext context,
+    RenderingContext rc, String width, String height, boolean needsQuoting,
+    Object id, boolean useScript)
+    throws IOException
   {
-    PartialPageContext pContext = arc.getPartialPageContext();
+    PartialPageContext pContext = rc.getPartialPageContext();
 
     // cannot use t() in MarlinCore.js on a partial rendering pass
     // just render the icon.
     if (!useScript || (pContext != null))
     {
-      renderDecorativeIcon(context, arc, TRANSPARENT_GIF,
-                           width, height, id, null);
+      renderDecorativeIcon(context, rc, TRANSPARENT_GIF, width, height, id,
+          null);
     }
     else
     {
       // IE has fast javascript, so render has a js function call
       ResponseWriter writer = context.getResponseWriter();
 
-      if (getRenderingProperty(arc,
-                               _TRANSPARENT_FUNCTION_WRITTEN_KEY) == null)
+      if (getRenderingProperty(rc, _TRANSPARENT_FUNCTION_WRITTEN_KEY) ==
+        null)
       {
         // determine the transparent image's URI
-        String transparentURI = getAbsoluteImageUri(context, arc, TRANSPARENT_GIF);
+        String transparentURI =
+          getAbsoluteImageUri(context, rc, TRANSPARENT_GIF);
 
-        setRenderingProperty(arc,
-                             _TRANSPARENT_FUNCTION_WRITTEN_KEY,
-                             Boolean.TRUE);
+        setRenderingProperty(rc, _TRANSPARENT_FUNCTION_WRITTEN_KEY,
+            Boolean.TRUE);
 
         // make sure the transparent image function is loaded
-        XhtmlUtils.addLib(context, arc, "t()");
+        XhtmlUtils.addLib(context, rc, "t()");
 
         writer.startElement("script", null);
         // Bug #3426092:
         // render the type="text/javascript" attribute in accessibility mode
-        renderScriptTypeAttribute(context, arc);
+        renderScriptTypeAttribute(context, rc);
 
         writer.writeAttribute("id", id, null);
 
@@ -854,7 +795,7 @@
         // store accessibility mode as javascript variable
         // which is used in t()
         writer.write("var _axm");
-        if (!isInaccessibleMode(arc))
+        if (!isInaccessibleMode(rc))
           writer.write("=1");
         writer.write(";");
       }
@@ -863,7 +804,7 @@
         writer.startElement("script", null);
         // Bug #3426092:
         // render the type="text/javascript" attribute in accessibility mode
-        renderScriptTypeAttribute(context, arc);
+        renderScriptTypeAttribute(context, rc);
         writer.writeAttribute("id", id, null);
       }
 
@@ -918,6 +859,7 @@
   //
   // JAVASCRIPT RENDERING
   //
+
   /**
    * Renders the "defer" attribute for a script element.
    * In order to support partial page rendering, scripts must
@@ -931,9 +873,9 @@
    * Note: ResponseWriter.startElement("script", null) must be called
    * before calling this method.
    */
-  public static void renderScriptDeferAttribute(
-    FacesContext        context,
-    RenderingContext arc) throws IOException
+  public static void renderScriptDeferAttribute(FacesContext context,
+    RenderingContext rc)
+    throws IOException
   {
     // At the moment we only render the defer attribute if
     // we are in the partial rendering pass.  This is to
@@ -947,7 +889,8 @@
     // ScriptBufferingResponseWriter.  Otherwise, we run into bug
     // 2466017.
     if (false)
-      context.getResponseWriter().writeAttribute("defer", Boolean.TRUE, null);
+      context.getResponseWriter().writeAttribute("defer", Boolean.TRUE,
+          null);
   }
 
   /**
@@ -958,149 +901,189 @@
    * Note: ResponseWriter.startElement("script", null) must be called
    * before calling this method.
    */
-  public static void renderScriptTypeAttribute(
-    FacesContext        context,
-    RenderingContext arc) throws IOException
+  public static void renderScriptTypeAttribute(FacesContext context,
+    RenderingContext rc)
+    throws IOException
   {
-    if (!isInaccessibleMode(arc))
+    if (!isInaccessibleMode(rc))
     {
       context.getResponseWriter().writeAttribute("type",
-                                                 _ACCESSIBILITY_SCRIPT_TYPE,
-                                                 null);
+          _ACCESSIBILITY_SCRIPT_TYPE, null);
     }
   }
 
 
   /**
    * This method renders an input element of type "submit". The input element's
-   * name attribute is encoded with parameter name and value pairs. Thus, it 
-   * would enable Non-JavaScript browsers to include the element's name in 
-   * their payLoad, if the element submits the page.    
+   * name attribute is encoded with parameter name and value pairs. Thus, it
+   * would enable Non-JavaScript browsers to include the element's name in
+   * their payLoad, if the element submits the page.
    *
    * @param context a <code>FacesContext</code>
-   * @param arc a <code>RenderingContext</code>
+   * @param rc a <code>RenderingContext</code>
    * @param valueAttri a <code>String</code> it is the value attribute
    *  of the submit button
    * @param nameAttri  a <code>String</code> it is the name attribute
    *  of the submit button
-   * 
+   *
    */
-  public static void renderSubmitButtonNonJSBrowser(
-    FacesContext     context,
-    RenderingContext arc,
-    String           valueAttri,
-    String           nameAttri
-    ) throws IOException
+  public static void renderSubmitButtonNonJSBrowser(FacesContext context,
+    RenderingContext rc, String valueAttri, String nameAttri)
+    throws IOException
   {
     ResponseWriter writer = context.getResponseWriter();
     writer.startElement("input", null);
     writer.writeAttribute("type", "submit", null);
     writer.writeAttribute("value", valueAttri, null);
     writer.writeAttribute("name", nameAttri, null);
-    renderStyleClass(context, arc, 
-                       SkinSelectors.AF_COMMAND_BUTTON_STYLE_CLASS);
+    renderStyleClass(context, rc,
+        SkinSelectors.AF_COMMAND_BUTTON_STYLE_CLASS);
     writer.endElement("input");
   }
- 
+
   //
   // ATTRIBUTE HOOKS
   //
-  protected String getShortDesc(FacesBean bean)
+
+  protected String getShortDesc(
+    UIComponent component,
+    FacesBean   bean)
   {
     return toString(bean.getProperty(_shortDescKey));
   }
 
-  protected String getStyleClass(FacesBean bean)
+  protected String getStyleClass(
+    UIComponent component,
+    FacesBean   bean)
   {
     return toString(bean.getProperty(_styleClassKey));
   }
 
-  protected String getInlineStyle(FacesBean bean)
+  protected String getInlineStyle(
+    UIComponent component,
+    FacesBean   bean)
   {
     return toString(bean.getProperty(_inlineStyleKey));
   }
 
-  protected String getOnclick(FacesBean bean)
+  protected String getOnclick(
+    UIComponent component,
+    FacesBean   bean)
   {
     if (_onclickKey == null)
       return null;
 
-    return toString(bean.getProperty(_onclickKey));
+    return XhtmlUtils.getClientEventHandler(
+      FacesContext.getCurrentInstance(),
+      component,
+      "click",
+      component instanceof UIXCommand ? "action" : null,
+      toString(bean.getProperty(_onclickKey)),
+      null);
   }
 
-  protected String getOndblclick(FacesBean bean)
+  protected String getOndblclick(
+    UIComponent component,
+    FacesBean   bean)
   {
     if (_ondblclickKey == null)
       return null;
 
-    return toString(bean.getProperty(_ondblclickKey));
+    return XhtmlUtils.getClientEventHandler(FacesContext.getCurrentInstance(), component,
+             "dblclick", null, toString(bean.getProperty(_ondblclickKey)), null);
   }
 
-  protected String getOnkeydown(FacesBean bean)
+  protected String getOnkeydown(
+    UIComponent component,
+    FacesBean   bean)
   {
     if (_onkeydownKey == null)
       return null;
 
-    return toString(bean.getProperty(_onkeydownKey));
+    return XhtmlUtils.getClientEventHandler(FacesContext.getCurrentInstance(), component,
+             "keydown", null, toString(bean.getProperty(_onkeydownKey)), null);
   }
 
-  protected String getOnkeyup(FacesBean bean)
+  protected String getOnkeyup(
+    UIComponent component,
+    FacesBean   bean)
   {
     if (_onkeyupKey == null)
       return null;
 
-    return toString(bean.getProperty(_onkeyupKey));
+    return XhtmlUtils.getClientEventHandler(FacesContext.getCurrentInstance(), component,
+             "keyup", null, toString(bean.getProperty(_onkeyupKey)), null);
   }
 
-  protected String getOnkeypress(FacesBean bean)
+  protected String getOnkeypress(
+    UIComponent component,
+    FacesBean   bean)
   {
     if (_onkeypressKey == null)
       return null;
 
-    return toString(bean.getProperty(_onkeypressKey));
+    return XhtmlUtils.getClientEventHandler(FacesContext.getCurrentInstance(), component,
+             "keypress", null, toString(bean.getProperty(_onkeypressKey)), null);
   }
 
-  protected String getOnmousedown(FacesBean bean)
+  protected String getOnmousedown(
+    UIComponent component,
+    FacesBean   bean)
   {
     if (_onmousedownKey == null)
       return null;
 
-    return toString(bean.getProperty(_onmousedownKey));
+    return XhtmlUtils.getClientEventHandler(FacesContext.getCurrentInstance(), component,
+             "mousedown", null, toString(bean.getProperty(_onmousedownKey)), null);
   }
 
-  protected String getOnmousemove(FacesBean bean)
+  protected String getOnmousemove(
+    UIComponent component,
+    FacesBean   bean)
   {
     if (_onmousemoveKey == null)
       return null;
 
-    return toString(bean.getProperty(_onmousemoveKey));
+    return XhtmlUtils.getClientEventHandler(FacesContext.getCurrentInstance(), component,
+             "mousemove", null, toString(bean.getProperty(_onmousemoveKey)), null);
   }
 
-  protected String getOnmouseout(FacesBean bean)
+  protected String getOnmouseout(
+    UIComponent component,
+    FacesBean   bean)
   {
     if (_onmouseoutKey == null)
       return null;
 
-    return toString(bean.getProperty(_onmouseoutKey));
+    return XhtmlUtils.getClientEventHandler(FacesContext.getCurrentInstance(), component,
+             "mouseout", null, toString(bean.getProperty(_onmouseoutKey)), null);
   }
 
-  protected String getOnmouseover(FacesBean bean)
+  protected String getOnmouseover(
+    UIComponent component,
+    FacesBean   bean)
   {
     if (_onmouseoverKey == null)
       return null;
 
-    return toString(bean.getProperty(_onmouseoverKey));
+    return XhtmlUtils.getClientEventHandler(FacesContext.getCurrentInstance(), component,
+             "mouseover", null, toString(bean.getProperty(_onmouseoverKey)), null);
   }
 
-  protected String getOnmouseup(FacesBean bean)
+  protected String getOnmouseup(
+    UIComponent component,
+    FacesBean   bean)
   {
     if (_onmouseupKey == null)
       return null;
 
-    return toString(bean.getProperty(_onmouseupKey));
+    return XhtmlUtils.getClientEventHandler(FacesContext.getCurrentInstance(), component,
+             "mouseup", null, toString(bean.getProperty(_onmouseupKey)), null);
   }
 
-  protected String[] getPartialTriggers(FacesBean bean)
+  protected String[] getPartialTriggers(
+    UIComponent component,
+    FacesBean   bean)
   {
     if (_partialTriggersKey == null)
     {
@@ -1108,21 +1091,21 @@
     }
     else
     {
-      return (String[])bean.getProperty(_partialTriggersKey);
+      return (String[]) bean.getProperty(_partialTriggersKey);
     }
   }
 
   /**
-   * Returns true if the agent supports the "onclick" JS Handler in an "input" 
+   * Returns true if the agent supports the "onclick" JS Handler in an "input"
    * HTML element of type "image"
    */
-  static public boolean supportsOnClickOnImgInput(RenderingContext arc)
+  static public boolean supportsOnClickOnImgInput(RenderingContext rc)
   {
-    Object cap = arc.getAgent().getCapabilities().get(
-                      TrinidadAgent.CAP_ONCLICK_IMG_INPUT);
+    Object cap =
+      rc.getAgent().getCapabilities().get(TrinidadAgent.CAP_ONCLICK_IMG_INPUT);
     return !Boolean.FALSE.equals(cap);
   }
-  
+
   private PropertyKey _shortDescKey;
   private PropertyKey _styleClassKey;
   private PropertyKey _inlineStyleKey;
@@ -1139,7 +1122,8 @@
   private PropertyKey _partialTriggersKey;
 
   // The value bound to the type attribute in script tags in accessibilty mode.
-  private static final String _ACCESSIBILITY_SCRIPT_TYPE = "text/javascript";
+  private static final String _ACCESSIBILITY_SCRIPT_TYPE =
+    "text/javascript";
 
   // Key to look up the number of times we have rendered the script spacer:
   private static final Object _SCRIPT_SPACER_COUNT = new Object();
@@ -1149,5 +1133,6 @@
   //                 XhtmlLafRenderer.__TRANSPARENT_URL_KEY = "_t.gif";
   private static final String _TRANSPARENT_FUNCTION_WRITTEN_KEY = "_t.gif";
 
-  private static final TrinidadLogger _LOG = TrinidadLogger.createTrinidadLogger(XhtmlRenderer.class);
+  private static final TrinidadLogger _LOG =
+    TrinidadLogger.createTrinidadLogger(XhtmlRenderer.class);
 }

Modified: myfaces/trinidad/branches/2.0.1-branch/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/XhtmlUtils.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/2.0.1-branch/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/XhtmlUtils.java?rev=896009&r1=896008&r2=896009&view=diff
==============================================================================
--- myfaces/trinidad/branches/2.0.1-branch/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/XhtmlUtils.java (original)
+++ myfaces/trinidad/branches/2.0.1-branch/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/XhtmlUtils.java Tue Jan  5 11:48:54 2010
@@ -20,13 +20,20 @@
 
 import java.io.IOException;
 
+import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
 import javax.faces.component.UIComponent;
+import javax.faces.component.behavior.ClientBehavior;
+import javax.faces.component.behavior.ClientBehaviorContext;
+import javax.faces.component.behavior.ClientBehaviorHint;
+import javax.faces.component.behavior.ClientBehaviorHolder;
 import javax.faces.context.FacesContext;
 import javax.faces.context.ResponseWriter;
 
@@ -37,6 +44,7 @@
 import org.apache.myfaces.trinidad.context.Agent;
 import org.apache.myfaces.trinidad.context.RenderingContext;
 import org.apache.myfaces.trinidad.logging.TrinidadLogger;
+import org.apache.myfaces.trinidad.render.CoreRenderer;
 import org.apache.myfaces.trinidadinternal.agent.TrinidadAgent;
 import org.apache.myfaces.trinidadinternal.renderkit.core.xhtml.jsLibs.Scriptlet;
 import org.apache.myfaces.trinidadinternal.renderkit.core.xhtml.jsLibs.XhtmlScriptletFactory;
@@ -68,7 +76,6 @@
     }
   }
 
-
   /**
    * Returns true if the agent has enough support for Trinidad
    * to launch separate windows.  We require both multiple window
@@ -105,7 +112,6 @@
     return compID.toString();
   }
 
-
   /**
    * Registers a scriptlet.
    */
@@ -117,11 +123,12 @@
   /**
    */
   static public void addLib(
-    FacesContext        context,
-    RenderingContext arc,
-    Object              libKey) throws IOException
+    FacesContext     context,
+    RenderingContext rc,
+    Object           libKey
+    ) throws IOException
   {
-    if ((XhtmlRenderer.supportsScripting(arc)) && (libKey != null))
+    if ((XhtmlRenderer.supportsScripting(rc)) && (libKey != null))
     {
       Scriptlet scriptlet = _sScriptletTable.get(libKey);
       if (scriptlet == null)
@@ -131,12 +138,11 @@
       }
       else
       {
-        scriptlet.outputScriptlet(context, arc);
+        scriptlet.outputScriptlet(context, rc);
       }
     }
   }
 
-
   /**
    * Write out a script element importing a library.
    * The given URL will only be written once to the page.
@@ -200,8 +206,7 @@
     writer.endElement("script");
   }
 
-
-   /**
+  /**
    * Return the chained JavaScript
    */
   public static String getChainedJS(
@@ -271,6 +276,74 @@
     return outBuilder.toString();
   }
 
+  /**
+   * Return the chained JavaScript
+   */
+  public static String getChainedJS(
+    boolean   shortCircuit,
+    String... scripts
+    )
+  {
+    if (scripts.length == 0)
+    {
+      return null;
+    }
+
+    if (scripts.length <= 2)
+    {
+      // Use the more efficient code for two scripts, or less
+      return getChainedJS(scripts[0], scripts.length == 2 ? scripts[1] : null, shortCircuit);
+    }
+
+    StringBuilder builder = new StringBuilder(100);
+    builder.append("return _chainMultiple([");
+    int firstNonNullScript = -1;
+    int numScripts = 0;
+
+    for (int i = 0, size = scripts.length; i < size; ++i)
+    {
+      String script = scripts[i];
+      if (script == null) { continue; }
+      script = script.trim();
+      if (script.length() == 0) { continue; }
+      ++numScripts;
+
+      if (firstNonNullScript == -1)
+      {
+        builder.append('\'');
+        firstNonNullScript = i;
+      }
+      else
+      {
+        builder.append(",'");
+      }
+      escapeJS(builder, script, true);
+      builder.append('\'');
+    }
+    if (numScripts == 0) { return null; }
+    if (numScripts == 1) { return scripts[firstNonNullScript]; }
+
+    RenderingContext rc = RenderingContext.getCurrentInstance();
+    if (rc.getAgent().getType().equals(Agent.TYPE_DESKTOP))
+    {
+      if (shortCircuit)
+        builder.append("],this,event,true);");
+      else
+        builder.append("],this,event);");
+    }
+    else
+    {
+      // Some mobile browsers do not support DOM Event object.
+      // If event is passed, the script crushes before the function gains
+      // control.
+      if (shortCircuit)
+        builder.append("],this,null,true);");
+      else
+        builder.append("],this,null);");
+    }
+
+    return builder.toString();
+  }
 
   /**
    * Handle escaping '/', and single quotes, plus escaping text inside of
@@ -285,8 +358,6 @@
     return escapeJS(inString, false /* inQuotes */);
   }
 
-
-
   /**
    * Handle escaping '/', and single quotes, plus escaping text inside of
    * quotes with just a String for input.  If a String in and a String out is
@@ -317,7 +388,6 @@
     }
   }
 
-
   /**
    * Handle escaping '/', and single quotes, plus escaping text inside of
    * quotes.
@@ -330,7 +400,6 @@
     escapeJS(outBuilder, inString, false /* inQuotes */);
   }
 
-
   /**
    * Handle escaping '/', and single quotes, plus escaping text inside of
    * quotes.
@@ -468,7 +537,6 @@
     builder.append(hexString);
   }
 
-
   private static void _escapeSingleQuotes(
     StringBuilder outBuilder,
     String       inString
@@ -526,7 +594,7 @@
     FastMessageFormat formatter = new FastMessageFormat(pattern);
     return formatter.format(parameters);
   }
-  
+
   /*
    * This method returns the encoded parameter name or paramater value
    * for the Non-JavaScript browsers
@@ -535,45 +603,209 @@
   {
     return param + XhtmlConstants.NO_JS_PARAMETER_KEY;
   }
-   
+
   /*
    * This method returns the name attribute of HTML elements for Non-JavaScript
-   * browsers. It is encoded with parameter name and value pair. 
+   * browsers. It is encoded with parameter name and value pair.
    */
   public static String getEncodedNameAttribute(String param[])
   {
     // The incoming array(param[]) must contain parameter name and value pair
     // in the order of <<name1>>, <<value1>>, <<name2>>, <<value2>>,...
-    // The encoded parameter name and value for the above would be 
+    // The encoded parameter name and value for the above would be
     // <<name1>><<encodingKey>><<value1>><<encodingKey>>
     // <<name2>><<encodingKey>><<value2>>
-            
+
     int noOfParam = param.length;
     int bufferLen = 0;
-    
-    // Calculate what would be the length of the encoded param name and  
+
+    // Calculate what would be the length of the encoded param name and
     // value pair. We need it to initialize the buffer size of StringBuilder.
     for(int i = 0; i < noOfParam; i++)
     {
       bufferLen += param[i].length();
     }
-    // If there are N parameter names and values, there would be N-1 
+    // If there are N parameter names and values, there would be N-1
     // encoding key so add its length also
     bufferLen  += (noOfParam -1) * XhtmlConstants.NO_JS_PARAMETER_KEY.length();
-   
+
     StringBuilder nameAttri = new StringBuilder(bufferLen);
-    
+
     //Encode all the parameter names and values except the last parameter value
     for(int i = 0; i < noOfParam-1; i++)
     {
       nameAttri.append(getEncodedParameter(param[i]));
     }
-    
+
     nameAttri.append(param[noOfParam-1]);
-  
+
     return(nameAttri.toString());
   }
-  
+
+  /**
+   * Build a client event handler (onfocus for example) including any associated
+   * client behaviors for the event.
+   *
+   * @param facesContext The faces context
+   * @param component The component
+   * @param eventName The event, without the "on*" prefix, to render
+   * @param secondaryEventName If applicable, the secondary event name. For command components,
+   * "click" and "action" behaviors are included together and for input components, "change" and
+   * "valueChange" are included together.
+   * @param eventHandlerScript Script to be executed after the behaviors. May be null
+   * @param userHandlerScript user event handler to be executed before the event handler script and
+   * any client behavior scripts. May be null.
+   */
+  public static String getClientEventHandler(
+    FacesContext facesContext,
+    UIComponent  component,
+    String       eventName,
+    String       secondaryEventName,
+    String       userHandlerScript,
+    String       eventHandlerScript
+    )
+  {
+    BehaviorsData data = null;
+    if (component instanceof ClientBehaviorHolder)
+    {
+      data = new BehaviorsData();
+      _getBehaviorScripts(facesContext, component, eventName, data);
+
+      if (secondaryEventName != null)
+      {
+        _getBehaviorScripts(facesContext, component, secondaryEventName, data);
+      }
+    }
+
+    boolean hasHandler = eventHandlerScript != null && eventHandlerScript.length() > 0;
+    boolean hasUserHandler = userHandlerScript != null && userHandlerScript.length() > 0;
+    String script = null;
+    boolean hasBehaviors = data != null && data.behaviorScripts != null &&
+      !data.behaviorScripts.isEmpty();
+
+    if (hasHandler && !hasBehaviors && !hasUserHandler)
+    {
+      script = eventHandlerScript;
+    }
+    else if (hasUserHandler && !hasBehaviors && !hasHandler)
+    {
+      script = userHandlerScript;
+    }
+    else if (!hasUserHandler && !hasHandler && hasBehaviors && data.behaviorScripts.size() == 1)
+    {
+      script = data.behaviorScripts.get(0);
+      if ("action".equals(secondaryEventName) && data.submitting)
+      {
+        // prevent the default click action if submitting
+        script += ";return false;";
+      }
+    }
+    else
+    {
+      // There are multiple scripts, we will need to chain the methods.
+      int numBehaviorScripts = hasBehaviors ? data.behaviorScripts.size() : 0;
+      int length = numBehaviorScripts;
+      if (hasHandler) { ++length; }
+      if (hasUserHandler) { ++length; }
+      String[] scripts = new String[length];
+      int index = 0;
+      boolean submitting = false;
+      if (hasUserHandler)
+      {
+        scripts[0] = userHandlerScript;
+        index = 1;
+      }
+
+      if (hasBehaviors)
+      {
+        System.arraycopy(data.behaviorScripts.toArray(), 0, scripts, index, numBehaviorScripts);
+        index += numBehaviorScripts;
+      }
+
+      if (hasHandler)
+      {
+        scripts[index] = eventHandlerScript;
+      }
+
+      script = getChainedJS(true, scripts);
+      if (submitting && "click".equals(eventName))
+      {
+        // prevent the default click action if submitting
+        script += ";return false;";
+      }
+    }
+
+    return script;
+  }
+
+  /**
+   * Gather the behavior scripts for a client behavior holder
+   *
+   * @param facesContext the faces context
+   * @param component the behavior holder (must implement ClientBehaviorHolder)
+   * @param eventName the event of the behaviors to get
+   * @param data the data to populate, which may have data from a previous invokation of this
+   * function
+   * @return the data collected while getting the behaviors (used for performance to avoid
+   * duplicate lookup and allow for lazy loading of the parameters)
+   */
+  private static void _getBehaviorScripts(
+    FacesContext  facesContext,
+    UIComponent   component,
+    String        eventName,
+    BehaviorsData data)
+  {
+    ClientBehaviorHolder behaviorHolder = (ClientBehaviorHolder)component;
+
+    List<ClientBehavior> behaviors = behaviorHolder.getClientBehaviors().get(eventName);
+    if (behaviors != null && !behaviors.isEmpty())
+    {
+      // if params are not null, a submitting behavior was found in a previous call to this
+      // function, so we do not need to check for submitting here
+      data.submitting = data.submitting || _hasSubmittingBehavior(behaviors);
+      if (data.params == null && data.submitting)
+      {
+        // We only need to gather the parameters if there is a submitting behavior, so do
+        // not incur the performance overhead if not needed
+        data.params = CoreRenderer.getBehaviorParameters(component);
+      }
+
+      ClientBehaviorContext behaviorContext = ClientBehaviorContext.createClientBehaviorContext(
+        facesContext, component, eventName, component.getClientId(facesContext), data.params);
+
+      if (data.behaviorScripts == null)
+      {
+        data.behaviorScripts = new ArrayList<String>(behaviors.size());
+      }
+
+      for (ClientBehavior behavior : behaviors)
+      {
+        data.behaviorScripts.add(behavior.getScript(behaviorContext));
+      }
+    }
+  }
+
+  private static boolean _hasSubmittingBehavior(
+    Iterable<ClientBehavior> behaviors)
+  {
+    for (ClientBehavior behavior : behaviors)
+    {
+      if (behavior.getHints().contains(ClientBehaviorHint.SUBMITTING))
+      {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  private static class BehaviorsData
+  {
+    Collection<ClientBehaviorContext.Parameter> params;
+    List<String>                                behaviorScripts;
+    boolean                                     submitting;
+  }
+
+  private static final Object _CLIENT_BEHAVIORS_KEY = new Object();
 
   /** HashMap mapping names to their scriptlets */
   private static Map<Object, Scriptlet> _sScriptletTable =
@@ -599,5 +831,4 @@
   }
 
   private static final TrinidadLogger _LOG = TrinidadLogger.createTrinidadLogger(XhtmlUtils.class);
-
 }

Modified: myfaces/trinidad/branches/2.0.1-branch/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/jsLibs/LibraryScriptlet.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/2.0.1-branch/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/jsLibs/LibraryScriptlet.java?rev=896009&r1=896008&r2=896009&view=diff
==============================================================================
--- myfaces/trinidad/branches/2.0.1-branch/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/jsLibs/LibraryScriptlet.java (original)
+++ myfaces/trinidad/branches/2.0.1-branch/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/jsLibs/LibraryScriptlet.java Tue Jan  5 11:48:54 2010
@@ -21,6 +21,8 @@
 import java.io.IOException;
 
 import org.apache.myfaces.trinidad.logging.TrinidadLogger;
+
+import javax.faces.application.ProjectStage;
 import javax.faces.context.FacesContext;
 import org.apache.myfaces.trinidad.context.RenderingContext;
 
@@ -184,15 +186,37 @@
     {
       String debugJavascript = context.
           getExternalContext().getInitParameter(_DEBUG_JAVASCRIPT);
-      if ((debugJavascript != null) &&
-          debugJavascript.equalsIgnoreCase("true"))
+
+      if (debugJavascript != null)
       {
-        _debugJavascript = Boolean.TRUE;
-        _LOG.info("RUNNING_DEBUG_JAVASCRIPT");
+        if (debugJavascript.equalsIgnoreCase("true"))
+        {
+          _debugJavascript = Boolean.TRUE;
+        
+          // if Apache MyFaces Trinidad is running in production stage
+          // running with JavaScript debugging is not desired, therefore
+          // we generate a WARNING message; otherwise we just inform the user
+          if (context.isProjectStage(ProjectStage.Production))
+          {
+            _LOG.warning("RUNNING_DEBUG_JAVASCRIPT_IN_PRODUCTION_STAGE");
+          }
+          else
+          {
+            _LOG.info("RUNNING_DEBUG_JAVASCRIPT"); 
+          }
+        }
       }
       else
       {
-        _debugJavascript = Boolean.FALSE;
+        // if the _DEBUG_JAVASCRIPT parameter has NOT been specified, let us
+        // apply the DEFAULT values for the certain Project Stages:
+        // -PRODUCTION we want this value to be FALSE;
+        // -other stages we use TRUE
+        _debugJavascript = !(context.isProjectStage(ProjectStage.Production));
+        if (_debugJavascript)
+        {
+          _LOG.info("RUNNING_DEBUG_JAVASCRIPT"); 
+        }
       }
     }