HtmlDropDownMenu with click able parent label
mmulligan03 Oct 26, 2011 1:35 PMI've created a class to build a drop down menu from a database. The creation of the menu works as planned but what I can't figure out is how to make the parent item a link to a page.
For instance I might have a menu structured like so:
- My Account
- Billing
- Pay Bill
- Change Billing
- Profile
- Billing
etc...
The way my current code works is I cannot click on Billing and have it bring me to the main Billing page
I know that when writing this out using tags I can specify a <f:facet like so:
<rich:dropDownMenu> <facet name="label" > <s:link view="/billing.xhtml" value="Billing" /> </facet> ...
and that will give me a click able link. How can I do this in my code below? (the _parseSubMenu method is where the HtmlDropDownMenu is created)
@Name("systemMenus")
@Scope(ScopeType.SESSION)
public class SystemMenus implements java.io.Serializable {
private static final long serialVersionUID = 1579546151447504530L;
private ArrayList<MenuItem> headerMenu;
private HtmlToolBar navBar;
@Logger
Log log;
@In(create = true)
private MenuItemsManager menuItemsManager;
@In
UserIdentity identity;
@Observer(Identity.EVENT_POST_AUTHENTICATE)
public void loadMenus() {
headerMenu = menuItemsManager.loadMenuItems(1);
}
public void setNavBar(HtmlToolBar navBar) {
this.navBar = navBar;
}
/**
* Build the navigation menu from the headerMenu property
*
* @return
*/
public UIToolBar getNavBar() {
navBar = new HtmlToolBar();
if (headerMenu == null) {
loadMenus();
}
for (MenuItem item : headerMenu) {
UIComponent menu = _parseSubMenu(item, 0);
if (menu != null) {
navBar.getChildren().add(menu);
}
}
if (log.isDebugEnabled())
log.debug("Count: " + navBar.getChildCount());
if (!(navBar.getChildCount() > 0))
navBar = null;
return navBar;
}
/**
* From a MenuItem either create a HtmlMenuItem or a HtmlDropDownMenu
*
* @param item
* MenuItem this is the parent item
* @param level
* What level of the menu are we on. This is used for determinig
* direction of the menu past the first level
* @return either a HtmlMenuItem or a HtmlDropDownMenu
*/
private UIComponent _parseSubMenu(MenuItem item, int level) {
// if the item pageView isn't null or empty check that for permission
// if the item does not have a page view (eg. place holder for a sub
// menu) then check the label against the permissions
if (((item.getPageView() != null && (!item.getPageView().equals(""))) && !identity.hasPermission(
item.getPageView(), "render"))
|| ((item.getPageView() == null || item.getPageView().equals("")) && !identity.hasPermission(
item.getLabel(), "render"))) {
if (log.isDebugEnabled())
log.debug("Denied to render: " + item.getLabel() + " - " + item.getPageView());
return null;
}
UIComponent ddm = null;
if (item.getMenuItems().size() > 0) {
if (level > 0) {
ddm = new HtmlMenuGroup();
// if the level is greater than 0 we want the menu to appear to
// the right
((HtmlMenuGroup) ddm).setDirection("bottom-right");
((HtmlMenuGroup) ddm).setValue(item.getLabel());
} else {
ddm = new HtmlDropDownMenu();
((HtmlDropDownMenu) ddm).setHideDelay(400);
((HtmlDropDownMenu) ddm).setValue(item.getLabel());
}
for (MenuItem child : item.getMenuItems()) {
UIComponent ui = _parseSubMenu(child, (level + 1));
// if the children of this parent is not null add it to
// the menu item
// if it is null no need to show the parent so make the
// UIComponent null
if (ui != null)
ddm.getChildren().add(ui);
else
ddm = null;
}
} else {
ddm = _createMenuItem(item);
}
return ddm;
}
/**
* From a menu item create an HtmlMenuItem object
*
* @param item
* @return
*/
private HtmlMenuItem _createMenuItem(MenuItem item) {
HtmlMenuItem mi = new HtmlMenuItem();
if (item.getPageView() != null && !item.getPageView().equals(""))
mi.setOnclick(String.format("window.location.href='%s'", _pageViewToUrl(item.getPageView())));
mi.getChildren().add(_createLink(item));
return mi;
}
/**
* From a menu item create an HtmlLink object
*
* @param item
* @return
*/
private HtmlLink _createLink(MenuItem item) {
HtmlLink link = new HtmlLink();
link.setView(item.getPageView());
link.setValue(item.getLabel());
return link;
}
/**
* Take a viewId and transform it into a usable URL
*
* @param viewId
* @return URL string
*/
private String _pageViewToUrl(String viewId) {
String url = FacesContext.getCurrentInstance().getApplication().getViewHandler()
.getActionURL(FacesContext.getCurrentInstance(), viewId);
if (log.isInfoEnabled())
log.info("ViewID: " + viewId + " URL: " + url);
return url;
}
/**
* @param headerMenu
* the headerMenu to set
*/
public void setHeaderMenu(ArrayList<MenuItem> headerMenu) {
this.headerMenu = headerMenu;
}
/**
* @return the headerMenu
*/
public ArrayList<MenuItem> getHeaderMenu() {
return headerMenu;
}
}