--- old/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/ContextMenuContent.java 2014-01-28 15:49:59.699628773 +0100 +++ new/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/ContextMenuContent.java 2014-01-28 15:49:59.551628768 +0100 @@ -1465,7 +1465,6 @@ public MenuLabel(MenuItem item, MenuItemContainer mic) { super(item.getText()); setMnemonicParsing(item.isMnemonicParsing()); - setFocusTraversable(true); setLabelFor(mic); menuitem = item; --- old/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/DatePickerContent.java 2014-01-28 15:50:00.083628785 +0100 +++ new/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/DatePickerContent.java 2014-01-28 15:49:59.931628780 +0100 @@ -204,8 +204,7 @@ refresh(); - // RT-30511: This enables traversal (not sure why Scene doesn't handle this), - // plus it prevents key events from reaching the popup's owner. + // RT-30511: This prevents key events from reaching the popup's owner. addEventHandler(KeyEvent.ANY, new EventHandler() { @Override public void handle(KeyEvent e) { Node node = getScene().getFocusOwner(); @@ -215,35 +214,6 @@ if (e.getEventType() == KeyEvent.KEY_PRESSED) { switch (e.getCode()) { - case TAB: - node.impl_traverse(e.isShiftDown() ? Direction.PREVIOUS : Direction.NEXT); - e.consume(); - break; - - case UP: - if (!e.isAltDown()) { - node.impl_traverse(Direction.UP); - e.consume(); - } - break; - - case DOWN: - if (!e.isAltDown()) { - node.impl_traverse(Direction.DOWN); - e.consume(); - } - break; - - case LEFT: - node.impl_traverse(Direction.LEFT); - e.consume(); - break; - - case RIGHT: - node.impl_traverse(Direction.RIGHT); - e.consume(); - break; - case HOME: goToDate(LocalDate.now()); e.consume(); @@ -284,14 +254,17 @@ } // Consume all key events except those that control - // showing the popup. + // showing the popup and traversal. switch (e.getCode()) { case ESCAPE: case F4: case F10: case UP: case DOWN: - break; + case LEFT: + case RIGHT: + case TAB: + break; default: e.consume(); --- old/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/MenuBarSkin.java 2014-01-28 15:50:00.447628797 +0100 +++ new/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/MenuBarSkin.java 2014-01-28 15:50:00.299628792 +0100 @@ -373,9 +373,9 @@ } getSkinnable().getScene().getAccelerators().put(acceleratorKeyCombo, firstMenuRunnable); engine = new TraversalEngine(getSkinnable(), false) { - @Override public void trav(Node node, Direction dir) { + @Override public boolean trav(Node node, Direction dir) { direction = dir; - super.trav(node,dir); + return super.trav(node,dir); } }; engine.addTraverseListener(this); --- old/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/TabPaneSkin.java 2014-01-28 15:50:00.823628809 +0100 +++ new/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/TabPaneSkin.java 2014-01-28 15:50:00.671628804 +0100 @@ -1434,9 +1434,9 @@ }); engine = new TraversalEngine(this, false) { - @Override public void trav(Node owner, Direction dir) { + @Override public boolean trav(Node owner, Direction dir) { direction = dir; - super.trav(owner, dir); + return super.trav(owner, dir); } }; engine.addTraverseListener(this); --- old/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/TitledPaneSkin.java 2014-01-28 15:50:01.211628821 +0100 +++ new/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/TitledPaneSkin.java 2014-01-28 15:50:01.063628817 +0100 @@ -31,11 +31,9 @@ import javafx.animation.KeyValue; import javafx.animation.Timeline; import javafx.beans.property.DoubleProperty; -import javafx.beans.property.DoublePropertyBase; import javafx.beans.property.SimpleDoubleProperty; import javafx.event.ActionEvent; import javafx.event.EventHandler; -import javafx.geometry.Bounds; import javafx.geometry.HPos; import javafx.geometry.Pos; import javafx.geometry.VPos; @@ -44,7 +42,6 @@ import javafx.scene.control.ContentDisplay; import javafx.scene.control.TitledPane; import javafx.scene.input.MouseEvent; -import javafx.scene.layout.Region; import javafx.scene.layout.StackPane; import javafx.scene.shape.Rectangle; import javafx.util.Duration; @@ -52,7 +49,6 @@ import com.sun.javafx.scene.control.behavior.TitledPaneBehavior; import com.sun.javafx.scene.traversal.Direction; import com.sun.javafx.scene.traversal.TraversalEngine; -import com.sun.javafx.scene.traversal.TraverseListener; import javafx.beans.binding.DoubleBinding; import javafx.geometry.Insets; import javafx.scene.control.Accordion; @@ -542,9 +538,9 @@ setContent(n); engine = new TraversalEngine(this, false) { - @Override public void trav(Node owner, Direction dir) { + @Override public boolean trav(Node owner, Direction dir) { direction = dir; - super.trav(owner, dir); + return super.trav(owner, dir); } }; setImpl_traversalEngine(engine); --- old/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/ToolBarSkin.java 2014-01-28 15:50:01.571628833 +0100 +++ new/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/ToolBarSkin.java 2014-01-28 15:50:01.427628828 +0100 @@ -93,17 +93,18 @@ registerChangeListener(toolbar.orientationProperty(), "ORIENTATION"); engine = new TraversalEngine(getSkinnable(), false) { - @Override public void trav(Node owner, Direction dir) { + @Override public boolean trav(Node owner, Direction dir) { // This allows the right arrow to select the overflow menu // without it only the tab key can select the overflow menu. if (overflow) { engine.reg(overflowMenu); } direction = dir; - super.trav(owner, dir); + boolean result = super.trav(owner, dir); if (overflow) { engine.unreg(overflowMenu); } + return result; } }; engine.addTraverseListener(this); --- old/modules/graphics/src/main/java/com/sun/javafx/scene/KeyboardShortcutsHandler.java 2014-01-28 15:50:01.939628845 +0100 +++ new/modules/graphics/src/main/java/com/sun/javafx/scene/KeyboardShortcutsHandler.java 2014-01-28 15:50:01.787628840 +0100 @@ -98,8 +98,10 @@ return accelerators; } - public void traverse(Node node, Direction dir) { - node.impl_traverse(dir); + private void traverse(Event event, Node node, Direction dir) { + if (node.impl_traverse(dir)) { + event.consume(); + } } public void processTraversal(Event event) { @@ -111,28 +113,23 @@ switch (((KeyEvent)event).getCode()) { case TAB : if (((KeyEvent)event).isShiftDown()) { - traverse(((Node)obj), com.sun.javafx.scene.traversal.Direction.PREVIOUS); + traverse(event, ((Node)obj), com.sun.javafx.scene.traversal.Direction.PREVIOUS); } else { - traverse(((Node)obj), com.sun.javafx.scene.traversal.Direction.NEXT); + traverse(event, ((Node)obj), com.sun.javafx.scene.traversal.Direction.NEXT); } - event.consume(); break; case UP : - traverse(((Node)obj), com.sun.javafx.scene.traversal.Direction.UP); - event.consume(); + traverse(event, ((Node)obj), com.sun.javafx.scene.traversal.Direction.UP); break; case DOWN : - traverse(((Node)obj), com.sun.javafx.scene.traversal.Direction.DOWN); - event.consume(); + traverse(event, ((Node)obj), com.sun.javafx.scene.traversal.Direction.DOWN); break; case LEFT : - traverse(((Node)obj), com.sun.javafx.scene.traversal.Direction.LEFT); - event.consume(); + traverse(event, ((Node)obj), com.sun.javafx.scene.traversal.Direction.LEFT); break; case RIGHT : - traverse(((Node)obj), com.sun.javafx.scene.traversal.Direction.RIGHT); - event.consume(); + traverse(event, ((Node)obj), com.sun.javafx.scene.traversal.Direction.RIGHT); break; default : break; --- old/modules/graphics/src/main/java/com/sun/javafx/scene/traversal/TraversalEngine.java 2014-01-28 15:50:02.307628856 +0100 +++ new/modules/graphics/src/main/java/com/sun/javafx/scene/traversal/TraversalEngine.java 2014-01-28 15:50:02.159628852 +0100 @@ -106,13 +106,13 @@ registeredNodes.remove(n); } - public void trav(Node owner, Direction dir) { - + public boolean trav(Node owner, Direction dir) { Node newNode = algorithm.traverse(owner, dir, this); if (newNode == null) { if (focusLogger.isLoggable(Level.FINE)) { focusLogger.fine("new node is null, focus not moved"); } + return false; } else { if (focusLogger.isLoggable(Level.FINER)) { focusLogger.finer("new focus owner : "+newNode); @@ -121,6 +121,7 @@ for (TraverseListener listener : listeners) { listener.onTraverse(newNode, getBounds(newNode)); } + return true; } } --- old/modules/graphics/src/main/java/javafx/scene/Node.java 2014-01-28 15:50:02.667628868 +0100 +++ new/modules/graphics/src/main/java/javafx/scene/Node.java 2014-01-28 15:50:02.515628863 +0100 @@ -7658,11 +7658,11 @@ * @deprecated This is an internal API that is not intended for use and will be removed in the next version */ @Deprecated - public final void impl_traverse(Direction dir) { + public final boolean impl_traverse(Direction dir) { if (getScene() == null) { - return; + return false; } - getScene().traverse(this, dir); + return getScene().traverse(this, dir); } //////////////////////////// --- old/modules/graphics/src/main/java/javafx/scene/Scene.java 2014-01-28 15:50:03.115628882 +0100 +++ new/modules/graphics/src/main/java/javafx/scene/Scene.java 2014-01-28 15:50:02.963628877 +0100 @@ -1987,7 +1987,7 @@ /** * Traverses focus from the given node in the given direction. */ - void traverse(Node node, Direction dir) { + boolean traverse(Node node, Direction dir) { /* ** if the registry is null then there are no ** registered traversable nodes in this scene @@ -1997,8 +1997,9 @@ if (te == null) { te = lookupTraversalEngine(node); } - te.trav(node, dir); + return te.trav(node, dir); } + return false; } /** --- old/modules/graphics/src/main/java/javafx/stage/PopupWindow.java 2014-01-28 15:50:03.535628896 +0100 +++ new/modules/graphics/src/main/java/javafx/stage/PopupWindow.java 2014-01-28 15:50:03.391628891 +0100 @@ -983,7 +983,7 @@ final Node sceneFocusOwner = scene.getFocusOwner(); final EventTarget eventTarget = (sceneFocusOwner != null) ? sceneFocusOwner : scene; - if (EventUtil.fireEvent(eventTarget, new DirectEvent(event)) + if (EventUtil.fireEvent(eventTarget, new DirectEvent(event.copyFor(popupWindow, eventTarget))) == null) { event.consume(); return;