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