150 lines
4.9 KiB
Java
150 lines
4.9 KiB
Java
package me.teridax.jcash;
|
|
|
|
import me.teridax.jcash.gui.IconProvider;
|
|
import me.teridax.jcash.gui.Loader;
|
|
import me.teridax.jcash.gui.MainFrame;
|
|
import me.teridax.jcash.gui.Utils;
|
|
import me.teridax.jcash.lang.Locales;
|
|
|
|
import javax.swing.*;
|
|
import java.awt.*;
|
|
import java.io.IOException;
|
|
import java.util.Objects;
|
|
import java.util.logging.Level;
|
|
|
|
import static me.teridax.jcash.Logging.LOGGER;
|
|
import static me.teridax.jcash.Logging.initializeSystemLogger;
|
|
|
|
public final class Main {
|
|
|
|
/**
|
|
* Main instance of this program. Contains the primary window.
|
|
*/
|
|
private static Main instance;
|
|
|
|
/**
|
|
* Primary class for controlling GUI of this application
|
|
*/
|
|
private final MainFrame window;
|
|
|
|
private Main() {
|
|
this.window = new MainFrame();
|
|
}
|
|
|
|
/**
|
|
* Prompts the user a dialog to select a file to load the database from.
|
|
* If a valid database has been read a login screen will be shown.
|
|
* If no file was selected or the database was invalid the application will close.
|
|
*/
|
|
public void loadDatabase() {
|
|
try {
|
|
var bms = Loader.load();
|
|
this.window.setBms(bms);
|
|
|
|
} catch (Exception e) {
|
|
LOGGER.severe("Failed to load database: " + e.getMessage());
|
|
Utils.error("Failed to load database");
|
|
System.exit(1);
|
|
}
|
|
}
|
|
|
|
public static void main(String[] args) {
|
|
initializeSystemLogger(Level.FINE);
|
|
|
|
setPlatformDependingTheme();
|
|
|
|
loadExtraFont();
|
|
|
|
Locales.autodetectDefaultLocale();
|
|
|
|
// create main instance and show the login screen
|
|
instance();
|
|
getInstance().loadDatabase();
|
|
}
|
|
|
|
/**
|
|
* Loads the extra font file used on the login button
|
|
*/
|
|
private static void loadExtraFont() {
|
|
try {
|
|
var font = Font.createFont(Font.TRUETYPE_FONT, Objects.requireNonNull(IconProvider.class.getResourceAsStream("res/Circus.ttf")));
|
|
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
|
|
ge.registerFont(font);
|
|
} catch (IOException | FontFormatException | NullPointerException e) {
|
|
LOGGER.warning("Could not load font file: " + e.getMessage());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Set the look and feel via the ui manager.
|
|
* This function will select a look and feel so that the application will
|
|
* look most like a native application.
|
|
* It will select the systems look and feel for Windows and MacOS
|
|
* and GTK for unix based systems.
|
|
*/
|
|
private static void setPlatformDependingTheme() {
|
|
// default look and feel
|
|
var laf = UIManager.getCrossPlatformLookAndFeelClassName();
|
|
|
|
// runtime os
|
|
String os = System.getProperty("os.name").toLowerCase();
|
|
LOGGER.fine("Detected operating system: " + os);
|
|
|
|
// set look and feel class name depending on the platform we run on
|
|
if (os.contains("win") || os.contains("mac")) {
|
|
LOGGER.info("Detected Windows or MacOS based operating system, using system look and feel");
|
|
laf = UIManager.getSystemLookAndFeelClassName();
|
|
} else if (os.contains("nix") || os.contains("nux") || os.contains("aix") || os.contains("sunos")) {
|
|
LOGGER.info("Detected Unix/Linux based operating system, using GTK look and feel");
|
|
laf = "com.sun.java.swing.plaf.gtk.GTKLookAndFeel";
|
|
} else {
|
|
LOGGER.warning("Unable to detect operating system: " + os);
|
|
}
|
|
|
|
try {
|
|
LOGGER.info("Setting look and feel to class: " + laf);
|
|
UIManager.setLookAndFeel(laf);
|
|
} catch (ClassNotFoundException | UnsupportedLookAndFeelException e) {
|
|
LOGGER.severe("Look and feel class not found: " + e.getMessage());
|
|
} catch (InstantiationException | IllegalAccessException e) {
|
|
LOGGER.warning("Could not set look and feel: " + e.getMessage());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get the main singleton instance of this program
|
|
*
|
|
* @return the singleton instance of this class
|
|
*/
|
|
public static Main getInstance() {
|
|
return instance;
|
|
}
|
|
|
|
/**
|
|
* Attempts to create a new instance of the singleton class Main.
|
|
* This method throws an exception if the class is already instantiated.
|
|
*
|
|
* @throws IllegalStateException if the class is already instantiated
|
|
*/
|
|
public static void instance() {
|
|
if (null != instance)
|
|
throw new IllegalStateException(Main.class.getName() + " is already initialized");
|
|
|
|
LOGGER.fine("Creating singleton instance of class " + Main.class.getName());
|
|
|
|
Main.instance = new Main();
|
|
}
|
|
|
|
public JFrame getWindow() {
|
|
return this.window.getWindow();
|
|
}
|
|
|
|
/**
|
|
* Logs the user out of the currently open account.
|
|
* This will show the login mask and clear the password field or the previous
|
|
* login attempt.
|
|
*/
|
|
public void logout() {
|
|
this.window.logout();
|
|
}
|
|
} |