package de.saring.sportstracker.gui; import java.util.logging.Level; import java.util.logging.Logger; import de.saring.sportstracker.storage.IStorage; import de.saring.sportstracker.storage.XMLStorage; import eu.lestard.easydi.EasyDI; import javafx.application.Application; import javafx.scene.control.Alert; import javafx.stage.Stage; import javafx.stage.WindowEvent; import de.saring.exerciseviewer.gui.EVContext; import de.saring.sportstracker.core.STException; import de.saring.sportstracker.core.STOptions; import de.saring.util.gui.javafx.WindowBoundsPersistence; import de.saring.util.unitcalc.FormatUtils; /** * This is the main class of SportsTracker which starts the entire application. * * @author Stefan Saring */ public class STApplication extends Application { private static final Logger LOGGER = Logger.getLogger(STApplication.class.getName()); private STDocument document; private STContext context; private STController controller; private Stage primaryStage; @Override public void init() throws Exception { // setup EasyDI for dependency injection final EasyDI easyDI = new EasyDI(); easyDI.bindInstance(STApplication.class, this); easyDI.bindInterface(IStorage.class, XMLStorage.class); easyDI.bindInterface(STContext.class, STContextImpl.class); easyDI.bindInterface(EVContext.class, STContextImpl.class); easyDI.bindInterface(STDocument.class, STDocumentImpl.class); easyDI.bindInterface(STController.class, STControllerImpl.class); // initialize the document document = easyDI.getInstance(STDocument.class); document.evaluateCommandLineParameters(getParameters().getRaw()); document.loadOptions(); // initialize the context (set format utils for current configuration) context = easyDI.getInstance(STContext.class); final STOptions options = document.getOptions(); context.setFormatUtils(new FormatUtils(options.getUnitSystem(), options.getSpeedView())); controller = easyDI.getInstance(STController.class); } @Override public void start(final Stage primaryStage) throws Exception { this.primaryStage = primaryStage; WindowBoundsPersistence.addWindowBoundsPersistence(primaryStage, "SportsTracker"); // initialize and start the main application window controller.initApplicationWindow(); primaryStage.setOnShown(this::onShown); primaryStage.show(); } @Override public void stop() throws Exception { document.storeOptions(); LOGGER.info("Exiting application..."); super.stop(); } /** * Returns the primary Stage of the JavaFX application. * * @return Stage */ public Stage getPrimaryStage() { return primaryStage; } /** * This method is called after the application window has been shown, final UI setup can be done here. * * @param event window event */ private void onShown(final WindowEvent event) { // create application directory try { document.createApplicationDirectory(); } catch (STException se) { LOGGER.log(Level.SEVERE, "Failed to create the application directory!", se); context.showMessageDialog(primaryStage, Alert.AlertType.ERROR, "common.error", "st.main.error.create_dir"); } // load application data (executed in background) controller.loadApplicationData(); } /** * Starts the SportsTracker application. * * @param args command line parameters */ public static void main(final String args[]) { // set format for java.util.logging, a log statement must be printed to a single line System.setProperty("java.util.logging.SimpleFormatter.format", "%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS %4$s %2$s %5$s %6$s%n"); launch(args); } }