rt/launcher/src/main/java/org/apidesign/bck2brwsr/launcher/impl/FXBrwsr.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Wed, 17 Apr 2013 17:04:40 +0200
branchfx
changeset 1004 04efef2a9c1e
parent 856 8d6534b67252
child 1005 512984207634
permissions -rw-r--r--
Rather than piggybacking on first alert call, use the fact that the server and FX Web View are in the same VM and notify the view that bck2brwsr.js is about to be served from the server.
jaroslav@845
     1
/**
jaroslav@845
     2
 * Back 2 Browser Bytecode Translator
jaroslav@845
     3
 * Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
jaroslav@845
     4
 *
jaroslav@845
     5
 * This program is free software: you can redistribute it and/or modify
jaroslav@845
     6
 * it under the terms of the GNU General Public License as published by
jaroslav@845
     7
 * the Free Software Foundation, version 2 of the License.
jaroslav@845
     8
 *
jaroslav@845
     9
 * This program is distributed in the hope that it will be useful,
jaroslav@845
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
jaroslav@845
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
jaroslav@845
    12
 * GNU General Public License for more details.
jaroslav@845
    13
 *
jaroslav@845
    14
 * You should have received a copy of the GNU General Public License
jaroslav@845
    15
 * along with this program. Look for COPYING file in the top folder.
jaroslav@845
    16
 * If not, see http://opensource.org/licenses/GPL-2.0.
jaroslav@845
    17
 */
jaroslav@845
    18
package org.apidesign.bck2brwsr.launcher.impl;
jaroslav@845
    19
jaroslav@845
    20
import java.util.List;
jaroslav@1004
    21
import java.util.TooManyListenersException;
jaroslav@845
    22
import java.util.logging.Level;
jaroslav@845
    23
import java.util.logging.Logger;
jaroslav@845
    24
import javafx.application.Application;
jaroslav@1004
    25
import javafx.application.Platform;
jaroslav@845
    26
import javafx.beans.value.ChangeListener;
jaroslav@845
    27
import javafx.beans.value.ObservableValue;
jaroslav@845
    28
import javafx.event.ActionEvent;
jaroslav@845
    29
import javafx.event.EventHandler;
jaroslav@845
    30
import javafx.geometry.HPos;
jaroslav@845
    31
import javafx.geometry.Insets;
jaroslav@854
    32
import javafx.geometry.Pos;
jaroslav@845
    33
import javafx.geometry.VPos;
jaroslav@845
    34
import javafx.scene.Node;
jaroslav@845
    35
import javafx.scene.Scene;
jaroslav@845
    36
import javafx.scene.control.Button;
jaroslav@845
    37
import javafx.scene.layout.ColumnConstraints;
jaroslav@845
    38
import javafx.scene.layout.GridPane;
jaroslav@845
    39
import javafx.scene.layout.Pane;
jaroslav@845
    40
import javafx.scene.layout.Priority;
jaroslav@845
    41
import javafx.scene.layout.VBox;
jaroslav@854
    42
import javafx.scene.text.Text;
jaroslav@845
    43
import javafx.scene.web.WebEngine;
jaroslav@845
    44
import javafx.scene.web.WebEvent;
jaroslav@845
    45
import javafx.scene.web.WebView;
jaroslav@854
    46
import javafx.stage.Modality;
jaroslav@845
    47
import javafx.stage.Stage;
jaroslav@845
    48
import netscape.javascript.JSObject;
jaroslav@845
    49
jaroslav@845
    50
/**
jaroslav@845
    51
 * Demonstrates a WebView object accessing a web page.
jaroslav@845
    52
 *
jaroslav@845
    53
 * @see javafx.scene.web.WebView
jaroslav@845
    54
 * @see javafx.scene.web.WebEngine
jaroslav@845
    55
 */
jaroslav@845
    56
public class FXBrwsr extends Application {
jaroslav@845
    57
    private static final Logger LOG = Logger.getLogger(FXBrwsr.class.getName());
jaroslav@845
    58
jaroslav@845
    59
    @Override
jaroslav@845
    60
    public void start(Stage primaryStage) throws Exception {
jaroslav@845
    61
        Pane root = new WebViewPane(getParameters().getUnnamed());
jaroslav@845
    62
        primaryStage.setScene(new Scene(root, 1024, 768));
jaroslav@845
    63
        primaryStage.show();
jaroslav@845
    64
    }
jaroslav@845
    65
    
jaroslav@845
    66
    /**
jaroslav@845
    67
     * Create a resizable WebView pane
jaroslav@845
    68
     */
jaroslav@845
    69
    private class WebViewPane extends Pane {
jaroslav@845
    70
        private final JVMBridge bridge = new JVMBridge();
jaroslav@845
    71
jaroslav@845
    72
        public WebViewPane(List<String> params) {
jaroslav@845
    73
            VBox.setVgrow(this, Priority.ALWAYS);
jaroslav@845
    74
            setMaxWidth(Double.MAX_VALUE);
jaroslav@845
    75
            setMaxHeight(Double.MAX_VALUE);
jaroslav@845
    76
            WebView view = new WebView();
jaroslav@845
    77
            view.setMinSize(500, 400);
jaroslav@845
    78
            view.setPrefSize(500, 400);
jaroslav@845
    79
            final WebEngine eng = view.getEngine();
jaroslav@854
    80
            LOG.log(Level.FINE, "params : {0}", params);
jaroslav@1004
    81
            try {
jaroslav@1004
    82
                JVMBridge.addBck2BrwsrLoad(new InitBck2Brwsr(eng));
jaroslav@1004
    83
            } catch (TooManyListenersException ex) {
jaroslav@1004
    84
                LOG.log(Level.SEVERE, null, ex);
jaroslav@1004
    85
            }
jaroslav@1004
    86
            
jaroslav@845
    87
            if (params.size() > 0) {
jaroslav@854
    88
                LOG.log(Level.FINE, "loading page {0}", params.get(0));
jaroslav@845
    89
                eng.load(params.get(0));
jaroslav@854
    90
                LOG.fine("done loading page ");
jaroslav@845
    91
            }
jaroslav@845
    92
            eng.setOnAlert(new EventHandler<WebEvent<String>>() {
jaroslav@845
    93
                @Override
jaroslav@845
    94
                public void handle(WebEvent<String> t) {
jaroslav@854
    95
                    final Stage dialogStage = new Stage();
jaroslav@854
    96
                    dialogStage.initModality(Modality.WINDOW_MODAL);
jaroslav@854
    97
                    dialogStage.setTitle("Warning");
jaroslav@854
    98
                    final Button button = new Button("Close");
jaroslav@854
    99
                    final Text text = new Text(t.getData());
jaroslav@854
   100
                    
jaroslav@854
   101
                    VBox box = new VBox();
jaroslav@854
   102
                    box.setAlignment(Pos.CENTER);
jaroslav@854
   103
                    box.setSpacing(10);
jaroslav@854
   104
                    box.setPadding(new Insets(10));
jaroslav@854
   105
                    box.getChildren().addAll(text, button);
jaroslav@854
   106
                    
jaroslav@854
   107
                    dialogStage.setScene(new Scene(box));
jaroslav@854
   108
                    
jaroslav@854
   109
                    button.setCancelButton(true);
jaroslav@854
   110
                    button.setOnAction(new EventHandler<ActionEvent>() {
jaroslav@854
   111
                        @Override
jaroslav@854
   112
                        public void handle(ActionEvent t) {
jaroslav@854
   113
                            dialogStage.close();
jaroslav@854
   114
                        }
jaroslav@854
   115
                    });
jaroslav@854
   116
                    
jaroslav@854
   117
                    dialogStage.centerOnScreen();
jaroslav@854
   118
                    dialogStage.showAndWait();
jaroslav@845
   119
                }
jaroslav@845
   120
            });
jaroslav@845
   121
            GridPane grid = new GridPane();
jaroslav@845
   122
            grid.setVgap(5);
jaroslav@845
   123
            grid.setHgap(5);
jaroslav@845
   124
            GridPane.setConstraints(view, 0, 1, 2, 1, HPos.CENTER, VPos.CENTER, Priority.ALWAYS, Priority.ALWAYS);
jaroslav@845
   125
            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@856
   126
            grid.getChildren().addAll(view);
jaroslav@845
   127
            getChildren().add(grid);
jaroslav@845
   128
        }
jaroslav@845
   129
jaroslav@854
   130
        boolean initBck2Brwsr(WebEngine webEngine) {
jaroslav@845
   131
            JSObject jsobj = (JSObject) webEngine.executeScript("window");
jaroslav@854
   132
            LOG.log(Level.FINE, "window: {0}", jsobj);
jaroslav@853
   133
            Object prev = jsobj.getMember("bck2brwsr");
jaroslav@853
   134
            if ("undefined".equals(prev)) {
jaroslav@853
   135
                System.getProperties().put("webEngine", webEngine);
jaroslav@853
   136
                jsobj.setMember("bck2brwsr", bridge);
jaroslav@854
   137
                return true;
jaroslav@845
   138
            }
jaroslav@854
   139
            return false;
jaroslav@845
   140
        }
jaroslav@845
   141
jaroslav@845
   142
        @Override
jaroslav@845
   143
        protected void layoutChildren() {
jaroslav@845
   144
            List<Node> managed = getManagedChildren();
jaroslav@845
   145
            double width = getWidth();
jaroslav@845
   146
            double height = getHeight();
jaroslav@845
   147
            double top = getInsets().getTop();
jaroslav@845
   148
            double right = getInsets().getRight();
jaroslav@845
   149
            double left = getInsets().getLeft();
jaroslav@845
   150
            double bottom = getInsets().getBottom();
jaroslav@845
   151
            for (int i = 0; i < managed.size(); i++) {
jaroslav@845
   152
                Node child = managed.get(i);
jaroslav@845
   153
                layoutInArea(child, left, top, width - left - right, height - top - bottom, 0, Insets.EMPTY, true, true, HPos.CENTER, VPos.CENTER);
jaroslav@845
   154
            }
jaroslav@845
   155
        }
jaroslav@1004
   156
jaroslav@1004
   157
        private class InitBck2Brwsr implements ChangeListener<Void>, Runnable {
jaroslav@1004
   158
            private final WebEngine eng;
jaroslav@1004
   159
jaroslav@1004
   160
            public InitBck2Brwsr(WebEngine eng) {
jaroslav@1004
   161
                this.eng = eng;
jaroslav@1004
   162
            }
jaroslav@1004
   163
jaroslav@1004
   164
            @Override
jaroslav@1004
   165
            public synchronized void changed(ObservableValue<? extends Void> ov, Void t, Void t1) {
jaroslav@1004
   166
                Platform.runLater(this);
jaroslav@1004
   167
                try {
jaroslav@1004
   168
                    wait();
jaroslav@1004
   169
                } catch (InterruptedException ex) {
jaroslav@1004
   170
                    LOG.log(Level.SEVERE, null, ex);
jaroslav@1004
   171
                }
jaroslav@1004
   172
            }
jaroslav@1004
   173
jaroslav@1004
   174
            @Override
jaroslav@1004
   175
            public synchronized void run() {
jaroslav@1004
   176
                initBck2Brwsr(eng);
jaroslav@1004
   177
                notifyAll();
jaroslav@1004
   178
            }
jaroslav@1004
   179
        }
jaroslav@845
   180
    }
jaroslav@845
   181
    
jaroslav@845
   182
}