From d4d61d68982b5ce5ff435ab7c8644709cdc5950e Mon Sep 17 00:00:00 2001 From: =?utf8?q?Johannes=20Dahlstr=C3=B6m?= Date: Tue, 26 Jun 2012 15:02:39 +0000 Subject: [PATCH] #8193 Listen to RootPanel keydown events to handle shortcut actions from PopupPanel/VOverlay widgets svn changeset:23977/svn branch:6.8 --- .../vaadin/terminal/gwt/client/ui/VView.java | 27 +++++-- .../terminal/gwt/client/ui/VWindow.java | 3 + .../popupview/PopupViewClickShortcut.java | 75 +++++++++++++++++++ 3 files changed, 100 insertions(+), 5 deletions(-) create mode 100644 tests/testbench/com/vaadin/tests/components/popupview/PopupViewClickShortcut.java diff --git a/src/com/vaadin/terminal/gwt/client/ui/VView.java b/src/com/vaadin/terminal/gwt/client/ui/VView.java index 6fdacc9607..3f0347c306 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VView.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VView.java @@ -18,6 +18,8 @@ import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.Style; import com.google.gwt.dom.client.Style.Display; import com.google.gwt.event.dom.client.DomEvent.Type; +import com.google.gwt.event.dom.client.KeyDownEvent; +import com.google.gwt.event.dom.client.KeyDownHandler; import com.google.gwt.event.logical.shared.ResizeEvent; import com.google.gwt.event.logical.shared.ResizeHandler; import com.google.gwt.event.shared.EventHandler; @@ -136,12 +138,31 @@ public class VView extends SimplePanel implements Container, ResizeHandler, // should not be in the document focus flow getElement().setTabIndex(-1); TouchScrollDelegate.enableTouchScrolling(this, getElement()); + + // Handle shortcut actions originated from the main window. Subwindow + // shortcut actions are handled by the subwindows themselves. + RootPanel.get().addDomHandler(new KeyDownHandler() { + public void onKeyDown(KeyDownEvent event) { + + Event nativeEvent = event.getNativeEvent().cast(); + com.google.gwt.user.client.Element target = nativeEvent + .getEventTarget().cast(); + // Ensure the event originates from our application even in case + // we're embedded. + if (actionHandler != null + && (!isEmbedded() || (Util.getPaintableForElement( + connection, getParent(), target) != null))) { + actionHandler.handleKeyboardEvent(nativeEvent); + } + } + }, KeyDownEvent.getType()); } /** * Start to periodically monitor for parent element resizes if embedded * application (e.g. portlet). */ + @Override protected void onLoad() { super.onLoad(); if (isMonitoringParentSize()) { @@ -569,10 +590,7 @@ public class VView extends SimplePanel implements Container, ResizeHandler, public void onBrowserEvent(Event event) { super.onBrowserEvent(event); int type = DOM.eventGetType(event); - if (type == Event.ONKEYDOWN && actionHandler != null) { - actionHandler.handleKeyboardEvent(event); - return; - } else if (scrollable && type == Event.ONSCROLL) { + if (scrollable && type == Event.ONSCROLL) { updateScrollPosition(); } } @@ -934,5 +952,4 @@ public class VView extends SimplePanel implements Container, ResizeHandler, public void focus() { getElement().focus(); } - } diff --git a/src/com/vaadin/terminal/gwt/client/ui/VWindow.java b/src/com/vaadin/terminal/gwt/client/ui/VWindow.java index 2384ee7ddd..9b124ae466 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VWindow.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VWindow.java @@ -1377,6 +1377,9 @@ public class VWindow extends VOverlay implements Container, if (shortcutHandler != null) { shortcutHandler .handleKeyboardEvent(Event.as(event.getNativeEvent())); + // Don't let the event propagate to the RootPanel where VView + // listens to shortcut events of the main window. + event.stopPropagation(); return; } } diff --git a/tests/testbench/com/vaadin/tests/components/popupview/PopupViewClickShortcut.java b/tests/testbench/com/vaadin/tests/components/popupview/PopupViewClickShortcut.java new file mode 100644 index 0000000000..7009d03f77 --- /dev/null +++ b/tests/testbench/com/vaadin/tests/components/popupview/PopupViewClickShortcut.java @@ -0,0 +1,75 @@ +package com.vaadin.tests.components.popupview; + +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.event.ShortcutAction.ModifierKey; +import com.vaadin.tests.components.TestBase; +import com.vaadin.tests.util.Log; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.ComponentContainer; +import com.vaadin.ui.Layout; +import com.vaadin.ui.PopupView; +import com.vaadin.ui.Table; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; + +public class PopupViewClickShortcut extends TestBase { + + private Window sub = new Window("Table", makeTable("Subwindow", KeyCode.S)); + + private Log log = new Log(5); + + @Override + protected void setup() { + sub.center(); + getMainWindow().addWindow(sub); + addComponent(log); + addComponent(new PopupView("Show popup table", makeTable("Popup", + KeyCode.P))); + addComponent(makeTable("Main window", KeyCode.M)); + sub.addComponent(new PopupView("Show popup table", makeTable( + "Subwindow popup", KeyCode.U))); + } + + private ComponentContainer makeTable(final String caption, int keyCode) { + final Table t = new Table(); + t.setSelectable(true); + t.setHeight("200px"); + t.setWidth("200px"); + t.addContainerProperty("foo", String.class, "foo"); + for (int i = 0; i < 5; i++) { + t.addItem(new String[] { "foo " + i }, i); + } + + final Layout l = new VerticalLayout(); + l.setCaption(caption); + l.setWidth(null); + + Button b = new Button("Submit " + caption, new Button.ClickListener() { + private int i = 5; + + public void buttonClick(ClickEvent event) { + log.log("Submitted from " + + event.getButton().getParent().getCaption()); + t.addItem(new String[] { "added " + i++ }, i); + } + }); + b.setClickShortcut(keyCode, ModifierKey.ALT); + + l.addComponent(t); + l.addComponent(b); + + return l; + } + + @Override + protected String getDescription() { + return "Enter ClickShortcut does not work with PopupView"; + } + + @Override + protected Integer getTicketNumber() { + return 8193; + } + +} -- 2.39.5