All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.sshtools.jajafx.JajaFXApp Maven / Gradle / Ivy

The newest version!
package com.sshtools.jajafx;

import java.net.URL;
import java.util.List;
import java.util.prefs.Preferences;

import org.scenicview.ScenicView;

import com.install4j.api.UiUtil;

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.image.Image;
import javafx.stage.Stage;

public abstract class JajaFXApp>> extends Application {

	public enum DarkMode {
		AUTO, ALWAYS, NEVER
	}

	public static void main(String[] args) {
		launch(args);
	}

	private final URL icon;
	private final A container;

	private final String title;
	private Stage primaryStage;
	private boolean defaultStandardWindowDecorations;
	private boolean showFrameTitle = true;
	private final ObservableList> windows = FXCollections.observableArrayList();
	private final Preferences appPreferences;
	
	@SuppressWarnings("unchecked")
	protected JajaFXApp(URL icon, String title, A container, Preferences appPreferences) {
		this.icon = icon;
		this.container = container;
		this.title = title;
		this.appPreferences = appPreferences;
		if(container instanceof JajaApp jja) {
			jja.init(this);
		}
	}

	public Stage getPrimaryStage() {
        return primaryStage;
    }

    public void addCommonStylesheets(ObservableList stylesheets) {
		FXUtil.addIfNotAdded(stylesheets, JajaFXApp.class.getResource("Common.css").toExternalForm());
		FXUtil.addIfNotAdded(stylesheets, Platforms.style().css().toExternalForm());
		var appResource = getClass().getResource("App.css");
		if(appResource != null) {
			FXUtil.addIfNotAdded(stylesheets, appResource.toExternalForm());
		}
	}

	public final A getContainer() {
		return container;
	}

	public URL getIcon() {
		return icon;
	}

	public final boolean isDarkMode() {
		var mode = getDarkMode();
		if (mode.equals(DarkMode.AUTO))
			return UiUtil.isDarkDesktop();
		else if (mode.equals(DarkMode.ALWAYS))
			return true;
		else
			return false;
	}

	public final boolean isDecorated() {
		return JajaApp.getInstance() == null ? false : JajaApp.getInstance().standardWindowDecorations.orElse(defaultStandardWindowDecorations);
	}

	public final boolean isDefaultStandardWindowDecorations() {
		return defaultStandardWindowDecorations;
	}
	
	public final boolean isShowFrameTitle() {
		return showFrameTitle;
	}
	
	public final void setDefaultStandardWindowDecorations(boolean defaultStandardWindowDecorations) {
		this.defaultStandardWindowDecorations = defaultStandardWindowDecorations;
	}
	
	public final void setShowFrameTitle(boolean showFrameTitle) {
		this.showFrameTitle = showFrameTitle;
		windows.forEach(JajaFXAppWindow::checkFrameTitle);
	}

	@Override
	public void start(final Stage primaryStage) {
		this.primaryStage = primaryStage;
		listenForDarkModeChanges();

		newAppWindow(primaryStage);
		primaryStage.show();

		onStarted();
		
		try {
			if(Boolean.getBoolean("jaja.debugScene"))
				ScenicView.show(primaryStage.getScene());
		}
		catch(Throwable e) {
		}
	}

	@SuppressWarnings("unchecked")
	public > W newAppWindow(final Stage primaryStage) {
		primaryStage.setTitle(title);
		
		var appWindow = createAppWindow(primaryStage);
		primaryStage.getIcons().add(new Image(icon.toExternalForm()));
		onConfigurePrimaryStage(appWindow, primaryStage);
		return (W)appWindow;
	}

	@SuppressWarnings("unchecked")
	public final  > List getWindows() {
		return (List)windows;
	}

	public void updateRootStyles(Parent root) {
		if (isDarkMode()) {
			root.getStyleClass().remove("lightMode");
			root.getStyleClass().add("darkMode");
		} else {
			root.getStyleClass().remove("darkMode");
			root.getStyleClass().add("lightMode");
		}
	}

	protected JajaFXAppWindow createAppWindow(final Stage stage) {
		var wnd = new JajaFXAppWindow>(stage, this);
		@SuppressWarnings("unchecked")
        var cnt = createContent(stage, (W)wnd);
		wnd.setContent(cnt);
		return wnd;
	}

	protected abstract Node createContent(Stage stage, W window);

	protected DarkMode getDarkMode() {
		return DarkMode.valueOf(appPreferences.get("darkMode", DarkMode.AUTO.name()).toUpperCase());
	}
	
	protected void listenForDarkModeChanges() {
	    appPreferences.addPreferenceChangeListener(pce -> {
			if (pce.getKey().equals("darkMode")) {
				updateDarkMode();
			}
		});
	}

	public void needUpdate() {
		//
	}

	protected void onConfigurePrimaryStage(JajaFXAppWindow wnd, Stage stage) {
		primaryStage.centerOnScreen();
	}

	protected void onStarted() {
	}

	protected void updateDarkMode() {
		windows.forEach(JajaFXAppWindow::updateDarkMode);
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy