package net.krazyweb.starmodmanager.view; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.VBox; import javafx.scene.text.Font; import javafx.scene.web.WebEngine; import javafx.scene.web.WebView; import javafx.stage.Modality; import javafx.stage.Stage; import net.krazyweb.helpers.FileHelper; import net.krazyweb.starmodmanager.data.LocalizerFactory; import net.krazyweb.starmodmanager.data.LocalizerModelInterface; import net.krazyweb.starmodmanager.data.SettingsFactory; import net.krazyweb.starmodmanager.data.SettingsModelInterface; import net.krazyweb.starmodmanager.dialogue.MessageDialogue; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.sun.webpane.sg.prism.WCGraphicsPrismContext; public class LicenseView { @SuppressWarnings("unused") private static final Logger log = LogManager.getLogger(LicenseView.class); private LicenseViewController controller; private Stage stage; private String title; private String file; private VBox root; private Button closeButton; private WebView webView; private SettingsModelInterface settings; private LocalizerModelInterface localizer; protected LicenseView(final String title, final String file) { this.title = title; this.file = file; settings = new SettingsFactory().getInstance(); localizer = new LocalizerFactory().getInstance(); controller = new LicenseViewController(this); } protected void build() throws IOException { stage = new Stage(); stage.initModality(Modality.APPLICATION_MODAL); stage.centerOnScreen(); stage.setTitle(title); webView = new WebView(); WebEngine e = webView.getEngine(); //Remove logging from WebView renderer. It messes things up if you don't. //If the logging is set to something higher than FINEST, which it appears to be by default, //WebView enters a debugging mode. java.util.logging.Logger.getLogger(WCGraphicsPrismContext.class.getName()).setLevel(java.util.logging.Level.OFF); root = new VBox(); BufferedReader reader = new BufferedReader(new InputStreamReader(LicenseView.class.getClassLoader().getResourceAsStream(file))); String line; StringBuilder output = new StringBuilder(); Font.loadFont( LicenseView.class.getClassLoader().getResource("Lato-Regular.ttf").toExternalForm(), 12 ); while ((line = reader.readLine()) != null) { if (line.startsWith("<head>")) { String style = FileHelper.fileToString(LicenseView.class.getClassLoader().getResourceAsStream("theme_web_base.css")) + "\n" + FileHelper.fileToString(LicenseView.class.getClassLoader().getResourceAsStream("theme_web_green.css")); //TODO Theme from settings output.append(line.replace("<head>", "<head><style>" + style + "</style>")); } else { output.append(line); } output.append(" "); } e.loadContent(output.toString()); closeButton = new Button(); closeButton.setId("message-dialogue-button"); closeButton.setPrefWidth(120); closeButton.setMinHeight(40); closeButton.setPrefHeight(40); closeButton.setAlignment(Pos.CENTER); closeButton.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(final ActionEvent event) { controller.close(); } }); root.getChildren().addAll( webView, closeButton ); root.setAlignment(Pos.CENTER); VBox.setMargin(closeButton, new Insets(25, 0, 20, 0)); Scene scene = new Scene(root); scene.getStylesheets().add(MessageDialogue.class.getClassLoader().getResource("theme_base.css").toExternalForm()); scene.getStylesheets().add(MessageDialogue.class.getClassLoader().getResource(settings.getPropertyString("theme")).toExternalForm()); stage.setScene(scene); stage.setWidth(700); stage.setMinWidth(700); stage.setMinHeight(600); updateStrings(); } private void updateStrings() { closeButton.setText(localizer.getMessage("licenseview.close")); } protected void open() { //Remove logging from WebView renderer. It messes things up if you don't. //If the logging is set to something higher than FINEST, which it appears to be by default, //WebView enters a debugging mode. java.util.logging.Logger.getLogger(WCGraphicsPrismContext.class.getName()).setLevel(java.util.logging.Level.OFF); stage.showAndWait(); } protected void close() { stage.close(); } }