1 /*
2 * Copyright (c) 2010, 2015, 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.control;
27
28 import static org.junit.Assert.assertEquals;
29 import static org.junit.Assert.assertFalse;
30 import static org.junit.Assert.assertTrue;
31
32 import javafx.scene.Node;
33 import javafx.scene.Parent;
34 import javafx.scene.Scene;
35 import javafx.scene.control.skin.MenuBarSkinShim;
36 import javafx.scene.input.KeyCode;
37 import javafx.scene.input.MouseEvent;
38 import javafx.scene.layout.AnchorPane;
39 import javafx.scene.layout.VBox;
40 import javafx.stage.Stage;
41
42 import org.junit.Before;
43 import org.junit.Test;
44
45 import test.com.sun.javafx.pgstub.StubToolkit;
46 import test.com.sun.javafx.scene.control.infrastructure.KeyEventFirer;
47 import test.com.sun.javafx.scene.control.infrastructure.MouseEventGenerator;
117 @Test public void testMenuShowHideWithMenuBarWithXYTranslation() {
118 final MouseEventGenerator generator = new MouseEventGenerator();
119 AnchorPane root = new AnchorPane();
120 Menu menu = new Menu("Menu");
121 menu.getItems().add(new MenuItem("MenuItem"));
122 menuBar.getMenus().add(menu);
123 menuBar.setLayoutX(100);
124 menuBar.setLayoutY(100);
125 root.getChildren().add(menuBar);
126 startApp(root);
127 tk.firePulse();
128
129 MenuBarSkin skin = (MenuBarSkin)menuBar.getSkin();
130 assertTrue(skin != null);
131
132 double xval = (menuBar.localToScene(menuBar.getLayoutBounds())).getMinX();
133 double yval = (menuBar.localToScene(menuBar.getLayoutBounds())).getMinY();
134
135 MenuButton mb = MenuBarSkinShim.getNodeForMenu(skin, 0);
136 mb.getScene().getWindow().requestFocus();
137 scene.impl_processMouseEvent(
138 generator.generateMouseEvent(MouseEvent.MOUSE_PRESSED, xval+20, yval+20));
139 scene.impl_processMouseEvent(
140 generator.generateMouseEvent(MouseEvent.MOUSE_RELEASED, xval+20, yval+20));
141 assertTrue(menu.isShowing());
142
143 }
144
145 @Test public void testSubMenuDismissalWithKeyNavigation() {
146 final MouseEventGenerator generator = new MouseEventGenerator();
147 AnchorPane root = new AnchorPane();
148 Menu menu = new Menu("Menu");
149 Menu menu1 = new Menu("Menu With SubMenu");
150 menu.getItems().add(menu1);
151
152 MenuItem menuItem1 = new MenuItem("MenuItem1");
153 MenuItem menuItem2 = new MenuItem("MenuItem2");
154 menu1.getItems().addAll(menuItem1, menuItem2);
155
156 menuBar.getMenus().add(menu);
157 menuBar.setLayoutX(100);
158 menuBar.setLayoutY(100);
159
160 root.getChildren().add(menuBar);
161 startApp(root);
162 tk.firePulse();
163
164 MenuBarSkin skin = (MenuBarSkin)menuBar.getSkin();
165 assertTrue(skin != null);
166
167 double xval = (menuBar.localToScene(menuBar.getLayoutBounds())).getMinX();
168 double yval = (menuBar.localToScene(menuBar.getLayoutBounds())).getMinY();
169
170 MenuButton mb = MenuBarSkinShim.getNodeForMenu(skin, 0);
171 mb.getScene().getWindow().requestFocus();
172 scene.impl_processMouseEvent(
173 generator.generateMouseEvent(MouseEvent.MOUSE_PRESSED, xval+20, yval+20));
174 scene.impl_processMouseEvent(
175 generator.generateMouseEvent(MouseEvent.MOUSE_RELEASED, xval+20, yval+20));
176 assertTrue(menu.isShowing());
177 /* ------------------------------------------------------------------ */
178
179 // Show subMenu
180 ContextMenuContent menuContent = MenuBarSkinShim.getMenuContent(mb); // ContextMenuContent
181 Node displayNode = MenuBarMenuButtonShim.getDisplayNodeForMenuItem(menuContent, 0); // MenuItemContainer
182
183 displayNode.getScene().getWindow().requestFocus();
184 assertTrue(displayNode.getScene().getWindow().isFocused());
185
186 displayNode.requestFocus(); // requestFocus on 1st Menu
187 assertTrue(displayNode.isFocused());
188 // update currentFocusedIndex
189 MenuBarMenuButtonShim.setCurrentFocusedIndex(menuContent, 0);
190
191 // fire KeyEvent (Enter) on menu1 to show submenu
192 KeyEventFirer keyboard = new KeyEventFirer(menuContent);
193 keyboard.doKeyPress(KeyCode.ENTER);
194 tk.firePulse();
222 MenuItem menuItem = new MenuItem("MenuItem");
223 menu.getItems().add(menuItem);
224
225 menuBar.getMenus().add(menu);
226 menuBar.setLayoutX(100);
227 menuBar.setLayoutY(100);
228
229 root.getChildren().addAll(menuBar);
230
231 startApp(root);
232 tk.firePulse();
233
234 MenuBarSkin skin = (MenuBarSkin)menuBar.getSkin();
235 assertTrue(skin != null);
236 MenuButton mb = MenuBarSkinShim.getNodeForMenu(skin, 0);
237 mb.getScene().getWindow().requestFocus();
238
239 double xval = (menuBar.localToScene(menuBar.getLayoutBounds())).getMinX();
240 double yval = (menuBar.localToScene(menuBar.getLayoutBounds())).getMinY();
241
242 scene.impl_processMouseEvent(
243 generator.generateMouseEvent(MouseEvent.MOUSE_PRESSED, xval+20, yval+20));
244 scene.impl_processMouseEvent(
245 generator.generateMouseEvent(MouseEvent.MOUSE_RELEASED, xval+20, yval+20));
246 assertTrue(menu.isShowing());
247 /* ------------------------------------------------------------------ */
248
249 // Show Menu
250 ContextMenuContent menuContent = MenuBarSkinShim.getMenuContent(mb); // ContextMenuContent
251 Node displayNode = MenuBarMenuButtonShim.getDisplayNodeForMenuItem(menuContent, 0); // MenuItemContainer
252
253 displayNode.getScene().getWindow().requestFocus();
254 assertTrue(displayNode.getScene().getWindow().isFocused());
255
256 displayNode.requestFocus(); // requestFocus on 1st Menu
257 assertTrue(displayNode.isFocused());
258
259 // fire KeyEvent (Enter) on menuitem
260 KeyEventFirer keyboard = new KeyEventFirer(menuContent);
261 keyboard.doKeyPress(KeyCode.ENTER);
262 tk.firePulse();
263
264 // confirm menu is closed.
322
323 menu1.getItems().add(menuItem1);
324 menu2.getItems().add(menuItem2);
325 menu3.getItems().add(menuItem3);
326
327 menuBar.getMenus().addAll(menu1, menu2, menu3);
328 menu2.setDisable(true);
329
330 root.getChildren().addAll(menuBar);
331 startApp(root);
332 tk.firePulse();
333
334 MenuBarSkin skin = (MenuBarSkin)menuBar.getSkin();
335 assertTrue(skin != null);
336
337 double xval = (menuBar.localToScene(menuBar.getLayoutBounds())).getMinX();
338 double yval = (menuBar.localToScene(menuBar.getLayoutBounds())).getMinY();
339
340 MenuButton mb = MenuBarSkinShim.getNodeForMenu(skin, 0);
341 mb.getScene().getWindow().requestFocus();
342 scene.impl_processMouseEvent(
343 MouseEventGenerator.generateMouseEvent(MouseEvent.MOUSE_PRESSED, xval+20, yval+20));
344 scene.impl_processMouseEvent(
345 MouseEventGenerator.generateMouseEvent(MouseEvent.MOUSE_RELEASED, xval+20, yval+20));
346 assertTrue(menu1.isShowing());
347
348 KeyEventFirer keyboard = new KeyEventFirer(mb.getScene());
349 keyboard.doKeyPress(KeyCode.RIGHT);
350 tk.firePulse();
351 assertTrue(menu3.isShowing());
352 }
353
354
355 @Test public void testMenuOnShowingEventFiringWithMenuHideOperation() {
356 VBox root = new VBox();
357 Menu menu = new Menu("Menu");
358
359 MenuItem menuItem1 = new MenuItem("MenuItem1");
360 menu.getItems().addAll(menuItem1);
361
362 menuBar.getMenus().add(menu);
363 menuBar.setLayoutX(100);
364 menuBar.setLayoutY(100);
368 tk.firePulse();
369
370 MenuBarSkin skin = (MenuBarSkin)menuBar.getSkin();
371 assertTrue(skin != null);
372 double xval = (menuBar.localToScene(menuBar.getLayoutBounds())).getMinX();
373 double yval = (menuBar.localToScene(menuBar.getLayoutBounds())).getMinY();
374
375 boolean click = true;
376 final Boolean firstClick = new Boolean(click);
377
378 menu.setOnShowing(t -> {
379 // we should not get here when the menu is hidden
380 assertEquals(firstClick.booleanValue(), true);
381 });
382
383 MenuButton mb = MenuBarSkinShim.getNodeForMenu(skin, 0);
384 mb.getScene().getWindow().requestFocus();
385 mb.requestFocus();
386 assertTrue(mb.isFocused());
387 // click on menu to show
388 scene.impl_processMouseEvent(
389 MouseEventGenerator.generateMouseEvent(MouseEvent.MOUSE_PRESSED, xval+20, yval+20));
390 scene.impl_processMouseEvent(
391 MouseEventGenerator.generateMouseEvent(MouseEvent.MOUSE_RELEASED, xval+20, yval+20));
392 tk.firePulse();
393 assertEquals(menu.showingProperty().get(), true);
394 click = false;
395 // click on menu to hide
396 scene.impl_processMouseEvent(
397 MouseEventGenerator.generateMouseEvent(MouseEvent.MOUSE_PRESSED, xval+20, yval+20));
398 scene.impl_processMouseEvent(
399 MouseEventGenerator.generateMouseEvent(MouseEvent.MOUSE_RELEASED, xval+20, yval+20));
400 tk.firePulse();
401 assertEquals(menu.showingProperty().get(), false);
402 }
403
404 @Test public void testRemovingMenuItemFromMenuNotInScene() {
405 VBox root = new VBox();
406 Menu menu = new Menu("Menu");
407
408 MenuItem menuItem1 = new MenuItem("MenuItem1");
409 menu.getItems().addAll(menuItem1);
410
411 menuBar.getMenus().add(menu);
412 root.getChildren().addAll(menuBar);
413 startApp(root);
414 tk.firePulse();
415
416 // remove menu from menubar
417 menuBar.getMenus().remove(menu);
418 //remove menuitem from menu that was just removed itself.
|
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.control;
27
28 import com.sun.javafx.scene.SceneHelper;
29 import static org.junit.Assert.assertEquals;
30 import static org.junit.Assert.assertFalse;
31 import static org.junit.Assert.assertTrue;
32
33 import javafx.scene.Node;
34 import javafx.scene.Parent;
35 import javafx.scene.Scene;
36 import javafx.scene.control.skin.MenuBarSkinShim;
37 import javafx.scene.input.KeyCode;
38 import javafx.scene.input.MouseEvent;
39 import javafx.scene.layout.AnchorPane;
40 import javafx.scene.layout.VBox;
41 import javafx.stage.Stage;
42
43 import org.junit.Before;
44 import org.junit.Test;
45
46 import test.com.sun.javafx.pgstub.StubToolkit;
47 import test.com.sun.javafx.scene.control.infrastructure.KeyEventFirer;
48 import test.com.sun.javafx.scene.control.infrastructure.MouseEventGenerator;
118 @Test public void testMenuShowHideWithMenuBarWithXYTranslation() {
119 final MouseEventGenerator generator = new MouseEventGenerator();
120 AnchorPane root = new AnchorPane();
121 Menu menu = new Menu("Menu");
122 menu.getItems().add(new MenuItem("MenuItem"));
123 menuBar.getMenus().add(menu);
124 menuBar.setLayoutX(100);
125 menuBar.setLayoutY(100);
126 root.getChildren().add(menuBar);
127 startApp(root);
128 tk.firePulse();
129
130 MenuBarSkin skin = (MenuBarSkin)menuBar.getSkin();
131 assertTrue(skin != null);
132
133 double xval = (menuBar.localToScene(menuBar.getLayoutBounds())).getMinX();
134 double yval = (menuBar.localToScene(menuBar.getLayoutBounds())).getMinY();
135
136 MenuButton mb = MenuBarSkinShim.getNodeForMenu(skin, 0);
137 mb.getScene().getWindow().requestFocus();
138 SceneHelper.processMouseEvent(scene,
139 generator.generateMouseEvent(MouseEvent.MOUSE_PRESSED, xval+20, yval+20));
140 SceneHelper.processMouseEvent(scene,
141 generator.generateMouseEvent(MouseEvent.MOUSE_RELEASED, xval+20, yval+20));
142 assertTrue(menu.isShowing());
143
144 }
145
146 @Test public void testSubMenuDismissalWithKeyNavigation() {
147 final MouseEventGenerator generator = new MouseEventGenerator();
148 AnchorPane root = new AnchorPane();
149 Menu menu = new Menu("Menu");
150 Menu menu1 = new Menu("Menu With SubMenu");
151 menu.getItems().add(menu1);
152
153 MenuItem menuItem1 = new MenuItem("MenuItem1");
154 MenuItem menuItem2 = new MenuItem("MenuItem2");
155 menu1.getItems().addAll(menuItem1, menuItem2);
156
157 menuBar.getMenus().add(menu);
158 menuBar.setLayoutX(100);
159 menuBar.setLayoutY(100);
160
161 root.getChildren().add(menuBar);
162 startApp(root);
163 tk.firePulse();
164
165 MenuBarSkin skin = (MenuBarSkin)menuBar.getSkin();
166 assertTrue(skin != null);
167
168 double xval = (menuBar.localToScene(menuBar.getLayoutBounds())).getMinX();
169 double yval = (menuBar.localToScene(menuBar.getLayoutBounds())).getMinY();
170
171 MenuButton mb = MenuBarSkinShim.getNodeForMenu(skin, 0);
172 mb.getScene().getWindow().requestFocus();
173 SceneHelper.processMouseEvent(scene,
174 generator.generateMouseEvent(MouseEvent.MOUSE_PRESSED, xval+20, yval+20));
175 SceneHelper.processMouseEvent(scene,
176 generator.generateMouseEvent(MouseEvent.MOUSE_RELEASED, xval+20, yval+20));
177 assertTrue(menu.isShowing());
178 /* ------------------------------------------------------------------ */
179
180 // Show subMenu
181 ContextMenuContent menuContent = MenuBarSkinShim.getMenuContent(mb); // ContextMenuContent
182 Node displayNode = MenuBarMenuButtonShim.getDisplayNodeForMenuItem(menuContent, 0); // MenuItemContainer
183
184 displayNode.getScene().getWindow().requestFocus();
185 assertTrue(displayNode.getScene().getWindow().isFocused());
186
187 displayNode.requestFocus(); // requestFocus on 1st Menu
188 assertTrue(displayNode.isFocused());
189 // update currentFocusedIndex
190 MenuBarMenuButtonShim.setCurrentFocusedIndex(menuContent, 0);
191
192 // fire KeyEvent (Enter) on menu1 to show submenu
193 KeyEventFirer keyboard = new KeyEventFirer(menuContent);
194 keyboard.doKeyPress(KeyCode.ENTER);
195 tk.firePulse();
223 MenuItem menuItem = new MenuItem("MenuItem");
224 menu.getItems().add(menuItem);
225
226 menuBar.getMenus().add(menu);
227 menuBar.setLayoutX(100);
228 menuBar.setLayoutY(100);
229
230 root.getChildren().addAll(menuBar);
231
232 startApp(root);
233 tk.firePulse();
234
235 MenuBarSkin skin = (MenuBarSkin)menuBar.getSkin();
236 assertTrue(skin != null);
237 MenuButton mb = MenuBarSkinShim.getNodeForMenu(skin, 0);
238 mb.getScene().getWindow().requestFocus();
239
240 double xval = (menuBar.localToScene(menuBar.getLayoutBounds())).getMinX();
241 double yval = (menuBar.localToScene(menuBar.getLayoutBounds())).getMinY();
242
243 SceneHelper.processMouseEvent(scene,
244 generator.generateMouseEvent(MouseEvent.MOUSE_PRESSED, xval+20, yval+20));
245 SceneHelper.processMouseEvent(scene,
246 generator.generateMouseEvent(MouseEvent.MOUSE_RELEASED, xval+20, yval+20));
247 assertTrue(menu.isShowing());
248 /* ------------------------------------------------------------------ */
249
250 // Show Menu
251 ContextMenuContent menuContent = MenuBarSkinShim.getMenuContent(mb); // ContextMenuContent
252 Node displayNode = MenuBarMenuButtonShim.getDisplayNodeForMenuItem(menuContent, 0); // MenuItemContainer
253
254 displayNode.getScene().getWindow().requestFocus();
255 assertTrue(displayNode.getScene().getWindow().isFocused());
256
257 displayNode.requestFocus(); // requestFocus on 1st Menu
258 assertTrue(displayNode.isFocused());
259
260 // fire KeyEvent (Enter) on menuitem
261 KeyEventFirer keyboard = new KeyEventFirer(menuContent);
262 keyboard.doKeyPress(KeyCode.ENTER);
263 tk.firePulse();
264
265 // confirm menu is closed.
323
324 menu1.getItems().add(menuItem1);
325 menu2.getItems().add(menuItem2);
326 menu3.getItems().add(menuItem3);
327
328 menuBar.getMenus().addAll(menu1, menu2, menu3);
329 menu2.setDisable(true);
330
331 root.getChildren().addAll(menuBar);
332 startApp(root);
333 tk.firePulse();
334
335 MenuBarSkin skin = (MenuBarSkin)menuBar.getSkin();
336 assertTrue(skin != null);
337
338 double xval = (menuBar.localToScene(menuBar.getLayoutBounds())).getMinX();
339 double yval = (menuBar.localToScene(menuBar.getLayoutBounds())).getMinY();
340
341 MenuButton mb = MenuBarSkinShim.getNodeForMenu(skin, 0);
342 mb.getScene().getWindow().requestFocus();
343 SceneHelper.processMouseEvent(scene,
344 MouseEventGenerator.generateMouseEvent(MouseEvent.MOUSE_PRESSED, xval+20, yval+20));
345 SceneHelper.processMouseEvent(scene,
346 MouseEventGenerator.generateMouseEvent(MouseEvent.MOUSE_RELEASED, xval+20, yval+20));
347 assertTrue(menu1.isShowing());
348
349 KeyEventFirer keyboard = new KeyEventFirer(mb.getScene());
350 keyboard.doKeyPress(KeyCode.RIGHT);
351 tk.firePulse();
352 assertTrue(menu3.isShowing());
353 }
354
355
356 @Test public void testMenuOnShowingEventFiringWithMenuHideOperation() {
357 VBox root = new VBox();
358 Menu menu = new Menu("Menu");
359
360 MenuItem menuItem1 = new MenuItem("MenuItem1");
361 menu.getItems().addAll(menuItem1);
362
363 menuBar.getMenus().add(menu);
364 menuBar.setLayoutX(100);
365 menuBar.setLayoutY(100);
369 tk.firePulse();
370
371 MenuBarSkin skin = (MenuBarSkin)menuBar.getSkin();
372 assertTrue(skin != null);
373 double xval = (menuBar.localToScene(menuBar.getLayoutBounds())).getMinX();
374 double yval = (menuBar.localToScene(menuBar.getLayoutBounds())).getMinY();
375
376 boolean click = true;
377 final Boolean firstClick = new Boolean(click);
378
379 menu.setOnShowing(t -> {
380 // we should not get here when the menu is hidden
381 assertEquals(firstClick.booleanValue(), true);
382 });
383
384 MenuButton mb = MenuBarSkinShim.getNodeForMenu(skin, 0);
385 mb.getScene().getWindow().requestFocus();
386 mb.requestFocus();
387 assertTrue(mb.isFocused());
388 // click on menu to show
389 SceneHelper.processMouseEvent(scene,
390 MouseEventGenerator.generateMouseEvent(MouseEvent.MOUSE_PRESSED, xval+20, yval+20));
391 SceneHelper.processMouseEvent(scene,
392 MouseEventGenerator.generateMouseEvent(MouseEvent.MOUSE_RELEASED, xval+20, yval+20));
393 tk.firePulse();
394 assertEquals(menu.showingProperty().get(), true);
395 click = false;
396 // click on menu to hide
397 SceneHelper.processMouseEvent(scene,
398 MouseEventGenerator.generateMouseEvent(MouseEvent.MOUSE_PRESSED, xval+20, yval+20));
399 SceneHelper.processMouseEvent(scene,
400 MouseEventGenerator.generateMouseEvent(MouseEvent.MOUSE_RELEASED, xval+20, yval+20));
401 tk.firePulse();
402 assertEquals(menu.showingProperty().get(), false);
403 }
404
405 @Test public void testRemovingMenuItemFromMenuNotInScene() {
406 VBox root = new VBox();
407 Menu menu = new Menu("Menu");
408
409 MenuItem menuItem1 = new MenuItem("MenuItem1");
410 menu.getItems().addAll(menuItem1);
411
412 menuBar.getMenus().add(menu);
413 root.getChildren().addAll(menuBar);
414 startApp(root);
415 tk.firePulse();
416
417 // remove menu from menubar
418 menuBar.getMenus().remove(menu);
419 //remove menuitem from menu that was just removed itself.
|