0

A GWT MenuItem extends UIObject - any idea how I can add event handlers to it for example I want a special context menu for right-clicking on a MenuItem. Thanks!

user1176505
  • 729
  • 5
  • 16

1 Answers1

1

You can use underlying element of the MenuItem object:

final Element element = menuItem.getElement();
Event.addNativePreviewHandler(new Event.NativePreviewHandler() {
    @Override
    public void onPreviewNativeEvent(Event.NativePreviewEvent event) {
        if (event.getTypeInt() == Event.ONMOUSEDOWN 
                && event.getNativeEvent().getButton() == Event.BUTTON_RIGHT 
                && event.getNativeEvent().getEventTarget().equals(element)) {
            showSpecialMenu();
        }
    }
});

Event.sinkEvents(element, Event.ONMOUSEDOWN);

Or like this (also you will be able to prevent default context menu):

final Element element = menuItem.getElement();
Event.addNativePreviewHandler(new Event.NativePreviewHandler() {
    @Override
    public void onPreviewNativeEvent(Event.NativePreviewEvent event) {
        if (event.getTypeInt() == Event.ONCONTEXTMENU && event.getNativeEvent().getEventTarget().equals(element)) {
            // prevent default context menu
            event.getNativeEvent().stopPropagation();
            event.getNativeEvent().preventDefault();

            // show custom context menu
            showSpecialMenu();
        }
    }
});

Event.sinkEvents(element, Event.ONCONTEXTMENU);

You can do both like this:

......
Event.sinkEvents(element, Event.ONCONTEXTMENU | Event.ONMOUSEDOWN);
thepun599
  • 150
  • 1
  • 7
  • Thanks that works great for catching the event but I still see the native context menu instead of mine. – user1176505 Dec 20 '14 at 11:41
  • Strangely the second one doesn't work for me - I never see a ONCONTEXTMENU event thrown. But for my purposes having a context menu even without supressing the native menu it a big help thanks. Also I have a hyperlink within the menu item which ends up being the event target so I'm using element.toString().contains(event.getNativeEvent().getEventTarget().toString()) Thanks again – user1176505 Dec 21 '14 at 06:05
  • Hmmm. I actually never got this working because I have a hyperlink inside the MenuItem and event comes from the hyperlink but the element was the MenuItem. In GWT DEvelopment mode it worked great with element.toString().contains(event.getNativeEvent().getEventTarget().toString()) but once compiled this fails and I cannot find any way to match the right-click event to which menuItem it came from. Also the menu item getAbsoluteTop() is zero even when it's visible (see http://stackoverflow.com/questions/27644719/gwt-menuitem-in-a-submenu-has-zero-getabsolutetop-getabsoluteleft) – user1176505 Dec 25 '14 at 19:23