Ignore:
Timestamp:
12/04/13 10:41:04 (11 years ago)
Author:
jts21
Message:

Move JavaFX reflection to it's own class so it can be accessed by multiple other classes, add WebParser class for parsing a webpage from a WebEngine into a Frame

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/expeditee/items/widgets/JfxBrowser.java

    r565 r566  
    4141import org.expeditee.items.Justification;
    4242import org.expeditee.items.Text;
     43import org.expeditee.reflection.JavaFX;
    4344import org.jfree.chart.labels.IntervalCategoryItemLabelGenerator;
    4445import org.w3c.dom.Document;
     
    6667        private WebBrowserPanel _browser;
    6768
    68         static Class JFXPanel;
    69 
    70         static Class Platform;
    71         static Method PlatformRunLater;
    72 
    73         static Class Group;
    74         static Method GroupGetChildren;
    75 
    76         static Class Scene;
    77         static Constructor SceneConstructor;
    78 
    79         static Class WebView;
    80         static Method JFXPanelSetScene;
    81         static Method WebViewSetPrefSize;
    82         static Method WebViewGetEngine;
    83 
    84         static Class WebEngine;
    85         static Method WebEngineLoad;
    86         static Method WebEngineGetLocation;
    87         static Method WebEngineGetLoadWorker;
    88         static Method WebEngineGetHistory;
    89         static Method WebEngineReload;
    90         static Method WebEngineExecuteScript;
    91 
    92         static Class WebHistory;
    93         static Method WebHistoryGo;
    94 
    95         static Class Worker;
    96         static Method WorkerStateProperty;
    97 
    98         static Class ReadOnlyObjectProperty;
    99         static Method ReadOnlyObjectPropertyAddListener;
    100 
    101         static Class ChangeListener;
    102 
    103         static Class ObservableValue;
    104 
    105         static Class State;
    106         static List<Object> StateConstants;
    107 
    108         static Class JSObject;
    109         static Method JSObejctEval;
    110         static Method JSObejctCall;
    111         static Method JSObejctGetMember;
    112         static Method JSObejctGetSlot;
    113 
    114         static {
    115                 String javaLibDir = System.getProperty("java.home") + File.separator + "lib" + File.separator;
    116                 try {
    117                         ClassLoader classLoader = ClassLoader.getSystemClassLoader();
    118 
    119                         File jar = new File(javaLibDir + "jfxrt.jar");
    120 
    121                         Method addURL = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
    122                         addURL.setAccessible(true);
    123                         addURL.invoke(classLoader, jar.toURI().toURL());
    124 
    125                         JFXPanel = Class.forName("javafx.embed.swing.JFXPanel", false, classLoader);
    126 
    127                         Platform = classLoader.loadClass("javafx.application.Platform");
    128                         PlatformRunLater = Platform.getMethod("runLater", Runnable.class);
    129 
    130                         // Setting JFX to not exit when all panels are hidden, otherwise moving, resizing and changing frames will
    131                         // cause JFX to exit, preventing JFX elements from displaying at all
    132                         Platform.getMethod("setImplicitExit", boolean.class).invoke(null, false);
    133 
    134                         Group = classLoader.loadClass("javafx.scene.Group");
    135                         GroupGetChildren = Group.getMethod("getChildren");
    136 
    137                         Scene = classLoader.loadClass("javafx.scene.Scene");
    138                         SceneConstructor = Scene.getConstructor(classLoader.loadClass("javafx.scene.Parent"));
    139 
    140                         WebView = classLoader.loadClass("javafx.scene.web.WebView");
    141                         JFXPanelSetScene = JFXPanel.getMethod("setScene", Scene);
    142                         WebViewSetPrefSize = WebView.getMethod("setPrefSize", double.class, double.class);
    143                         WebViewGetEngine = WebView.getMethod("getEngine");
    144 
    145                         WebEngine = classLoader.loadClass("javafx.scene.web.WebEngine");
    146                         WebEngineLoad = WebEngine.getMethod("load", String.class);
    147                         WebEngineGetLocation = WebEngine.getMethod("getLocation");
    148                         WebEngineGetLoadWorker = WebEngine.getMethod("getLoadWorker");
    149                         WebEngineGetHistory = WebEngine.getMethod("getHistory");
    150                         WebEngineReload = WebEngine.getMethod("reload");
    151                         WebEngineExecuteScript = WebEngine.getMethod("executeScript", String.class);
    152                        
    153                         WebHistory = classLoader.loadClass("javafx.scene.web.WebHistory");
    154                         WebHistoryGo = WebHistory.getMethod("go", int.class);
    155 
    156                         Worker = classLoader.loadClass("javafx.concurrent.Worker");
    157                         WorkerStateProperty = Worker.getMethod("stateProperty");
    158 
    159                         ChangeListener = classLoader.loadClass("javafx.beans.value.ChangeListener");
    160 
    161                         ReadOnlyObjectProperty = classLoader.loadClass("javafx.beans.property.ReadOnlyObjectProperty");
    162                         ReadOnlyObjectPropertyAddListener = ReadOnlyObjectProperty.getMethod("addListener", ChangeListener);
    163 
    164                         ObservableValue = classLoader.loadClass("javafx.beans.value.ObservableValue");
    165 
    166                         State = classLoader.loadClass("javafx.concurrent.Worker$State");
    167                         StateConstants = Arrays.asList(State.getEnumConstants());
    168 
    169                         JSObject = classLoader.loadClass("netscape.javascript.JSObject");
    170                         JSObejctEval = JSObject.getMethod("eval", String.class);
    171                         JSObejctCall = JSObject.getMethod("call", String.class, Object[].class);
    172                         JSObejctGetMember = JSObject.getMethod("getMember", String.class);
    173                         JSObejctGetSlot = JSObject.getMethod("getSlot", int.class);
    174 
    175                 } catch (Exception e) {
    176                         e.printStackTrace();
    177                 }
    178         }
    179 
    18069        private static class WebBrowserPanel extends JPanel implements ComponentListener {
    18170
     
    20493                        this.addComponentListener(this);
    20594                        try {
    206                                 jfxPanel = JFXPanel.newInstance();
     95                                jfxPanel = JavaFX.JFXPanel.newInstance();
    20796
    20897                                // Toolbar (that can't be dragged) to hold the nav buttons, url bar, etc
     
    369258                                this.setBackground(new Color(100, 100, 100));
    370259
    371                                 PlatformRunLater.invoke(null, new Runnable() {
     260                                JavaFX.PlatformRunLater.invoke(null, new Runnable() {
    372261                                        @Override
    373262                                        public void run() {
     
    388277                private void initFx(String url) {
    389278                        try {
    390                                 this.webview = WebView.newInstance();
    391 
    392                                 Object scene = SceneConstructor.newInstance(this.webview);
    393 
    394                                 JFXPanelSetScene.invoke(jfxPanel, scene);
    395 
    396                                 ReadOnlyObjectPropertyAddListener.invoke(WorkerStateProperty.invoke(WebEngineGetLoadWorker
    397                                         .invoke(WebViewGetEngine.invoke(this.webview))), java.lang.reflect.Proxy.newProxyInstance(
    398                                         ChangeListener.getClassLoader(), new java.lang.Class[] { ChangeListener },
     279                                this.webview = JavaFX.WebView.newInstance();
     280
     281                                Object scene = JavaFX.SceneConstructor.newInstance(this.webview);
     282
     283                                JavaFX.JFXPanelSetScene.invoke(jfxPanel, scene);
     284
     285                                JavaFX.ReadOnlyObjectPropertyAddListener.invoke(JavaFX.WorkerStateProperty.invoke(JavaFX.WebEngineGetLoadWorker
     286                                        .invoke(JavaFX.WebViewGetEngine.invoke(this.webview))), java.lang.reflect.Proxy.newProxyInstance(
     287                                                        JavaFX.ChangeListener.getClassLoader(), new java.lang.Class[] { JavaFX.ChangeListener },
    399288                                        new java.lang.reflect.InvocationHandler() {
    400289                                                @Override
     
    413302                                                                System.out.println(args[0].getClass());
    414303                                                                // args[2] is the new State
    415                                                                 if (args[2].getClass() == State) {
    416                                                                         int id = StateConstants.indexOf(args[2]);
     304                                                                if (args[2].getClass() == JavaFX.State) {
     305                                                                        int id = JavaFX.StateConstants.indexOf(args[2]);
    417306                                                                        switch (id) {
    418307                                                                                case 0: // READY
     
    426315
    427316                                                                                        // Updating the URL bar to display the URL of the page being loaded
    428                                                                                         WebBrowserPanel.this.urlField.setText((String) WebEngineGetLocation.invoke(WebViewGetEngine.invoke(WebBrowserPanel.this.webview)));
     317                                                                                        WebBrowserPanel.this.urlField.setText((String) JavaFX.WebEngineGetLocation.invoke(JavaFX.WebViewGetEngine.invoke(WebBrowserPanel.this.webview)));
    429318                                                                                        break;
    430319                                                                                case 3: // SUCCEEDED
     
    454343                                // });
    455344
    456                                 WebEngineLoad.invoke(WebViewGetEngine.invoke(this.webview), url);
     345                                JavaFX.WebEngineLoad.invoke(JavaFX.WebViewGetEngine.invoke(this.webview), url);
    457346                        } catch (Exception e) {
    458347                                e.printStackTrace();
     
    517406                System.out.println(actualURL);
    518407                try {
    519                         PlatformRunLater.invoke(null, new Runnable() {
     408                        JavaFX.PlatformRunLater.invoke(null, new Runnable() {
    520409                                @Override
    521410                                public void run() {
    522411                                        try {
    523                                                 WebEngineLoad.invoke(WebViewGetEngine.invoke(JfxBrowser.this._browser.webview), actualURL);
     412                                                JavaFX.WebEngineLoad.invoke(JavaFX.WebViewGetEngine.invoke(JfxBrowser.this._browser.webview), actualURL);
    524413                                        } catch (Exception e) {
    525414                                                e.printStackTrace();
     
    538427        public void navigateBack() {
    539428                try {
    540                         final Object webEngine = WebViewGetEngine.invoke(this._browser.webview);
     429                        final Object webEngine = JavaFX.WebViewGetEngine.invoke(this._browser.webview);
    541430                        try {
    542                                 PlatformRunLater.invoke(null, new Runnable() {
     431                                JavaFX.PlatformRunLater.invoke(null, new Runnable() {
    543432                                        @Override
    544433                                        public void run() {
    545434                                                try {
    546                                                         WebHistoryGo.invoke(WebEngineGetHistory.invoke(webEngine), -1);
     435                                                        JavaFX.WebHistoryGo.invoke(JavaFX.WebEngineGetHistory.invoke(webEngine), -1);
    547436                                                        FreeItems.getInstance().clear();
    548437                                                } catch (InvocationTargetException e) {
     
    567456        public void navigateForward() {
    568457                try {
    569                         final Object webEngine = WebViewGetEngine.invoke(this._browser.webview);
     458                        final Object webEngine = JavaFX.WebViewGetEngine.invoke(this._browser.webview);
    570459                        try {
    571                                 PlatformRunLater.invoke(null, new Runnable() {
     460                                JavaFX.PlatformRunLater.invoke(null, new Runnable() {
    572461                                        @Override
    573462                                        public void run() {
    574463                                                try {
    575                                                         WebHistoryGo.invoke(WebEngineGetHistory.invoke(webEngine), 1);
     464                                                        JavaFX.WebHistoryGo.invoke(JavaFX.WebEngineGetHistory.invoke(webEngine), 1);
    576465                                                        FreeItems.getInstance().clear();
    577466                                                } catch (InvocationTargetException e) {
     
    595484        public void refresh() {
    596485                try {
    597                         final Object webEngine = WebViewGetEngine.invoke(this._browser.webview);
     486                        final Object webEngine = JavaFX.WebViewGetEngine.invoke(this._browser.webview);
    598487                        try {
    599                                 PlatformRunLater.invoke(null, new Runnable() {
     488                                JavaFX.PlatformRunLater.invoke(null, new Runnable() {
    600489                                        @Override
    601490                                        public void run() {
    602491                                                try {
    603                                                         WebEngineReload.invoke(webEngine);
     492                                                        JavaFX.WebEngineReload.invoke(webEngine);
    604493                                                        FreeItems.getInstance().clear();
    605494                                                        MessageBay.displayMessage("Page Refreshing");
     
    623512                try {
    624513                        // Reference to the webEngine, to make it easier/possible to get to it inside the run()
    625                         final Object webEngine = WebViewGetEngine.invoke(this._browser.webview);
     514                        final Object webEngine = JavaFX.WebViewGetEngine.invoke(this._browser.webview);
    626515
    627516                        try {
    628                                 PlatformRunLater.invoke(null, new Runnable() {
     517                                JavaFX.PlatformRunLater.invoke(null, new Runnable() {
    629518                                        @Override
    630519                                        public void run() {
    631520                                                try {
    632                                                         HTMLBodyElement doc = (HTMLBodyElement) WebEngineExecuteScript.invoke(webEngine, "document.body");
    633 
    634                                                         Object window = WebEngineExecuteScript.invoke(webEngine, "window");
     521                                                        HTMLBodyElement doc = (HTMLBodyElement) JavaFX.WebEngineExecuteScript.invoke(webEngine, "document.body");
     522
     523                                                        Object window = JavaFX.WebEngineExecuteScript.invoke(webEngine, "window");
    635524                                                        NodeList nodes = doc.getElementsByTagName("*");
    636525
    637526                                                        // Using Javascript to get an array of all the text nodes (i.e. text contents of every HTML tag)
    638                                                         Object textNodes = WebEngineExecuteScript.invoke(webEngine,
     527                                                        Object textNodes = JavaFX.WebEngineExecuteScript.invoke(webEngine,
    639528                                                                        "function getTextNodes(rootNode){"
    640529                                                                                + "var node;"
     
    648537                                                                        + "getTextNodes(document.body)");
    649538
    650                                                         int textNodesLength = (Integer) JSObejctGetMember.invoke(textNodes, "length");
     539                                                        int textNodesLength = (Integer) JavaFX.JSObjectGetMember.invoke(textNodes, "length");
    651540
    652541                                                        for (int i = 0; i < textNodesLength; i++) {
    653                                                                 Node textItem = (Node) JSObejctGetSlot.invoke(textNodes, i);
     542                                                                Node textItem = (Node) JavaFX.JSObjectGetSlot.invoke(textNodes, i);
    654543
    655544                                                                Element e = (Element) textItem.getParentNode();
    656545
    657                                                                 Object style = JSObejctCall.invoke(window, "getComputedStyle", new Object[] { e });
     546                                                                Object style = JavaFX.JSObjectCall.invoke(window, "getComputedStyle", new Object[] { e });
    658547
    659548                                                                // Checking if the element is actually visible on the page
    660                                                                 if ((Integer) JSObejctGetMember.invoke(e, "offsetWidth") > 0 && (Integer) JSObejctGetMember.invoke(e, "offsetHeight") > 0
    661                                                                                 && !(((String) JSObejctCall.invoke(style, "getPropertyValue", new Object[] { "visibility" })).equals("hidden"))
    662                                                                                 && !(((String) JSObejctCall.invoke(style, "getPropertyValue", new Object[] { "display" })).equals("none"))) {
     549                                                                if ((Integer) JavaFX.JSObjectGetMember.invoke(e, "offsetWidth") > 0 && (Integer) JavaFX.JSObjectGetMember.invoke(e, "offsetHeight") > 0
     550                                                                                && !(((String) JavaFX.JSObjectCall.invoke(style, "getPropertyValue", new Object[] { "visibility" })).equals("hidden"))
     551                                                                                && !(((String) JavaFX.JSObjectCall.invoke(style, "getPropertyValue", new Object[] { "display" })).equals("none"))) {
    663552
    664553                                                                        // Getting a rectangle that represents the area and position of the element
    665                                                                         Object bounds = JSObejctCall.invoke(e, "getBoundingClientRect", new Object[] {});
     554                                                                        Object bounds = JavaFX.JSObjectCall.invoke(e, "getBoundingClientRect", new Object[] {});
    666555
    667556                                                                        // Bounding rectangle position is relative to the current view, so scroll position must be added to x/y
    668                                                                         float x = Float.valueOf(JSObejctGetMember.invoke(bounds, "left").toString())
    669                                                                                         + Float.valueOf(WebEngineExecuteScript.invoke(webEngine, "window.pageXOffset").toString());
    670                                                                         float y = Float.valueOf(JSObejctGetMember.invoke(bounds, "top").toString())
    671                                                                                         + Float.valueOf(WebEngineExecuteScript.invoke(webEngine, "window.pageYOffset").toString());
    672 
    673                                                                         Float width = Float.valueOf(JSObejctGetMember.invoke(bounds, "width").toString());
    674 
    675                                                                         String fontSize = ((String) JSObejctCall.invoke(style, "getPropertyValue", new Object[] { "font-size" }));
     557                                                                        float x = Float.valueOf(JavaFX.JSObjectGetMember.invoke(bounds, "left").toString())
     558                                                                                        + Float.valueOf(JavaFX.WebEngineExecuteScript.invoke(webEngine, "window.pageXOffset").toString());
     559                                                                        float y = Float.valueOf(JavaFX.JSObjectGetMember.invoke(bounds, "top").toString())
     560                                                                                        + Float.valueOf(JavaFX.WebEngineExecuteScript.invoke(webEngine, "window.pageYOffset").toString());
     561
     562                                                                        Float width = Float.valueOf(JavaFX.JSObjectGetMember.invoke(bounds, "width").toString());
     563
     564                                                                        String fontSize = ((String) JavaFX.JSObjectCall.invoke(style, "getPropertyValue", new Object[] { "font-size" }));
    676565                                                                        fontSize = fontSize.substring(0, fontSize.length() - 2);
    677                                                                         String color = (String) JSObejctCall.invoke(style, "getPropertyValue", new Object[] { "color" });
    678                                                                         String bgColor = (String) JSObejctCall.invoke(style, "getPropertyValue", new Object[] { "background-color" });
    679                                                                         String align = (String) JSObejctCall.invoke(style, "getPropertyValue", new Object[] { "text-align" });
    680                                                                         String typeface = (String) JSObejctCall.invoke(style, "getPropertyValue", new Object[] { "font-family" });
     566                                                                        String color = (String) JavaFX.JSObjectCall.invoke(style, "getPropertyValue", new Object[] { "color" });
     567                                                                        String bgColor = (String) JavaFX.JSObjectCall.invoke(style, "getPropertyValue", new Object[] { "background-color" });
     568                                                                        String align = (String) JavaFX.JSObjectCall.invoke(style, "getPropertyValue", new Object[] { "text-align" });
     569                                                                        String typeface = (String) JavaFX.JSObjectCall.invoke(style, "getPropertyValue", new Object[] { "font-family" });
    681570                                                                        typeface = typeface.split(",")[0].trim();
    682                                                                         String weight = (String) JSObejctCall.invoke(style, "getPropertyValue", new Object[] { "font-weight" });
     571                                                                        String weight = (String) JavaFX.JSObjectCall.invoke(style, "getPropertyValue", new Object[] { "font-weight" });
    683572
    684573                                                                        Text t;
     
    788677                if (this._browser.webview != null) {
    789678                        try {
    790                                 r = new String[] { (String) WebEngineGetLocation.invoke(WebViewGetEngine.invoke(this._browser.webview)) };
     679                                r = new String[] { (String) JavaFX.WebEngineGetLocation.invoke(JavaFX.WebViewGetEngine.invoke(this._browser.webview)) };
    791680                        } catch (Exception e) {
    792681                                e.printStackTrace();
Note: See TracChangeset for help on using the changeset viewer.