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

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

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.  Oracle designates this

@@ -21,97 +21,150 @@
  * 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 com.sun.javafx.scene.control.behavior.BehaviorBase;
+import com.sun.javafx.scene.control.skin.Utils;
+import javafx.scene.Node;
 import javafx.scene.Scene;
 import javafx.scene.control.Button;
 import javafx.scene.control.ContextMenu;
+import com.sun.javafx.scene.control.behavior.ButtonBehavior;
+import javafx.scene.control.Control;
 import javafx.scene.input.KeyCode;
 import javafx.scene.input.KeyCodeCombination;
 
-import com.sun.javafx.scene.control.behavior.ButtonBehavior;
+/**
+ * Default skin implementation for the {@link Button} control.
+ *
+ * @see Button
+ * @since 9
+ */
+public class ButtonSkin extends LabeledSkinBase<Button> {
 
+    /***************************************************************************
+     *                                                                         *
+     * Private fields                                                          *
+     *                                                                         *
+     **************************************************************************/
 
+    private KeyCodeCombination defaultAcceleratorKeyCodeCombination;
+    private KeyCodeCombination cancelAcceleratorKeyCodeCombination;
+    private final BehaviorBase<Button> behavior;
 
-/**
- * A Skin for command Buttons.
- */
-public class ButtonSkin extends LabeledSkinBase<Button, ButtonBehavior<Button>> {
 
-    public ButtonSkin(Button button) {
-        super(button, new ButtonBehavior<Button>(button));
 
-        // Register listeners
-        registerChangeListener(button.defaultButtonProperty(), "DEFAULT_BUTTON");
-        registerChangeListener(button.cancelButtonProperty(), "CANCEL_BUTTON");
-        registerChangeListener(button.focusedProperty(), "FOCUSED");
+    /***************************************************************************
+     *                                                                         *
+     * Listeners                                                               *
+     *                                                                         *
+     **************************************************************************/
 
-        if (getSkinnable().isDefaultButton()) {
-            /*
-            ** were we already the defaultButton, before the listener was added?
-            ** don't laugh, it can happen....
-            */
-            setDefaultButton(true);
+    Runnable defaultButtonRunnable = () -> {
+        if (getSkinnable().getScene() != null && getSkinnable().impl_isTreeVisible() && !getSkinnable().isDisabled()) {
+            getSkinnable().fire();
         }
+    };
 
-        if (getSkinnable().isCancelButton()) {
-            /*
-            ** were we already the defaultButton, before the listener was added?
-            ** don't laugh, it can happen....
-            */
-            setCancelButton(true);
+    Runnable cancelButtonRunnable = () -> {
+        if (getSkinnable().getScene() != null && getSkinnable().impl_isTreeVisible() && !getSkinnable().isDisabled()) {
+            getSkinnable().fire();
         }       
+    };
 
-    }
 
 
-    @Override protected void handleControlPropertyChanged(String p) {     
-        super.handleControlPropertyChanged(p);
-        if ("DEFAULT_BUTTON".equals(p)) {
-            setDefaultButton(getSkinnable().isDefaultButton());
-        }
-        else if ("CANCEL_BUTTON".equals(p)) {
-            setCancelButton(getSkinnable().isCancelButton());
-        }
-        else if ("FOCUSED".equals(p)) {
+    /***************************************************************************
+     *                                                                         *
+     * Constructors                                                            *
+     *                                                                         *
+     **************************************************************************/
+
+    /**
+     * Creates a new ButtonSkin 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 control The control that this skin should be installed onto.
+     */
+    public ButtonSkin(Button control) {
+        super(control);
+
+        // install default input map for the Button control
+        behavior = new ButtonBehavior<>(control);
+//        control.setInputMap(behavior.getInputMap());
+
+        // Register listeners
+        registerChangeListener(control.defaultButtonProperty(), o -> setDefaultButton(getSkinnable().isDefaultButton()));
+        registerChangeListener(control.cancelButtonProperty(), o -> setCancelButton(getSkinnable().isCancelButton()));
+        registerChangeListener(control.focusedProperty(), o -> {
            if (!getSkinnable().isFocused()) {
                 ContextMenu cm = getSkinnable().getContextMenu();
                 if (cm != null) {
                     if (cm.isShowing()) {
                         cm.hide();
                         Utils.removeMnemonics(cm, getSkinnable().getScene());
                     }
                 }
            }
-        } else if ("PARENT".equals(p)) {
+        });
+        registerChangeListener(control.parentProperty(), o -> {
             if (getSkinnable().getParent() == null && getSkinnable().getScene() != null) {  
                 if (getSkinnable().isDefaultButton()) {
                     getSkinnable().getScene().getAccelerators().remove(defaultAcceleratorKeyCodeCombination);
                 }
                 if (getSkinnable().isCancelButton()) {
                     getSkinnable().getScene().getAccelerators().remove(cancelAcceleratorKeyCodeCombination);
                 }
             }
-        }
+        });
+
+        // set visuals
+        if (getSkinnable().isDefaultButton()) {
+            /*
+            ** were we already the defaultButton, before the listener was added?
+            ** don't laugh, it can happen....
+            */
+            setDefaultButton(true);
     }
 
-    Runnable defaultButtonRunnable = () -> {
-        if (getSkinnable().getScene() != null && getSkinnable().impl_isTreeVisible() && !getSkinnable().isDisabled()) {
-            getSkinnable().fire();
+        if (getSkinnable().isCancelButton()) {
+            /*
+            ** were we already the defaultButton, before the listener was added?
+            ** don't laugh, it can happen....
+            */
+            setCancelButton(true);
+        }       
         }
-    };
 
-    Runnable cancelButtonRunnable = () -> {
-        if (getSkinnable().getScene() != null && getSkinnable().impl_isTreeVisible() && !getSkinnable().isDisabled()) {
-            getSkinnable().fire();
+
+
+    /***************************************************************************
+     *                                                                         *
+     * Public API                                                              *
+     *                                                                         *
+     **************************************************************************/
+
+    /** {@inheritDoc} */
+    @Override public void dispose() {
+        super.dispose();
+
+        if (behavior != null) {
+            behavior.dispose();
+        }
         }
-    };
 
-    private KeyCodeCombination defaultAcceleratorKeyCodeCombination;
+
+
+    /***************************************************************************
+     *                                                                         *
+     * Private implementation                                                  *
+     *                                                                         *
+     **************************************************************************/
     
     private void setDefaultButton(boolean value) {
         Scene scene = getSkinnable().getScene();
         if (scene != null) {
             KeyCode acceleratorCode = KeyCode.ENTER;

@@ -136,12 +189,10 @@
                 }
             }
         }
     }
 
-    private KeyCodeCombination cancelAcceleratorKeyCodeCombination;
-
     private void setCancelButton(boolean value) {
         Scene scene = getSkinnable().getScene();
         if (scene != null) {
             KeyCode acceleratorCode = KeyCode.ESCAPE;
             cancelAcceleratorKeyCodeCombination = new KeyCodeCombination(acceleratorCode);