modules/controls/src/main/java/com/sun/javafx/scene/control/behavior/DateCellBehavior.java

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

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 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

@@ -23,19 +23,20 @@
  * questions.
  */
 
 package com.sun.javafx.scene.control.behavior;
 
+import com.sun.javafx.scene.traversal.Direction;
 import javafx.geometry.NodeOrientation;
 import javafx.scene.Node;
 import javafx.scene.control.DateCell;
-import java.util.ArrayList;
-import java.util.List;
-import com.sun.javafx.scene.control.skin.DatePickerContent;
-import com.sun.javafx.scene.traversal.Direction;
-import static java.time.temporal.ChronoUnit.DAYS;
-import static java.time.temporal.ChronoUnit.WEEKS;
+
+import com.sun.javafx.scene.control.DatePickerContent;
+import com.sun.javafx.scene.control.inputmap.InputMap;
+
+import java.time.temporal.ChronoUnit;
+
 import static javafx.scene.input.KeyCode.DOWN;
 import static javafx.scene.input.KeyCode.ENTER;
 import static javafx.scene.input.KeyCode.LEFT;
 import static javafx.scene.input.KeyCode.RIGHT;
 import static javafx.scene.input.KeyCode.SPACE;

@@ -47,65 +48,47 @@
  * that subclasses implement so that CellSkinBase has API to call.
  *
  */
 public class DateCellBehavior extends BehaviorBase<DateCell> {
 
-    /**************************************************************************
-     *                          Setup KeyBindings                             *
-     *************************************************************************/
-    protected static final List<KeyBinding> DATE_CELL_BINDINGS = new ArrayList<KeyBinding>();
-    static {
-        DATE_CELL_BINDINGS.add(new KeyBinding(UP, "TraverseUp"));
-        DATE_CELL_BINDINGS.add(new KeyBinding(DOWN, "TraverseDown"));
-        DATE_CELL_BINDINGS.add(new KeyBinding(LEFT, "TraverseLeft"));
-        DATE_CELL_BINDINGS.add(new KeyBinding(RIGHT, "TraverseRight"));
-        DATE_CELL_BINDINGS.add(new KeyBinding(ENTER, KEY_RELEASED, "SelectDate"));
-        DATE_CELL_BINDINGS.add(new KeyBinding(SPACE, KEY_RELEASED, "SelectDate"));
-    }
-
+    private final InputMap<DateCell> inputMap;
 
     public DateCellBehavior(DateCell dateCell) {
-        super(dateCell, DATE_CELL_BINDINGS);
-    }
-
-    @Override public void callAction(String name) {
-        DateCell cell = getControl();
-        DatePickerContent dpc = findDatePickerContent(cell);
+        super(dateCell);
 
-        if (dpc != null) {
-            switch (name) {
-              case "SelectDate":    dpc.selectDayCell(cell); break;
-              default: super.callAction(name);
-            }
-            return;
+        inputMap = createInputMap();
+        addDefaultMapping(inputMap,
+            new InputMap.KeyMapping(UP,    e -> traverse(dateCell, Direction.UP)),
+            new InputMap.KeyMapping(DOWN,  e -> traverse(dateCell, Direction.DOWN)),
+            new InputMap.KeyMapping(LEFT,  e -> traverse(dateCell, Direction.LEFT)),
+            new InputMap.KeyMapping(RIGHT, e -> traverse(dateCell, Direction.RIGHT)),
+            new InputMap.KeyMapping(ENTER, KEY_RELEASED, e -> selectDate()),
+            new InputMap.KeyMapping(SPACE, KEY_RELEASED, e -> selectDate())
+        );
         }
-        super.callAction(name);
+
+    @Override public InputMap<DateCell> getInputMap() {
+        return inputMap;
     }
 
-    @Override public void traverse(final Node node, final Direction dir) {
-        boolean rtl = (node.getEffectiveNodeOrientation() == NodeOrientation.RIGHT_TO_LEFT);
+    private void selectDate() {
+        DateCell cell = getNode();
+        DatePickerContent dpc = findDatePickerContent(cell);
+        dpc.selectDayCell(cell);
+    }
 
-        switch (dir) {
-          case UP:
-          case DOWN:
-          case LEFT:
-          case RIGHT:
-              if (node instanceof DateCell) {
-                  DatePickerContent dpc = findDatePickerContent(node);
+    public void traverse(final DateCell cell, final Direction dir) {
+        boolean rtl = (cell.getEffectiveNodeOrientation() == NodeOrientation.RIGHT_TO_LEFT);
+        DatePickerContent dpc = findDatePickerContent(cell);
                   if (dpc != null) {
-                      DateCell cell = (DateCell)node;
                       switch (dir) {
-                        case UP:    dpc.goToDayCell(cell, -1, WEEKS, true); break;
-                        case DOWN:  dpc.goToDayCell(cell, +1, WEEKS, true); break;
-                        case LEFT:  dpc.goToDayCell(cell, rtl ? +1 : -1, DAYS,  true); break;
-                        case RIGHT: dpc.goToDayCell(cell, rtl ? -1 : +1, DAYS,  true); break;
-                      }
-                      return;
-                  }
+                case UP:    dpc.goToDayCell(cell, -1, ChronoUnit.WEEKS, true); break;
+                case DOWN:  dpc.goToDayCell(cell, +1, ChronoUnit.WEEKS, true); break;
+                case LEFT:  dpc.goToDayCell(cell, rtl ? +1 : -1, ChronoUnit.DAYS,  true); break;
+                case RIGHT: dpc.goToDayCell(cell, rtl ? -1 : +1, ChronoUnit.DAYS,  true); break;
               }
         }
-        super.traverse(node, dir);
     }
 
     protected DatePickerContent findDatePickerContent(Node node) {
         Node parent = node;
         while ((parent = parent.getParent()) != null && !(parent instanceof DatePickerContent));