1 /* 2 * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 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 */ 24 package test.scenegraph.app; 25 26 import java.util.ArrayList; 27 import java.util.HashMap; 28 import java.util.List; 29 import java.util.Map; 30 import java.util.concurrent.ExecutionException; 31 import javafx.collections.FXCollections; 32 import javafx.concurrent.Task; 33 import javafx.event.ActionEvent; 34 import javafx.event.Event; 35 import javafx.event.EventHandler; 36 import javafx.event.EventType; 37 import javafx.geometry.Insets; 38 import javafx.geometry.Orientation; 39 import javafx.scene.Scene; 40 import javafx.scene.control.*; 41 import javafx.scene.input.*; 42 import javafx.scene.layout.BorderPane; 43 import javafx.scene.layout.FlowPane; 44 import javafx.scene.layout.VBoxBuilder; 45 import test.javaclient.shared.InteroperabilityApp; 46 import test.javaclient.shared.Utils; 47 48 /** 49 * 50 * @author Aleksandr Sakharuk 51 */ 52 public class SceneEventHandlersApp extends InteroperabilityApp 53 { 54 55 public static void main(String... args) 56 { 57 Utils.launch(SceneEventHandlersApp.class, args); 58 //System.out.println("fx: " + VersionInfo.getRuntimeVersion()); 59 } 60 61 @Override 62 protected Scene getScene() 63 { 64 eventCombo.setId(EVENTS_COMBO_ID); 65 actionButton.setId(ACTION_BUTTON_ID); 66 dragField.setId(DRAG_SOURCE_ID); 67 dropField.setId(DROP_TARGET_ID); 68 69 eventCombo.addEventHandler(ActionEvent.ACTION, new EventHandler<ActionEvent>() { 70 71 public void handle(ActionEvent event) { 72 EventType<?> type = eventCombo.getValue().getType(); 73 scene.addEventHandler(type, new TestHandler(type)); 74 } 75 }); 76 77 eventCombo.setItems(FXCollections.observableArrayList(EventTypes.values())); 78 79 dragField.setOnDragDetected(new EventHandler<MouseEvent>() { 80 81 public void handle(MouseEvent event) { 82 final Dragboard db = dragField.startDragAndDrop(TransferMode.ANY); 83 final ClipboardContent content = new ClipboardContent(); 84 content.putString(dragField.getText()); 85 db.setContent(content); 86 event.consume(); 87 } 88 }); 89 90 // dragField.setOnDragExited(new EventHandler<DragEvent>() { 91 // 92 // public void handle(DragEvent arg0) { 93 // System.out.println("Drag exited drag source."); 94 // } 95 // }); 96 97 dropField.setOnDragOver(new EventHandler<DragEvent>() { 98 99 public void handle(DragEvent event) { 100 event.acceptTransferModes(TransferMode.COPY); 101 } 102 }); 103 104 dropField.setOnDragDropped(new EventHandler<DragEvent>() { 105 106 public void handle(DragEvent event) { 107 Dragboard db = event.getDragboard(); 108 boolean success = false; 109 if (db.hasString()) { 110 dropField.setText(db.getString()); 111 success = true; 112 } 113 event.setDropCompleted(success); 114 } 115 }); 116 117 for(EventTypes t: EventTypes.values()) 118 { 119 Label lb = LabelBuilder.create().text(t.toString()).id(t.toString()).style(NOT_HANDLED_STYLE).build(); 120 controlLabels.add(lb); 121 } 122 123 BorderPane root = new BorderPane(); 124 FlowPane flow = new FlowPane(Orientation.VERTICAL); 125 flow.setVgap(30); 126 flow.setHgap(1); 127 flow.setPadding(new Insets(10, 10, 10, 10)); 128 flow.getChildren().addAll(actionButton, dragField, dropField); 129 root.setTop(eventCombo); 130 root.setCenter(flow); 131 root.setLeft(VBoxBuilder.create().children(controlLabels).padding(new Insets(10, 10, 10, 10)).build()); 132 scene = new Scene(root); 133 134 scene.addEventHandler(MouseEvent.DRAG_DETECTED, new EventHandler<MouseEvent>() { 135 136 public void handle(MouseEvent arg0) { 137 //System.out.println("startFullDrag handled"); 138 scene.startFullDrag(); 139 } 140 }); 141 142 return scene; 143 } 144 145 public Map<EventType<Event>, Boolean> getResults() 146 { 147 return handled; 148 } 149 150 private ComboBox<EventTypes> eventCombo = new ComboBox<EventTypes>(); 151 private Button actionButton = new Button("Action"); 152 private List<Label> controlLabels = new ArrayList<Label>(); 153 private TextField dragField = new TextField("Drag source"); 154 private TextField dropField = new TextField("Drop target"); 155 private Scene scene; 156 157 private Map<EventType<Event>, Boolean> handled = new HashMap<EventType<Event>, Boolean>(); 158 159 public static final String NOT_HANDLED_STYLE = "-fx-text-fill: red;"; 160 public static final String HANDLED_STYLE = "-fx-text-fill: green;"; 161 public static final String EVENTS_COMBO_ID = "events_combo"; 162 public static final String ACTION_BUTTON_ID = "action_button"; 163 public static final String DRAG_SOURCE_ID = "drag_field"; 164 public static final String DROP_TARGET_ID = "drop_field"; 165 166 public static enum EventTypes 167 { 168 169 ACTION(ActionEvent.ACTION), 170 CONTEXT_MENU_REQUESTED(ContextMenuEvent.CONTEXT_MENU_REQUESTED), 171 DRAG_DONE(DragEvent.DRAG_DONE), 172 DRAG_DROPPED(DragEvent.DRAG_DROPPED), 173 DRAG_ENTERED(DragEvent.DRAG_ENTERED), 174 DRAG_ENTERED_TARGET(DragEvent.DRAG_ENTERED_TARGET), 175 DRAG_EXITED(DragEvent.DRAG_EXITED), 176 DRAG_EXITED_TARGET(DragEvent.DRAG_EXITED_TARGET), 177 DRAG_OVER(DragEvent.DRAG_OVER), 178 //INPUT_METHOD_TEXT_CHANGED(InputMethodEvent.INPUT_METHOD_TEXT_CHANGED), 179 KEY_PRESSED(KeyEvent.KEY_PRESSED), 180 KEY_RELEASED(KeyEvent.KEY_RELEASED), 181 KEY_TYPED(KeyEvent.KEY_TYPED), 182 DRAG_DETECTED(MouseEvent.DRAG_DETECTED), 183 MOUSE_CLICKED(MouseEvent.MOUSE_CLICKED), 184 MOUSE_DRAGGED(MouseEvent.MOUSE_DRAGGED), 185 MOUSE_ENTERED(MouseEvent.MOUSE_ENTERED), 186 MOUSE_ENTERED_TARGET(MouseEvent.MOUSE_ENTERED_TARGET), 187 MOUSE_EXITED(MouseEvent.MOUSE_EXITED), 188 MOUSE_EXITED_TARGET(MouseEvent.MOUSE_EXITED_TARGET), 189 MOUSE_MOVED(MouseEvent.MOUSE_MOVED), 190 MOUSE_PRESSED(MouseEvent.MOUSE_PRESSED), 191 MOUSE_RELEASED(MouseEvent.MOUSE_RELEASED), 192 MOUSE_DRAG_ENTERED(MouseDragEvent.MOUSE_DRAG_ENTERED), 193 MOUSE_DRAG_ENTERED_TARGET(MouseDragEvent.MOUSE_DRAG_ENTERED_TARGET), 194 MOUSE_DRAG_EXITED(MouseDragEvent.MOUSE_DRAG_EXITED), 195 MOUSE_DRAG_EXITED_TARGET(MouseDragEvent.MOUSE_DRAG_EXITED_TARGET), 196 MOUSE_DRAG_OVER(MouseDragEvent.MOUSE_DRAG_OVER), 197 MOUSE_DRAG_RELEASED(MouseDragEvent.MOUSE_DRAG_RELEASED), 198 SCROLL(ScrollEvent.SCROLL), 199 //MEDIA_ERROR(MediaErrorEvent.MEDIA_ERROR), 200 //ALERT(WebEvent.ALERT), 201 //RESIZED(WebEvent.RESIZED), 202 //TATUS_CHANGED(WebEvent.STATUS_CHANGED), 203 //VISIBILITY_CHANGED(WebEvent.VISIBILITY_CHANGED), 204 //WINDOW_CLOSE_REQUEST(WindowEvent.WINDOW_CLOSE_REQUEST), 205 //WINDOW_HIDDEN(WindowEvent.WINDOW_HIDDEN), 206 //WINDOW_HIDING(WindowEvent.WINDOW_HIDING), 207 //WINDOW_SHOWING(WindowEvent.WINDOW_SHOWING), 208 //WINDOW_SHOWN(WindowEvent.WINDOW_SHOWN), 209 //WORKER_STATE_CANCELLED(WorkerStateEvent.WORKER_STATE_CANCELLED), 210 //WORKER_STATE_FAILED(WorkerStateEvent.WORKER_STATE_FAILED), 211 //WORKER_STATE_READY(WorkerStateEvent.WORKER_STATE_READY), 212 //WORKER_STATE_RUNNING(WorkerStateEvent.WORKER_STATE_RUNNING), 213 //WORKER_STATE_SCHEDULED(WorkerStateEvent.WORKER_STATE_SCHEDULED), 214 //WORKER_STATE_SUCCEEDED(WorkerStateEvent.WORKER_STATE_SUCCEEDED) 215 ; 216 217 private EventTypes(EventType<? extends Event> type) 218 { 219 this.type = type; 220 } 221 222 public EventType<? extends Event> getType() 223 { 224 return type; 225 } 226 227 public static EventTypes get(EventType<? extends Event> type) 228 { 229 for(EventTypes t: EventTypes.values()) 230 { 231 if(t.type.equals(type)) 232 { 233 return t; 234 } 235 } 236 return null; 237 } 238 239 private EventType<? extends Event> type; 240 241 } 242 243 private class TestHandler<T extends EventType<Event>> implements EventHandler<Event> 244 { 245 246 public TestHandler(T eventType) 247 { 248 this.eventType = eventType; 249 handled.put(eventType, Boolean.FALSE); 250 } 251 252 @Override 253 public void handle(Event event) 254 { 255 handled.put(eventType, Boolean.TRUE); 256 System.out.println(event + " handled."); 257 controlLabels.get(EventTypes.get(event.getEventType()).ordinal()).setStyle(HANDLED_STYLE); 258 scene.removeEventHandler(event.getEventType(), this); 259 } 260 261 private EventType<Event> eventType; 262 263 } 264 265 }