1 /*
   2  * Copyright (c) 2010, 2014, 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 test.javafx.scene.input;
  27 
  28 import test.com.sun.javafx.pgstub.StubScene;
  29 import javafx.event.Event;
  30 import javafx.scene.Group;
  31 import static org.junit.Assert.assertEquals;
  32 import static org.junit.Assert.assertFalse;
  33 import static org.junit.Assert.assertNotNull;
  34 import static org.junit.Assert.assertSame;
  35 import static org.junit.Assert.assertTrue;
  36 import javafx.scene.Scene;
  37 import javafx.scene.shape.Rectangle;
  38 import javafx.event.EventHandler;
  39 import javafx.geometry.Point3D;
  40 import javafx.scene.input.ContextMenuEvent;
  41 import javafx.scene.input.PickResult;
  42 import javafx.stage.Stage;
  43 
  44 import org.junit.Assert;
  45 import org.junit.Test;
  46 
  47 public class ContextMenuEventTest {
  48 
  49     @Test public void testShortConstructor() {
  50         Rectangle node = new Rectangle(10, 10);
  51         node.setTranslateX(3);
  52         node.setTranslateY(2);
  53         node.setTranslateZ(50);
  54 
  55         PickResult pickRes = new PickResult(node, new Point3D(15, 25, 100), 33);
  56         ContextMenuEvent e = new ContextMenuEvent(
  57                 ContextMenuEvent.CONTEXT_MENU_REQUESTED, 10, 20, 30, 40,
  58                 false, pickRes);
  59         assertSame(ContextMenuEvent.CONTEXT_MENU_REQUESTED, e.getEventType());
  60         assertEquals(18, e.getX(), 10e-20);
  61         assertEquals(27, e.getY(), 10e-20);
  62         assertEquals(150, e.getZ(), 10e-20);
  63         assertEquals(10, e.getSceneX(), 10e-20);
  64         assertEquals(20, e.getSceneY(), 10e-20);
  65         assertEquals(30, e.getScreenX(), 10e-20);
  66         assertEquals(40, e.getScreenY(), 10e-20);
  67         assertFalse(e.isKeyboardTrigger());
  68         assertFalse(e.isConsumed());
  69         assertSame(pickRes, e.getPickResult());
  70         assertSame(Event.NULL_SOURCE_TARGET, e.getSource());
  71         assertSame(Event.NULL_SOURCE_TARGET, e.getTarget());
  72 
  73         e = new ContextMenuEvent(
  74                 ContextMenuEvent.CONTEXT_MENU_REQUESTED, 10, 20, 30, 40,
  75                 true, pickRes);
  76         assertTrue(e.isKeyboardTrigger());
  77     }
  78 
  79     @Test public void testShortConstructorWithoutPickResult() {
  80         ContextMenuEvent e = new ContextMenuEvent(
  81                 ContextMenuEvent.CONTEXT_MENU_REQUESTED, 10, 20, 30, 40,
  82                 false, null);
  83         assertEquals(10, e.getX(), 10e-20);
  84         assertEquals(20, e.getY(), 10e-20);
  85         assertEquals(0, e.getZ(), 10e-20);
  86         assertEquals(10, e.getSceneX(), 10e-20);
  87         assertEquals(20, e.getSceneY(), 10e-20);
  88         assertEquals(30, e.getScreenX(), 10e-20);
  89         assertEquals(40, e.getScreenY(), 10e-20);
  90         assertNotNull(e.getPickResult());
  91         assertNotNull(e.getPickResult().getIntersectedPoint());
  92         assertEquals(10, e.getPickResult().getIntersectedPoint().getX(), 10e-20);
  93         assertEquals(20, e.getPickResult().getIntersectedPoint().getY(), 10e-20);
  94         assertEquals(0, e.getPickResult().getIntersectedPoint().getZ(), 10e-20);
  95         assertSame(Event.NULL_SOURCE_TARGET, e.getSource());
  96         assertSame(Event.NULL_SOURCE_TARGET, e.getTarget());
  97     }
  98 
  99     @Test public void testLongConstructor() {
 100         Rectangle node = new Rectangle(10, 10);
 101         node.setTranslateX(3);
 102         node.setTranslateY(2);
 103         node.setTranslateZ(50);
 104         Rectangle n1 = new Rectangle(10, 10);
 105         Rectangle n2 = new Rectangle(10, 10);
 106 
 107         PickResult pickRes = new PickResult(node, new Point3D(15, 25, 100), 33);
 108         ContextMenuEvent e = new ContextMenuEvent(n1, n2,
 109                 ContextMenuEvent.CONTEXT_MENU_REQUESTED, 10, 20, 30, 40,
 110                 false, pickRes);
 111         assertSame(n1, e.getSource());
 112         assertSame(n2, e.getTarget());
 113         assertSame(ContextMenuEvent.CONTEXT_MENU_REQUESTED, e.getEventType());
 114         assertEquals(18, e.getX(), 10e-20);
 115         assertEquals(27, e.getY(), 10e-20);
 116         assertEquals(150, e.getZ(), 10e-20);
 117         assertEquals(10, e.getSceneX(), 10e-20);
 118         assertEquals(20, e.getSceneY(), 10e-20);
 119         assertEquals(30, e.getScreenX(), 10e-20);
 120         assertEquals(40, e.getScreenY(), 10e-20);
 121         assertFalse(e.isKeyboardTrigger());
 122         assertFalse(e.isConsumed());
 123         assertSame(pickRes, e.getPickResult());
 124 
 125         e = new ContextMenuEvent(
 126                 ContextMenuEvent.CONTEXT_MENU_REQUESTED, 10, 20, 30, 40,
 127                 true, null);
 128         assertTrue(e.isKeyboardTrigger());
 129     }
 130 
 131 
 132     @Test public void testLongConstructorWithoutPickResult() {
 133         Rectangle n1 = new Rectangle(10, 10);
 134         Rectangle n2 = new Rectangle(10, 10);
 135         ContextMenuEvent e = new ContextMenuEvent(n1, n2,
 136                 ContextMenuEvent.CONTEXT_MENU_REQUESTED, 10, 20, 30, 40,
 137                 false, null);
 138         assertSame(n1, e.getSource());
 139         assertSame(n2, e.getTarget());
 140         assertSame(ContextMenuEvent.CONTEXT_MENU_REQUESTED, e.getEventType());
 141         assertEquals(10, e.getX(), 10e-20);
 142         assertEquals(20, e.getY(), 10e-20);
 143         assertEquals(0, e.getZ(), 10e-20);
 144         assertEquals(10, e.getSceneX(), 10e-20);
 145         assertEquals(20, e.getSceneY(), 10e-20);
 146         assertEquals(30, e.getScreenX(), 10e-20);
 147         assertEquals(40, e.getScreenY(), 10e-20);
 148         assertNotNull(e.getPickResult());
 149         assertNotNull(e.getPickResult().getIntersectedPoint());
 150         assertEquals(10, e.getPickResult().getIntersectedPoint().getX(), 10e-20);
 151         assertEquals(20, e.getPickResult().getIntersectedPoint().getY(), 10e-20);
 152         assertEquals(0, e.getPickResult().getIntersectedPoint().getZ(), 10e-20);
 153     }
 154 
 155     @Test public void mouseTriggerKeepsCoordinates() {
 156         Rectangle rect = new Rectangle(100, 100);
 157         rect.setTranslateX(100);
 158         rect.setTranslateY(100);
 159         Group root = new Group(rect);
 160         Scene scene = new Scene(root);
 161         Stage stage = new Stage();
 162         stage.setScene(scene);
 163         stage.show();
 164         rect.requestFocus();
 165 
 166         rect.setOnContextMenuRequested(event -> {
 167             Assert.assertEquals(1.0, event.getX(), 0.0001);
 168             Assert.assertEquals(101, event.getSceneX(), 0.0001);
 169             Assert.assertEquals(201, event.getScreenX(), 0.0001);
 170             Assert.assertEquals(2.0, event.getY(), 0.0001);
 171             Assert.assertEquals(102, event.getSceneY(), 0.0001);
 172             Assert.assertEquals(202, event.getScreenY(), 0.0001);
 173             assertFalse(event.isKeyboardTrigger());
 174         });
 175 
 176         ((StubScene) scene.impl_getPeer()).getListener().menuEvent(
 177                 101, 102, 201, 202, false);
 178     }
 179 
 180     @Test public void keyTriggerSetsCoordinatesToFocusOwner() {
 181         Rectangle rect = new Rectangle(100, 100);
 182         rect.setTranslateX(100);
 183         rect.setTranslateY(100);
 184         Group root = new Group(rect);
 185         Scene scene = new Scene(root);
 186         Stage stage = new Stage();
 187         stage.setScene(scene);
 188         stage.show();
 189         rect.requestFocus();
 190 
 191         rect.setOnContextMenuRequested(event -> {
 192             Assert.assertEquals(25.0, event.getX(), 0.0001);
 193             Assert.assertEquals(125, event.getSceneX(), 0.0001);
 194             Assert.assertEquals(225, event.getScreenX(), 0.0001);
 195             Assert.assertEquals(50.0, event.getY(), 0.0001);
 196             Assert.assertEquals(150, event.getSceneY(), 0.0001);
 197             Assert.assertEquals(250, event.getScreenY(), 0.0001);
 198             assertTrue(event.isKeyboardTrigger());
 199         });
 200 
 201         ((StubScene) scene.impl_getPeer()).getListener().menuEvent(
 202                 101, 102, 201, 202, true);
 203     }
 204 
 205     @Test
 206     public void shouldCompute3dCoordinates() {
 207         Rectangle rect = new Rectangle(100, 100);
 208         rect.setTranslateX(100);
 209         rect.setTranslateY(100);
 210         rect.setTranslateZ(50);
 211         Group root = new Group(rect, new Rectangle(0, 0));
 212         Scene scene = new Scene(root);
 213         Stage stage = new Stage();
 214         stage.setScene(scene);
 215         stage.show();
 216         rect.requestFocus();
 217 
 218         rect.setOnContextMenuRequested(event -> {
 219             Assert.assertEquals(1.0, event.getX(), 0.0001);
 220             Assert.assertEquals(101, event.getSceneX(), 0.0001);
 221             Assert.assertEquals(201, event.getScreenX(), 0.0001);
 222             Assert.assertEquals(2.0, event.getY(), 0.0001);
 223             Assert.assertEquals(102, event.getSceneY(), 0.0001);
 224             Assert.assertEquals(202, event.getScreenY(), 0.0001);
 225             Assert.assertEquals(0, event.getZ(), 0.0001);
 226             assertFalse(event.isKeyboardTrigger());
 227         });
 228 
 229         scene.setOnContextMenuRequested(event -> {
 230             Assert.assertEquals(101.0, event.getX(), 0.0001);
 231             Assert.assertEquals(101, event.getSceneX(), 0.0001);
 232             Assert.assertEquals(201, event.getScreenX(), 0.0001);
 233             Assert.assertEquals(102.0, event.getY(), 0.0001);
 234             Assert.assertEquals(102, event.getSceneY(), 0.0001);
 235             Assert.assertEquals(202, event.getScreenY(), 0.0001);
 236             Assert.assertEquals(50, event.getZ(), 0.0001);
 237             assertFalse(event.isKeyboardTrigger());
 238         });
 239 
 240         ((StubScene) scene.impl_getPeer()).getListener().menuEvent(
 241                 101, 102, 201, 202, false);
 242     }
 243 
 244     @Test public void pickResultIsFromEventCoordinates() {
 245         final Rectangle rect = new Rectangle(100, 100);
 246         rect.setTranslateX(100);
 247         rect.setTranslateY(100);
 248         Group root = new Group(rect);
 249         Scene scene = new Scene(root);
 250         Stage stage = new Stage();
 251         stage.setScene(scene);
 252         stage.show();
 253         rect.requestFocus();
 254 
 255         rect.setOnContextMenuRequested(event -> {
 256             PickResult pickRes = event.getPickResult();
 257             assertNotNull(pickRes);
 258             assertSame(rect, pickRes.getIntersectedNode());
 259             assertEquals(25, pickRes.getIntersectedPoint().getX(), 0.00001);
 260             assertEquals(50, pickRes.getIntersectedPoint().getY(), 0.00001);
 261             assertEquals(0, pickRes.getIntersectedPoint().getZ(), 0.00001);
 262         });
 263 
 264         ((StubScene) scene.impl_getPeer()).getListener().menuEvent(
 265                 1330, 1350, 1340, 1360, true);
 266 
 267     }
 268 }