Search code examples
javagwtcontextmenugxt

How to prevent empty context menu from showing in GXT


I have a TreePanel which shows different kind of objects hierarchically. Region, City, Location...

I want to be able to show different context menu items in different levels. For example: miR for Region, miC for City, miL for Location... I used this snipped to achieve that dynamic structure:

    contextMenu.addListener(Events.BeforeShow, new Listener<MenuEvent>() {
        @Override
        public void handleEvent(MenuEvent be) {
            //First make all menu items invisible
            List<Component> menuItems = contextMenu.getItems();
            for (Component c : menuItems) {
                c.setVisible(false);
            }               

            //And make apprepriate menu items visible
            TopologyTreeElement s = tree.getSelectionModel().getSelectedItem();
            if (s instanceof TopologyTreeElement.Region) {
                miR.setVisible(true);
            }
            if (s instanceof TopologyTreeElement.City) {
                miC.setVisible(true);
            }                                   
        }
    });

But, in any level if all of the items are invisible, it shows an empty box. I want it not to show the menu totally. I tried adding this code snippet to the method, but it gave no help.

            //Do not show menu if no menu item is invisible     
            boolean isMenuShouldBeVisible = miC.isVisible() || miR.isVisible();
            if (!isMenuShouldBeVisible) {
                be.preventDefault();
                be.stopEvent();
            }

Anyone can suggest a different approach?


Solution

  • Since you are listening to the BeforeShow event, you are allowed to cancel the event and stop the actual Show event from happening. Check to see if all items are invisible, and if so, call be.setCancelled(true).

    Any event that starts in Before can be used to cancel the later event - this is why these before- events exist at all.