package org.peerbox; import java.io.IOException; import java.util.Collection; import javafx.application.Platform; import javafx.event.EventHandler; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; import javafx.scene.image.Image; import javafx.stage.Stage; import javafx.stage.StageStyle; import javafx.stage.WindowEvent; import org.peerbox.app.Constants; import org.peerbox.app.IExitHandler; import org.peerbox.presenter.INavigatable; import org.peerbox.presenter.NavigationService; import org.peerbox.utils.DialogUtils; import org.peerbox.utils.IconUtils; import org.peerbox.view.ViewNames; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.inject.Inject; import com.google.inject.name.Named; public class StartupStage { private static final Logger logger = LoggerFactory.getLogger(StartupStage.class); private Stage stage; private Parent mainView; private NavigationService navigationService; private IExitHandler exitHandler; public StartupStage() { } public NavigationService getNavigationService() { return navigationService; } @Inject public void setNavigationService(NavigationService service) { this.navigationService = service; } @Inject public void setStage(@Named("PrimaryStage") Stage stage) { this.stage = stage; } @Inject public void setExitHandler(IExitHandler exitHandler) { this.exitHandler = exitHandler; } private void initializeStage() { stage.setTitle(Constants.APP_NAME); Collection<Image> icons = IconUtils.createWindowIcons(); stage.getIcons().addAll(icons); stage.initStyle(StageStyle.DECORATED); installExitHandler(); Scene scene = new Scene(mainView); stage.setScene(scene); stage.sizeToScene(); // Add configuration of stage here } private void installExitHandler() { stage.setOnCloseRequest(new EventHandler<WindowEvent>() { @Override public void handle(WindowEvent t) { exitHandler.exit(); } }); } private void initializeMainView() { INavigatable mainController; try { FXMLLoader fxmlLoader = navigationService.createLoader(ViewNames.MAIN_VIEW); mainView = fxmlLoader.load(); mainController = (INavigatable)fxmlLoader.getController(); navigationService.setNavigationController(mainController); } catch (IOException e) { logger.error("Could not load initial view (main view and controller): {}", e.getMessage()); showErrorMsg(e.getMessage()); return; } } private void showErrorMsg(String msg) { final Runnable msgRunner = new Runnable() { @Override public void run() { Alert dlg = DialogUtils.createAlert(AlertType.ERROR); dlg.setTitle("Opening Window Failed"); dlg.setHeaderText("Could not open window"); dlg.setContentText(String.format("Message: %s", msg)); dlg.showAndWait(); } }; if (Platform.isFxApplicationThread()) { msgRunner.run(); } else { Platform.runLater(msgRunner); } } public void show() { initializeMainView(); initializeStage(); navigationService.navigate(ViewNames.NETWORK_SELECTION_VIEW); stage.show(); } }