modules/controls/src/main/java/javafx/scene/control/skin/ContextMenuSkin.java
Print this page
rev 9240 : 8076423: JEP 253: Prepare JavaFX UI Controls & CSS APIs for Modularization
*** 21,63 ****
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
! package com.sun.javafx.scene.control.skin;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.scene.AccessibleAttribute;
import javafx.scene.Node;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.Menu;
import javafx.scene.control.Skin;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.Region;
import javafx.stage.WindowEvent;
import com.sun.javafx.scene.control.behavior.TwoLevelFocusPopupBehavior;
/**
! * Default Skin implementation for PopupMenu. Several controls use PopupMenu in
! * order to display items in a drop down. It deals mostly with show hide logic for
! * Popup based controls, and specifically in this case for PopupMenu. This is
! * explained in the superclass {@link PopupControlSkin}.
! * <p>
! * Region/css based skin implementation for PopupMenu is the {@link PopupMenuContent}
! * class.
*/
public class ContextMenuSkin implements Skin<ContextMenu> {
/* need to hold a reference to popupMenu here because getSkinnable() deliberately
* returns null in PopupControlSkin. */
private ContextMenu popupMenu;
private final Region root;
private TwoLevelFocusPopupBehavior tlFocus;
// Fix for RT-18247
private final EventHandler<KeyEvent> keyListener = new EventHandler<KeyEvent>() {
@Override public void handle(KeyEvent event) {
if (event.getEventType() != KeyEvent.KEY_PRESSED) return;
--- 21,82 ----
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
! package javafx.scene.control.skin;
+ import com.sun.javafx.scene.control.ContextMenuContent;
+ import com.sun.javafx.scene.control.EmbeddedTextContextMenuContent;
+ import com.sun.javafx.scene.control.Properties;
+ import com.sun.javafx.scene.control.skin.Utils;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.scene.AccessibleAttribute;
import javafx.scene.Node;
import javafx.scene.control.ContextMenu;
+ import javafx.scene.control.Control;
import javafx.scene.control.Menu;
import javafx.scene.control.Skin;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.Region;
import javafx.stage.WindowEvent;
import com.sun.javafx.scene.control.behavior.TwoLevelFocusPopupBehavior;
/**
! * Default Skin implementation for ContextMenu. Several controls use ContextMenu in
! * order to display items in a drop down. This class mostly deals mostly with
! * show / hide logic - the actual content of the context menu is contained within
! * the {@link #getNode() root node}.
! *
! * @since 9
! * @see ContextMenu
*/
public class ContextMenuSkin implements Skin<ContextMenu> {
+ /***************************************************************************
+ * *
+ * Private fields *
+ * *
+ **************************************************************************/
+
/* need to hold a reference to popupMenu here because getSkinnable() deliberately
* returns null in PopupControlSkin. */
private ContextMenu popupMenu;
private final Region root;
private TwoLevelFocusPopupBehavior tlFocus;
+
+
+ /***************************************************************************
+ * *
+ * Listeners *
+ * *
+ **************************************************************************/
+
// Fix for RT-18247
private final EventHandler<KeyEvent> keyListener = new EventHandler<KeyEvent>() {
@Override public void handle(KeyEvent event) {
if (event.getEventType() != KeyEvent.KEY_PRESSED) return;
*** 71,83 ****
default: return;
}
}
};
! /***/
! public ContextMenuSkin(final ContextMenu popupMenu) {
! this.popupMenu = popupMenu;
// When a contextMenu is shown, requestFocus on its content to enable
// keyboard navigation.
popupMenu.addEventHandler(Menu.ON_SHOWN, new EventHandler<Event>() {
@Override public void handle(Event event) {
--- 90,114 ----
default: return;
}
}
};
!
!
! /***************************************************************************
! * *
! * Constructors *
! * *
! **************************************************************************/
!
! /**
! * Creates a new ContextMenuSkin instance.
! *
! * @param control The control that this skin should be installed onto.
! */
! public ContextMenuSkin(final ContextMenu control) {
! this.popupMenu = control;
// When a contextMenu is shown, requestFocus on its content to enable
// keyboard navigation.
popupMenu.addEventHandler(Menu.ON_SHOWN, new EventHandler<Event>() {
@Override public void handle(Event event) {
*** 113,123 ****
accMenu.notifyAccessibleAttributeChanged(AccessibleAttribute.VISIBLE);
}
}
});
! if (BehaviorSkinBase.IS_TOUCH_SUPPORTED &&
popupMenu.getStyleClass().contains("text-input-context-menu")) {
root = new EmbeddedTextContextMenuContent(popupMenu);
} else {
root = new ContextMenuContent(popupMenu);
}
--- 144,154 ----
accMenu.notifyAccessibleAttributeChanged(AccessibleAttribute.VISIBLE);
}
}
});
! if (Properties.IS_TOUCH_SUPPORTED &&
popupMenu.getStyleClass().contains("text-input-context-menu")) {
root = new EmbeddedTextContextMenuContent(popupMenu);
} else {
root = new ContextMenuContent(popupMenu);
}
*** 129,146 ****
--- 160,188 ----
if (Utils.isTwoLevelFocus()) {
tlFocus = new TwoLevelFocusPopupBehavior(popupMenu); // needs to be last.
}
}
+
+
+ /***************************************************************************
+ * *
+ * Public API *
+ * *
+ **************************************************************************/
+
+ /** {@inheritDoc} */
@Override public ContextMenu getSkinnable() {
return popupMenu;
}
+ /** {@inheritDoc} */
@Override public Node getNode() {
return root;
}
+ /** {@inheritDoc} */
@Override public void dispose() {
root.idProperty().unbind();
root.styleProperty().unbind();
if (tlFocus != null) tlFocus.dispose();
}