/* * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * * * * * * * * * * * * * * * * * * * * */ package com.sun.javafx.robot.impl; import javafx.collections.ObservableList; import javafx.event.EventType; import javafx.scene.Node; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; import javafx.scene.input.MouseButton; import javafx.scene.input.MouseEvent; import javafx.scene.paint.Color; import javafx.stage.Stage; import com.sun.javafx.robot.FXRobotImage; import javafx.scene.input.ScrollEvent; /** * Utility class class used for accessing certain implementation-specific * runtime functionality. * */ public class FXRobotHelper { static FXRobotInputAccessor inputAccessor; static FXRobotSceneAccessor sceneAccessor; static FXRobotStageAccessor stageAccessor; static FXRobotImageConvertor imageConvertor; /** * Returns a ObservableList containing this passed parent's children. * * Note that application must use/reference javafx.scene.Scene class prior to * using this method (for example, by creating a scene). * * @param p Parent subclass to get children for * @return ObservableList containing this parent's children */ public static ObservableList getChildren(Parent p) { if (sceneAccessor == null) { // TODO: force scene initialization } return sceneAccessor.getChildren(p); } /** * Returns a ObservableList containing {@code Stage}s created at this point. * * Note that application must use/reference javafx.stage.Stage class prior to * using this method (for example, by creating a Stage). * * @return ObservableList containing existing stages */ public static ObservableList getStages() { if (stageAccessor == null) { // TODO: force stage initialization } return stageAccessor.getStages(); } /** * Converts passed integer in IntArgb pixel format to Color. * @return Color object */ public static Color argbToColor(int argb) { int a = argb >> 24; a = a & 0xff; float aa = ((float)a) / 255f; int r = argb >> 16; r = r & 0xff; int g = argb >> 8; g = g & 0xff; int b = argb; b = b & 0xff; return Color.rgb(r, g, b, aa); } /** * @treatAsPrivate implementation detail */ public static void setInputAccessor(FXRobotInputAccessor a) { if (inputAccessor != null) { System.out.println("Warning: Input accessor is already set: " + inputAccessor); Thread.dumpStack(); } inputAccessor = a; } /** * @treatAsPrivate implementation detail */ public static void setSceneAccessor(FXRobotSceneAccessor a) { if (sceneAccessor != null) { System.out.println("Warning: Scene accessor is already set: " + sceneAccessor); Thread.dumpStack(); } sceneAccessor = a; } /** * @treatAsPrivate implementation detail */ public static void setImageConvertor(FXRobotImageConvertor ic) { if (imageConvertor != null) { System.out.println("Warning: Image convertor is already set: " + imageConvertor); Thread.dumpStack(); } imageConvertor = ic; } /** * @treatAsPrivate implementation detail */ public static void setStageAccessor(FXRobotStageAccessor a) { if (stageAccessor != null) { System.out.println("Warning: Stage accessor already set: " + stageAccessor); Thread.dumpStack(); } stageAccessor = a; } /** * @treatAsPrivate implementation detail */ public static abstract class FXRobotStageAccessor { public abstract ObservableList getStages(); } /** * @treatAsPrivate implementation detail */ public static abstract class FXRobotImageConvertor { public abstract FXRobotImage convertToFXRobotImage(Object platformImage); } /** * @treatAsPrivate implementation detail */ public static abstract class FXRobotInputAccessor { public abstract int getCodeForKeyCode(KeyCode keyCode); public abstract KeyCode getKeyCodeForCode(int code); public abstract KeyEvent createKeyEvent( EventType eventType, KeyCode keyCode, String keyChar, String keyText, boolean shiftDown, boolean controlDown, boolean altDown, boolean metaDown); public abstract MouseEvent createMouseEvent( EventType eventType, int x, int y, int screenX, int screenY, MouseButton button, int clickCount, boolean shiftDown, boolean controlDown, boolean altDown, boolean metaDown, boolean popupTrigger, boolean primaryButtonDown, boolean middleButtonDown, boolean secondaryButtonDown); public abstract ScrollEvent createScrollEvent( EventType eventType, int scrollX, int scrollY, ScrollEvent.HorizontalTextScrollUnits xTextUnits, int xText, ScrollEvent.VerticalTextScrollUnits yTextUnits, int yText, int x, int y, int screenX, int screenY, boolean shiftDown, boolean controlDown, boolean altDown, boolean metaDown); } /** * @treatAsPrivate implementation detail */ public static abstract class FXRobotSceneAccessor { public abstract void processKeyEvent(Scene scene, KeyEvent keyEvent); public abstract void processMouseEvent(Scene scene, MouseEvent mouseEvent); public abstract void processScrollEvent(Scene scene, ScrollEvent scrollEvent); public abstract ObservableList getChildren(Parent parent); public abstract Object renderToImage(Scene scene, Object platformImage); } }