From 3e12c50b99b463938c8538e30856e943dac59a81 Mon Sep 17 00:00:00 2001 From: Automerge Date: Mon, 19 Mar 2012 15:28:39 +0000 Subject: [merge from 6.7] #7855 - Screen goes blank when detaching an Embedded component displaying a PDF svn changeset:23264/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/ui/VEmbedded.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/com/vaadin/terminal/gwt/client/ui/VEmbedded.java b/src/com/vaadin/terminal/gwt/client/ui/VEmbedded.java index 17a95388b9..2c3115c5ed 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VEmbedded.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VEmbedded.java @@ -395,8 +395,14 @@ public class VEmbedded extends HTML implements Paintable { // Force browser to fire unload event when component is detached // from the view (IE doesn't do this automatically) if (browserElement != null) { - DOM.setElementAttribute(browserElement, "src", - "javascript:false"); + /* + * src was previously set to javascript:false, but this was not + * enough to overcome a bug when detaching an iframe with a pdf + * loaded in IE9. about:blank seems to cause the adobe reader + * plugin to unload properly before the iframe is removed. See + * #7855 + */ + DOM.setElementAttribute(browserElement, "src", "about:blank"); } } super.onDetach(); -- cgit v1.2.3 From 2033fd45c9124ef277e23f9f3a2507a6902e7f70 Mon Sep 17 00:00:00 2001 From: Automerge Date: Mon, 19 Mar 2012 15:28:46 +0000 Subject: [merge from 6.7] Test case updated for #7855 svn changeset:23265/svn branch:6.8 --- .../com/vaadin/tests/components/embedded/EmbeddedPdf.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tests/testbench/com/vaadin/tests/components/embedded/EmbeddedPdf.java b/tests/testbench/com/vaadin/tests/components/embedded/EmbeddedPdf.java index 0fb8b27b75..320df648b1 100644 --- a/tests/testbench/com/vaadin/tests/components/embedded/EmbeddedPdf.java +++ b/tests/testbench/com/vaadin/tests/components/embedded/EmbeddedPdf.java @@ -2,6 +2,8 @@ package com.vaadin.tests.components.embedded; import com.vaadin.terminal.ClassResource; import com.vaadin.tests.components.TestBase; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Embedded; import com.vaadin.ui.Window; @@ -19,13 +21,19 @@ public class EmbeddedPdf extends TestBase { @Override public void setup() { - Embedded player = new Embedded(); + final Embedded player = new Embedded(); player.setType(Embedded.TYPE_BROWSER); player.setWidth("400px"); player.setHeight("300px"); player.setSource(new ClassResource(getClass(), "test.pdf", this)); addComponent(player); + addComponent(new Button("Remove pdf", new Button.ClickListener() { + public void buttonClick(ClickEvent event) { + removeComponent(player); + } + })); + player.getWindow().addWindow(new Window("Testwindow")); } -- cgit v1.2.3 From 34ec44230f5b79f860a53a1d10b20a7038646319 Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Tue, 20 Mar 2012 12:24:46 +0000 Subject: #6085 Allow setting an alternate text for Embedded, for accessibility purposes svn changeset:23268/svn branch:6.8 --- .../vaadin/terminal/gwt/client/ui/VEmbedded.java | 15 ++++++++-- src/com/vaadin/ui/Embedded.java | 33 ++++++++++++++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/src/com/vaadin/terminal/gwt/client/ui/VEmbedded.java b/src/com/vaadin/terminal/gwt/client/ui/VEmbedded.java index 2c3115c5ed..2783db99d1 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VEmbedded.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VEmbedded.java @@ -31,6 +31,7 @@ import com.vaadin.terminal.gwt.client.VTooltip; public class VEmbedded extends HTML implements Paintable { public static final String CLICK_EVENT_IDENTIFIER = "click"; + public static final String ALTERNATE_TEXT = "alt"; private static String CLASSNAME = "v-embedded"; @@ -107,6 +108,11 @@ public class VEmbedded extends HTML implements Paintable { } DOM.setElementProperty(el, "src", getSrc(uidl, client)); + if (uidl.hasAttribute(ALTERNATE_TEXT)) { + el.setPropertyString(ALTERNATE_TEXT, + uidl.getStringAttribute(ALTERNATE_TEXT)); + } + if (created) { // insert in dom late getElement().appendChild(el); @@ -138,7 +144,6 @@ public class VEmbedded extends HTML implements Paintable { // Handle embedding of Flash addStyleName(CLASSNAME + "-flash"); setHTML(createFlashEmbed(uidl)); - } else if (mime.equals("image/svg+xml")) { addStyleName(CLASSNAME + "-svg"); String data; @@ -179,7 +184,9 @@ public class VEmbedded extends HTML implements Paintable { uidl.getStringAttribute("standby")); } getElement().appendChild(obj); - + if (uidl.hasAttribute(ALTERNATE_TEXT)) { + obj.setInnerText(uidl.getStringAttribute(ALTERNATE_TEXT)); + } } else { VConsole.log("Unknown Embedded mimetype '" + mime + "'"); } @@ -306,6 +313,10 @@ public class VEmbedded extends HTML implements Paintable { // End embed tag html.append(">"); + if (uidl.hasAttribute(ALTERNATE_TEXT)) { + html.append(uidl.getStringAttribute(ALTERNATE_TEXT)); + } + // End object tag html.append(""); diff --git a/src/com/vaadin/ui/Embedded.java b/src/com/vaadin/ui/Embedded.java index dc14cc6ef8..181cbbfb96 100644 --- a/src/com/vaadin/ui/Embedded.java +++ b/src/com/vaadin/ui/Embedded.java @@ -78,6 +78,8 @@ public class Embedded extends AbstractComponent { private String archive = null; + private String altText; + /** * Creates a new empty Embedded object. */ @@ -146,6 +148,9 @@ public class Embedded extends AbstractComponent { if (archive != null && !"".equals(archive)) { target.addAttribute("archive", archive); } + if (altText != null && !"".equals(altText)) { + target.addAttribute(VEmbedded.ALTERNATE_TEXT, altText); + } // Params for (final Iterator i = getParameterNames(); i.hasNext();) { @@ -157,6 +162,34 @@ public class Embedded extends AbstractComponent { } } + /** + * Sets this component's "alt-text", that is, an alternate text that can be + * presented instead of this component's normal content, for accessibility + * purposes. Does not work when {@link #setType(int)} has been called with + * {@link #TYPE_BROWSER}. + * + * @param altText + * A short, human-readable description of this component's + * content. + * @since 6.8 + */ + public void setAlternateText(String altText) { + if (altText != this.altText + || (altText != null && !altText.equals(this.altText))) { + this.altText = altText; + requestRepaint(); + } + } + + /** + * Gets this component's "alt-text". + * + * @see #setAlternateText(String) + */ + public String getAlternateText() { + return altText; + } + /** * Sets an object parameter. Parameters are optional information, and they * are passed to the instantiated object. Parameters are are stored as name -- cgit v1.2.3 From 13e8d50ee4e32026572b6913eb27554ca763eaba Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Tue, 20 Mar 2012 12:46:46 +0000 Subject: Test for #6085 - use assertHtmlSource instead of assertText because IE hides the alt text in an altHtml="..." property svn changeset:23269/svn branch:6.8 --- .../tests/components/embedded/EmbeddedAltText.html | 47 +++++++++++++++++++++ .../tests/components/embedded/EmbeddedAltText.java | 48 ++++++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 tests/testbench/com/vaadin/tests/components/embedded/EmbeddedAltText.html create mode 100644 tests/testbench/com/vaadin/tests/components/embedded/EmbeddedAltText.java diff --git a/tests/testbench/com/vaadin/tests/components/embedded/EmbeddedAltText.html b/tests/testbench/com/vaadin/tests/components/embedded/EmbeddedAltText.html new file mode 100644 index 0000000000..066c55fe55 --- /dev/null +++ b/tests/testbench/com/vaadin/tests/components/embedded/EmbeddedAltText.html @@ -0,0 +1,47 @@ + + + + + + +EmbeddedAltText + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EmbeddedAltText
open/run/com.vaadin.tests.components.embedded.EmbeddedAltText?restartApplication
assertAttributevaadin=runcomvaadintestscomponentsembeddedEmbeddedAltText::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VEmbedded[0]/domChild[0]@altAlt text of the image
assertHtmlSource*Alt text of the object*
clickvaadin=runcomvaadintestscomponentsembeddedEmbeddedAltText::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[2]/VButton[0]/domChild[0]/domChild[0]
assertAttributevaadin=runcomvaadintestscomponentsembeddedEmbeddedAltText::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VEmbedded[0]/domChild[0]@altNew alt text of the image!
assertHtmlSource*New alt text of the object!*
+ + diff --git a/tests/testbench/com/vaadin/tests/components/embedded/EmbeddedAltText.java b/tests/testbench/com/vaadin/tests/components/embedded/EmbeddedAltText.java new file mode 100644 index 0000000000..f8874810fc --- /dev/null +++ b/tests/testbench/com/vaadin/tests/components/embedded/EmbeddedAltText.java @@ -0,0 +1,48 @@ +package com.vaadin.tests.components.embedded; + +import com.vaadin.terminal.ExternalResource; +import com.vaadin.terminal.ThemeResource; +import com.vaadin.tests.components.TestBase; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Embedded; + +public class EmbeddedAltText extends TestBase { + @Override + protected String getDescription() { + return "It should be possible to set an alternative text on an image or object."; + } + + @Override + protected Integer getTicketNumber() { + return 2853; + } + + @Override + protected void setup() { + final Embedded e = new Embedded("Caption", new ThemeResource( + "../runo/icons/64/ok.png")); + e.setAlternateText("Alt text of the image"); + addComponent(e); + final Embedded player = new Embedded(); + player.setAlternateText("Alt text of the object"); + player.setType(Embedded.TYPE_OBJECT); + player.setWidth("400px"); + player.setHeight("300px"); + player.setMimeType("application/x-shockwave-flash"); + String url = "http://www.youtube.com/v/qQ9N742QB4g&autoplay=1"; + player.setSource(new ExternalResource(url)); + player.setParameter("movie", "someRandomValue"); + player.setParameter("allowFullScreen", "true"); + addComponent(player); + + Button changeAltTexts = new Button("Change alt texts", + new Button.ClickListener() { + public void buttonClick(ClickEvent event) { + e.setAlternateText("New alt text of the image!"); + player.setAlternateText("New alt text of the object!"); + } + }); + addComponent(changeAltTexts); + } +} -- cgit v1.2.3 From 9f3b320609250996730b57790a330e35a08f4a03 Mon Sep 17 00:00:00 2001 From: Automerge Date: Tue, 20 Mar 2012 14:07:26 +0000 Subject: [merge from 6.7] Test script for #7855 svn changeset:23270/svn branch:6.8 --- .../tests/components/embedded/EmbeddedPdf.html | 41 ++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 tests/testbench/com/vaadin/tests/components/embedded/EmbeddedPdf.html diff --git a/tests/testbench/com/vaadin/tests/components/embedded/EmbeddedPdf.html b/tests/testbench/com/vaadin/tests/components/embedded/EmbeddedPdf.html new file mode 100644 index 0000000000..371c6d300b --- /dev/null +++ b/tests/testbench/com/vaadin/tests/components/embedded/EmbeddedPdf.html @@ -0,0 +1,41 @@ + + + + + + +EmbeddedClickListenerRelativeCoordinates + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EmbeddedClickListenerRelativeCoordinates
open/run/com.vaadin.tests.components.embedded.EmbeddedPdf?restartApplication
pause10000
screenCapturewith-pdf
clickvaadin=runcomvaadintestscomponentsembeddedEmbeddedPdf::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[1]/VButton[0]/domChild[0]/domChild[0]
screenCapturewithout-pdf
+ + -- cgit v1.2.3 From 3ae537eaf91633b589c9628d68aaae1153f8712e Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Tue, 20 Mar 2012 15:10:10 +0000 Subject: #8209 Added a public click() method to Button, simulating a click on server side svn changeset:23275/svn branch:6.8 --- src/com/vaadin/ui/Button.java | 11 +++++ .../tests/server/component/button/ButtonClick.java | 47 ++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 tests/server-side/com/vaadin/tests/server/component/button/ButtonClick.java diff --git a/src/com/vaadin/ui/Button.java b/src/com/vaadin/ui/Button.java index 795a13e41a..8a98f0ccb0 100644 --- a/src/com/vaadin/ui/Button.java +++ b/src/com/vaadin/ui/Button.java @@ -515,6 +515,17 @@ public class Button extends AbstractField implements FieldEvents.BlurNotifier, removeListener(ClickEvent.class, listener, BUTTON_CLICK_METHOD); } + /** + * Simulates a button click, notifying all server-side listeners. + * + * No action is taken is the button is disabled. + */ + public void click() { + if (isEnabled() && !isReadOnly()) { + fireClick(); + } + } + /** * Fires a click event to all listeners without any event details. * diff --git a/tests/server-side/com/vaadin/tests/server/component/button/ButtonClick.java b/tests/server-side/com/vaadin/tests/server/component/button/ButtonClick.java new file mode 100644 index 0000000000..464d131996 --- /dev/null +++ b/tests/server-side/com/vaadin/tests/server/component/button/ButtonClick.java @@ -0,0 +1,47 @@ +package com.vaadin.tests.server.component.button; + +import static org.junit.Assert.assertEquals; + +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; + +import org.junit.Test; + +/** + * Tests the public click() method. + */ +public class ButtonClick { + private boolean clicked = false; + + @Test + public void testClick() { + getButton().click(); + assertEquals(clicked, true); + } + + @Test + public void testClickDisabled() { + Button b = getButton(); + b.setEnabled(false); + b.click(); + assertEquals(clicked, false); + } + + @Test + public void testClickReadOnly() { + Button b = getButton(); + b.setReadOnly(true); + b.click(); + assertEquals(clicked, false); + } + + private Button getButton() { + Button b = new Button(); + b.addListener(new Button.ClickListener() { + public void buttonClick(ClickEvent ev) { + clicked = true; + } + }); + return b; + } +} -- cgit v1.2.3 From 4a8f8b444a36ba69368d6f02908e3722148d40a0 Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Tue, 20 Mar 2012 15:13:08 +0000 Subject: #8209 Call click() from handleAction svn changeset:23276/svn branch:6.8 --- src/com/vaadin/ui/Button.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/com/vaadin/ui/Button.java b/src/com/vaadin/ui/Button.java index 8a98f0ccb0..3c99784592 100644 --- a/src/com/vaadin/ui/Button.java +++ b/src/com/vaadin/ui/Button.java @@ -667,9 +667,7 @@ public class Button extends AbstractField implements FieldEvents.BlurNotifier, @Override public void handleAction(Object sender, Object target) { - if (button.isEnabled() && !button.isReadOnly()) { - button.fireClick(); - } + button.click(); } } -- cgit v1.2.3 From 590f1dbb3b32f6ba58b5e8daf9602824b688d850 Mon Sep 17 00:00:00 2001 From: Automerge Date: Tue, 20 Mar 2012 18:06:40 +0000 Subject: [merge from 6.7] Change screenshot delay to improve test reliablilty #7855 svn changeset:23278/svn branch:6.8 --- tests/testbench/com/vaadin/tests/components/embedded/EmbeddedPdf.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/testbench/com/vaadin/tests/components/embedded/EmbeddedPdf.html b/tests/testbench/com/vaadin/tests/components/embedded/EmbeddedPdf.html index 371c6d300b..758a004445 100644 --- a/tests/testbench/com/vaadin/tests/components/embedded/EmbeddedPdf.html +++ b/tests/testbench/com/vaadin/tests/components/embedded/EmbeddedPdf.html @@ -16,10 +16,11 @@ /run/com.vaadin.tests.components.embedded.EmbeddedPdf?restartApplication + pause - 10000 + 4000 screenCapture -- cgit v1.2.3 From 483df08ee0517f14f958266e7a057313ed1300f1 Mon Sep 17 00:00:00 2001 From: Automerge Date: Thu, 22 Mar 2012 14:07:26 +0000 Subject: [merge from 6.7] Fixed #8524 - properly update currentDrag elementOver in all cases svn changeset:23285/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/ui/dd/VDragAndDropManager.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/com/vaadin/terminal/gwt/client/ui/dd/VDragAndDropManager.java b/src/com/vaadin/terminal/gwt/client/ui/dd/VDragAndDropManager.java index dbeff243a8..74ab1dcc47 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/dd/VDragAndDropManager.java +++ b/src/com/vaadin/terminal/gwt/client/ui/dd/VDragAndDropManager.java @@ -167,6 +167,8 @@ public class VDragAndDropManager { // ApplicationConnection.getConsole().log( // "DropHandler now" // + currentDropHandler.getPaintable()); + currentDrag + .setElementOver((com.google.gwt.user.client.Element) targetElement); target.dragEnter(currentDrag); } else if (target == null && currentDropHandler != null) { // ApplicationConnection.getConsole().log("Invalid state!?"); @@ -197,6 +199,8 @@ public class VDragAndDropManager { case Event.ONMOUSEMOVE: case Event.ONTOUCHMOVE: if (currentDropHandler != null) { + currentDrag + .setElementOver((com.google.gwt.user.client.Element) targetElement); currentDropHandler.dragOver(currentDrag); } nativeEvent.preventDefault(); -- cgit v1.2.3 From 3ef26bbd6253eabfcbf6e247b665c715b4491a13 Mon Sep 17 00:00:00 2001 From: Automerge Date: Thu, 22 Mar 2012 18:50:04 +0000 Subject: [merge from 6.7] Code cleanup (#8559/#8560) svn changeset:23288/svn branch:6.8 --- .../vaadin/terminal/gwt/client/ui/VMenuBar.java | 32 ++++++++++++++-------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/src/com/vaadin/terminal/gwt/client/ui/VMenuBar.java b/src/com/vaadin/terminal/gwt/client/ui/VMenuBar.java index a0d7300f11..4ac7fdce45 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VMenuBar.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VMenuBar.java @@ -958,7 +958,7 @@ public class VMenuBar extends SimpleFocusablePanel implements Paintable, } public void setSelected(boolean selected) { - if (selected && !isSeparator) { + if (selected && isSelectable()) { addStyleDependentName("selected"); // needed for IE6 to have a single style name to match for an // element @@ -1136,6 +1136,15 @@ public class VMenuBar extends SimpleFocusablePanel implements Paintable, return menubar; } + /** + * Checks if the item can be selected. + * + * @return true if it is possible to select this item, false otherwise + */ + public boolean isSelectable() { + return !isSeparator() && isEnabled(); + } + } /** @@ -1389,11 +1398,11 @@ public class VMenuBar extends SimpleFocusablePanel implements Paintable, if (getSelected() == null) { // If nothing is selected then select the last item setSelected(items.get(items.size() - 1)); - if (getSelected().isSeparator() || !getSelected().isEnabled()) { + if (!getSelected().isSelectable()) { handleNavigation(keycode, ctrl, shift); } } else if (visibleChildMenu == null && getParentMenu() == null) { - // If this is the root menu then move to the right + // If this is the root menu then move to the left int idx = items.indexOf(getSelected()); if (idx > 0) { setSelected(items.get(idx - 1)); @@ -1401,7 +1410,7 @@ public class VMenuBar extends SimpleFocusablePanel implements Paintable, setSelected(items.get(items.size() - 1)); } - if (getSelected().isSeparator() || !getSelected().isEnabled()) { + if (!getSelected().isSelectable()) { handleNavigation(keycode, ctrl, shift); } } else if (visibleChildMenu != null) { @@ -1409,8 +1418,7 @@ public class VMenuBar extends SimpleFocusablePanel implements Paintable, visibleChildMenu.handleNavigation(keycode, ctrl, shift); } else if (getParentMenu().getParentMenu() == null) { - - // Get the root menu + // Inside a sub menu, whose parent is a root menu item VMenuBar root = getParentMenu(); root.getSelected().getSubMenu().setSelected(null); @@ -1445,7 +1453,7 @@ public class VMenuBar extends SimpleFocusablePanel implements Paintable, if (getSelected() == null) { // If nothing is selected then select the first item setSelected(items.get(0)); - if (getSelected().isSeparator() || !getSelected().isEnabled()) { + if (!getSelected().isSelectable()) { handleNavigation(keycode, ctrl, shift); } } else if (visibleChildMenu == null && getParentMenu() == null) { @@ -1458,7 +1466,7 @@ public class VMenuBar extends SimpleFocusablePanel implements Paintable, setSelected(items.get(0)); } - if (getSelected().isSeparator() || !getSelected().isEnabled()) { + if (!getSelected().isSelectable()) { handleNavigation(keycode, ctrl, shift); } } else if (visibleChildMenu == null @@ -1508,7 +1516,7 @@ public class VMenuBar extends SimpleFocusablePanel implements Paintable, if (getSelected() == null) { // If nothing is selected then select the last item setSelected(items.get(items.size() - 1)); - if (getSelected().isSeparator() || !getSelected().isEnabled()) { + if (!getSelected().isSelectable()) { handleNavigation(keycode, ctrl, shift); } } else if (visibleChildMenu != null) { @@ -1523,7 +1531,7 @@ public class VMenuBar extends SimpleFocusablePanel implements Paintable, setSelected(items.get(items.size() - 1)); } - if (getSelected().isSeparator() || !getSelected().isEnabled()) { + if (!getSelected().isSelectable()) { handleNavigation(keycode, ctrl, shift); } } @@ -1535,7 +1543,7 @@ public class VMenuBar extends SimpleFocusablePanel implements Paintable, if (getSelected() == null) { // If nothing is selected then select the first item setSelected(items.get(0)); - if (getSelected().isSeparator() || !getSelected().isEnabled()) { + if (!getSelected().isSelectable()) { handleNavigation(keycode, ctrl, shift); } } else if (visibleChildMenu == null && getParentMenu() == null) { @@ -1556,7 +1564,7 @@ public class VMenuBar extends SimpleFocusablePanel implements Paintable, setSelected(items.get(0)); } - if (getSelected().isSeparator() || !getSelected().isEnabled()) { + if (!getSelected().isSelectable()) { handleNavigation(keycode, ctrl, shift); } } -- cgit v1.2.3 From 2296d93d648857c248162a1261a15e7a8c7ca378 Mon Sep 17 00:00:00 2001 From: Automerge Date: Thu, 22 Mar 2012 18:50:10 +0000 Subject: [merge from 6.7] Fixed NPE:s in keyboard navigation in MenuBar (#8559/#8560) svn changeset:23289/svn branch:6.8 --- .../vaadin/terminal/gwt/client/ui/VMenuBar.java | 66 ++++++---- .../components/menubar/MenuBarNavigation.java | 1 - .../menubar/MenuBarNavigationKeyboard.html | 140 ++++++++------------- 3 files changed, 93 insertions(+), 114 deletions(-) diff --git a/src/com/vaadin/terminal/gwt/client/ui/VMenuBar.java b/src/com/vaadin/terminal/gwt/client/ui/VMenuBar.java index 4ac7fdce45..f4bacc05b5 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VMenuBar.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VMenuBar.java @@ -1435,12 +1435,7 @@ public class VMenuBar extends SimpleFocusablePanel implements Paintable, } root.setSelected(selected); - root.showChildMenu(selected); - VMenuBar submenu = selected.getSubMenu(); - - // Select the first item in the newly open submenu - submenu.setSelected(submenu.getItems().get(0)); - + openMenuAndFocusFirstIfPossible(selected); } else { getParentMenu().getSelected().getSubMenu().setSelected(null); getParentMenu().hideChildren(); @@ -1498,12 +1493,7 @@ public class VMenuBar extends SimpleFocusablePanel implements Paintable, } root.setSelected(selected); - root.showChildMenu(selected); - VMenuBar submenu = selected.getSubMenu(); - - // Select the first item in the newly open submenu - submenu.setSelected(submenu.getItems().get(0)); - + openMenuAndFocusFirstIfPossible(selected); } else if (visibleChildMenu != null) { // Redirect all navigation to the submenu visibleChildMenu.handleNavigation(keycode, ctrl, shift); @@ -1542,16 +1532,11 @@ public class VMenuBar extends SimpleFocusablePanel implements Paintable, if (getSelected() == null) { // If nothing is selected then select the first item - setSelected(items.get(0)); - if (!getSelected().isSelectable()) { - handleNavigation(keycode, ctrl, shift); - } + selectFirstItem(); } else if (visibleChildMenu == null && getParentMenu() == null) { // If this is the root menu the show the child menu with arrow - // down - showChildMenu(getSelected()); - menuVisible = true; - visibleChildMenu.handleNavigation(keycode, ctrl, shift); + // down, if there is a child menu + openMenuAndFocusFirstIfPossible(getSelected()); } else if (visibleChildMenu != null) { // Redirect all navigation to the submenu visibleChildMenu.handleNavigation(keycode, ctrl, shift); @@ -1576,17 +1561,18 @@ public class VMenuBar extends SimpleFocusablePanel implements Paintable, menuVisible = false; } else if (keycode == getNavigationSelectKey()) { - if (visibleChildMenu != null) { + if (getSelected() == null) { + // If nothing is selected then select the first item + selectFirstItem(); + } else if (visibleChildMenu != null) { // Redirect all navigation to the submenu visibleChildMenu.handleNavigation(keycode, ctrl, shift); menuVisible = false; } else if (visibleChildMenu == null && getSelected().getSubMenu() != null) { - // If the item has a submenu then show it and move the selection - // there - showChildMenu(getSelected()); - menuVisible = true; - visibleChildMenu.handleNavigation(keycode, ctrl, shift); + // If the item has a sub menu then show it and move the + // selection there + openMenuAndFocusFirstIfPossible(getSelected()); } else { Command command = getSelected().getCommand(); if (command != null) { @@ -1601,6 +1587,34 @@ public class VMenuBar extends SimpleFocusablePanel implements Paintable, return false; } + private void selectFirstItem() { + for (int i = 0; i < items.size(); i++) { + CustomMenuItem item = items.get(i); + if (!item.isSelectable()) { + continue; + } + + setSelected(item); + break; + } + } + + private void openMenuAndFocusFirstIfPossible(CustomMenuItem menuItem) { + VMenuBar subMenu = menuItem.getSubMenu(); + if (subMenu == null) { + // No child menu? Nothing to do + return; + } + + VMenuBar parentMenu = menuItem.getParentMenu(); + parentMenu.showChildMenu(menuItem); + + menuVisible = true; + // Select the first item in the newly open submenu + subMenu.setSelected(subMenu.getItems().get(0)); + + } + /* * (non-Javadoc) * diff --git a/tests/testbench/com/vaadin/tests/components/menubar/MenuBarNavigation.java b/tests/testbench/com/vaadin/tests/components/menubar/MenuBarNavigation.java index 7e801a9faf..ede0c0c5a5 100644 --- a/tests/testbench/com/vaadin/tests/components/menubar/MenuBarNavigation.java +++ b/tests/testbench/com/vaadin/tests/components/menubar/MenuBarNavigation.java @@ -34,7 +34,6 @@ public class MenuBarNavigation extends TestBase implements Command { addComponent(mb); log = new Log(5); - log.setNumberLogRows(false); addComponent(log); } diff --git a/tests/testbench/com/vaadin/tests/components/menubar/MenuBarNavigationKeyboard.html b/tests/testbench/com/vaadin/tests/components/menubar/MenuBarNavigationKeyboard.html index 9791c95f80..6a7dccb6ed 100644 --- a/tests/testbench/com/vaadin/tests/components/menubar/MenuBarNavigationKeyboard.html +++ b/tests/testbench/com/vaadin/tests/components/menubar/MenuBarNavigationKeyboard.html @@ -16,85 +16,45 @@ /run/com.vaadin.tests.components.menubar.MenuBarNavigation?restartApplication - - waitForVaadin - - - mouseClick vaadin=runcomvaadintestscomponentsmenubarMenuBarNavigation::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VMenuBar[0]#menu0 3,10 - - waitForVaadin - - - pressSpecialKey vaadin=runcomvaadintestscomponentsmenubarMenuBarNavigation::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VMenuBar[0] down - - waitForVaadin - - - pressSpecialKey vaadin=runcomvaadintestscomponentsmenubarMenuBarNavigation::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VMenuBar[0] down - - waitForVaadin - - - pressSpecialKey vaadin=runcomvaadintestscomponentsmenubarMenuBarNavigation::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VMenuBar[0] down - - waitForVaadin - - - pressSpecialKey vaadin=runcomvaadintestscomponentsmenubarMenuBarNavigation::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VMenuBar[0] down - - waitForVaadin - - - pressSpecialKey vaadin=runcomvaadintestscomponentsmenubarMenuBarNavigation::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VMenuBar[0] right - - waitForVaadin - - - pressSpecialKey vaadin=runcomvaadintestscomponentsmenubarMenuBarNavigation::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VMenuBar[0] enter - - waitForVaadin - - - assertText vaadin=runcomvaadintestscomponentsmenubarMenuBarNavigation::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VLabel[0] - MenuItem File/Export../As PDF... selected + 1. MenuItem File/Export../As PDF... selected mouseClick @@ -102,9 +62,9 @@ 0,7 - waitForVaadin - - + pressSpecialKey + vaadin=runcomvaadintestscomponentsmenubarMenuBarNavigation::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VMenuBar[0] + right pressSpecialKey @@ -112,101 +72,107 @@ right - waitForVaadin - - + pressSpecialKey + vaadin=runcomvaadintestscomponentsmenubarMenuBarNavigation::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VMenuBar[0] + right pressSpecialKey vaadin=runcomvaadintestscomponentsmenubarMenuBarNavigation::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VMenuBar[0] - right + enter - waitForVaadin - - + assertText + vaadin=runcomvaadintestscomponentsmenubarMenuBarNavigation::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VLabel[0] + 2. MenuItem Help selected + + + mouseClick + vaadin=runcomvaadintestscomponentsmenubarMenuBarNavigation::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VMenuBar[0]#menu1 + 4,7 pressSpecialKey vaadin=runcomvaadintestscomponentsmenubarMenuBarNavigation::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VMenuBar[0] - right + left - waitForVaadin - - + pressSpecialKey + vaadin=runcomvaadintestscomponentsmenubarMenuBarNavigation::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VMenuBar[0] + down pressSpecialKey vaadin=runcomvaadintestscomponentsmenubarMenuBarNavigation::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VMenuBar[0] - enter + down - waitForVaadin - - + pressSpecialKey + vaadin=runcomvaadintestscomponentsmenubarMenuBarNavigation::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VMenuBar[0] + enter assertText vaadin=runcomvaadintestscomponentsmenubarMenuBarNavigation::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VLabel[0] - MenuItem Help selected + 3. MenuItem Edit/Cut selected mouseClick vaadin=runcomvaadintestscomponentsmenubarMenuBarNavigation::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VMenuBar[0]#menu1 4,7 - - waitForVaadin - - - pressSpecialKey - vaadin=runcomvaadintestscomponentsmenubarMenuBarNavigation::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VMenuBar[0] - left + vaadin=runcomvaadintestscomponentsmenubarMenuBarNavigation::/VVerticalLayout[0]/VVerticalLayout[0]/VMenuBar[0] + enter - waitForVaadin - - + assertText + vaadin=runcomvaadintestscomponentsmenubarMenuBarNavigation::/VVerticalLayout[0]/VVerticalLayout[0]/VVerticalLayout[0]/VLabel[0] + 3. MenuItem Edit/Cut selected pressSpecialKey - vaadin=runcomvaadintestscomponentsmenubarMenuBarNavigation::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VMenuBar[0] - down + vaadin=runcomvaadintestscomponentsmenubarMenuBarNavigation::/VVerticalLayout[0]/VVerticalLayout[0]/VMenuBar[0] + enter - waitForVaadin - - + assertText + vaadin=runcomvaadintestscomponentsmenubarMenuBarNavigation::/VVerticalLayout[0]/VVerticalLayout[0]/VVerticalLayout[0]/VLabel[0] + 4. MenuItem Edit/Copy selected + pressSpecialKey - vaadin=runcomvaadintestscomponentsmenubarMenuBarNavigation::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VMenuBar[0] - down + vaadin=runcomvaadintestscomponentsmenubarMenuBarNavigation::/VVerticalLayout[0]/VVerticalLayout[0]/VMenuBar[0] + enter - waitForVaadin - - + assertText + vaadin=runcomvaadintestscomponentsmenubarMenuBarNavigation::/VVerticalLayout[0]/VVerticalLayout[0]/VVerticalLayout[0]/VLabel[0] + 4. MenuItem Edit/Copy selected + pressSpecialKey - vaadin=runcomvaadintestscomponentsmenubarMenuBarNavigation::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VMenuBar[0] + vaadin=runcomvaadintestscomponentsmenubarMenuBarNavigation::/VVerticalLayout[0]/VVerticalLayout[0]/VMenuBar[0] enter - waitForVaadin - - + assertText + vaadin=runcomvaadintestscomponentsmenubarMenuBarNavigation::/VVerticalLayout[0]/VVerticalLayout[0]/VVerticalLayout[0]/VLabel[0] + 4. MenuItem Edit/Copy selected + + + pressSpecialKey + vaadin=runcomvaadintestscomponentsmenubarMenuBarNavigation::/VVerticalLayout[0]/VVerticalLayout[0]/VMenuBar[0] + enter assertText - vaadin=runcomvaadintestscomponentsmenubarMenuBarNavigation::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VLabel[0] - MenuItem Edit/Cut selected + vaadin=runcomvaadintestscomponentsmenubarMenuBarNavigation::/VVerticalLayout[0]/VVerticalLayout[0]/VVerticalLayout[0]/VLabel[0] + 5. MenuItem File/Open selected - -- cgit v1.2.3