You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by sc...@apache.org on 2005/04/08 15:05:59 UTC

cvs commit: incubator-myfaces/src/components/org/apache/myfaces/custom/navmenu/jscookmenu HtmlJSCookMenuRenderer.java

schof       2005/04/08 06:05:59

  Modified:    src/components/org/apache/myfaces/custom/navmenu/jscookmenu
                        HtmlJSCookMenuRenderer.java
  Log:
  Fixes MyFaces-20 (Patch by Martin Bosak)
  
  Revision  Changes    Path
  1.13      +88 -5     incubator-myfaces/src/components/org/apache/myfaces/custom/navmenu/jscookmenu/HtmlJSCookMenuRenderer.java
  
  Index: HtmlJSCookMenuRenderer.java
  ===================================================================
  RCS file: /home/cvs/incubator-myfaces/src/components/org/apache/myfaces/custom/navmenu/jscookmenu/HtmlJSCookMenuRenderer.java,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- HtmlJSCookMenuRenderer.java	27 Dec 2004 04:11:11 -0000	1.12
  +++ HtmlJSCookMenuRenderer.java	8 Apr 2005 13:05:59 -0000	1.13
  @@ -18,6 +18,7 @@
   import org.apache.myfaces.component.html.util.AddResource;
   import org.apache.myfaces.custom.navmenu.NavigationMenuItem;
   import org.apache.myfaces.custom.navmenu.NavigationMenuUtils;
  +import org.apache.myfaces.custom.navmenu.UINavigationMenuItem;
   import org.apache.myfaces.el.SimpleActionMethodBinding;
   import org.apache.myfaces.renderkit.RendererUtils;
   import org.apache.myfaces.renderkit.html.HtmlRenderer;
  @@ -29,6 +30,7 @@
   import javax.faces.context.FacesContext;
   import javax.faces.context.ResponseWriter;
   import javax.faces.el.MethodBinding;
  +import javax.faces.el.ValueBinding;
   import javax.faces.event.ActionEvent;
   import javax.faces.webapp.UIComponentTag;
   import java.io.IOException;
  @@ -39,6 +41,9 @@
    * @author Thomas Spiegl (latest modification by $Author$)
    * @version $Revision$ $Date$
    *          $Log$
  + *          Revision 1.13  2005/04/08 13:05:59  schof
  + *          Fixes MyFaces-20 (Patch by Martin Bosak)
  + *
    *          Revision 1.12  2004/12/27 04:11:11  mmarinschek
    *          Data Table stores the state of facets of children; script tag is rendered with type attribute instead of language attribute, popup works better as a column in a data table
    *
  @@ -91,6 +96,14 @@
           String actionParam = (String)parameter.get(JSCOOK_ACTION_PARAM);
           if (actionParam != null)
           {
  +            String compId = component.getId();
  +            int idx = actionParam.indexOf(':');
  +            String actionId = actionParam.substring(0, idx);
  +            if (! compId.equals(actionId)) {
  +                return;
  +            }
  +            actionParam = actionParam.substring(idx + 1);
  +            actionParam = decodeValueBinding(actionParam, context);
               MethodBinding mb;
               if (UIComponentTag.isValueReference(actionParam))
               {
  @@ -106,6 +119,30 @@
           }
       }
   
  +    private String decodeValueBinding(String actionParam, FacesContext context) 
  +    {
  +        int idx = actionParam.indexOf(";#{"); 
  +        if (idx == -1) {
  +            return actionParam;
  +        }
  +        
  +        String newActionParam = actionParam.substring(0, idx);
  +        String vbParam = actionParam.substring(idx + 1);
  +        
  +        idx = vbParam.indexOf('=');
  +        if (idx == -1) {
  +            return newActionParam;
  +        }
  +        String vbExpressionString = vbParam.substring(0, idx);
  +        String vbValue = vbParam.substring(idx + 1);
  +        
  +        ValueBinding vb = 
  +            context.getApplication().createValueBinding(vbExpressionString);        
  +        vb.setValue(context, vbValue);
  +        
  +        return newActionParam;
  +    }
  +    
       public boolean getRendersChildren()
       {
           return true;
  @@ -118,16 +155,21 @@
           List list = NavigationMenuUtils.getNavigationMenuItemList(component);
           if (list.size() > 0)
           {
  +            List uiNavMenuItemList = component.getChildren();
               DummyFormResponseWriter dummyFormResponseWriter = DummyFormUtils.getDummyFormResponseWriter(context);
               dummyFormResponseWriter.addDummyFormParameter(JSCOOK_ACTION_PARAM);
               dummyFormResponseWriter.setWriteDummyForm(true);
   
  +            String myId = component.getId();
  +            
               ResponseWriter writer = context.getResponseWriter();
   
               writer.write("\n<script type=\"text/javascript\"><!--\n" +
                            "var myMenu =\n[");
               encodeNavigationMenuItems(context, writer,
  -                                      (NavigationMenuItem[]) list.toArray(new NavigationMenuItem[list.size()]));
  +                                      (NavigationMenuItem[]) list.toArray(new NavigationMenuItem[list.size()]),
  +                                      uiNavMenuItemList,
  +                                      myId);
   
               writer.write("];\n" +
                            "--></script>\n");
  @@ -136,12 +178,25 @@
   
       private void encodeNavigationMenuItems(FacesContext context,
                                              ResponseWriter writer,
  -                                           NavigationMenuItem[] items)
  +                                           NavigationMenuItem[] items,
  +                                           List uiNavMenuItemList,
  +                                           String menuId)
           throws IOException
       {
           for (int i = 0; i < items.length; i++)
           {
               NavigationMenuItem item = (NavigationMenuItem)items[i];
  +            Object tempObj = null;
  +            UINavigationMenuItem uiNavMenuItem = null;
  +            try {
  +                tempObj = uiNavMenuItemList.get(i);
  +            } catch (IndexOutOfBoundsException  e) {
  +            }
  +            if (tempObj != null) {
  +                if (tempObj instanceof UINavigationMenuItem) {
  +                    uiNavMenuItem = (UINavigationMenuItem) tempObj;
  +                }
  +            }
   
               if (! item.isRendered()) {
                   continue;
  @@ -175,7 +230,12 @@
               if (item.getAction() != null && ! item.isDisabled())
               {
                   writer.write("'");
  +                writer.write(menuId);
  +                writer.write(':');
                   writer.write(item.getAction());
  +                if (uiNavMenuItem != null) {
  +                    encodeValueBinding(writer, uiNavMenuItem, item);
  +                }
                   writer.write("'");
               }
               else
  @@ -190,13 +250,36 @@
                   if (menuItems != null && menuItems.length > 0)
                   {
                       writer.write(",");
  -                    encodeNavigationMenuItems(context, writer, menuItems);
  +                    encodeNavigationMenuItems(context, writer, menuItems, 
  +                            uiNavMenuItem.getChildren(), menuId);
                   }
               };
               writer.write("]");
           }
       }
   
  +    private void encodeValueBinding(ResponseWriter writer, UINavigationMenuItem uiNavMenuItem, 
  +            NavigationMenuItem item) throws IOException 
  +    {
  +        ValueBinding vb = uiNavMenuItem.getValueBinding("NavMenuItemValue");
  +        if (vb == null) {
  +            return;
  +        }
  +        String vbExpression = vb.getExpressionString();
  +        if (vbExpression == null) {
  +            return;
  +        }
  +        Object tempObj = item.getValue();
  +        if (tempObj == null) {
  +            return;
  +        }
  +        
  +        writer.write(";");
  +        writer.write(vbExpression);
  +        writer.write("=");
  +        writer.write(tempObj.toString());
  +    }
  +    
       public void encodeEnd(FacesContext context, UIComponent component) throws IOException
       {
           RendererUtils.checkParamValidity(context, component, HtmlCommandJSCookMenu.class);