It's really a work in progress.

I just checked it againt Seam 2 cvs. 

So, the code as it is...

All the calls go through MenuManager

  | package org.jboss.seam.menu;
  | 
  | import static org.jboss.seam.ScopeType.APPLICATION;
  | import static org.jboss.seam.annotations.Install.BUILT_IN;
  | 
  | import java.io.InputStream;
  | import java.util.Collections;
  | import java.util.HashMap;
  | import java.util.List;
  | import java.util.Map;
  | 
  | import org.dom4j.DocumentException;
  | import org.dom4j.Element;
  | import org.jboss.seam.Component;
  | import org.jboss.seam.annotations.Create;
  | import org.jboss.seam.annotations.Install;
  | import org.jboss.seam.annotations.Name;
  | import org.jboss.seam.annotations.Scope;
  | import org.jboss.seam.annotations.intercept.BypassInterceptors;
  | import org.jboss.seam.contexts.Contexts;
  | import org.jboss.seam.log.LogProvider;
  | import org.jboss.seam.log.Logging;
  | import org.jboss.seam.menu.MenuItem.ItemType;
  | import org.jboss.seam.menu.NavigationFactory.NavigationType;
  | import org.jboss.seam.util.Resources;
  | import org.jboss.seam.util.XML;
  | 
  | /**
  |  * Provide menu items 
  |  * 
  |  * - in the same application, it should be possible to use different 
implementations through component configuration
  |  *   atm the only one available is RichFaces
  |  * - in menus.xml, everything is a item, without no information about how 
to show these items
  |  * - the way that a menu is inserted in a page is fixed on from the page 
side with the choice between 3 methods: 
  |  *   - getNavigationItem : return an simple item
  |  *   - getNavigationMenu : return a single top menu
  |  *   - getNavigationMenus: retourne a list of top menus
  |  *   What is exactly returned depends of the implementation.
  |  * - any item, whatever its declaration place is, can be named with "id" 
attribute and so reused 
  |  *   (in a tag, through attribut "refid")
  |  * - TODO to set parameters specifics for a given implementation, with the 
tag
  |  *         <specific type="richfaces">...</specific>
  |  *   inside any item.
  |  * - all seam parameters defined for a link are directly available; atm 
only propagation
  |  * - the children of an item can be "unwrapped" i.e. used in place of the 
item.
  |  * 
  |  * Syntaxe of a menu file:
  |  * <menus>
  |  *   <item id="...">
  |  *       <item id="..."
  |  *             label="..."
  |  *             icon="..."
  |  *             description
  |  *             rendered
  |  *             disabled
  |  *             action
  |  *             type
  |  *             propagation
  |  *             split
  |  *             target
  |  *             >
  |  *          ...
  |  *       </item>
  |  *       <item>
  |  *         ...
  |  *   </item>
  |  *    ...
  |  * </menus>  
  |  * 
  |  * @author Pierre
  |  *
  |  */
  | @Scope(APPLICATION)
  | @BypassInterceptors
  | @Name("menumanager")
  | @Install(precedence = BUILT_IN)
  | public class MenuManager {
  |     private static String EMPTY_STRING = "";
  |     private static String TRUE_STRING = "true";
  |     private static String ITEM_TAG = "item";
  |     private static String ID_ATTR = "id";
  |     private static String REFID_ATTR = "refid";
  |     private static String ICON_ATTR = "icon";
  |     private static String LABEL_ATTR = "label";
  |     private static String HOTKEY_ATTR = "accesskey";
  |     private static String DESCRIPTION_ATTR = "description";
  |     private static String RENDERED_ATTR = "rendered";
  |     private static String DISABLED_ATTR = "disabled";
  |     private static String ACTION_ATTR = "action";
  |     private static String TYPE_ATTR = "type";
  |     private static String PROPAGATION_ATTR = "propagation";
  |     private static String TARGET_ATTR = "target";
  |     private static String UNWRAP_ATTR = "unwrap";
  | 
  |     public static NavigationType MENU_LIST_TYPE = NavigationType.GROUP;
  |     public static NavigationType MENU_TYPE = NavigationType.ROOT;
  | 
  |     private String menusFile = "/WEB-INF/menus.xml";
  |     private String menuImpl = "Richfaces";
  | 
  |     private static final LogProvider log = Logging
  |                     .getLogProvider(MenuManager.class);
  |     private Map<String, MenuItem> menusById = Collections
  |                     .synchronizedMap(new HashMap<String, MenuItem>());
  |     private NavigationFactory factory;
  | 
  |     @Create
  |     public void initialize() {
  |             InputStream stream = Resources.getResourceAsStream(menusFile, 
null);
  |             if (stream == null) {
  |                     log.debug("no " + menusFile + " file found");
  |             }
  |             if (stream != null) {
  |                     log.debug("reading " + menusFile);
  |                     parse(stream);
  |             }
  | 
  |             factory = NavigationFactory.getInstance(menuImpl);
  |     }
  | 
  |     public static MenuManager instance() {
  |             if (Contexts.isApplicationContextActive()) {
  |                     return (MenuManager) 
Component.getInstance(MenuManager.class,
  |                                     APPLICATION);
  |             } else // tests
  |             {
  |                     return new MenuManager();
  |             }
  |     }
  | 
  |     /**
  |      *Get a MenuItem from cache
  |      */
  |     public MenuItem getMenu(String id) {
  |             MenuItem item = menusById.get(id);
  |             if (null == item)
  |                     return null;
  | 
  |             if ((item.getRefid() != null) && 
!EMPTY_STRING.equals(item.getRefid())) {
  |                     item = menusById.get(item.getRefid());
  |             }
  |             return item;
  |     }
  | 
  |     /**
  |      * Get a Menu List to insert in a menu bar
  |      */
  |     public Object getNavigationMenus(String id) {
  |             return factory
  |                             .getNavigationItem(menusById, getMenu(id), 
MENU_LIST_TYPE);
  |     }
  | 
  |     /**
  |      * Get a Menu to insert in a menu bar
  |      */
  |     public Object getNavigationMenu(String id) {
  |             return factory.getNavigationItem(menusById, getMenu(id), 
MENU_TYPE);
  |     }
  | 
  |     /**
  |      * Get a menu item 
  |      */
  |     public Object getNavigationItem(String id) {
  |             return factory.getNavigationItem(menusById, getMenu(id));
  |     }
  | 
  |     /**
  |      * Parse a menus.xml file
  |      */
  |     private void parse(InputStream stream) {
  |             Element root = getDocumentRoot(stream);
  | 
  |             List<Element> elements = root.elements(ITEM_TAG);
  |             for (Element item : elements) {
  |                     String itemId = item.attributeValue(ID_ATTR);
  |                     if (null == itemId || EMPTY_STRING.equals(itemId)) {
  |                             // TODO: use an other type of exception? 
  |                             throw new IllegalStateException("Must specify 
item-id for '"
  |                                             + 
item.attributeValue(LABEL_ATTR) + "' tag.");
  |                     }
  |                     parseItem(item);
  |             }
  |     }
  | 
  |     private String parseLabel(Element element) {
  |             return element.attributeValue(LABEL_ATTR);
  |     }
  | 
  |     private ItemType parseItemType(Element element) {
  |         String type = element.attributeValue(TYPE_ATTR);
  |         if (null == type) return ItemType.DEFAULT;
  |         try
  |         {
  |             return ItemType
  |             .valueOf(type.toUpperCase());
  |         }
  |         catch (IllegalArgumentException  e)
  |         {
  |             return ItemType.DEFAULT;
  |         }
  |     }
  | 
  |     private MenuItem parseItem(Element element) {
  | 
  |             String itemId = element.attributeValue(ID_ATTR);
  |             MenuItem item = null;
  |             String refid = element.attributeValue(REFID_ATTR);
  |             if (null != refid && !EMPTY_STRING.equals(refid)) {
  |                     item = new MenuItem(refid);
  |                     item.setUnwrap(Boolean.parseBoolean(element
  |                                     .attributeValue(UNWRAP_ATTR)));
  |             } else {
  |                     item = new MenuItem(itemId, 
element.attributeValue(ICON_ATTR),
  |                                     parseLabel(element), 
element.attributeValue(HOTKEY_ATTR),
  |                                     
element.attributeValue(DESCRIPTION_ATTR), Boolean
  |                                                     
.parseBoolean(element.attributeValue(RENDERED_ATTR,
  |                                                                     
TRUE_STRING)), Boolean.parseBoolean(element
  |                                                     
.attributeValue(DISABLED_ATTR)), element
  |                                                     
.attributeValue(ACTION_ATTR),
  |                                     parseItemType(element), element
  |                                                     
.attributeValue(PROPAGATION_ATTR), element
  |                                                     
.attributeValue(TARGET_ATTR));
  |                     item.setText(element.getText());
  | 
  |                     for (Element child : (List<Element>) 
element.elements(ITEM_TAG)) {
  |                             item.getItems().add(parseItem(child));
  |                     }
  |             }
  | 
  |             if (null != itemId && !EMPTY_STRING.equals(itemId)) {
  |                     menusById.put(itemId, item);
  |             }
  | 
  |             return item;
  |     }
  | 
  |     /**
  |      * Get the root element of the document
  |      */
  |     private static Element getDocumentRoot(InputStream stream) {
  |             try {
  |                     return XML.getRootElement(stream);
  |             } catch (DocumentException de) {
  |                     throw new RuntimeException(de);
  |             }
  |     }
  | 
  |     /**
  |      * @return the menuImpl
  |      */
  |     public String getMenuImpl() {
  |             return this.menuImpl;
  |     }
  | 
  |     /**
  |      * @param menuImpl the menuImpl to set
  |      */
  |     public void setMenuImpl(String menuImpl) {
  |             this.menuImpl = menuImpl;
  |     }
  | 
  |     /**
  |      * @return the menusFile
  |      */
  |     public String getMenusFile() {
  |             return this.menusFile;
  |     }
  | 
  |     /**
  |      * @param menusFile the menusFile to set
  |      */
  |     public void setMenusFile(String menusFile) {
  |             this.menusFile = menusFile;
  |     }
  | 
  |     public Map<String, MenuItem> getMenus() {
  |             return menusById;
  |     }
  | }
  | 
  | 

with tree classes to do the job
- an abstract one: NavigationFactory
- Richfaces implementation: RichFacesNavigationFactory
- and a value object: MenuItem


  | package org.jboss.seam.menu;
  | 
  | import java.util.Map;
  | 
  | import org.jboss.seam.core.Expressions;
  | import org.jboss.seam.log.LogProvider;
  | import org.jboss.seam.log.Logging;
  | 
  | public abstract class NavigationFactory {
  | 
  |     public static enum NavigationType {
  |             ROOT, GROUP, INSIDE
  |     }
  |     protected static final String EMPTY_STRING = "";
  |     private static final String PATH_SEP = ".";
  | 
  |     protected Map<String, MenuItem> refmap;
  | 
  |     private static final String CLASS_SUFFIX = NavigationFactory.class
  |                     .getSimpleName();
  | 
  |     protected static final LogProvider log = Logging
  |                     .getLogProvider(NavigationFactory.class);
  | 
  |     protected NavigationFactory() {
  |     }
  | 
  |     /**
  |      * 
  |      * @param impl either a simple prefix if the implementation is in the 
same package 
  |      *             or a full package name for a NavigationFactory class in 
an other package
  |      * @return
  |      */
  |     public static NavigationFactory getInstance(String impl) {
  |             NavigationFactory factory = null;
  |             String className = impl;
  |             try {
  |                     if (impl.indexOf(PATH_SEP) < 0) {
  |                             className = 
NavigationFactory.class.getPackage().getName()
  |                                             + PATH_SEP + className;
  |                             if (!impl.endsWith(CLASS_SUFFIX)) {
  |                                     className += CLASS_SUFFIX;
  |                             }
  |                     }
  |                     Class clazz = Class.forName(className);
  |                     factory = (NavigationFactory) clazz.newInstance();
  |             } catch (ClassNotFoundException e) {
  |                     log.error("Navigation factory not found for '" + 
className + "'.",
  |                                     e);
  |             } catch (IllegalAccessException e) {
  |                     log.error("Navigation factory not accessible for '" + 
className
  |                                     + "'.", e);
  |             } catch (InstantiationException e) {
  |                     log.error("Navigation factory can't be instantiated for 
'"
  |                                     + className + "'.", e);
  |             }
  | 
  |             return factory;
  |     }
  | 
  |     /**
  |      * gives a standard navigation item
  |      * 
  |      * @param itemId
  |      * @return
  |      */
  |     public Object getNavigationItem(Map<String, MenuItem> refmap, MenuItem 
item) {
  |             return getNavigationItem(refmap, item, NavigationType.INSIDE);
  |     }
  | 
  |     /**
  |      * gives a navigation item, either a standard one with 
NavigationType.INSIDE or a menu bar's one 
  |      * with NavigationType.ROOT or NavigationType.GROUP
  |      * 
  |      * @param itemId
  |      * @param type  
  |      * @return
  |      */
  |     public Object getNavigationItem(Map<String, MenuItem> refmap,
  |                     MenuItem item, NavigationType type) {
  |             this.refmap = refmap;
  |             return getNavigationItem(item, type);
  |     }
  | 
  |     protected abstract Object getNavigationItem(MenuItem item,
  |                     NavigationType type);
  | 
  |     protected MenuItem getRefItem(MenuItem item) {
  |             if ((null == item) || (null == item.getRefid())
  |                             || EMPTY_STRING.equals(item.getRefid())) {
  |                     return item;
  |             }
  |             return getRefItem(refmap.get(item.getRefid()));
  |     }
  | 
  |     protected Object parseLabel(String expression) {
  |             return null == expression ? null : Expressions.instance()
  |                             .createValueExpression(expression).getValue();
  |     }
  | 
  |     protected Object parseAction(String expression) {
  |             return null == expression ? null : Expressions.instance()
  |                             .createValueExpression(expression).getValue();
  |     }
  | 
  | }
  | 


  | package org.jboss.seam.menu;
  | 
  | import javax.el.ELContext;
  | import javax.el.ExpressionFactory;
  | import javax.el.MethodExpression;
  | import javax.faces.component.UIComponent;
  | import javax.faces.context.FacesContext;
  | 
  | import org.jboss.seam.el.SeamExpressionFactory;
  | import org.jboss.seam.ui.component.html.HtmlLink;
  | import org.richfaces.component.html.HtmlDropDownMenu;
  | import org.richfaces.component.html.HtmlMenuGroup;
  | import org.richfaces.component.html.HtmlMenuItem;
  | import org.richfaces.component.html.HtmlMenuSeparator;
  | import org.richfaces.component.html.HtmlToolBarGroup;
  | 
  | public class RichfacesNavigationFactory extends NavigationFactory {
  | 
  |     protected UIComponent getNavigationItem(MenuItem item, NavigationType 
type) {
  | 
  |             item = getRefItem(item);
  |             if (null == item) {
  |                     item = new MenuItem(null);
  |             }
  | 
  |             if (NavigationType.ROOT == type) {
  |                     return getDropDownMenu(item);
  |             } else if (NavigationType.GROUP == type) {
  |                     return getToolBarGroup(item);
  |             } else if (item.getItems().isEmpty()) {
  |                     if ((null == item.getLabel())
  |                                     || 
EMPTY_STRING.equals(item.getLabel())) {
  |                             return getMenuSeparator(item);
  |                     } else {
  |                             return getMenuItem(item);
  |                     }
  |             } else {
  |                     return getMenuGroup(item);
  |             }
  |     }
  | 
  |     private HtmlToolBarGroup getToolBarGroup(MenuItem item) {
  |             HtmlToolBarGroup group = new HtmlToolBarGroup();
  |             group.setId(item.getId());
  |             group.setRendered(item.isRendered());
  |             copyChildren(item, group, NavigationType.ROOT);
  |             return group;
  |     }
  | 
  |     private HtmlDropDownMenu getDropDownMenu(MenuItem item) {
  |             HtmlDropDownMenu menu = new HtmlDropDownMenu();
  |             menu.setId(item.getId());
  |             menu.setValue(parseLabel(item.getLabel()));
  |             menu.setRendered(item.isRendered());
  |             copyChildren(item, menu, NavigationType.INSIDE);
  |             return menu;
  |     }
  | 
  |     private HtmlMenuItem getMenuItem(MenuItem item) {
  |             HtmlMenuItem navItem = new HtmlMenuItem();
  |             navItem.setId(item.getId());
  |             navItem.setIcon(item.getIcon());
  |             navItem.setRendered(item.isRendered());
  |             boolean linked = false;
  |             if (null == item.getPropagation()) {
  |                     if (MenuItem.ItemType.DIRECT.equals(item.getType())) // 
i.e. a link with its protocole, e.g. "http://...";
  |                     {
  |                             navItem.setOnclick("document.location.href='"
  |                                             + parseAction(item.getAction()) 
+ "'");
  |                             navItem.setSubmitMode("none");
  |                             linked = true;
  |                     } else if 
(MenuItem.ItemType.BINDING.equals(item.getType())) {
  |                             ExpressionFactory factory = 
SeamExpressionFactory.INSTANCE;
  |                             ELContext context = 
FacesContext.getCurrentInstance()
  |                                             .getELContext();
  |                             MethodExpression expression = 
factory.createMethodExpression(
  |                                             context, item.getAction(), 
Object.class,
  |                                             new Class<?>[0]);
  |                             navItem.setActionExpression(expression);
  |                             linked = true;
  |                     }
  |                     if (linked) {
  |                             navItem.setDisabled(item.isDisabled());
  |                             navItem.setValue(parseLabel(item.getLabel()));
  |                     }
  |             }
  |             if (!linked) // by default, jsf view id; used also if 
propagation is specified
  |             {
  |                     HtmlLink link = new HtmlLink();
  |                     link.setValue(parseLabel(item.getLabel()));
  |                     link.setView((String) parseAction(item.getAction()));
  |                     link.setPropagation(item.getPropagation());
  |                     link.setDisabled(item.isDisabled());
  |                     navItem.getChildren().add(link);
  |                     navItem.setSubmitMode("none");
  |                     navItem.setStyleClass("withlink");
  |             }
  | 
  |             return navItem;
  |     }
  | 
  |     private HtmlMenuGroup getMenuGroup(MenuItem item) {
  |             HtmlMenuGroup group = new HtmlMenuGroup();
  |             group.setId(item.getId());
  |             group.setIcon(item.getIcon());
  |             group.setValue(parseLabel(item.getLabel()));
  |             group.setDisabled(item.isDisabled());
  |             group.setRendered(item.isRendered());
  |             copyChildren(item, group, NavigationType.INSIDE);
  |             return group;
  |     }
  | 
  |     private HtmlMenuSeparator getMenuSeparator(MenuItem item) {
  |             return new HtmlMenuSeparator();
  |     }
  | 
  |     private void copyChildren(MenuItem item, UIComponent group,
  |                     NavigationType type) {
  |             for (MenuItem child : item.getItems()) {
  |                     if (null != child && child.isUnwrap()) {
  |                             child = getRefItem(child);
  |                             for (MenuItem subchild : child.getItems()) {
  |                                     
group.getChildren().add(getNavigationItem(subchild, type));
  |                             }
  |                     } else {
  |                             
group.getChildren().add(getNavigationItem(child, type));
  |                     }
  |             }
  |     }
  | 
  | }
  | 


  | package org.jboss.seam.menu;
  | 
  | import java.util.ArrayList;
  | import java.util.HashMap;
  | import java.util.List;
  | import java.util.Map;
  | 
  | /**
  |  * Nota: attribute "type" gives the type of action, with value "direct", 
"binding" or "default"
  |  *       The default value is associated with jsf link.      
  |  * 
  |  * Nota: to deal with implementation specific needs, use "specific" tag in 
the body of the item.
  |  *       The implementation is specified by the attribute "type" of this 
tag. This specific data are stored 
  |  *       in data property.  
  |  *       
  |  * @author Pierre
  |  *
  |  */
  | public class MenuItem {
  |     public static enum ItemType {
  |             DIRECT, BINDING, DEFAULT
  |     }
  | 
  |     private String id;
  |     private String refid;
  |     private boolean unwrap;
  |     private String text;
  |     private String icon;
  |     private String label;
  |     private String hotkey;
  |     private String description;
  |     private boolean rendered;
  |     private boolean disabled;
  |     private String action;
  |     private ItemType type;
  |     private String propagation;
  |     private String target;
  |     private Map<String, Object> data;
  |     private List<MenuItem> items = new ArrayList<MenuItem>();
  | 
  |     public MenuItem(String refid) {
  |             this.refid = refid;
  |     }
  | 
  |     public MenuItem(String id, String icon, String label, String hotkey,
  |                     String description, boolean rendered, boolean disabled,
  |                     String action, ItemType type, String propagation, 
String target) {
  |             this.id = id;
  |             this.icon = icon;
  |             this.label = label;
  |             this.description = description;
  |             this.rendered = rendered;
  |             this.disabled = disabled;
  |             this.action = action;
  |             this.type = type;
  |             this.propagation = propagation;
  |             this.hotkey = hotkey;
  |             this.target = target;
  |     }
  | 
  |     /**
  |      * @return the items
  |      */
  |     public List<MenuItem> getItems() {
  |             return this.items;
  |     }
  | 
  |     /**
  |      * @param items the items to set
  |      */
  |     public void setItems(List<MenuItem> items) {
  |             this.items = items;
  |     }
  | 
  |     /**
  |      * @return the action
  |      */
  |     public String getAction() {
  |             return this.action;
  |     }
  | 
  |     /**
  |      * @param action the action to set
  |      */
  |     public void setAction(String action) {
  |             this.action = action;
  |     }
  | 
  |     /**
  |      * @return the action type 
  |      */
  |     public ItemType getType() {
  |             return this.type;
  |     }
  | 
  |     /**
  |      * @param type the type to set
  |      */
  |     public void setType(ItemType type) {
  |             this.type = type;
  |     }
  | 
  |     /**
  |      * @return the propagation
  |      */
  |     public String getPropagation() {
  |             return this.propagation;
  |     }
  | 
  |     /**
  |      * @param propagation the propagation to set
  |      */
  |     public void setPropagation(String propagation) {
  |             this.propagation = propagation;
  |     }
  | 
  |     /**
  |      * @return the description
  |      */
  |     public String getDescription() {
  |             return this.description;
  |     }
  | 
  |     /**
  |      * @param description the description to set
  |      */
  |     public void setDescription(String description) {
  |             this.description = description;
  |     }
  | 
  |     /**
  |      * @return the disabled
  |      */
  |     public boolean isDisabled() {
  |             return this.disabled;
  |     }
  | 
  |     /**
  |      * @param disabled the disabled to set
  |      */
  |     public void setDisabled(boolean disabled) {
  |             this.disabled = disabled;
  |     }
  | 
  |     /**
  |      * @return the icon
  |      */
  |     public String getIcon() {
  |             return this.icon;
  |     }
  | 
  |     /**
  |      * @param icon the icon to set
  |      */
  |     public void setIcon(String icon) {
  |             this.icon = icon;
  |     }
  | 
  |     /**
  |      * @return the id
  |      */
  |     public String getId() {
  |             return this.id;
  |     }
  | 
  |     /**
  |      * @param id the id to set
  |      */
  |     public void setId(String id) {
  |             this.id = id;
  |     }
  | 
  |     /**
  |      * @return the label
  |      */
  |     public String getLabel() {
  |             return this.label;
  |     }
  | 
  |     /**
  |      * @param label the label to set
  |      */
  |     public void setLabel(String label) {
  |             this.label = label;
  |     }
  | 
  |     /**
  |      * @return the rendered
  |      */
  |     public boolean isRendered() {
  |             return this.rendered;
  |     }
  | 
  |     /**
  |      * @param rendered the rendered to set
  |      */
  |     public void setRendered(boolean rendered) {
  |             this.rendered = rendered;
  |     }
  | 
  |     /**
  |      * @return the target
  |      */
  |     public String getTarget() {
  |             return this.target;
  |     }
  | 
  |     /**
  |      * @param target the target to set
  |      */
  |     public void setTarget(String target) {
  |             this.target = target;
  |     }
  | 
  |     /**
  |      * @return the hotkey
  |      */
  |     public String getHotkey() {
  |             return this.hotkey;
  |     }
  | 
  |     /**
  |      * @param hotkey the hotkey to set
  |      */
  |     public void setHotkey(String hotkey) {
  |             this.hotkey = hotkey;
  |     }
  | 
  |     /**
  |      * @return the data
  |      */
  |     public Map<String, Object> getData() {
  |             return this.data;
  |     }
  | 
  |     /**
  |      * @param data the data to set
  |      */
  |     public void setData(Map<String, Object> data) {
  |             this.data = data;
  |     }
  |     public void addData(String impl, Object data) {
  |             if (null == this.data) {
  |                     this.data = new HashMap<String, Object>();
  |             }
  |             this.data.put(impl, data);
  |     }
  | 
  |     /**
  |      * @return the refid
  |      */
  |     public String getRefid() {
  |             return this.refid;
  |     }
  | 
  |     /**
  |      * @param refid the refid to set
  |      */
  |     public void setRefid(String refid) {
  |             this.refid = refid;
  |     }
  | 
  |     /**
  |      * The text from the item body
  |      * 
  |      * @return the text
  |      */
  |     public String getText() {
  |             return this.text;
  |     }
  | 
  |     /**
  |      * @param text the text to set
  |      */
  |     public void setText(String text) {
  |             this.text = text;
  |     }
  | 
  |     /**
  |      * @return the unwrap
  |      */
  |     public boolean isUnwrap() {
  |             return this.unwrap;
  |     }
  | 
  |     /**
  |      * @param unwrap the unwrap to set
  |      */
  |     public void setUnwrap(boolean unwrap) {
  |             this.unwrap = unwrap;
  |     }
  | 
  |     public String toString() {
  |             return this.getClass().getSimpleName() + ", id = " + id
  |                             + (refid == null ? ", " : " (" + refid + "), ") 
+ "label = '"
  |                             + label + "', action = " + action;
  |     }
  | }
  | 


Then to use it:
- create a menus.xml, e.g.:

  | <menus>
  | 
  |     <item id="HomeMenu" >
  |       <item refid="EntityMenu" />
  |       <item refid="MainMenu" unwrap="true" />
  |     </item>
  |     
  |     <item id="EntityMenu" label="#{messages['view.menu.label.entities']}" >
  |         <item label="#{messages['view.menu.list.person']}"   
action="/PersonList.xhtml"   propagation="none" />
  |         <item label="#{messages['view.menu.list.branch']}"   
action="/BranchList.xhtml"   propagation="none" />
  |         <item label="#{messages['view.menu.list.fund']}"     
action="/FundList.xhtml"     propagation="none" />
  |         <item label="#{messages['view.menu.list.payslip']}"  
action="/PayslipList.xhtml"  propagation="none" />
  |         <item label="#{messages['view.menu.list.worker']}"   
action="/WorkerList.xhtml"   propagation="none" />
  |         <item label="#{messages['view.menu.list.contract']}" 
action="/ContractList.xhtml" propagation="none" />
  |         <item label="#{messages['view.menu.list.address']}"  
action="/AddressList.xhtml"  propagation="none" />
  |         <item label="#{messages['view.menu.list.rubric']}"   
action="/RubricList.xhtml"   propagation="none" />
  |         <item label="#{messages['view.menu.list.profil']}"   
action="/ProfilList.xhtml"   propagation="none" />
  |         <item label="#{messages['view.menu.list.job']}"      
action="/JobList.xhtml"      propagation="none" />
  |         <item label="#{messages['view.menu.list.payItem']}"  
action="/PayItemList.xhtml"  propagation="none" />
  |     </item>
  | 
  |     <item id="MainMenu" >
  |       <item refid="FileMenu" />
  |       <item refid="EmployeeMenu" />
  |       <item refid="PayslipMenu" />
  |       <item refid="ReportMenu" />
  |       <item refid="ToolMenu" />
  |       <item refid="HelpMenu" />
  |     </item>
  |     
  |     <item id="FileMenu" label="#{messages['menu.company']}">
  |         <item label="#{messages['menu.quit']}" 
action="#{messages['view.menu.link.site.company']}"  type="direct" />
  |     </item>
  | 
  |     <item id="EmployeeMenu" label="#{messages['menu.employee']}">
  |         <item label="#{messages['menu.employee.list']}" 
action="/WorkerList.xhtml" propagation="none" />
  |         <item />
  |         <item label="#{messages['menu.employee.contract.list']}" 
action="/ContractList.xhtml" propagation="none" />
  |     </item>
  | 
  |     <item id="PayslipMenu" label="#{messages['menu.payslip']}">
  |         <item label="#{messages['menu.payslip.list']}"  
action="/PayslipList.xhtml" propagation="none" />
  |     </item>
  | 
  |     <item id="ReportMenu" label="#{messages['menu.report']}">
  |     </item>
  | 
  |     <item id="ToolMenu" label="#{messages['menu.tool']}">
  |     </item>
  | 
  |     <item id="HelpMenu" label="#{messages['menu.help']}">
  |         <item label="#{messages['view.menu.label.site.jboss']}" 
action="#{messages['view.menu.link.site.jboss']}"  type="direct" />
  |         <item label="#{messages['view.menu.label.help']}" 
action="/Help.xhtml" target="_blank"/>
  |     </item>
  | 
  |     <item id="PersonListMenu" >
  |       <item label="#{messages['entity.person.name']}">
  |         <item label="#{messages['view.global.button.add']}" 
  |               action="/PersonEdit.xhtml" />
  |       </item>
  |     </item>
  |   
  |     <item id="ContractListMenu" >
  |       <item label="#{messages['entity.contract.name']}">
  |         <item label="#{messages['view.global.button.add']}" 
  |               action="/WorkerList.xhtml" />
  |       </item>
  |     </item>
  |   
  |     <item id="ContractViewMenu" >
  |       <item label="#{messages['entity.contract.name']}">
  |         <item label="#{messages['menu.link.contract.create.payslips']}" 
  |               action="#{customContractHome.createPayslip}" 
  |               type="binding"/>
  |       </item>
  |     </item>
  | 
  | </menus>
  | 

- and use it with a menu layout:

  | <rich:toolBar 
  |         xmlns="http://www.w3.org/1999/xhtml";
  |         xmlns:ui="http://java.sun.com/jsf/facelets";
  |         xmlns:h="http://java.sun.com/jsf/html";
  |         xmlns:f="http://java.sun.com/jsf/core";
  |         xmlns:s="http://jboss.com/products/seam/taglib";
  |         xmlns:rich="http://richfaces.ajax4jsf.org/rich";>
  | <h:form id="menuBar">
  |         
  | <style type="text/css">
  |   .withlink a {display:inline-block; width: 100%;}
  |   html>/**/body .withlink a {display: block; width: 100%;}
  |   html>/**/body .withlink span{float: left;}
  |   html>/**/body .withlink span + span {float: none; display: block;}
  | </style>
  | 
  | <style type="text/css">
  |     .withHighIndex div {z-index:    100;}
  | </style>
  | 
  |     <rich:toolBarGroup>
  |         <h:outputFormat value="#{messages['view.menu.title.project']}">
  |             <f:param value="#{projectName}" />
  |         </h:outputFormat>
  |     </rich:toolBarGroup>
  | 
  | <ui:insert name="menu" />
  | <f:subview rendered="#{empty menuref}">
  | 
  |     <rich:toolBarGroup>
  |                 <s:link view="/home.xhtml"
  |                    value="#{messages['view.menu.link.home']}"/>
  |     </rich:toolBarGroup>
  | 
  |     <rich:toolBarGroup styleClass="withHighIndex">
  |         <rich:dropDownMenu value="#{messages['view.menu.label.entities']}">
  |             <rich:menuItem 
  |                       styleClass="withlink"
  |                       submitMode="none">
  |                 <s:link value="#{messages['view.menu.list.profil']}"
  |                          view="/ProfilList.xhtml" propagation="none" />
  |             </rich:menuItem>
  | [...]
  |             <rich:menuItem 
  |                       styleClass="withlink"
  |                       submitMode="none">
  |                 <s:link value="#{messages['view.menu.list.person']}"
  |                          view="/PersonList.xhtml" propagation="none" />
  |             </rich:menuItem>
  |         </rich:dropDownMenu>
  |                 
  |         <rich:dropDownMenu value="#{messages['view.menu.help']}">
  |             <rich:menuItem 
value="#{messages['view.menu.label.site.jboss']}" 
  |                          
onclick="document.location.href='#{messages['view.menu.link.site.jboss']}'" 
submitMode="none" />
  |         </rich:dropDownMenu>
  |      </rich:toolBarGroup>
  | 
  | </f:subview>
  | 
  |      <rich:toolBarGroup location="right">
  |          <h:outputFormat 
value="#{messages['org.jboss.seam.loginSuccessful']}"
  |                       rendered="#{identity.loggedIn}">
  |              <f:param value="#{identity.username}"/>
  |          </h:outputFormat>
  |          <s:link view="/login.xhtml" 
  |                 value="#{messages['view.login.button.login']}"
  |              rendered="#{not identity.loggedIn}"/>
  |          <s:link view="/home.xhtml" 
  |                action="#{identity.logout}" 
  |                 value="#{messages['view.login.button.logout']}"
  |              rendered="#{identity.loggedIn}"/>
  |      </rich:toolBarGroup>
  | </h:form>
  | </rich:toolBar>
  | 

and some view:

  | <!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  |                              
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";>
  | 
  | <ui:composition xmlns="http://www.w3.org/1999/xhtml";
  |                 xmlns:s="http://jboss.com/products/seam/taglib";
  |                 xmlns:ui="http://java.sun.com/jsf/facelets";
  |                 xmlns:f="http://java.sun.com/jsf/core";
  |                 xmlns:h="http://java.sun.com/jsf/html";
  |                 xmlns:rich="http://richfaces.ajax4jsf.org/rich";
  |                 xmlns:j="http://ext.joda.org/jsf/components";
  |                 template="layout/template.xhtml">
  |                        
  | <ui:param name="menuref" value="#{menumanager.getMenu('FundViewMenu')}" />
  | <ui:define name="menu">
  |     <rich:toolBarGroup styleClass="withHighIndex" 
binding="#{menumanager.getNavigationMenus('FundViewMenu')}" />
  | </ui:define>
  |                        
  | <ui:define name="body">
  |     
  |     <h:messages globalOnly="true" styleClass="message" id="globalMessages"/>
  |     
  |     <rich:panel>
  |         <f:facet name="header">
  |             <h:outputFormat 
value="#{messages['view.edit.title.show.entity']}">
  |                 <f:param value="#{messages['entity.fund.name']}"/>
  |             </h:outputFormat>
  |         </f:facet>
  | 
  |         <s:decorate id="id" template="layout/display.xhtml">
  |             <ui:define name="label">
  |                 <h:outputText value="#{messages['entity.fund.id.label']}"/>
  |             </ui:define>
  |             #{fundHome.instance.id}
  |         </s:decorate>
  | 
  | [...]
  | 
  | </ui:define>
  | 
  | </ui:composition>
  | 



View the original post : 
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4069401#4069401

Reply to the post : 
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4069401
_______________________________________________
jboss-user mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/jboss-user

Reply via email to