4 Replies Latest reply on Jun 4, 2008 1:45 PM by sergeysmirnov

    rich:dropDownMenu: What can I put inside?



      I want to dynamically populate a dropDownMenu without binding a Bean class (and using RichFaces API).

      I've tried the following JSF but it doesn't work:

       <rich:dropDownMenu id="myMenu-cforEach" submitMode="server">
       <f:facet name="label">
       <h:panelGrid cellpadding="0" cellspacing="0" columns="2" style="vertical-align:middle">
       <h:outputText value="MyChoice"/>
       <c:forEach items="#{myBean.pairList}" var="item">
       <rich:menuItem value="#{item.first}" action="#{myBean.menuChangeAction}">
       <f:setPropertyActionListener target="#{myBean.currentChoice}" value="#{item.first}"/>
       <f:facet name="icon">
       <h:outputText value="#{item.first}"/>
       <h:outputText value="#{item.second}"/>

      where myBean is defined as follows:
      import java.util.ArrayList;
      import java.util.List;
      public class MyBean
       private static List<Pair<String,String>> PairList = null;
       PairList = new ArrayList<Pair<String,String>>();
       PairList.add( new Pair<String,String>( "de", "Deutsch") );
       PairList.add( new Pair<String,String>( "en", "English" ) );
       PairList.add( new Pair<String,String>( "es", "Espaniol") );
       PairList.add( new Pair<String,String>( "fr", "Francaise" ) );
       PairList.add( new Pair<String,String>( "it", "Italiano") );
       public List<Pair<String,String>> getPairList()
       return PairList;
       private String curChoice;
       public String getCurrentChoice() { return this.curChoice; }
       public void setCurrentChoice(String value) { this.curChoice = value; }
       public String menuChangeAction()
       // change action trigger goes here
       return "ok";

      and the Pair type is defined as:
      public class Pair<V1,V2>
       private V1 v1; /** The first element. */
       private V2 v2; /** The second element. */
       public Pair(V1 v1, V2 v2)
       this.v1 = v1;
       this.v2 = v2;
       public V1 getFirst() { return this.v1; }
       public V2 getSecond() { return this.v2; }
       public String toString() { return "<" + this.v1 + ", " + this.v2 + ">"; }

      What I get is like:
      [de] deDeutsch
      [en] enEnglish
      [es] esEspaniol
      [fr] frFrancaise
      [it] itItaliano

      That is, each menuItem displays both elements of each pair (note [xx] stands for what is showed in the icon part), instead of displaying only the second one.

      I've also tried to implement a custom JSF component, using UIData as the base component and implementing the rendering logic by myself. But no hope (without the enclosing rich:dropDownMenu element it works).

      Please, Can anyone help me??

      Thank you very very much!!