modules/controls/src/main/java/com/sun/javafx/scene/control/inputmap/KeyBinding.java

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

*** 1,7 **** /* ! * 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 --- 1,7 ---- /* ! * Copyright (c) 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
*** 20,42 **** * * 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.behavior; import com.sun.javafx.util.Utils; - import static com.sun.javafx.scene.control.behavior.OptionalBoolean.ANY; - import static com.sun.javafx.scene.control.behavior.OptionalBoolean.FALSE; - import static com.sun.javafx.scene.control.behavior.OptionalBoolean.TRUE; import com.sun.javafx.tk.Toolkit; import javafx.event.EventType; - import javafx.scene.control.Control; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; /** * KeyBindings are used to describe which action should occur based on some * KeyEvent state and Control state. These bindings are used to populate the * keyBindings variable on BehaviorBase. The KeyBinding can be subclassed to * add additional matching criteria. A match in a subclass should always have --- 20,41 ---- * * 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.inputmap; import com.sun.javafx.util.Utils; import com.sun.javafx.tk.Toolkit; import javafx.event.EventType; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; + import java.util.Objects; + + import static com.sun.javafx.scene.control.inputmap.KeyBinding.OptionalBoolean.*; + /** * KeyBindings are used to describe which action should occur based on some * KeyEvent state and Control state. These bindings are used to populate the * keyBindings variable on BehaviorBase. The KeyBinding can be subclassed to * add additional matching criteria. A match in a subclass should always have
*** 45,112 **** * * Note that this API is, at present, quite odd in that you use a constructor * and then use shift(), ctrl(), alt(), or meta() separately. It gave me an * object-literal like approach but isn't ideal. We will want some builder * approach here (similar as in other places). */ public class KeyBinding { ! private KeyCode code; ! private EventType<KeyEvent> eventType = KeyEvent.KEY_PRESSED; ! private String action; private OptionalBoolean shift = FALSE; private OptionalBoolean ctrl = FALSE; private OptionalBoolean alt = FALSE; private OptionalBoolean meta = FALSE; ! public KeyBinding(KeyCode code, String action) { ! this.code = code; ! this.action = action; } ! public KeyBinding(KeyCode code, EventType<KeyEvent> type, String action) { this.code = code; ! this.eventType = type; ! this.action = action; } ! public KeyBinding shift() { return shift(TRUE); } ! public KeyBinding shift(OptionalBoolean value) { shift = value; return this; } ! public KeyBinding ctrl() { return ctrl(TRUE); } ! public KeyBinding ctrl(OptionalBoolean value) { ctrl = value; return this; } ! public KeyBinding alt() { return alt(TRUE); } ! public KeyBinding alt(OptionalBoolean value) { alt = value; return this; } ! public KeyBinding meta() { return meta(TRUE); } ! public KeyBinding meta(OptionalBoolean value) { meta = value; return this; } ! public KeyBinding shortcut() { if (Toolkit.getToolkit().getClass().getName().endsWith("StubToolkit")) { // FIXME: We've hit the terrible StubToolkit (which only appears // during testing). We will dumb down what we do here if (Utils.isMac()) { return meta(); --- 44,118 ---- * * Note that this API is, at present, quite odd in that you use a constructor * and then use shift(), ctrl(), alt(), or meta() separately. It gave me an * object-literal like approach but isn't ideal. We will want some builder * approach here (similar as in other places). + * + * @since 9 */ public class KeyBinding { ! private final KeyCode code; ! private final EventType<KeyEvent> eventType; private OptionalBoolean shift = FALSE; private OptionalBoolean ctrl = FALSE; private OptionalBoolean alt = FALSE; private OptionalBoolean meta = FALSE; ! public KeyBinding(KeyCode code) { ! this(code, null); } ! /** ! * Designed for 'catch-all' situations, e.g. all KeyTyped events. ! * @param type ! */ ! public KeyBinding(EventType<KeyEvent> type) { ! this(null, type); ! } ! ! public KeyBinding(KeyCode code, EventType<KeyEvent> type) { this.code = code; ! this.eventType = type != null ? type : KeyEvent.KEY_PRESSED; } ! public final KeyBinding shift() { return shift(TRUE); } ! public final KeyBinding shift(OptionalBoolean value) { shift = value; return this; } ! public final KeyBinding ctrl() { return ctrl(TRUE); } ! public final KeyBinding ctrl(OptionalBoolean value) { ctrl = value; return this; } ! public final KeyBinding alt() { return alt(TRUE); } ! public final KeyBinding alt(OptionalBoolean value) { alt = value; return this; } ! public final KeyBinding meta() { return meta(TRUE); } ! public final KeyBinding meta(OptionalBoolean value) { meta = value; return this; } ! public final KeyBinding shortcut() { if (Toolkit.getToolkit().getClass().getName().endsWith("StubToolkit")) { // FIXME: We've hit the terrible StubToolkit (which only appears // during testing). We will dumb down what we do here if (Utils.isMac()) { return meta();
*** 131,149 **** return this; } } } public final KeyCode getCode() { return code; } public final EventType<KeyEvent> getType() { return eventType; } - public final String getAction() { return action; } public final OptionalBoolean getShift() { return shift; } public final OptionalBoolean getCtrl() { return ctrl; } public final OptionalBoolean getAlt() { return alt; } public final OptionalBoolean getMeta() { return meta; } ! public int getSpecificity(Control control, KeyEvent event) { int s = 0; if (code != null && code != event.getCode()) return 0; else s = 1; if (!shift.equals(event.isShiftDown())) return 0; else if (shift != ANY) s++; if (!ctrl.equals(event.isControlDown())) return 0; else if (ctrl != ANY) s++; if (!alt.equals(event.isAltDown())) return 0; else if (alt != ANY) s++; --- 137,156 ---- return this; } } } + + public final KeyCode getCode() { return code; } public final EventType<KeyEvent> getType() { return eventType; } public final OptionalBoolean getShift() { return shift; } public final OptionalBoolean getCtrl() { return ctrl; } public final OptionalBoolean getAlt() { return alt; } public final OptionalBoolean getMeta() { return meta; } ! public int getSpecificity(KeyEvent event) { int s = 0; if (code != null && code != event.getCode()) return 0; else s = 1; if (!shift.equals(event.isShiftDown())) return 0; else if (shift != ANY) s++; if (!ctrl.equals(event.isControlDown())) return 0; else if (ctrl != ANY) s++; if (!alt.equals(event.isAltDown())) return 0; else if (alt != ANY) s++;
*** 151,162 **** if (eventType != null && eventType != event.getEventType()) return 0; else s++; // We can now trivially accept it return s; } @Override public String toString() { return "KeyBinding [code=" + code + ", shift=" + shift + ", ctrl=" + ctrl + ", alt=" + alt + ! ", meta=" + meta + ", type=" + eventType + ! ", action=" + action + "]"; } } --- 158,213 ---- if (eventType != null && eventType != event.getEventType()) return 0; else s++; // We can now trivially accept it return s; } + /** {@inheritDoc} */ @Override public String toString() { return "KeyBinding [code=" + code + ", shift=" + shift + ", ctrl=" + ctrl + ", alt=" + alt + ! ", meta=" + meta + ", type=" + eventType + "]"; ! } ! ! /** {@inheritDoc} */ ! @Override public boolean equals(Object o) { ! if (this == o) return true; ! if (!(o instanceof KeyBinding)) return false; ! KeyBinding that = (KeyBinding) o; ! return Objects.equals(getCode(), that.getCode()) && ! Objects.equals(eventType, that.eventType) && ! Objects.equals(getShift(), that.getShift()) && ! Objects.equals(getCtrl(), that.getCtrl()) && ! Objects.equals(getAlt(), that.getAlt()) && ! Objects.equals(getMeta(), that.getMeta()); ! } ! ! /** {@inheritDoc} */ ! @Override public int hashCode() { ! return Objects.hash(getCode(), eventType, getShift(), getCtrl(), getAlt(), getMeta()); ! } ! ! public static KeyBinding toKeyBinding(KeyEvent keyEvent) { ! KeyBinding newKeyBinding = new KeyBinding(keyEvent.getCode(), keyEvent.getEventType()); ! if (keyEvent.isShiftDown()) newKeyBinding.shift(); ! if (keyEvent.isControlDown()) newKeyBinding.ctrl(); ! if (keyEvent.isAltDown()) newKeyBinding.alt(); ! if (keyEvent.isShortcutDown()) newKeyBinding.shortcut(); ! return newKeyBinding; ! } ! ! /** ! * A tri-state boolean used with KeyBinding. ! */ ! public enum OptionalBoolean { ! TRUE, ! FALSE, ! ANY; ! ! public boolean equals(boolean b) { ! if (this == ANY) return true; ! if (b && this == TRUE) return true; ! if (!b && this == FALSE) return true; ! return false; } + } + }