Need to programmatically add menuitems

Hi,

I have a UIBackbaseMenuItem and I need to add another UIBackbaseMenuItem to it as a child. The code is below. The observed behavior is that is it adding as it was a direct child to the MenuBar and not the MenuItem. How do you programmatically add a child MenuItem?

UIBackbaseMenuItem menuItem = new UIBackbaseMenuItem();
menuItem.setId(rpass.getPass(10));
menuItem.setItemLabel(item.getStringToDisplay());
menuItem.setItemValue(item.getAction());
menuItem.setSelectListener(FacesContext.getCurrentInstance().getApplication().createMethodBinding("#{mainBackingBean.universalSelectMenuItem}",listenerClass ));
pMenuItem.addChild(menuItem);

Need to programmatically add menuitems

Hi Edward,

Could you provide more code, since the following code seems to be working for me:

jsp:

<bjs:menuBar id="menu" binding="#{sampleBean.bar}">
        <bjs:menuItem itemLabel="File" binding="#{sampleBean.item}">
                <bjs:menuItem itemLabel="Open"/>
                <bjs:menuItem itemLabel="Save" />
        </bjs:menuItem>
</bjs:menuBar>

<bjs:commandButton actionListener="#{sampleBean.addMenuItem}"
        value="Click here to add a menu item" />

backing bean:

UIBackbaseMenuBar bar;
UIBackbaseMenuItem item;

public UIBackbaseMenuItem getItem() {
        return item;
}

public void setItem(UIBackbaseMenuItem item) {
        this.item = item;
}

public UIBackbaseMenuBar getBar() {
        return bar;
}

public void setBar(UIBackbaseMenuBar bar) {
        this.bar = bar;
}

public void addMenuItem(ActionEvent event) {
        log.debug(item.getChildCount());
       
        UIBackbaseMenuItem menuItem = new UIBackbaseMenuItem();
        menuItem.setId("someNewId");
        menuItem.setItemLabel("New label");
        menuItem.setItemValue("New value");
        item.addChild(menuItem);
}

Maybe this already helps...

Cheers,
Robin

Code does not work

The example does not work in 4.2.0.
I get:
2: API: Invalid argument type in call to API function "construct", argument 1: expected "[model]", but was "[null]".

Best regards,
D

MenuPopUp is not closed

Hi llper,

It is indeed will return error. It is because the menuPopUp has no close tag after the programmatically adding the menuPopUpItem.

This is the response that I got from the server:

<c:create xmlns:b="http://www.backbase.com/2006/btl" xmlns:e="http://www.backbase.com/2006/xel" destination="id('menu:File')" mode="replaceChildren">
<b:menuPopUp>
<b:menuPopUpItem label="Open" id="menu:File:Open"></b:menuPopUpItem>
<b:menuPopUpItem label="Save" id="menu:File:Save"></b:menuPopUpItem>
<b:menuPopUpItem label="New label" id="menu:File:Newvalue"></b:menuPopUpItem>
</c:create>

I considered it as a bug and I have already put it on our issue tracking system.
Thank you for your finding.

Andys

Need to programmatically add menuitems

Here it is. Thanks Robin for your help. The code looks similar but the results are not the same.

public void presentMenu(UIBackbasePanel pParent) throws CFMException {
CFMAbstractApplication application = getCFMVisit().getActiveApplication();
CFMAbstractMenu menu = application.getMenu();

UIBackbaseMenuBar menuBar = new UIBackbaseMenuBar();
menuBar.setId(rpass.getPass(10));
pParent.addChild(menuBar);

Class[] listenerClass = new Class[1];
try { listenerClass[0] = Class.forName("com.backbase.bjs.event.SelectEvent"); }
catch (ClassNotFoundException e) { e.printStackTrace(); }

ArrayList rootElements = menu.getRootElements();
for (int i = 0;i<rootElements.size();i++) {
CFMMenuItemStandardImpl item = (CFMMenuItemStandardImpl)rootElements.get(i);

UIBackbaseMenuItem menuItem = new UIBackbaseMenuItem();
menuItem.setId(rpass.getPass(10));
menuItem.setItemLabel(item.getStringToDisplay());
if (item.getAction() == null) menuItem.setItemValue("NO ACTION " + rpass.getPass(5));
else {
menuItem.setItemValue(item.getAction().getName());
item.setUIBackbaseMenuItem(menuItem);
}
menuItem.setSelectListener(FacesContext.getCurrentInstance().getApplication().createMethodBinding("#{mainBackingBean.universalSelectMenuItem}",listenerClass ));
menuBar.addChild(menuItem);
processMenu(menuItem,item);
}
}

public void processMenu(UIBackbaseMenuItem pMenuItem,CFMMenuItemStandardImpl pItem) {
ArrayList children = getCFMVisit().getActiveApplication().getMenu().getChildren(pItem);

for (int i = 0;i<children.size();i++) {
CFMMenuItemStandardImpl item = (CFMMenuItemStandardImpl)children.get(i);

Class[] listenerClass = new Class[1];
try { listenerClass[0] = Class.forName("com.backbase.bjs.event.SelectEvent"); }
catch (ClassNotFoundException e) { e.printStackTrace(); }

UIBackbaseMenuItem menuItem = new UIBackbaseMenuItem();
menuItem.setId(rpass.getPass(10));
menuItem.setItemLabel(item.getStringToDisplay());
if (item.getAction() == null) menuItem.setItemValue("NO ACTION " + rpass.getPass(5));
else menuItem.setItemValue(item.getAction().getName());
menuItem.setSelectListener(FacesContext.getCurrentInstance().getApplication().createMethodBinding("#{mainBackingBean.universalSelectMenuItem}",listenerClass ));
pMenuItem.addChild(menuItem);
}
}

Need to programmatically add menuitems

Please close this case. I have resolved the problem.

Thanks

Same issue

Any chance for a work-around and or a timeline for when this will be fixed, the next release of the JSF componenets?