modules/controls/src/main/java/javafx/scene/control/skin/MenuButtonSkin.java

Print this page
rev 9240 : 8076423: JEP 253: Prepare JavaFX UI Controls & CSS APIs for Modularization

@@ -21,60 +21,116 @@
  * 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;
+package javafx.scene.control.skin;
 
-import javafx.event.Event;
-import javafx.event.EventHandler;
+import com.sun.javafx.scene.control.ContextMenuContent;
+import javafx.scene.Node;
+import javafx.scene.control.Control;
 import javafx.scene.control.MenuButton;
 
 import com.sun.javafx.scene.control.behavior.MenuButtonBehavior;
 
 /**
- * Skin for MenuButton Control.
+ * Default skin implementation for the {@link MenuButton} control.
+ *
+ * @see MenuButton
+ * @since 9
  */
-public class MenuButtonSkin extends MenuButtonSkinBase<MenuButton, MenuButtonBehavior> {
+public class MenuButtonSkin extends MenuButtonSkinBase<MenuButton> {
+
+    /***************************************************************************
+     *                                                                         *
+     * Static fields                                                           *
+     *                                                                         *
+     **************************************************************************/
 
     static final String AUTOHIDE = "autoHide";
+
+
+
+    /***************************************************************************
+     *                                                                         *
+     * Private fields                                                          *
+     *                                                                         *
+     **************************************************************************/
+
+    private final MenuButtonBehavior behavior;
+
+
+
     /***************************************************************************
      *                                                                         *
      * Constructors                                                            *
      *                                                                         *
      **************************************************************************/
 
     /**
-     * Creates a new MenuButtonSkin for the given MenuButton
+     * Creates a new MenuButtonSkin instance, installing the necessary child
+     * nodes into the Control {@link Control#getChildren() children} list, as
+     * well as the necessary input mappings for handling key, mouse, etc events.
      * 
-     * @param menuButton the MenuButton
+     * @param control The control that this skin should be installed onto.
      */
-    public MenuButtonSkin(final MenuButton menuButton) {
-        super(menuButton, new MenuButtonBehavior(menuButton));
+    public MenuButtonSkin(final MenuButton control) {
+        super(control);
+
+        // install default input map for the MenuButton-like controls
+        this.behavior = new MenuButtonBehavior(control);
+//        control.setInputMap(behavior.getInputMap());
+
         // MenuButton's showing does not get updated when autoHide happens,
         // as that hide happens under the covers. So we add to the menuButton's
         // properties map to which the MenuButton can react and update accordingly..
-        popup.setOnAutoHide(new EventHandler<Event>() {
-            @Override public void handle(Event t) {
-                MenuButton menuButton = (MenuButton)getSkinnable();
+        popup.setOnAutoHide(e -> {
+            MenuButton menuButton = getSkinnable();
                 // work around for the fact autohide happens twice
                 // remove this check when that is fixed.
                 if (!menuButton.getProperties().containsKey(AUTOHIDE)) {
                     menuButton.getProperties().put(AUTOHIDE, Boolean.TRUE);
                 }
-                }
         });
+
         // request focus on content when the popup is shown
         popup.setOnShown(event -> {
             ContextMenuContent cmContent = (ContextMenuContent)popup.getSkin().getNode();
             if (cmContent != null) cmContent.requestFocus();
         });
 
-        if (menuButton.getOnAction() == null) {
-            menuButton.setOnAction(e -> {
-                menuButton.show();
-            });
+        if (control.getOnAction() == null) {
+            control.setOnAction(e -> control.show());
+        }
+
+        label.setLabelFor(control);
         }
 
-        label.setLabelFor(menuButton);
+
+
+    /***************************************************************************
+     *                                                                         *
+     * Public API                                                              *
+     *                                                                         *
+     **************************************************************************/
+
+    /** {@inheritDoc} */
+    @Override public void dispose() {
+        super.dispose();
+
+        if (behavior != null) {
+            behavior.dispose();
+        }
+    }
+
+
+
+    /***************************************************************************
+     *                                                                         *
+     * Private implementation                                                  *
+     *                                                                         *
+     **************************************************************************/
+
+    @Override MenuButtonBehavior getBehavior() {
+        return behavior;
     }
 }