launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/fximpl/FXBrwsr.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Thu, 30 May 2013 06:09:42 +0200
changeset 1166 16555ef29e9e
parent 1041 f18b7262fe91
child 1167 fd8ac9eb0008
permissions -rw-r--r--
When in debug mode, add toolbar
jaroslav@1041
     1
/**
jaroslav@1041
     2
 * Back 2 Browser Bytecode Translator
jaroslav@1041
     3
 * Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
jaroslav@1041
     4
 *
jaroslav@1041
     5
 * This program is free software: you can redistribute it and/or modify
jaroslav@1041
     6
 * it under the terms of the GNU General Public License as published by
jaroslav@1041
     7
 * the Free Software Foundation, version 2 of the License.
jaroslav@1041
     8
 *
jaroslav@1041
     9
 * This program is distributed in the hope that it will be useful,
jaroslav@1041
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
jaroslav@1041
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
jaroslav@1041
    12
 * GNU General Public License for more details.
jaroslav@1041
    13
 *
jaroslav@1041
    14
 * You should have received a copy of the GNU General Public License
jaroslav@1041
    15
 * along with this program. Look for COPYING file in the top folder.
jaroslav@1041
    16
 * If not, see http://opensource.org/licenses/GPL-2.0.
jaroslav@1041
    17
 */
jaroslav@1041
    18
package org.apidesign.bck2brwsr.launcher.fximpl;
jaroslav@1041
    19
jaroslav@1041
    20
import java.util.List;
jaroslav@1041
    21
import java.util.TooManyListenersException;
jaroslav@1041
    22
import java.util.logging.Level;
jaroslav@1041
    23
import java.util.logging.Logger;
jaroslav@1041
    24
import javafx.application.Application;
jaroslav@1041
    25
import javafx.application.Platform;
jaroslav@1041
    26
import javafx.beans.value.ChangeListener;
jaroslav@1041
    27
import javafx.beans.value.ObservableValue;
jaroslav@1041
    28
import javafx.event.ActionEvent;
jaroslav@1041
    29
import javafx.event.EventHandler;
jaroslav@1041
    30
import javafx.geometry.HPos;
jaroslav@1041
    31
import javafx.geometry.Insets;
jaroslav@1041
    32
import javafx.geometry.Pos;
jaroslav@1041
    33
import javafx.geometry.VPos;
jaroslav@1041
    34
import javafx.scene.Node;
jaroslav@1041
    35
import javafx.scene.Scene;
jaroslav@1041
    36
import javafx.scene.control.Button;
jaroslav@1166
    37
import javafx.scene.control.ToolBar;
jaroslav@1166
    38
import javafx.scene.layout.BorderPane;
jaroslav@1041
    39
import javafx.scene.layout.ColumnConstraints;
jaroslav@1041
    40
import javafx.scene.layout.GridPane;
jaroslav@1166
    41
import javafx.scene.layout.HBox;
jaroslav@1041
    42
import javafx.scene.layout.Pane;
jaroslav@1041
    43
import javafx.scene.layout.Priority;
jaroslav@1041
    44
import javafx.scene.layout.VBox;
jaroslav@1041
    45
import javafx.scene.text.Text;
jaroslav@1041
    46
import javafx.scene.web.WebEngine;
jaroslav@1041
    47
import javafx.scene.web.WebEvent;
jaroslav@1041
    48
import javafx.scene.web.WebView;
jaroslav@1041
    49
import javafx.stage.Modality;
jaroslav@1041
    50
import javafx.stage.Stage;
jaroslav@1041
    51
import netscape.javascript.JSObject;
jaroslav@1041
    52
jaroslav@1041
    53
/**
jaroslav@1041
    54
 * Demonstrates a WebView object accessing a web page.
jaroslav@1041
    55
 *
jaroslav@1041
    56
 * @see javafx.scene.web.WebView
jaroslav@1041
    57
 * @see javafx.scene.web.WebEngine
jaroslav@1041
    58
 */
jaroslav@1041
    59
public class FXBrwsr extends Application {
jaroslav@1041
    60
    private static final Logger LOG = Logger.getLogger(FXBrwsr.class.getName());
jaroslav@1041
    61
jaroslav@1041
    62
    @Override
jaroslav@1041
    63
    public void start(Stage primaryStage) throws Exception {
jaroslav@1166
    64
        WebView view = new WebView();
jaroslav@1166
    65
        WebController wc = new WebController(view, getParameters().getUnnamed());
jaroslav@1166
    66
jaroslav@1166
    67
        final VBox vbox = new VBox();
jaroslav@1166
    68
        vbox.setAlignment( Pos.CENTER );
jaroslav@1166
    69
        vbox.setStyle( "-fx-background-color: #808080;");
jaroslav@1166
    70
jaroslav@1166
    71
jaroslav@1166
    72
        HBox hbox = new HBox();
jaroslav@1166
    73
        hbox.setStyle( "-fx-background-color: #808080;");
jaroslav@1166
    74
        hbox.setAlignment(Pos.CENTER);
jaroslav@1166
    75
        hbox.getChildren().add(vbox);
jaroslav@1166
    76
        vbox.getChildren().add(view);
jaroslav@1166
    77
jaroslav@1166
    78
        BorderPane root = new BorderPane();
jaroslav@1166
    79
        if ("true".equals(this.getParameters().getNamed().get("toolbar"))) { // NOI18N
jaroslav@1166
    80
            final ToolBar toolbar = BrowserToolbar.create(view, vbox);
jaroslav@1166
    81
            root.setTop( toolbar );
jaroslav@1166
    82
        }
jaroslav@1166
    83
        root.setCenter(hbox);
jaroslav@1166
    84
jaroslav@1166
    85
        Scene scene = new Scene(root, 800, 600);
jaroslav@1166
    86
jaroslav@1166
    87
        primaryStage.setTitle( "Device Emulator" );
jaroslav@1166
    88
        primaryStage.setScene( scene );
jaroslav@1041
    89
        primaryStage.show();
jaroslav@1041
    90
    }
jaroslav@1041
    91
    
jaroslav@1041
    92
    /**
jaroslav@1041
    93
     * Create a resizable WebView pane
jaroslav@1041
    94
     */
jaroslav@1166
    95
    private static class WebController {
jaroslav@1041
    96
        private final JVMBridge bridge = new JVMBridge();
jaroslav@1041
    97
jaroslav@1166
    98
        public WebController(WebView view, List<String> params) {
jaroslav@1041
    99
            LOG.log(Level.INFO, "Initializing WebView with {0}", params);
jaroslav@1041
   100
            final WebEngine eng = view.getEngine();
jaroslav@1041
   101
            try {
jaroslav@1041
   102
                JVMBridge.addBck2BrwsrLoad(new InitBck2Brwsr(eng));
jaroslav@1041
   103
            } catch (TooManyListenersException ex) {
jaroslav@1041
   104
                LOG.log(Level.SEVERE, null, ex);
jaroslav@1041
   105
            }
jaroslav@1041
   106
            
jaroslav@1041
   107
            if (params.size() > 0) {
jaroslav@1041
   108
                LOG.log(Level.INFO, "loading page {0}", params.get(0));
jaroslav@1041
   109
                eng.load(params.get(0));
jaroslav@1041
   110
                LOG.fine("back from load");
jaroslav@1041
   111
            }
jaroslav@1041
   112
            eng.setOnAlert(new EventHandler<WebEvent<String>>() {
jaroslav@1041
   113
                @Override
jaroslav@1041
   114
                public void handle(WebEvent<String> t) {
jaroslav@1041
   115
                    final Stage dialogStage = new Stage();
jaroslav@1041
   116
                    dialogStage.initModality(Modality.WINDOW_MODAL);
jaroslav@1041
   117
                    dialogStage.setTitle("Warning");
jaroslav@1041
   118
                    final Button button = new Button("Close");
jaroslav@1041
   119
                    final Text text = new Text(t.getData());
jaroslav@1041
   120
                    
jaroslav@1041
   121
                    VBox box = new VBox();
jaroslav@1041
   122
                    box.setAlignment(Pos.CENTER);
jaroslav@1041
   123
                    box.setSpacing(10);
jaroslav@1041
   124
                    box.setPadding(new Insets(10));
jaroslav@1041
   125
                    box.getChildren().addAll(text, button);
jaroslav@1041
   126
                    
jaroslav@1041
   127
                    dialogStage.setScene(new Scene(box));
jaroslav@1041
   128
                    
jaroslav@1041
   129
                    button.setCancelButton(true);
jaroslav@1041
   130
                    button.setOnAction(new EventHandler<ActionEvent>() {
jaroslav@1041
   131
                        @Override
jaroslav@1041
   132
                        public void handle(ActionEvent t) {
jaroslav@1041
   133
                            dialogStage.close();
jaroslav@1041
   134
                        }
jaroslav@1041
   135
                    });
jaroslav@1041
   136
                    
jaroslav@1041
   137
                    dialogStage.centerOnScreen();
jaroslav@1041
   138
                    dialogStage.showAndWait();
jaroslav@1041
   139
                }
jaroslav@1041
   140
            });
jaroslav@1041
   141
        }
jaroslav@1041
   142
jaroslav@1041
   143
        boolean initBck2Brwsr(WebEngine webEngine) {
jaroslav@1041
   144
            JSObject jsobj = (JSObject) webEngine.executeScript("window");
jaroslav@1041
   145
            LOG.log(Level.FINE, "window: {0}", jsobj);
jaroslav@1041
   146
            Object prev = jsobj.getMember("bck2brwsr");
jaroslav@1041
   147
            if ("undefined".equals(prev)) {
jaroslav@1041
   148
                System.getProperties().put("webEngine", webEngine);
jaroslav@1041
   149
                jsobj.setMember("bck2brwsr", bridge);
jaroslav@1041
   150
                return true;
jaroslav@1041
   151
            }
jaroslav@1041
   152
            return false;
jaroslav@1041
   153
        }
jaroslav@1041
   154
jaroslav@1041
   155
        private class InitBck2Brwsr implements ChangeListener<Void>, Runnable {
jaroslav@1041
   156
            private final WebEngine eng;
jaroslav@1041
   157
jaroslav@1041
   158
            public InitBck2Brwsr(WebEngine eng) {
jaroslav@1041
   159
                this.eng = eng;
jaroslav@1041
   160
            }
jaroslav@1041
   161
jaroslav@1041
   162
            @Override
jaroslav@1041
   163
            public synchronized void changed(ObservableValue<? extends Void> ov, Void t, Void t1) {
jaroslav@1041
   164
                Platform.runLater(this);
jaroslav@1041
   165
                try {
jaroslav@1041
   166
                    wait();
jaroslav@1041
   167
                } catch (InterruptedException ex) {
jaroslav@1041
   168
                    LOG.log(Level.SEVERE, null, ex);
jaroslav@1041
   169
                }
jaroslav@1041
   170
            }
jaroslav@1041
   171
jaroslav@1041
   172
            @Override
jaroslav@1041
   173
            public synchronized void run() {
jaroslav@1041
   174
                initBck2Brwsr(eng);
jaroslav@1041
   175
                notifyAll();
jaroslav@1041
   176
            }
jaroslav@1041
   177
        }
jaroslav@1041
   178
    }
jaroslav@1041
   179
    
jaroslav@1041
   180
}