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

    rich:dropDownMenu: What can I put inside?

    seg.fault

      Hello!

      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:

      <h:form>
       <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"/>
       </h:panelGrid>
       </f:facet>
       <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}"/>
       </f:facet>
       <h:outputText value="#{item.second}"/>
       </rich:menuItem>
       </c:forEach>
       </rich:dropDownMenu>
      </h:form>
      


      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;
       static
       {
       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; }
      
       @Override
       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!!