0
votes

I'd like to intercept Ctrl+F4 in order to close tabs of a TabPanel rather then the browser tab my application is running in. The following code is works if I click inside the tab panel first:

    Viewport v = new Viewport();
    v.setLayout(new FitLayout());

    v.add(panel);
    v.addListener(Events.KeyDown, new Listener<BaseEvent>() {
        public void handleEvent(BaseEvent be) {
            KeyEvent ce = (KeyEvent)be;
            if (ce.isControlKey()) {
                if (ce.getKeyCode() == 115) {
                    System.out.println(ce.getKeyCode() + " Ctrl-f4");
                    ce.preventDefault();
                    ce.stopEvent();
                }
            }
        };
    });

The funny thing is that if the focus is somewhre outside the TabPanel (which is obviously located inside the Viewport) the event isn't fired.

Any ideas?

2

2 Answers

0
votes

ctrl-f4 is windows specific, so you should not rely on it.

Instead to catch user closing window/tab use Window.ClosingHandler:

     Window.addWindowClosingHandler(new Window.ClosingHandler() {
        @Override
        public void onWindowClosing(ClosingEvent closingEvent) {
            closingEvent.setMessage("Closing? Really?")
        }
    });

This will show a browser dialog with your message and confirm buttons.

0
votes

You can use a ClosingHandler to intercept the window close event and prompt the user for confirmation. You cannot, however, completely block the window/tab from closing - the browser will not allow it. You're going to have to choose a different keyboard shortcut.

Once you choose your shortcut use a NativePreviewHandler to detect it:

Event.addNativePreviewHandler(new NativePreviewHandler() {
  @Override
  public void onPreviewNativeEvent(NativePreviewEvent event) {
    if (event.getTypeInt() == Event.ONKEYDOWN) {
      NativeEvent ne = event.getNativeEvent();

      if (ne.getKeyCode() == 't' && ne.getCtrlKey()) {
        // ...
      }
    }
  }
});