1 /* 2 * Copyright (c) 2014, Oracle and/or its affiliates. 3 * All rights reserved. Use is subject to license terms. 4 * 5 * This file is available and licensed under the following license: 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 11 * - Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * - Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in 15 * the documentation and/or other materials provided with the distribution. 16 * - Neither the name of Oracle Corporation nor the names of its 17 * contributors may be used to endorse or promote products derived 18 * from this software without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 24 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 package com.oracle.javafx.scenebuilder.kit.editor.panel.content.gesture.key; 34 35 import com.oracle.javafx.scenebuilder.kit.editor.panel.content.ContentPanelController; 36 import com.oracle.javafx.scenebuilder.kit.editor.panel.content.gesture.AbstractGesture; 37 38 import javafx.scene.Node; 39 import javafx.scene.input.InputEvent; 40 import javafx.scene.input.KeyEvent; 41 42 /** 43 * 44 */ 45 public abstract class AbstractKeyGesture extends AbstractGesture { 46 47 private KeyEvent firstKeyPressedEvent; 48 private KeyEvent lastKeyEvent; 49 private Observer observer; 50 51 52 public AbstractKeyGesture(ContentPanelController contentPanelController) { 53 super(contentPanelController); 54 } 55 56 57 /* 58 * For subclasses 59 */ 60 61 protected abstract void keyPressed(); 62 protected abstract void keyReleased(); 63 64 protected KeyEvent getFirstKeyPressedEvent() { 65 return firstKeyPressedEvent; 66 } 67 68 protected KeyEvent getLastKeyEvent() { 69 return lastKeyEvent; 70 } 71 72 /* 73 * AbstractGesture 74 */ 75 76 @Override 77 public void start(InputEvent e, Observer observer) { 78 assert e != null; 79 assert e instanceof KeyEvent; 80 assert e.getEventType() == KeyEvent.KEY_PRESSED; 81 assert observer != null; 82 83 final Node glassLayer = contentPanelController.getGlassLayer(); 84 assert glassLayer.getOnKeyPressed() == null; 85 assert glassLayer.getOnKeyReleased() == null; 86 87 glassLayer.setOnKeyPressed(e1 -> { 88 if (e1.getCode() == firstKeyPressedEvent.getCode()) { 89 lastKeyEvent = e1; 90 try { 91 keyPressed(); 92 } finally { 93 e1.consume(); 94 } 95 } 96 }); 97 glassLayer.setOnKeyReleased(e1 -> { 98 if (e1.getCode() == firstKeyPressedEvent.getCode()) { 99 lastKeyEvent = e1; 100 try { 101 keyReleased(); 102 } finally { 103 performTermination(); 104 e1.consume(); 105 } 106 } 107 }); 108 109 110 this.firstKeyPressedEvent = (KeyEvent)e; 111 this.lastKeyEvent = this.firstKeyPressedEvent; 112 this.observer = observer; 113 114 try { 115 keyPressed(); 116 } catch(RuntimeException x) { 117 performTermination(); 118 throw x; 119 } 120 } 121 122 123 /* 124 * Private 125 */ 126 127 private void performTermination() { 128 final Node glassLayer = contentPanelController.getGlassLayer(); 129 glassLayer.setOnKeyPressed(null); 130 glassLayer.setOnKeyReleased(null); 131 132 try { 133 observer.gestureDidTerminate(this); 134 } finally { 135 observer = null; 136 firstKeyPressedEvent = null; 137 lastKeyEvent = null; 138 } 139 } 140 141 }