1 /* 2 * Copyright (c) 2000, 2013, 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 * questions. 24 */ 25 26 package javafx.scene.input; 27 28 import com.sun.javafx.FXUnit; 29 import com.sun.javafx.pgstub.StubScene; 30 import com.sun.javafx.test.MouseEventGenerator; 31 import javafx.event.Event; 32 import javafx.event.EventHandler; 33 import javafx.geometry.Point3D; 34 import javafx.scene.Group; 35 import javafx.scene.Scene; 36 import javafx.scene.shape.Rectangle; 37 import javafx.stage.Stage; 38 import org.junit.Rule; 39 import org.junit.Test; 40 import static org.junit.Assert.*; 41 42 public class ScrollEventTest { 43 44 @Rule 45 public FXUnit fx = new FXUnit(); 46 47 private boolean scrolled; 48 private boolean scrolled2; 49 private PickResult pickRes; 50 51 @Test public void testShortConstructor() { 52 Rectangle node = new Rectangle(); 53 node.setTranslateX(3); 54 node.setTranslateY(2); 55 node.setTranslateZ(50); 56 57 pickRes = new PickResult(node, new Point3D(15, 25, 100), 33); 58 ScrollEvent e = new ScrollEvent( 59 ScrollEvent.SCROLL_STARTED, 10, 20, 30, 40, 60 false, true, false, true, false, true, 61 2, 3, 4, 5, ScrollEvent.HorizontalTextScrollUnits.CHARACTERS, 6, 62 ScrollEvent.VerticalTextScrollUnits.PAGES, 7, 8, pickRes); 63 64 assertSame(ScrollEvent.SCROLL_STARTED, e.getEventType()); 65 assertSame(pickRes, e.getPickResult()); 66 assertEquals(18, e.getX(), 10e-20); 67 assertEquals(27, e.getY(), 10e-20); 68 assertEquals(150, e.getZ(), 10e-20); 69 assertEquals(10, e.getSceneX(), 10e-20); 70 assertEquals(20, e.getSceneY(), 10e-20); 71 assertEquals(30, e.getScreenX(), 10e-20); 72 assertEquals(40, e.getScreenY(), 10e-20); 73 assertFalse(e.isShiftDown()); 74 assertTrue(e.isControlDown()); 75 assertFalse(e.isAltDown()); 76 assertTrue(e.isMetaDown()); 77 assertFalse(e.isDirect()); 78 assertTrue(e.isInertia()); 79 assertEquals(2.0, e.getDeltaX(), 10e-20); 80 assertEquals(3.0, e.getDeltaY(), 10e-20); 81 assertEquals(4.0, e.getTotalDeltaX(), 10e-20); 82 assertEquals(5.0, e.getTotalDeltaY(), 10e-20); 83 assertSame(ScrollEvent.HorizontalTextScrollUnits.CHARACTERS, e.getTextDeltaXUnits()); 84 assertEquals(6.0, e.getTextDeltaX(), 10e-20); 85 assertSame(ScrollEvent.VerticalTextScrollUnits.PAGES, e.getTextDeltaYUnits()); 86 assertEquals(7.0, e.getTextDeltaY(), 10e-20); 87 assertEquals(8.0, e.getTouchCount(), 10e-20); 88 assertSame(Event.NULL_SOURCE_TARGET, e.getSource()); 89 assertSame(Event.NULL_SOURCE_TARGET, e.getTarget()); 90 assertFalse(e.isConsumed()); 91 92 e = new ScrollEvent( 93 ScrollEvent.SCROLL_STARTED, 10, 20, 30, 40, 94 true, false, true, false, true, false, 95 2, 3, 4, 5, ScrollEvent.HorizontalTextScrollUnits.CHARACTERS, 6, 96 ScrollEvent.VerticalTextScrollUnits.PAGES, 7, 8, pickRes); 97 assertTrue(e.isShiftDown()); 98 assertFalse(e.isControlDown()); 99 assertTrue(e.isAltDown()); 100 assertFalse(e.isMetaDown()); 101 assertTrue(e.isDirect()); 102 assertFalse(e.isInertia()); 103 } 104 105 @Test public void testShortConstructorWithoutPickResult() { 106 ScrollEvent e = new ScrollEvent( 107 ScrollEvent.SCROLL_STARTED, 10, 20, 30, 40, 108 false, true, false, true, false, true, 109 2, 3, 4, 5, ScrollEvent.HorizontalTextScrollUnits.CHARACTERS, 6, 110 ScrollEvent.VerticalTextScrollUnits.PAGES, 7, 8, null); 111 112 assertEquals(10, e.getX(), 10e-20); 113 assertEquals(20, e.getY(), 10e-20); 114 assertEquals(0, e.getZ(), 10e-20); 115 assertEquals(10, e.getSceneX(), 10e-20); 116 assertEquals(20, e.getSceneY(), 10e-20); 117 assertEquals(30, e.getScreenX(), 10e-20); 118 assertEquals(40, e.getScreenY(), 10e-20); 119 assertNotNull(e.getPickResult()); 120 assertNotNull(e.getPickResult().getIntersectedPoint()); 121 assertEquals(10, e.getPickResult().getIntersectedPoint().getX(), 10e-20); 122 assertEquals(20, e.getPickResult().getIntersectedPoint().getY(), 10e-20); 123 assertEquals(0, e.getPickResult().getIntersectedPoint().getZ(), 10e-20); 124 assertSame(Event.NULL_SOURCE_TARGET, e.getSource()); 125 assertSame(Event.NULL_SOURCE_TARGET, e.getTarget()); 126 } 127 128 @Test public void testLongConstructor() { 129 Rectangle node = new Rectangle(10, 10); 130 node.setTranslateX(3); 131 node.setTranslateY(2); 132 node.setTranslateZ(50); 133 Rectangle n1 = new Rectangle(10, 10); 134 Rectangle n2 = new Rectangle(10, 10); 135 136 pickRes = new PickResult(node, new Point3D(15, 25, 100), 33); 137 ScrollEvent e = new ScrollEvent(n1, n2, 138 ScrollEvent.SCROLL_STARTED, 10, 20, 30, 40, 139 false, true, false, true, false, true, 140 2, 3, 4, 5, ScrollEvent.HorizontalTextScrollUnits.CHARACTERS, 6, 141 ScrollEvent.VerticalTextScrollUnits.PAGES, 7, 8, pickRes); 142 143 assertSame(n1, e.getSource()); 144 assertSame(n2, e.getTarget()); 145 assertSame(ScrollEvent.SCROLL_STARTED, e.getEventType()); 146 assertSame(pickRes, e.getPickResult()); 147 assertEquals(18, e.getX(), 10e-20); 148 assertEquals(27, e.getY(), 10e-20); 149 assertEquals(150, e.getZ(), 10e-20); 150 assertEquals(10, e.getSceneX(), 10e-20); 151 assertEquals(20, e.getSceneY(), 10e-20); 152 assertEquals(30, e.getScreenX(), 10e-20); 153 assertEquals(40, e.getScreenY(), 10e-20); 154 assertFalse(e.isShiftDown()); 155 assertTrue(e.isControlDown()); 156 assertFalse(e.isAltDown()); 157 assertTrue(e.isMetaDown()); 158 assertFalse(e.isDirect()); 159 assertTrue(e.isInertia()); 160 assertEquals(2.0, e.getDeltaX(), 10e-20); 161 assertEquals(3.0, e.getDeltaY(), 10e-20); 162 assertEquals(4.0, e.getTotalDeltaX(), 10e-20); 163 assertEquals(5.0, e.getTotalDeltaY(), 10e-20); 164 assertSame(ScrollEvent.HorizontalTextScrollUnits.CHARACTERS, e.getTextDeltaXUnits()); 165 assertEquals(6.0, e.getTextDeltaX(), 10e-20); 166 assertSame(ScrollEvent.VerticalTextScrollUnits.PAGES, e.getTextDeltaYUnits()); 167 assertEquals(7.0, e.getTextDeltaY(), 10e-20); 168 assertEquals(8.0, e.getTouchCount(), 10e-20); 169 assertFalse(e.isConsumed()); 170 171 e = new ScrollEvent(n1, n2, 172 ScrollEvent.SCROLL_STARTED, 10, 20, 30, 40, 173 true, false, true, false, true, false, 174 2, 3, 4, 5, ScrollEvent.HorizontalTextScrollUnits.CHARACTERS, 6, 175 ScrollEvent.VerticalTextScrollUnits.PAGES, 7, 8, pickRes); 176 assertTrue(e.isShiftDown()); 177 assertFalse(e.isControlDown()); 178 assertTrue(e.isAltDown()); 179 assertFalse(e.isMetaDown()); 180 assertTrue(e.isDirect()); 181 assertFalse(e.isInertia()); 182 } 183 184 @Test public void testLongConstructorWithoutPickResult() { 185 Rectangle n1 = new Rectangle(10, 10); 186 Rectangle n2 = new Rectangle(10, 10); 187 ScrollEvent e = new ScrollEvent(n1, n2, 188 ScrollEvent.SCROLL_STARTED, 10, 20, 30, 40, 189 false, true, false, true, false, true, 190 2, 3, 4, 5, ScrollEvent.HorizontalTextScrollUnits.CHARACTERS, 6, 191 ScrollEvent.VerticalTextScrollUnits.PAGES, 7, 8, null); 192 193 assertSame(n1, e.getSource()); 194 assertSame(n2, e.getTarget()); 195 assertEquals(10, e.getX(), 10e-20); 196 assertEquals(20, e.getY(), 10e-20); 197 assertEquals(0, e.getZ(), 10e-20); 198 assertEquals(10, e.getSceneX(), 10e-20); 199 assertEquals(20, e.getSceneY(), 10e-20); 200 assertEquals(30, e.getScreenX(), 10e-20); 201 assertEquals(40, e.getScreenY(), 10e-20); 202 assertNotNull(e.getPickResult()); 203 assertNotNull(e.getPickResult().getIntersectedPoint()); 204 assertEquals(10, e.getPickResult().getIntersectedPoint().getX(), 10e-20); 205 assertEquals(20, e.getPickResult().getIntersectedPoint().getY(), 10e-20); 206 assertEquals(0, e.getPickResult().getIntersectedPoint().getZ(), 10e-20); 207 } 208 209 210 @Test 211 public void shouldDeliverScrollEventToPickedNode() { 212 Scene scene = createScene(); 213 Rectangle rect = 214 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0); 215 216 scrolled = false; 217 rect.setOnScroll(new EventHandler<ScrollEvent>() { 218 @Override public void handle(ScrollEvent event) { 219 scrolled = true; 220 } 221 }); 222 223 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 224 ScrollEvent.SCROLL, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 225 50, 50, 50, 50, false, false, false, false, false, false); 226 227 assertFalse(scrolled); 228 229 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 230 ScrollEvent.SCROLL, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 231 150, 150, 150, 150, false, false, false, false, false, false); 232 233 assertTrue(scrolled); 234 } 235 236 @Test 237 public void shouldUseMultiplier() { 238 Scene scene = createScene(); 239 Rectangle rect = 240 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0); 241 242 scrolled = false; 243 rect.setOnScroll(new EventHandler<ScrollEvent>() { 244 @Override public void handle(ScrollEvent event) { 245 assertEquals(66.0, event.getDeltaX(), 0.0001); 246 assertEquals(99.0, event.getDeltaY(), 0.0001); 247 assertEquals(132.0, event.getTotalDeltaX(), 0.0001); 248 assertEquals(198.0, event.getTotalDeltaY(), 0.0001); 249 scrolled = true; 250 } 251 }); 252 253 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 254 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 1, 1, 1, 1, 1, 255 150, 150, 150, 150, false, false, false, false, false, false); 256 257 assertTrue(scrolled); 258 } 259 260 @Test 261 public void shouldUseTextDeltasForUnitsAndValues() { 262 Scene scene = createScene(); 263 Rectangle rect = 264 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0); 265 266 scrolled = false; 267 rect.setOnScroll(new EventHandler<ScrollEvent>() { 268 @Override public void handle(ScrollEvent event) { 269 assertEquals(0.0, event.getTextDeltaX(), 0.0001); 270 assertEquals(0.0, event.getTextDeltaY(), 0.0001); 271 assertSame(ScrollEvent.HorizontalTextScrollUnits.NONE, event.getTextDeltaXUnits()); 272 assertSame(ScrollEvent.VerticalTextScrollUnits.NONE, event.getTextDeltaYUnits()); 273 scrolled = true; 274 } 275 }); 276 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 277 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 0, 0, 0, 0, 0, 278 150, 150, 150, 150, false, false, false, false, false, false); 279 assertTrue(scrolled); 280 281 scrolled = false; 282 rect.setOnScroll(new EventHandler<ScrollEvent>() { 283 @Override public void handle(ScrollEvent event) { 284 assertEquals(8.0, event.getTextDeltaX(), 0.0001); 285 assertEquals(15.0, event.getTextDeltaY(), 0.0001); 286 assertSame(ScrollEvent.HorizontalTextScrollUnits.CHARACTERS, event.getTextDeltaXUnits()); 287 assertSame(ScrollEvent.VerticalTextScrollUnits.LINES, event.getTextDeltaYUnits()); 288 scrolled = true; 289 } 290 }); 291 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 292 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 1, 4, 5, 3, 3, 293 150, 150, 150, 150, false, false, false, false, false, false); 294 assertTrue(scrolled); 295 296 scrolled = false; 297 rect.setOnScroll(new EventHandler<ScrollEvent>() { 298 @Override public void handle(ScrollEvent event) { 299 assertEquals(0.0, event.getTextDeltaX(), 0.0001); 300 assertEquals(3.0, event.getTextDeltaY(), 0.0001); 301 assertSame(ScrollEvent.HorizontalTextScrollUnits.NONE, event.getTextDeltaXUnits()); 302 assertSame(ScrollEvent.VerticalTextScrollUnits.PAGES, event.getTextDeltaYUnits()); 303 scrolled = true; 304 } 305 }); 306 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 307 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 5, -1, -1, 3, 3, 308 150, 150, 150, 150, false, false, false, false, false, false); 309 assertTrue(scrolled); 310 311 } 312 313 @Test 314 public void shouldPassModifiers() { 315 Scene scene = createScene(); 316 Rectangle rect = 317 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0); 318 319 scrolled = false; 320 rect.setOnScroll(new EventHandler<ScrollEvent>() { 321 @Override public void handle(ScrollEvent event) { 322 assertTrue(event.isShiftDown()); 323 assertFalse(event.isControlDown()); 324 assertTrue(event.isAltDown()); 325 assertFalse(event.isMetaDown()); 326 scrolled = true; 327 } 328 }); 329 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 330 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 1, 1, 1, 3, 3, 331 150, 150, 150, 150, true, false, true, false, false, false); 332 assertTrue(scrolled); 333 334 scrolled = false; 335 rect.setOnScroll(new EventHandler<ScrollEvent>() { 336 @Override public void handle(ScrollEvent event) { 337 assertFalse(event.isShiftDown()); 338 assertTrue(event.isControlDown()); 339 assertFalse(event.isAltDown()); 340 assertTrue(event.isMetaDown()); 341 scrolled = true; 342 } 343 }); 344 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 345 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 1, 1, 1, 3, 3, 346 150, 150, 150, 150, false, true, false, true, false, false); 347 assertTrue(scrolled); 348 } 349 350 @Test 351 public void shouldPassDirect() { 352 Scene scene = createScene(); 353 Rectangle rect = 354 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0); 355 356 scrolled = false; 357 rect.setOnScroll(new EventHandler<ScrollEvent>() { 358 @Override public void handle(ScrollEvent event) { 359 assertTrue(event.isDirect()); 360 scrolled = true; 361 } 362 }); 363 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 364 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 1, 1, 1, 3, 3, 365 150, 150, 150, 150, true, false, true, false, true, false); 366 assertTrue(scrolled); 367 368 scrolled = false; 369 rect.setOnScroll(new EventHandler<ScrollEvent>() { 370 @Override public void handle(ScrollEvent event) { 371 assertFalse(event.isDirect()); 372 scrolled = true; 373 } 374 }); 375 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 376 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 1, 1, 1, 3, 3, 377 150, 150, 150, 150, false, true, false, true, false, false); 378 assertTrue(scrolled); 379 } 380 381 @Test 382 public void shouldPassInertia() { 383 Scene scene = createScene(); 384 Rectangle rect = 385 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0); 386 387 scrolled = false; 388 rect.setOnScroll(new EventHandler<ScrollEvent>() { 389 @Override public void handle(ScrollEvent event) { 390 assertTrue(event.isInertia()); 391 scrolled = true; 392 } 393 }); 394 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 395 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 1, 1, 1, 3, 3, 396 150, 150, 150, 150, true, false, true, false, false, true); 397 assertTrue(scrolled); 398 399 scrolled = false; 400 rect.setOnScroll(new EventHandler<ScrollEvent>() { 401 @Override public void handle(ScrollEvent event) { 402 assertFalse(event.isInertia()); 403 scrolled = true; 404 } 405 }); 406 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 407 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 1, 1, 1, 3, 3, 408 150, 150, 150, 150, false, true, false, true, false, false); 409 assertTrue(scrolled); 410 } 411 412 @Test 413 public void shouldPassTouchCount() { 414 Scene scene = createScene(); 415 Rectangle rect = 416 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0); 417 418 scrolled = false; 419 rect.setOnScroll(new EventHandler<ScrollEvent>() { 420 @Override public void handle(ScrollEvent event) { 421 assertEquals(0, event.getTouchCount()); 422 scrolled = true; 423 } 424 }); 425 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 426 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3, 427 150, 150, 150, 150, true, false, true, false, true, false); 428 assertTrue(scrolled); 429 430 scrolled = false; 431 rect.setOnScroll(new EventHandler<ScrollEvent>() { 432 @Override public void handle(ScrollEvent event) { 433 assertEquals(5, event.getTouchCount()); 434 scrolled = true; 435 } 436 }); 437 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 438 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 5, 1, 1, 3, 3, 439 150, 150, 150, 150, true, false, true, false, true, false); 440 assertTrue(scrolled); 441 } 442 443 @Test 444 public void shouldPassEventType() { 445 Scene scene = createScene(); 446 Rectangle rect = 447 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0); 448 449 scrolled = false; 450 rect.setOnScrollStarted(new EventHandler<ScrollEvent>() { 451 @Override public void handle(ScrollEvent event) { 452 scrolled = true; 453 } 454 }); 455 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 456 ScrollEvent.SCROLL_STARTED, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3, 457 150, 150, 150, 150, true, false, true, false, true, false); 458 assertTrue(scrolled); 459 460 scrolled = false; 461 rect.setOnScrollFinished(new EventHandler<ScrollEvent>() { 462 @Override public void handle(ScrollEvent event) { 463 scrolled = true; 464 } 465 }); 466 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 467 ScrollEvent.SCROLL_FINISHED, 2, 3, 4, 6, 33, 33, 5, 1, 1, 3, 3, 468 150, 150, 150, 150, true, false, true, false, true, false); 469 assertTrue(scrolled); 470 } 471 472 @Test 473 public void handlingAnyShouldGetAllTypes() { 474 Scene scene = createScene(); 475 Rectangle rect = 476 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0); 477 478 rect.addEventHandler(ScrollEvent.ANY, new EventHandler<ScrollEvent>() { 479 @Override public void handle(ScrollEvent event) { 480 scrolled = true; 481 } 482 }); 483 484 scrolled = false; 485 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 486 ScrollEvent.SCROLL_STARTED, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3, 487 150, 150, 150, 150, true, false, true, false, true, false); 488 assertTrue(scrolled); 489 490 scrolled = false; 491 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 492 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 5, 1, 1, 3, 3, 493 150, 150, 150, 150, true, false, true, false, true, false); 494 assertTrue(scrolled); 495 496 scrolled = false; 497 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 498 ScrollEvent.SCROLL_FINISHED, 2, 3, 4, 6, 33, 33, 5, 1, 1, 3, 3, 499 150, 150, 150, 150, true, false, true, false, true, false); 500 assertTrue(scrolled); 501 } 502 503 @Test 504 public void shouldDeliverWholeGestureToOneNode() { 505 Scene scene = createScene(); 506 Rectangle rect1 = 507 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0); 508 Rectangle rect2 = 509 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(1); 510 511 rect1.addEventHandler(ScrollEvent.ANY, new EventHandler<ScrollEvent>() { 512 @Override public void handle(ScrollEvent event) { 513 scrolled = true; 514 } 515 }); 516 rect2.addEventHandler(ScrollEvent.ANY, new EventHandler<ScrollEvent>() { 517 @Override public void handle(ScrollEvent event) { 518 scrolled2 = true; 519 } 520 }); 521 522 scrolled = false; 523 scrolled2 = false; 524 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 525 ScrollEvent.SCROLL_STARTED, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3, 526 150, 150, 150, 150, true, false, true, false, true, false); 527 assertTrue(scrolled); 528 assertFalse(scrolled2); 529 530 scrolled = false; 531 scrolled2 = false; 532 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 533 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3, 534 250, 250, 250, 250, true, false, true, false, true, false); 535 assertTrue(scrolled); 536 assertFalse(scrolled2); 537 538 scrolled = false; 539 scrolled2 = false; 540 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 541 ScrollEvent.SCROLL_FINISHED, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3, 542 250, 250, 250, 250, true, false, true, false, true, false); 543 assertTrue(scrolled); 544 assertFalse(scrolled2); 545 546 // inertia 547 scrolled = false; 548 scrolled2 = false; 549 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 550 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3, 551 250, 250, 250, 250, true, false, true, false, true, true); 552 assertTrue(scrolled); 553 assertFalse(scrolled2); 554 } 555 556 @Test 557 public void shouldCompute3dCoordinates() { 558 Scene scene = createScene(); 559 Rectangle rect = 560 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0); 561 rect.setTranslateZ(50); 562 563 scrolled = false; 564 scrolled2 = false; 565 rect.setOnScroll(new EventHandler<ScrollEvent>() { 566 @Override public void handle(ScrollEvent event) { 567 assertEquals(150, event.getX(), 0.00001); 568 assertEquals(150, event.getY(), 0.00001); 569 assertEquals(0, event.getZ(), 0.00001); 570 scrolled = true; 571 } 572 }); 573 574 scene.setOnScroll(new EventHandler<ScrollEvent>() { 575 @Override public void handle(ScrollEvent event) { 576 assertEquals(150, event.getX(), 0.00001); 577 assertEquals(150, event.getY(), 0.00001); 578 assertEquals(50, event.getZ(), 0.00001); 579 scrolled2 = true; 580 } 581 }); 582 583 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 584 ScrollEvent.SCROLL, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 585 150, 150, 150, 150, false, false, false, false, false, false); 586 587 assertTrue(scrolled); 588 assertTrue(scrolled2); 589 } 590 591 @Test 592 public void shouldContainPickResult() { 593 Scene scene = createScene(); 594 Rectangle rect1 = 595 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0); 596 Rectangle rect2 = 597 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(1); 598 599 rect1.addEventHandler(ScrollEvent.ANY, new EventHandler<ScrollEvent>() { 600 @Override public void handle(ScrollEvent event) { 601 pickRes = event.getPickResult(); 602 scrolled = true; 603 } 604 }); 605 rect2.addEventHandler(ScrollEvent.ANY, new EventHandler<ScrollEvent>() { 606 @Override public void handle(ScrollEvent event) { 607 pickRes = event.getPickResult(); 608 scrolled2 = true; 609 } 610 }); 611 612 scrolled = false; 613 scrolled2 = false; 614 pickRes = null; 615 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 616 ScrollEvent.SCROLL_STARTED, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3, 617 150, 150, 150, 150, true, false, true, false, true, false); 618 assertTrue(scrolled); 619 assertFalse(scrolled2); 620 assertNotNull(pickRes); 621 assertSame(rect1, pickRes.getIntersectedNode()); 622 assertEquals(150, pickRes.getIntersectedPoint().getX(), 0.00001); 623 assertEquals(150, pickRes.getIntersectedPoint().getY(), 0.00001); 624 assertEquals(0, pickRes.getIntersectedPoint().getZ(), 0.00001); 625 626 scrolled = false; 627 scrolled2 = false; 628 pickRes = null; 629 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 630 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3, 631 250, 250, 250, 250, true, false, true, false, true, false); 632 assertTrue(scrolled); 633 assertFalse(scrolled2); 634 assertNotNull(pickRes); 635 assertSame(rect2, pickRes.getIntersectedNode()); 636 assertEquals(250, pickRes.getIntersectedPoint().getX(), 0.00001); 637 assertEquals(250, pickRes.getIntersectedPoint().getY(), 0.00001); 638 assertEquals(0, pickRes.getIntersectedPoint().getZ(), 0.00001); 639 640 scrolled = false; 641 scrolled2 = false; 642 pickRes = null; 643 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 644 ScrollEvent.SCROLL_FINISHED, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3, 645 250, 250, 250, 250, true, false, true, false, true, false); 646 assertTrue(scrolled); 647 assertFalse(scrolled2); 648 assertNotNull(pickRes); 649 assertSame(rect2, pickRes.getIntersectedNode()); 650 assertEquals(250, pickRes.getIntersectedPoint().getX(), 0.00001); 651 assertEquals(250, pickRes.getIntersectedPoint().getY(), 0.00001); 652 assertEquals(0, pickRes.getIntersectedPoint().getZ(), 0.00001); 653 654 // inertia 655 scrolled = false; 656 scrolled2 = false; 657 pickRes = null; 658 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 659 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3, 660 250, 250, 250, 250, true, false, true, false, true, true); 661 assertTrue(scrolled); 662 assertFalse(scrolled2); 663 assertNotNull(pickRes); 664 assertSame(rect2, pickRes.getIntersectedNode()); 665 assertEquals(250, pickRes.getIntersectedPoint().getX(), 0.00001); 666 assertEquals(250, pickRes.getIntersectedPoint().getY(), 0.00001); 667 assertEquals(0, pickRes.getIntersectedPoint().getZ(), 0.00001); 668 } 669 670 @Test 671 public void shouldPickForMouseWheelDuringInertia() { 672 Scene scene = createScene(); 673 Rectangle rect1 = 674 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0); 675 Rectangle rect2 = 676 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(1); 677 678 rect1.addEventHandler(ScrollEvent.ANY, new EventHandler<ScrollEvent>() { 679 @Override public void handle(ScrollEvent event) { 680 scrolled = true; 681 } 682 }); 683 rect2.addEventHandler(ScrollEvent.ANY, new EventHandler<ScrollEvent>() { 684 @Override public void handle(ScrollEvent event) { 685 scrolled2 = true; 686 } 687 }); 688 689 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 690 ScrollEvent.SCROLL_STARTED, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3, 691 150, 150, 150, 150, true, false, true, false, true, false); 692 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 693 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3, 694 250, 250, 250, 250, true, false, true, false, true, false); 695 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 696 ScrollEvent.SCROLL_FINISHED, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3, 697 250, 250, 250, 250, true, false, true, false, true, false); 698 699 // inertia 700 scrolled = false; 701 scrolled2 = false; 702 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 703 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3, 704 250, 250, 250, 250, true, false, true, false, true, true); 705 assertTrue(scrolled); 706 assertFalse(scrolled2); 707 708 // wheel 709 scrolled = false; 710 scrolled2 = false; 711 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 712 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3, 713 250, 250, 250, 250, true, false, true, false, true, false); 714 assertFalse(scrolled); 715 assertTrue(scrolled2); 716 717 // inertia 718 scrolled = false; 719 scrolled2 = false; 720 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 721 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3, 722 250, 250, 250, 250, true, false, true, false, true, true); 723 assertTrue(scrolled); 724 assertFalse(scrolled2); 725 } 726 727 @Test 728 public void unknownLocationShouldBeReplacedByMouseLocation() { 729 Scene scene = createScene(); 730 Rectangle rect1 = 731 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0); 732 Rectangle rect2 = 733 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(1); 734 rect1.addEventHandler(ScrollEvent.ANY, new EventHandler<ScrollEvent>() { 735 @Override public void handle(ScrollEvent event) { 736 scrolled = true; 737 } 738 }); 739 740 MouseEventGenerator generator = new MouseEventGenerator(); 741 742 scrolled = false; 743 scrolled2 = false; 744 rect2.setOnScrollStarted(new EventHandler<ScrollEvent>() { 745 @Override public void handle(ScrollEvent event) { 746 assertEquals(250.0, event.getSceneX(), 0.0001); 747 assertEquals(250.0, event.getSceneY(), 0.0001); 748 scrolled2 = true; 749 } 750 }); 751 scene.impl_processMouseEvent(generator.generateMouseEvent( 752 MouseEvent.MOUSE_MOVED, 250, 250)); 753 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 754 ScrollEvent.SCROLL_STARTED, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3, 755 Double.NaN, Double.NaN, Double.NaN, Double.NaN, 756 true, false, true, false, true, false); 757 assertFalse(scrolled); 758 assertTrue(scrolled2); 759 760 scrolled = false; 761 scrolled2 = false; 762 rect2.setOnScroll(new EventHandler<ScrollEvent>() { 763 @Override public void handle(ScrollEvent event) { 764 assertEquals(150.0, event.getSceneX(), 0.0001); 765 assertEquals(150.0, event.getSceneY(), 0.0001); 766 scrolled2 = true; 767 } 768 }); 769 scene.impl_processMouseEvent(generator.generateMouseEvent( 770 MouseEvent.MOUSE_MOVED, 150, 150)); 771 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 772 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3, 773 Double.NaN, Double.NaN, Double.NaN, Double.NaN, 774 true, false, true, false, true, false); 775 assertFalse(scrolled); 776 assertTrue(scrolled2); 777 778 scrolled = false; 779 scrolled2 = false; 780 rect2.setOnScrollFinished(new EventHandler<ScrollEvent>() { 781 @Override public void handle(ScrollEvent event) { 782 assertEquals(150.0, event.getSceneX(), 0.0001); 783 assertEquals(150.0, event.getSceneY(), 0.0001); 784 scrolled2 = true; 785 } 786 }); 787 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 788 ScrollEvent.SCROLL_FINISHED, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3, 789 Double.NaN, Double.NaN, Double.NaN, Double.NaN, 790 true, false, true, false, true, false); 791 assertFalse(scrolled); 792 assertTrue(scrolled2); 793 } 794 795 @Test 796 public void finishedLocationShouldBeFixed() { 797 Scene scene = createScene(); 798 Rectangle rect = 799 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0); 800 rect.setOnScrollFinished(new EventHandler<ScrollEvent>() { 801 @Override public void handle(ScrollEvent event) { 802 assertEquals(250.0, event.getSceneX(), 0.0001); 803 assertEquals(250.0, event.getSceneY(), 0.0001); 804 scrolled = true; 805 } 806 }); 807 808 scrolled = false; 809 810 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 811 ScrollEvent.SCROLL_STARTED, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3, 812 150, 150, 150, 150, true, false, true, false, true, false); 813 814 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 815 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3, 816 250, 250, 250, 250, true, false, true, false, true, false); 817 818 assertFalse(scrolled); 819 820 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 821 ScrollEvent.SCROLL_FINISHED, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3, 822 Double.NaN, Double.NaN, Double.NaN, Double.NaN, 823 true, false, true, false, true, false); 824 825 assertTrue(scrolled); 826 } 827 828 @Test 829 public void unknownLocalShouldBeFixedByMousePosition() { 830 MouseEventGenerator gen = new MouseEventGenerator(); 831 Scene scene = createScene(); 832 Rectangle rect = 833 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0); 834 835 rect.setOnScroll(new EventHandler<ScrollEvent>() { 836 @Override public void handle(ScrollEvent event) { 837 assertEquals(150.0, event.getSceneX(), 0.0001); 838 assertEquals(150.0, event.getSceneY(), 0.0001); 839 scrolled = true; 840 } 841 }); 842 843 scrolled = false; 844 845 scene.impl_processMouseEvent( 846 gen.generateMouseEvent(MouseEvent.MOUSE_MOVED, 250, 250)); 847 848 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 849 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3, 850 Double.NaN, Double.NaN, Double.NaN, Double.NaN, 851 true, false, true, false, true, false); 852 853 assertFalse(scrolled); 854 855 scene.impl_processMouseEvent( 856 gen.generateMouseEvent(MouseEvent.MOUSE_MOVED, 150, 150)); 857 858 ((StubScene) scene.impl_getPeer()).getListener().scrollEvent( 859 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3, 860 Double.NaN, Double.NaN, Double.NaN, Double.NaN, 861 true, false, true, false, true, false); 862 863 assertTrue(scrolled); 864 } 865 866 @Test public void testToString() { 867 ScrollEvent e = new ScrollEvent(ScrollEvent.SCROLL, 868 100, 100, 200, 200, 869 false, false, false, false, 870 true, false, 10, 10, 20, 20,ScrollEvent.HorizontalTextScrollUnits.NONE, 0, 871 ScrollEvent.VerticalTextScrollUnits.NONE, 0, 872 3, null); 873 874 String s = e.toString(); 875 876 assertNotNull(s); 877 assertFalse(s.isEmpty()); 878 } 879 880 private Scene createScene() { 881 final Group root = new Group(); 882 883 final Scene scene = new Scene(root, 400, 400); 884 885 Rectangle rect = new Rectangle(100, 100, 100, 100); 886 Rectangle rect2 = new Rectangle(200, 200, 100, 100); 887 888 root.getChildren().addAll(rect, rect2); 889 890 Stage stage = new Stage(); 891 stage.setScene(scene); 892 stage.show(); 893 894 return scene; 895 } 896 }