jaroslav@845: /** jaroslav@845: * Back 2 Browser Bytecode Translator jaroslav@845: * Copyright (C) 2012 Jaroslav Tulach jaroslav@845: * jaroslav@845: * This program is free software: you can redistribute it and/or modify jaroslav@845: * it under the terms of the GNU General Public License as published by jaroslav@845: * the Free Software Foundation, version 2 of the License. jaroslav@845: * jaroslav@845: * This program is distributed in the hope that it will be useful, jaroslav@845: * but WITHOUT ANY WARRANTY; without even the implied warranty of jaroslav@845: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the jaroslav@845: * GNU General Public License for more details. jaroslav@845: * jaroslav@845: * You should have received a copy of the GNU General Public License jaroslav@845: * along with this program. Look for COPYING file in the top folder. jaroslav@845: * If not, see http://opensource.org/licenses/GPL-2.0. jaroslav@845: */ jaroslav@845: package org.apidesign.bck2brwsr.launcher.impl; jaroslav@845: jaroslav@845: import java.util.List; jaroslav@845: import java.util.logging.Level; jaroslav@845: import java.util.logging.Logger; jaroslav@845: import javafx.application.Application; jaroslav@845: import javafx.beans.value.ChangeListener; jaroslav@845: import javafx.beans.value.ObservableValue; jaroslav@845: import javafx.concurrent.Worker; jaroslav@845: import javafx.event.ActionEvent; jaroslav@845: import javafx.event.EventHandler; jaroslav@845: import javafx.geometry.HPos; jaroslav@845: import javafx.geometry.Insets; jaroslav@845: import javafx.geometry.VPos; jaroslav@845: import javafx.scene.Node; jaroslav@845: import javafx.scene.Scene; jaroslav@845: import javafx.scene.control.Button; jaroslav@845: import javafx.scene.control.TextField; jaroslav@845: import javafx.scene.layout.ColumnConstraints; jaroslav@845: import javafx.scene.layout.GridPane; jaroslav@845: import javafx.scene.layout.Pane; jaroslav@845: import javafx.scene.layout.Priority; jaroslav@845: import javafx.scene.layout.VBox; jaroslav@845: import javafx.scene.web.WebEngine; jaroslav@845: import javafx.scene.web.WebEvent; jaroslav@845: import javafx.scene.web.WebView; jaroslav@845: import javafx.stage.Stage; jaroslav@845: import javax.swing.JOptionPane; jaroslav@845: import netscape.javascript.JSObject; jaroslav@845: jaroslav@845: /** jaroslav@845: * Demonstrates a WebView object accessing a web page. jaroslav@845: * jaroslav@845: * @see javafx.scene.web.WebView jaroslav@845: * @see javafx.scene.web.WebEngine jaroslav@845: */ jaroslav@845: public class FXBrwsr extends Application { jaroslav@845: private static final Logger LOG = Logger.getLogger(FXBrwsr.class.getName()); jaroslav@845: jaroslav@845: @Override jaroslav@845: public void start(Stage primaryStage) throws Exception { jaroslav@845: Pane root = new WebViewPane(getParameters().getUnnamed()); jaroslav@845: primaryStage.setScene(new Scene(root, 1024, 768)); jaroslav@845: primaryStage.show(); jaroslav@845: } jaroslav@845: jaroslav@845: /** jaroslav@845: * Create a resizable WebView pane jaroslav@845: */ jaroslav@845: private class WebViewPane extends Pane { jaroslav@845: private final JVMBridge bridge = new JVMBridge(); jaroslav@845: jaroslav@845: public WebViewPane(List params) { jaroslav@845: VBox.setVgrow(this, Priority.ALWAYS); jaroslav@845: setMaxWidth(Double.MAX_VALUE); jaroslav@845: setMaxHeight(Double.MAX_VALUE); jaroslav@845: WebView view = new WebView(); jaroslav@845: view.setMinSize(500, 400); jaroslav@845: view.setPrefSize(500, 400); jaroslav@845: final WebEngine eng = view.getEngine(); jaroslav@845: final TextField locationField = new TextField(); jaroslav@845: LOG.info("params : " + params); jaroslav@845: if (params.size() > 0) { jaroslav@845: eng.getLoadWorker().stateProperty().addListener(new ChangeListener() { jaroslav@845: @Override jaroslav@845: public void changed(ObservableValue ov, Worker.State t, Worker.State t1) { jaroslav@845: LOG.info("about to init bck2brwsr"); jaroslav@845: initBck2Brwsr(eng); jaroslav@845: LOG.info("done init of bck2brwsr"); jaroslav@845: } jaroslav@845: }); jaroslav@845: LOG.info("loading page " + params.get(0)); jaroslav@845: eng.load(params.get(0)); jaroslav@845: LOG.info("done loading page "); jaroslav@845: locationField.setText(params.get(0)); jaroslav@845: } jaroslav@845: locationField.setMaxHeight(Double.MAX_VALUE); jaroslav@845: Button goButton = new Button("Go"); jaroslav@845: goButton.setDefaultButton(true); jaroslav@845: EventHandler goAction = new EventHandler() { jaroslav@845: @Override jaroslav@845: public void handle(ActionEvent event) { jaroslav@845: eng.load(locationField.getText().startsWith("http://") ? locationField.getText() : "http://" + locationField.getText()); jaroslav@845: } jaroslav@845: }; jaroslav@845: goButton.setOnAction(goAction); jaroslav@845: locationField.setOnAction(goAction); jaroslav@845: eng.locationProperty().addListener(new ChangeListener() { jaroslav@845: @Override jaroslav@845: public void changed(ObservableValue observable, String oldValue, String newValue) { jaroslav@845: locationField.setText(newValue); jaroslav@845: } jaroslav@845: }); jaroslav@845: eng.setOnAlert(new EventHandler>() { jaroslav@845: @Override jaroslav@845: public void handle(WebEvent t) { jaroslav@845: JOptionPane.showMessageDialog(null, t.getData()); jaroslav@845: } jaroslav@845: }); jaroslav@845: GridPane grid = new GridPane(); jaroslav@845: grid.setVgap(5); jaroslav@845: grid.setHgap(5); jaroslav@845: GridPane.setConstraints(locationField, 0, 0, 1, 1, HPos.CENTER, VPos.CENTER, Priority.ALWAYS, Priority.SOMETIMES); jaroslav@845: GridPane.setConstraints(goButton, 1, 0); jaroslav@845: GridPane.setConstraints(view, 0, 1, 2, 1, HPos.CENTER, VPos.CENTER, Priority.ALWAYS, Priority.ALWAYS); jaroslav@845: grid.getColumnConstraints().addAll(new ColumnConstraints(100, 100, Double.MAX_VALUE, Priority.ALWAYS, HPos.CENTER, true), new ColumnConstraints(40, 40, 40, Priority.NEVER, HPos.CENTER, true)); jaroslav@845: grid.getChildren().addAll(locationField, goButton, view); jaroslav@845: getChildren().add(grid); jaroslav@845: } jaroslav@845: jaroslav@845: void initBck2Brwsr(WebEngine webEngine) { jaroslav@845: JSObject jsobj = (JSObject) webEngine.executeScript("window"); jaroslav@845: LOG.info("window: " + jsobj); jaroslav@845: System.getProperties().put("webEngine", webEngine); jaroslav@845: Object prev = jsobj.getMember("jvmBridge"); jaroslav@845: if (prev instanceof JSObject) { jaroslav@845: jsobj.setMember("jvmBridge", bridge); jaroslav@845: JSObject jso = (JSObject) prev; jaroslav@845: Object len = jso.getMember("length"); jaroslav@845: if (len instanceof Integer) { jaroslav@845: for (int i = 0; i < (Integer) len; i++) { jaroslav@845: Object slt = jso.getSlot(i); jaroslav@845: if (slt instanceof String) { jaroslav@845: try { jaroslav@845: bridge.loadClass((String) slt); jaroslav@845: } catch (ClassNotFoundException ex) { jaroslav@845: LOG.log(Level.SEVERE, null, ex); jaroslav@845: } jaroslav@845: } jaroslav@845: } jaroslav@845: LOG.info("bck2brwsr: " + jsobj.getMember("bck2brwsr")); jaroslav@845: } jaroslav@845: } jaroslav@845: } jaroslav@845: jaroslav@845: @Override jaroslav@845: protected void layoutChildren() { jaroslav@845: List managed = getManagedChildren(); jaroslav@845: double width = getWidth(); jaroslav@845: double height = getHeight(); jaroslav@845: double top = getInsets().getTop(); jaroslav@845: double right = getInsets().getRight(); jaroslav@845: double left = getInsets().getLeft(); jaroslav@845: double bottom = getInsets().getBottom(); jaroslav@845: for (int i = 0; i < managed.size(); i++) { jaroslav@845: Node child = managed.get(i); jaroslav@845: layoutInArea(child, left, top, width - left - right, height - top - bottom, 0, Insets.EMPTY, true, true, HPos.CENTER, VPos.CENTER); jaroslav@845: } jaroslav@845: } jaroslav@845: } jaroslav@845: jaroslav@845: }