8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package com.sun.javafx.scene.control.behavior;
27
28 import javafx.scene.Node;
29 import javafx.scene.control.PopupControl;
30
31 import javafx.scene.Scene;
32 import javafx.scene.input.KeyEvent;
33
34 import javafx.beans.value.ChangeListener;
35 import javafx.event.Event;
36 import javafx.event.EventDispatcher;
37 import javafx.event.EventHandler;
38 import javafx.scene.input.MouseEvent;
39
40
41 public class TwoLevelFocusPopupBehavior extends TwoLevelFocusBehavior {
42
43 public TwoLevelFocusPopupBehavior(PopupControl popup) {
44
45 tlPopup = popup;
46
47 setExternalFocus(false); // popups go straight to internal focus
87
88 /*
89 ** don't allow the Node to handle a key event if it is in externalFocus mode.
90 ** the only keyboard actions allowed are the navigation keys......
91 */
92 final EventDispatcher preemptiveEventDispatcher = (event, tail) -> {
93
94 // block the event from being passed down to children
95 if (event instanceof KeyEvent && event.getEventType() == KeyEvent.KEY_PRESSED) {
96 if (!((KeyEvent)event).isMetaDown() && !((KeyEvent)event).isControlDown() && !((KeyEvent)event).isAltDown()) {
97 if (isExternalFocus()) {
98 //
99 // don't let the behaviour leak any navigation keys when
100 // we're not in blocking mode....
101 //
102 Object obj = event.getTarget();
103
104 switch (((KeyEvent)event).getCode()) {
105 case TAB :
106 if (((KeyEvent)event).isShiftDown()) {
107 ((Node)obj).impl_traverse(com.sun.javafx.scene.traversal.Direction.PREVIOUS);
108 }
109 else {
110 ((Node)obj).impl_traverse(com.sun.javafx.scene.traversal.Direction.NEXT);
111 }
112 event.consume();
113 break;
114 case UP :
115 ((Node)obj).impl_traverse(com.sun.javafx.scene.traversal.Direction.UP);
116 event.consume();
117 break;
118 case DOWN :
119 ((Node)obj).impl_traverse(com.sun.javafx.scene.traversal.Direction.DOWN);
120 event.consume();
121 break;
122 case LEFT :
123 ((Node)obj).impl_traverse(com.sun.javafx.scene.traversal.Direction.LEFT);
124 event.consume();
125 break;
126 case RIGHT :
127 ((Node)obj).impl_traverse(com.sun.javafx.scene.traversal.Direction.RIGHT);
128 event.consume();
129 break;
130 case ENTER :
131 setExternalFocus(false);
132 event.consume();
133 break;
134 default :
135 // this'll kill mnemonics.... unless!
136 Scene s = tlNode.getScene();
137 Event.fireEvent(s, event);
138 event.consume();
139 break;
140 }
141 }
142 }
143 }
144 return event;
145 };
146 final EventDispatcher preemptivePopupEventDispatcher = (event, tail) -> {
147
148 // block the event from being passed down to children
149 if (event instanceof KeyEvent && event.getEventType() == KeyEvent.KEY_PRESSED) {
150 if (!((KeyEvent)event).isMetaDown() && !((KeyEvent)event).isControlDown() && !((KeyEvent)event).isAltDown()) {
151 if (!isExternalFocus()) {
152 //
153 // don't let the behaviour leak any navigation keys when
154 // we're not in blocking mode....
155 //
156 Object obj = event.getTarget();
157 switch (((KeyEvent)event).getCode()) {
158 case TAB :
159 case ENTER :
160 event.consume();
161 break;
162 case UP :
163 case DOWN :
164 break;
165 case LEFT :
166 if (obj instanceof Node) {
167 ((Node)obj).impl_traverse(com.sun.javafx.scene.traversal.Direction.LEFT);
168 event.consume();
169 }
170 else if (obj instanceof Scene) {
171 Node node = ((Scene)obj).getFocusOwner();
172 if (node != null) {
173 node.impl_traverse(com.sun.javafx.scene.traversal.Direction.LEFT);
174 event.consume();
175 }
176 }
177 break;
178 case RIGHT :
179 if (obj instanceof Node) {
180 ((Node)obj).impl_traverse(com.sun.javafx.scene.traversal.Direction.RIGHT);
181 event.consume();
182 }
183 else if (obj instanceof Scene) {
184 Node node = ((Scene)obj).getFocusOwner();
185 if (node != null) {
186 node.impl_traverse(com.sun.javafx.scene.traversal.Direction.RIGHT);
187 event.consume();
188 }
189 }
190 break;
191
192 default :
193 // this'll kill mnemonics.... unless!
194 Scene s = null;
195 if (tlNode != null) {
196 s = tlNode.getScene();
197 Event.fireEvent(s, event);
198 }
199 event.consume();
200 break;
201 }
202 }
203 }
204 }
205 return event;
206 };
|
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package com.sun.javafx.scene.control.behavior;
27
28 import com.sun.javafx.scene.NodeHelper;
29 import javafx.scene.Node;
30 import javafx.scene.control.PopupControl;
31
32 import javafx.scene.Scene;
33 import javafx.scene.input.KeyEvent;
34
35 import javafx.beans.value.ChangeListener;
36 import javafx.event.Event;
37 import javafx.event.EventDispatcher;
38 import javafx.event.EventHandler;
39 import javafx.scene.input.MouseEvent;
40
41
42 public class TwoLevelFocusPopupBehavior extends TwoLevelFocusBehavior {
43
44 public TwoLevelFocusPopupBehavior(PopupControl popup) {
45
46 tlPopup = popup;
47
48 setExternalFocus(false); // popups go straight to internal focus
88
89 /*
90 ** don't allow the Node to handle a key event if it is in externalFocus mode.
91 ** the only keyboard actions allowed are the navigation keys......
92 */
93 final EventDispatcher preemptiveEventDispatcher = (event, tail) -> {
94
95 // block the event from being passed down to children
96 if (event instanceof KeyEvent && event.getEventType() == KeyEvent.KEY_PRESSED) {
97 if (!((KeyEvent)event).isMetaDown() && !((KeyEvent)event).isControlDown() && !((KeyEvent)event).isAltDown()) {
98 if (isExternalFocus()) {
99 //
100 // don't let the behaviour leak any navigation keys when
101 // we're not in blocking mode....
102 //
103 Object obj = event.getTarget();
104
105 switch (((KeyEvent)event).getCode()) {
106 case TAB :
107 if (((KeyEvent)event).isShiftDown()) {
108 NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.PREVIOUS);
109 }
110 else {
111 NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.NEXT);
112 }
113 event.consume();
114 break;
115 case UP :
116 NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.UP);
117 event.consume();
118 break;
119 case DOWN :
120 NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.DOWN);
121 event.consume();
122 break;
123 case LEFT :
124 NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.LEFT);
125 event.consume();
126 break;
127 case RIGHT :
128 NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.RIGHT);
129 event.consume();
130 break;
131 case ENTER :
132 setExternalFocus(false);
133 event.consume();
134 break;
135 default :
136 // this'll kill mnemonics.... unless!
137 Scene s = tlNode.getScene();
138 Event.fireEvent(s, event);
139 event.consume();
140 break;
141 }
142 }
143 }
144 }
145 return event;
146 };
147 final EventDispatcher preemptivePopupEventDispatcher = (event, tail) -> {
148
149 // block the event from being passed down to children
150 if (event instanceof KeyEvent && event.getEventType() == KeyEvent.KEY_PRESSED) {
151 if (!((KeyEvent)event).isMetaDown() && !((KeyEvent)event).isControlDown() && !((KeyEvent)event).isAltDown()) {
152 if (!isExternalFocus()) {
153 //
154 // don't let the behaviour leak any navigation keys when
155 // we're not in blocking mode....
156 //
157 Object obj = event.getTarget();
158 switch (((KeyEvent)event).getCode()) {
159 case TAB :
160 case ENTER :
161 event.consume();
162 break;
163 case UP :
164 case DOWN :
165 break;
166 case LEFT :
167 if (obj instanceof Node) {
168 NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.LEFT);
169 event.consume();
170 }
171 else if (obj instanceof Scene) {
172 Node node = ((Scene)obj).getFocusOwner();
173 if (node != null) {
174 NodeHelper.traverse(node, com.sun.javafx.scene.traversal.Direction.LEFT);
175 event.consume();
176 }
177 }
178 break;
179 case RIGHT :
180 if (obj instanceof Node) {
181 NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.RIGHT);
182 event.consume();
183 }
184 else if (obj instanceof Scene) {
185 Node node = ((Scene)obj).getFocusOwner();
186 if (node != null) {
187 NodeHelper.traverse(node, com.sun.javafx.scene.traversal.Direction.RIGHT);
188 event.consume();
189 }
190 }
191 break;
192
193 default :
194 // this'll kill mnemonics.... unless!
195 Scene s = null;
196 if (tlNode != null) {
197 s = tlNode.getScene();
198 Event.fireEvent(s, event);
199 }
200 event.consume();
201 break;
202 }
203 }
204 }
205 }
206 return event;
207 };
|