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 }