jaroslav@1041: /** jaroslav@1041: * Back 2 Browser Bytecode Translator jaroslav@1041: * Copyright (C) 2012 Jaroslav Tulach jaroslav@1041: * jaroslav@1041: * This program is free software: you can redistribute it and/or modify jaroslav@1041: * it under the terms of the GNU General Public License as published by jaroslav@1041: * the Free Software Foundation, version 2 of the License. jaroslav@1041: * jaroslav@1041: * This program is distributed in the hope that it will be useful, jaroslav@1041: * but WITHOUT ANY WARRANTY; without even the implied warranty of jaroslav@1041: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the jaroslav@1041: * GNU General Public License for more details. jaroslav@1041: * jaroslav@1041: * You should have received a copy of the GNU General Public License jaroslav@1041: * along with this program. Look for COPYING file in the top folder. jaroslav@1041: * If not, see http://opensource.org/licenses/GPL-2.0. jaroslav@1041: */ jaroslav@1041: package org.apidesign.bck2brwsr.launcher.fximpl; jaroslav@1041: jaroslav@1041: import java.util.List; jaroslav@1041: import java.util.TooManyListenersException; jaroslav@1041: import java.util.logging.Level; jaroslav@1041: import java.util.logging.Logger; jaroslav@1041: import javafx.application.Application; jaroslav@1041: import javafx.application.Platform; jaroslav@1041: import javafx.beans.value.ChangeListener; jaroslav@1041: import javafx.beans.value.ObservableValue; jaroslav@1041: import javafx.event.ActionEvent; jaroslav@1041: import javafx.event.EventHandler; jaroslav@1041: import javafx.geometry.Insets; jaroslav@1041: import javafx.geometry.Pos; jaroslav@1041: import javafx.scene.Scene; jaroslav@1041: import javafx.scene.control.Button; jaroslav@1166: import javafx.scene.control.ToolBar; jaroslav@1166: import javafx.scene.layout.BorderPane; jaroslav@1166: import javafx.scene.layout.HBox; jaroslav@1041: import javafx.scene.layout.VBox; jaroslav@1041: import javafx.scene.text.Text; jaroslav@1041: import javafx.scene.web.WebEngine; jaroslav@1041: import javafx.scene.web.WebEvent; jaroslav@1041: import javafx.scene.web.WebView; jaroslav@1041: import javafx.stage.Modality; jaroslav@1041: import javafx.stage.Stage; jaroslav@1041: import netscape.javascript.JSObject; jaroslav@1041: jaroslav@1041: /** jaroslav@1041: * Demonstrates a WebView object accessing a web page. jaroslav@1041: * jaroslav@1041: * @see javafx.scene.web.WebView jaroslav@1041: * @see javafx.scene.web.WebEngine jaroslav@1041: */ jaroslav@1041: public class FXBrwsr extends Application { jaroslav@1041: private static final Logger LOG = Logger.getLogger(FXBrwsr.class.getName()); jaroslav@1169: jaroslav@1041: @Override jaroslav@1041: public void start(Stage primaryStage) throws Exception { jaroslav@1166: WebView view = new WebView(); jaroslav@1283: WebController wc = new WebController(view, getParameters().getUnnamed()); jaroslav@1283: jaroslav@1283: FXInspect.initialize(view.getEngine()); jaroslav@1166: jaroslav@1166: final VBox vbox = new VBox(); jaroslav@1166: vbox.setAlignment( Pos.CENTER ); jaroslav@1166: vbox.setStyle( "-fx-background-color: #808080;"); jaroslav@1166: jaroslav@1166: jaroslav@1166: HBox hbox = new HBox(); jaroslav@1166: hbox.setStyle( "-fx-background-color: #808080;"); jaroslav@1166: hbox.setAlignment(Pos.CENTER); jaroslav@1166: hbox.getChildren().add(vbox); jaroslav@1166: vbox.getChildren().add(view); jaroslav@1166: jaroslav@1166: BorderPane root = new BorderPane(); jaroslav@1167: final boolean showToolbar = "true".equals(this.getParameters().getNamed().get("toolbar")); // NOI18N jaroslav@1167: final boolean useFirebug = "true".equals(this.getParameters().getNamed().get("firebug")); // NOI18N jaroslav@1167: if (showToolbar) { jaroslav@1283: final ToolBar toolbar = new BrowserToolbar(view, vbox, useFirebug); jaroslav@1166: root.setTop( toolbar ); jaroslav@1166: } jaroslav@1166: root.setCenter(hbox); jaroslav@1166: jaroslav@1166: Scene scene = new Scene(root, 800, 600); jaroslav@1166: jaroslav@1166: primaryStage.setTitle( "Device Emulator" ); jaroslav@1166: primaryStage.setScene( scene ); jaroslav@1041: primaryStage.show(); jaroslav@1041: } jaroslav@1041: jaroslav@1041: /** jaroslav@1041: * Create a resizable WebView pane jaroslav@1041: */ jaroslav@1166: private static class WebController { jaroslav@1174: private final JVMBridge bridge; jaroslav@1041: jaroslav@1283: public WebController(WebView view, List params) { jaroslav@1174: this.bridge = new JVMBridge(view.getEngine()); jaroslav@1041: LOG.log(Level.INFO, "Initializing WebView with {0}", params); jaroslav@1041: final WebEngine eng = view.getEngine(); jaroslav@1041: try { jaroslav@1041: JVMBridge.addBck2BrwsrLoad(new InitBck2Brwsr(eng)); jaroslav@1041: } catch (TooManyListenersException ex) { jaroslav@1041: LOG.log(Level.SEVERE, null, ex); jaroslav@1041: } jaroslav@1041: jaroslav@1041: if (params.size() > 0) { jaroslav@1041: LOG.log(Level.INFO, "loading page {0}", params.get(0)); jaroslav@1041: eng.load(params.get(0)); jaroslav@1041: LOG.fine("back from load"); jaroslav@1041: } jaroslav@1041: eng.setOnAlert(new EventHandler>() { jaroslav@1041: @Override jaroslav@1041: public void handle(WebEvent t) { jaroslav@1041: final Stage dialogStage = new Stage(); jaroslav@1041: dialogStage.initModality(Modality.WINDOW_MODAL); jaroslav@1041: dialogStage.setTitle("Warning"); jaroslav@1041: final Button button = new Button("Close"); jaroslav@1041: final Text text = new Text(t.getData()); jaroslav@1041: jaroslav@1041: VBox box = new VBox(); jaroslav@1041: box.setAlignment(Pos.CENTER); jaroslav@1041: box.setSpacing(10); jaroslav@1041: box.setPadding(new Insets(10)); jaroslav@1041: box.getChildren().addAll(text, button); jaroslav@1041: jaroslav@1041: dialogStage.setScene(new Scene(box)); jaroslav@1041: jaroslav@1041: button.setCancelButton(true); jaroslav@1041: button.setOnAction(new EventHandler() { jaroslav@1041: @Override jaroslav@1041: public void handle(ActionEvent t) { jaroslav@1041: dialogStage.close(); jaroslav@1041: } jaroslav@1041: }); jaroslav@1041: jaroslav@1041: dialogStage.centerOnScreen(); jaroslav@1041: dialogStage.showAndWait(); jaroslav@1041: } jaroslav@1041: }); jaroslav@1041: } jaroslav@1041: jaroslav@1041: boolean initBck2Brwsr(WebEngine webEngine) { jaroslav@1041: JSObject jsobj = (JSObject) webEngine.executeScript("window"); jaroslav@1041: LOG.log(Level.FINE, "window: {0}", jsobj); jaroslav@1041: Object prev = jsobj.getMember("bck2brwsr"); jaroslav@1041: if ("undefined".equals(prev)) { jaroslav@1041: jsobj.setMember("bck2brwsr", bridge); jaroslav@1041: return true; jaroslav@1041: } jaroslav@1041: return false; jaroslav@1041: } jaroslav@1041: jaroslav@1041: private class InitBck2Brwsr implements ChangeListener, Runnable { jaroslav@1041: private final WebEngine eng; jaroslav@1041: jaroslav@1041: public InitBck2Brwsr(WebEngine eng) { jaroslav@1041: this.eng = eng; jaroslav@1041: } jaroslav@1041: jaroslav@1041: @Override jaroslav@1041: public synchronized void changed(ObservableValue ov, Void t, Void t1) { jaroslav@1041: Platform.runLater(this); jaroslav@1041: try { jaroslav@1041: wait(); jaroslav@1041: } catch (InterruptedException ex) { jaroslav@1041: LOG.log(Level.SEVERE, null, ex); jaroslav@1041: } jaroslav@1041: } jaroslav@1041: jaroslav@1041: @Override jaroslav@1041: public synchronized void run() { jaroslav@1041: initBck2Brwsr(eng); jaroslav@1041: notifyAll(); jaroslav@1041: } jaroslav@1041: } jaroslav@1041: } jaroslav@1041: jaroslav@1041: }