package com.scrivenvar;
import com.scrivenvar.preferences.FilePreferencesFactory;
import com.scrivenvar.service.Options;
import com.scrivenvar.service.Snitch;
import com.scrivenvar.service.events.Notifier;
import com.scrivenvar.util.StageState;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.stage.Stage;
import java.util.logging.LogManager;
import static com.scrivenvar.Constants.*;
import static com.scrivenvar.Messages.get;
public final class Main extends Application {
static {
LogManager.getLogManager().reset();
}
private static Application sApplication;
private final Options mOptions = Services.load( Options.class );
private final Notifier mNotifier = Services.load( Notifier.class );
private final Snitch mSnitch = Services.load( Snitch.class );
private final Thread mSnitchThread = new Thread( getSnitch() );
private final MainWindow mMainWindow = new MainWindow();
@SuppressWarnings({"FieldCanBeLocal", "unused"})
private StageState mStageState;
public static void main( final String[] args ) {
initPreferences();
launch( args );
}
@Override
public void start( final Stage stage ) {
initApplication();
initNotifyService();
initState( stage );
initStage( stage );
initSnitch();
stage.show();
}
private static void initPreferences() {
System.setProperty(
"java.util.prefs.PreferencesFactory",
FilePreferencesFactory.class.getName()
);
}
public static void showDocument( final String uri ) {
getApplication().getHostServices().showDocument( uri );
}
private void initApplication() {
sApplication = this;
}
private void initNotifyService() {
mNotifier.addObserver( getMainWindow() );
}
private void initState( final Stage stage ) {
mStageState = new StageState( stage, getOptions().getState() );
}
private void initStage( final Stage stage ) {
stage.getIcons().addAll(
createImage( FILE_LOGO_16 ),
createImage( FILE_LOGO_32 ),
createImage( FILE_LOGO_128 ),
createImage( FILE_LOGO_256 ),
createImage( FILE_LOGO_512 ) );
stage.setTitle( getApplicationTitle() );
stage.setScene( getScene() );
}
private void initSnitch() {
getSnitchThread().start();
}
@Override
public void stop() throws InterruptedException {
getSnitch().stop();
final Thread thread = getSnitchThread();
thread.interrupt();
thread.join();
}
private synchronized Snitch getSnitch() {
return mSnitch;
}
private Thread getSnitchThread() {
return mSnitchThread;
}
private synchronized Options getOptions() {
return mOptions;
}
private Scene getScene() {
return getMainWindow().getScene();
}
private MainWindow getMainWindow() {
return mMainWindow;
}
private static Application getApplication() {
return sApplication;
}
private String getApplicationTitle() {
return get( "Main.title" );
}
private Image createImage( final String filename ) {
return new Image( filename );
}
}