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