Changeset 566 for trunk/src/org/expeditee/items/widgets
- Timestamp:
- 12/04/13 10:41:04 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/expeditee/items/widgets/JfxBrowser.java
r565 r566 41 41 import org.expeditee.items.Justification; 42 42 import org.expeditee.items.Text; 43 import org.expeditee.reflection.JavaFX; 43 44 import org.jfree.chart.labels.IntervalCategoryItemLabelGenerator; 44 45 import org.w3c.dom.Document; … … 66 67 private WebBrowserPanel _browser; 67 68 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 will131 // cause JFX to exit, preventing JFX elements from displaying at all132 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 180 69 private static class WebBrowserPanel extends JPanel implements ComponentListener { 181 70 … … 204 93 this.addComponentListener(this); 205 94 try { 206 jfxPanel = J FXPanel.newInstance();95 jfxPanel = JavaFX.JFXPanel.newInstance(); 207 96 208 97 // Toolbar (that can't be dragged) to hold the nav buttons, url bar, etc … … 369 258 this.setBackground(new Color(100, 100, 100)); 370 259 371 PlatformRunLater.invoke(null, new Runnable() {260 JavaFX.PlatformRunLater.invoke(null, new Runnable() { 372 261 @Override 373 262 public void run() { … … 388 277 private void initFx(String url) { 389 278 try { 390 this.webview = WebView.newInstance();391 392 Object scene = SceneConstructor.newInstance(this.webview);393 394 J FXPanelSetScene.invoke(jfxPanel, scene);395 396 ReadOnlyObjectPropertyAddListener.invoke(WorkerStateProperty.invoke(WebEngineGetLoadWorker397 .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 }, 399 288 new java.lang.reflect.InvocationHandler() { 400 289 @Override … … 413 302 System.out.println(args[0].getClass()); 414 303 // 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]); 417 306 switch (id) { 418 307 case 0: // READY … … 426 315 427 316 // 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))); 429 318 break; 430 319 case 3: // SUCCEEDED … … 454 343 // }); 455 344 456 WebEngineLoad.invoke(WebViewGetEngine.invoke(this.webview), url);345 JavaFX.WebEngineLoad.invoke(JavaFX.WebViewGetEngine.invoke(this.webview), url); 457 346 } catch (Exception e) { 458 347 e.printStackTrace(); … … 517 406 System.out.println(actualURL); 518 407 try { 519 PlatformRunLater.invoke(null, new Runnable() {408 JavaFX.PlatformRunLater.invoke(null, new Runnable() { 520 409 @Override 521 410 public void run() { 522 411 try { 523 WebEngineLoad.invoke(WebViewGetEngine.invoke(JfxBrowser.this._browser.webview), actualURL);412 JavaFX.WebEngineLoad.invoke(JavaFX.WebViewGetEngine.invoke(JfxBrowser.this._browser.webview), actualURL); 524 413 } catch (Exception e) { 525 414 e.printStackTrace(); … … 538 427 public void navigateBack() { 539 428 try { 540 final Object webEngine = WebViewGetEngine.invoke(this._browser.webview);429 final Object webEngine = JavaFX.WebViewGetEngine.invoke(this._browser.webview); 541 430 try { 542 PlatformRunLater.invoke(null, new Runnable() {431 JavaFX.PlatformRunLater.invoke(null, new Runnable() { 543 432 @Override 544 433 public void run() { 545 434 try { 546 WebHistoryGo.invoke(WebEngineGetHistory.invoke(webEngine), -1);435 JavaFX.WebHistoryGo.invoke(JavaFX.WebEngineGetHistory.invoke(webEngine), -1); 547 436 FreeItems.getInstance().clear(); 548 437 } catch (InvocationTargetException e) { … … 567 456 public void navigateForward() { 568 457 try { 569 final Object webEngine = WebViewGetEngine.invoke(this._browser.webview);458 final Object webEngine = JavaFX.WebViewGetEngine.invoke(this._browser.webview); 570 459 try { 571 PlatformRunLater.invoke(null, new Runnable() {460 JavaFX.PlatformRunLater.invoke(null, new Runnable() { 572 461 @Override 573 462 public void run() { 574 463 try { 575 WebHistoryGo.invoke(WebEngineGetHistory.invoke(webEngine), 1);464 JavaFX.WebHistoryGo.invoke(JavaFX.WebEngineGetHistory.invoke(webEngine), 1); 576 465 FreeItems.getInstance().clear(); 577 466 } catch (InvocationTargetException e) { … … 595 484 public void refresh() { 596 485 try { 597 final Object webEngine = WebViewGetEngine.invoke(this._browser.webview);486 final Object webEngine = JavaFX.WebViewGetEngine.invoke(this._browser.webview); 598 487 try { 599 PlatformRunLater.invoke(null, new Runnable() {488 JavaFX.PlatformRunLater.invoke(null, new Runnable() { 600 489 @Override 601 490 public void run() { 602 491 try { 603 WebEngineReload.invoke(webEngine);492 JavaFX.WebEngineReload.invoke(webEngine); 604 493 FreeItems.getInstance().clear(); 605 494 MessageBay.displayMessage("Page Refreshing"); … … 623 512 try { 624 513 // 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); 626 515 627 516 try { 628 PlatformRunLater.invoke(null, new Runnable() {517 JavaFX.PlatformRunLater.invoke(null, new Runnable() { 629 518 @Override 630 519 public void run() { 631 520 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"); 635 524 NodeList nodes = doc.getElementsByTagName("*"); 636 525 637 526 // 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, 639 528 "function getTextNodes(rootNode){" 640 529 + "var node;" … … 648 537 + "getTextNodes(document.body)"); 649 538 650 int textNodesLength = (Integer) J SObejctGetMember.invoke(textNodes, "length");539 int textNodesLength = (Integer) JavaFX.JSObjectGetMember.invoke(textNodes, "length"); 651 540 652 541 for (int i = 0; i < textNodesLength; i++) { 653 Node textItem = (Node) J SObejctGetSlot.invoke(textNodes, i);542 Node textItem = (Node) JavaFX.JSObjectGetSlot.invoke(textNodes, i); 654 543 655 544 Element e = (Element) textItem.getParentNode(); 656 545 657 Object style = J SObejctCall.invoke(window, "getComputedStyle", new Object[] { e });546 Object style = JavaFX.JSObjectCall.invoke(window, "getComputedStyle", new Object[] { e }); 658 547 659 548 // Checking if the element is actually visible on the page 660 if ((Integer) J SObejctGetMember.invoke(e, "offsetWidth") > 0 && (Integer) JSObejctGetMember.invoke(e, "offsetHeight") > 0661 && !(((String) J SObejctCall.invoke(style, "getPropertyValue", new Object[] { "visibility" })).equals("hidden"))662 && !(((String) J SObejctCall.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"))) { 663 552 664 553 // Getting a rectangle that represents the area and position of the element 665 Object bounds = J SObejctCall.invoke(e, "getBoundingClientRect", new Object[] {});554 Object bounds = JavaFX.JSObjectCall.invoke(e, "getBoundingClientRect", new Object[] {}); 666 555 667 556 // Bounding rectangle position is relative to the current view, so scroll position must be added to x/y 668 float x = Float.valueOf(J SObejctGetMember.invoke(bounds, "left").toString())669 + Float.valueOf( WebEngineExecuteScript.invoke(webEngine, "window.pageXOffset").toString());670 float y = Float.valueOf(J SObejctGetMember.invoke(bounds, "top").toString())671 + Float.valueOf( WebEngineExecuteScript.invoke(webEngine, "window.pageYOffset").toString());672 673 Float width = Float.valueOf(J SObejctGetMember.invoke(bounds, "width").toString());674 675 String fontSize = ((String) J SObejctCall.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" })); 676 565 fontSize = fontSize.substring(0, fontSize.length() - 2); 677 String color = (String) J SObejctCall.invoke(style, "getPropertyValue", new Object[] { "color" });678 String bgColor = (String) J SObejctCall.invoke(style, "getPropertyValue", new Object[] { "background-color" });679 String align = (String) J SObejctCall.invoke(style, "getPropertyValue", new Object[] { "text-align" });680 String typeface = (String) J SObejctCall.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" }); 681 570 typeface = typeface.split(",")[0].trim(); 682 String weight = (String) J SObejctCall.invoke(style, "getPropertyValue", new Object[] { "font-weight" });571 String weight = (String) JavaFX.JSObjectCall.invoke(style, "getPropertyValue", new Object[] { "font-weight" }); 683 572 684 573 Text t; … … 788 677 if (this._browser.webview != null) { 789 678 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)) }; 791 680 } catch (Exception e) { 792 681 e.printStackTrace();
Note:
See TracChangeset
for help on using the changeset viewer.