Remove desktopBrowser File

This commit is contained in:
Connor Yoh 2025-07-15 13:53:42 +01:00
parent 70d66bbcbe
commit 679d3efc81
3 changed files with 448 additions and 448 deletions

View File

@ -113,7 +113,7 @@ jobs:
chmod +x ./gradlew
echo "🔧 Building Stirling-PDF JAR..."
# STIRLING_PDF_DESKTOP_UI=false ./gradlew clean bootJar --no-daemon
STIRLING_PDF_DESKTOP_UI=false ./gradlew clean build -x spotlessApply -x spotlessCheck -x test -x sonarqube
./gradlew clean build -x spotlessApply -x spotlessCheck -x test -x sonarqube
# Find the built JAR
STIRLING_JAR=$(ls stirling-pdf/build/libs/stirling-pdf-*.jar | head -n 1)

View File

@ -29,7 +29,7 @@ dependencies {
if (System.getenv('STIRLING_PDF_DESKTOP_UI') != 'false'
|| (project.hasProperty('STIRLING_PDF_DESKTOP_UI')
&& project.getProperty('STIRLING_PDF_DESKTOP_UI') != 'false')) {
implementation 'me.friwi:jcefmaven:132.3.1'
// implementation 'me.friwi:jcefmaven:132.3.1'
implementation 'org.openjfx:javafx-controls:21'
implementation 'org.openjfx:javafx-swing:21'
}

View File

@ -1,497 +1,497 @@
package stirling.software.SPDF.UI.impl;
// package stirling.software.SPDF.UI.impl;
import java.awt.AWTException;
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import java.awt.event.WindowEvent;
import java.awt.event.WindowStateListener;
import java.io.File;
import java.io.InputStream;
import java.util.Objects;
import java.util.concurrent.CompletableFuture;
// import java.awt.AWTException;
// import java.awt.BorderLayout;
// import java.awt.Frame;
// import java.awt.Image;
// import java.awt.MenuItem;
// import java.awt.PopupMenu;
// import java.awt.SystemTray;
// import java.awt.TrayIcon;
// import java.awt.event.WindowEvent;
// import java.awt.event.WindowStateListener;
// import java.io.File;
// import java.io.InputStream;
// import java.util.Objects;
// import java.util.concurrent.CompletableFuture;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
// import javax.imageio.ImageIO;
// import javax.swing.JFrame;
// import javax.swing.JPanel;
// import javax.swing.SwingUtilities;
// import javax.swing.Timer;
import org.cef.CefApp;
import org.cef.CefClient;
import org.cef.CefSettings;
import org.cef.browser.CefBrowser;
import org.cef.callback.CefBeforeDownloadCallback;
import org.cef.callback.CefDownloadItem;
import org.cef.callback.CefDownloadItemCallback;
import org.cef.handler.CefDownloadHandlerAdapter;
import org.cef.handler.CefLoadHandlerAdapter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Component;
// import org.cef.CefApp;
// import org.cef.CefClient;
// import org.cef.CefSettings;
// import org.cef.browser.CefBrowser;
// import org.cef.callback.CefBeforeDownloadCallback;
// import org.cef.callback.CefDownloadItem;
// import org.cef.callback.CefDownloadItemCallback;
// import org.cef.handler.CefDownloadHandlerAdapter;
// import org.cef.handler.CefLoadHandlerAdapter;
// import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
// import org.springframework.stereotype.Component;
import jakarta.annotation.PreDestroy;
// import jakarta.annotation.PreDestroy;
import lombok.extern.slf4j.Slf4j;
// import lombok.extern.slf4j.Slf4j;
import me.friwi.jcefmaven.CefAppBuilder;
import me.friwi.jcefmaven.EnumProgress;
import me.friwi.jcefmaven.MavenCefAppHandlerAdapter;
import me.friwi.jcefmaven.impl.progress.ConsoleProgressHandler;
// import me.friwi.jcefmaven.CefAppBuilder;
// import me.friwi.jcefmaven.EnumProgress;
// import me.friwi.jcefmaven.MavenCefAppHandlerAdapter;
// import me.friwi.jcefmaven.impl.progress.ConsoleProgressHandler;
import stirling.software.SPDF.UI.WebBrowser;
import stirling.software.common.configuration.InstallationPathConfig;
import stirling.software.common.util.UIScaling;
// import stirling.software.SPDF.UI.WebBrowser;
// import stirling.software.common.configuration.InstallationPathConfig;
// import stirling.software.common.util.UIScaling;
@Component
@Slf4j
@ConditionalOnProperty(
name = "STIRLING_PDF_DESKTOP_UI",
havingValue = "true",
matchIfMissing = false)
public class DesktopBrowser implements WebBrowser {
private static CefApp cefApp;
private static CefClient client;
private static CefBrowser browser;
private static JFrame frame;
private static LoadingWindow loadingWindow;
private static volatile boolean browserInitialized = false;
private static TrayIcon trayIcon;
private static SystemTray systemTray;
// @Component
// @Slf4j
// @ConditionalOnProperty(
// name = "STIRLING_PDF_DESKTOP_UI",
// havingValue = "true",
// matchIfMissing = false)
// public class DesktopBrowser implements WebBrowser {
// private static CefApp cefApp;
// private static CefClient client;
// private static CefBrowser browser;
// private static JFrame frame;
// private static LoadingWindow loadingWindow;
// private static volatile boolean browserInitialized = false;
// private static TrayIcon trayIcon;
// private static SystemTray systemTray;
public DesktopBrowser() {
SwingUtilities.invokeLater(
() -> {
loadingWindow = new LoadingWindow(null, "Initializing...");
loadingWindow.setVisible(true);
});
}
// public DesktopBrowser() {
// SwingUtilities.invokeLater(
// () -> {
// loadingWindow = new LoadingWindow(null, "Initializing...");
// loadingWindow.setVisible(true);
// });
// }
public void initWebUI(String url) {
CompletableFuture.runAsync(
() -> {
try {
CefAppBuilder builder = new CefAppBuilder();
configureCefSettings(builder);
builder.setProgressHandler(createProgressHandler());
builder.setInstallDir(
new File(InstallationPathConfig.getClientWebUIPath()));
// Build and initialize CEF
cefApp = builder.build();
client = cefApp.createClient();
// public void initWebUI(String url) {
// CompletableFuture.runAsync(
// () -> {
// try {
// CefAppBuilder builder = new CefAppBuilder();
// configureCefSettings(builder);
// builder.setProgressHandler(createProgressHandler());
// builder.setInstallDir(
// new File(InstallationPathConfig.getClientWebUIPath()));
// // Build and initialize CEF
// cefApp = builder.build();
// client = cefApp.createClient();
// Set up download handler
setupDownloadHandler();
// // Set up download handler
// setupDownloadHandler();
// Create browser and frame on EDT
SwingUtilities.invokeAndWait(
() -> {
browser = client.createBrowser(url, false, false);
setupMainFrame();
setupLoadHandler();
// // Create browser and frame on EDT
// SwingUtilities.invokeAndWait(
// () -> {
// browser = client.createBrowser(url, false, false);
// setupMainFrame();
// setupLoadHandler();
// Force initialize UI after 7 seconds if not already done
Timer timeoutTimer =
new Timer(
2500,
e -> {
log.warn(
"Loading timeout reached. Forcing"
+ " UI transition.");
if (!browserInitialized) {
// Force UI initialization
forceInitializeUI();
}
});
timeoutTimer.setRepeats(false);
timeoutTimer.start();
});
} catch (Exception e) {
log.error("Error initializing JCEF browser: ", e);
cleanup();
}
});
}
// // Force initialize UI after 7 seconds if not already done
// Timer timeoutTimer =
// new Timer(
// 2500,
// e -> {
// log.warn(
// "Loading timeout reached. Forcing"
// + " UI transition.");
// if (!browserInitialized) {
// // Force UI initialization
// forceInitializeUI();
// }
// });
// timeoutTimer.setRepeats(false);
// timeoutTimer.start();
// });
// } catch (Exception e) {
// log.error("Error initializing JCEF browser: ", e);
// cleanup();
// }
// });
// }
private void configureCefSettings(CefAppBuilder builder) {
CefSettings settings = builder.getCefSettings();
String basePath = InstallationPathConfig.getClientWebUIPath();
log.info("basePath " + basePath);
settings.cache_path = new File(basePath + "cache").getAbsolutePath();
settings.root_cache_path = new File(basePath + "root_cache").getAbsolutePath();
// settings.browser_subprocess_path = new File(basePath +
// "subprocess").getAbsolutePath();
// settings.resources_dir_path = new File(basePath + "resources").getAbsolutePath();
// settings.locales_dir_path = new File(basePath + "locales").getAbsolutePath();
settings.log_file = new File(basePath, "debug.log").getAbsolutePath();
// private void configureCefSettings(CefAppBuilder builder) {
// CefSettings settings = builder.getCefSettings();
// String basePath = InstallationPathConfig.getClientWebUIPath();
// log.info("basePath " + basePath);
// settings.cache_path = new File(basePath + "cache").getAbsolutePath();
// settings.root_cache_path = new File(basePath + "root_cache").getAbsolutePath();
// // settings.browser_subprocess_path = new File(basePath +
// // "subprocess").getAbsolutePath();
// // settings.resources_dir_path = new File(basePath + "resources").getAbsolutePath();
// // settings.locales_dir_path = new File(basePath + "locales").getAbsolutePath();
// settings.log_file = new File(basePath, "debug.log").getAbsolutePath();
settings.persist_session_cookies = true;
settings.windowless_rendering_enabled = false;
settings.log_severity = CefSettings.LogSeverity.LOGSEVERITY_INFO;
// settings.persist_session_cookies = true;
// settings.windowless_rendering_enabled = false;
// settings.log_severity = CefSettings.LogSeverity.LOGSEVERITY_INFO;
builder.setAppHandler(
new MavenCefAppHandlerAdapter() {
@Override
public void stateHasChanged(org.cef.CefApp.CefAppState state) {
log.info("CEF state changed: " + state);
if (state == CefApp.CefAppState.TERMINATED) {
System.exit(0);
}
}
});
}
// builder.setAppHandler(
// new MavenCefAppHandlerAdapter() {
// @Override
// public void stateHasChanged(org.cef.CefApp.CefAppState state) {
// log.info("CEF state changed: " + state);
// if (state == CefApp.CefAppState.TERMINATED) {
// System.exit(0);
// }
// }
// });
// }
private void setupDownloadHandler() {
client.addDownloadHandler(
new CefDownloadHandlerAdapter() {
@Override
public boolean onBeforeDownload(
CefBrowser browser,
CefDownloadItem downloadItem,
String suggestedName,
CefBeforeDownloadCallback callback) {
callback.Continue("", true);
return true;
}
// private void setupDownloadHandler() {
// client.addDownloadHandler(
// new CefDownloadHandlerAdapter() {
// @Override
// public boolean onBeforeDownload(
// CefBrowser browser,
// CefDownloadItem downloadItem,
// String suggestedName,
// CefBeforeDownloadCallback callback) {
// callback.Continue("", true);
// return true;
// }
@Override
public void onDownloadUpdated(
CefBrowser browser,
CefDownloadItem downloadItem,
CefDownloadItemCallback callback) {
if (downloadItem.isComplete()) {
log.info("Download completed: " + downloadItem.getFullPath());
} else if (downloadItem.isCanceled()) {
log.info("Download canceled: " + downloadItem.getFullPath());
}
}
});
}
// @Override
// public void onDownloadUpdated(
// CefBrowser browser,
// CefDownloadItem downloadItem,
// CefDownloadItemCallback callback) {
// if (downloadItem.isComplete()) {
// log.info("Download completed: " + downloadItem.getFullPath());
// } else if (downloadItem.isCanceled()) {
// log.info("Download canceled: " + downloadItem.getFullPath());
// }
// }
// });
// }
private ConsoleProgressHandler createProgressHandler() {
return new ConsoleProgressHandler() {
@Override
public void handleProgress(EnumProgress state, float percent) {
Objects.requireNonNull(state, "state cannot be null");
SwingUtilities.invokeLater(
() -> {
if (loadingWindow != null) {
switch (state) {
case LOCATING:
loadingWindow.setStatus("Locating Files...");
loadingWindow.setProgress(0);
break;
case DOWNLOADING:
if (percent >= 0) {
loadingWindow.setStatus(
String.format(
"Downloading additional files: %.0f%%",
percent));
loadingWindow.setProgress((int) percent);
}
break;
case EXTRACTING:
loadingWindow.setStatus("Extracting files...");
loadingWindow.setProgress(60);
break;
case INITIALIZING:
loadingWindow.setStatus("Initializing UI...");
loadingWindow.setProgress(80);
break;
case INITIALIZED:
loadingWindow.setStatus("Finalising startup...");
loadingWindow.setProgress(90);
break;
}
}
});
}
};
}
// private ConsoleProgressHandler createProgressHandler() {
// return new ConsoleProgressHandler() {
// @Override
// public void handleProgress(EnumProgress state, float percent) {
// Objects.requireNonNull(state, "state cannot be null");
// SwingUtilities.invokeLater(
// () -> {
// if (loadingWindow != null) {
// switch (state) {
// case LOCATING:
// loadingWindow.setStatus("Locating Files...");
// loadingWindow.setProgress(0);
// break;
// case DOWNLOADING:
// if (percent >= 0) {
// loadingWindow.setStatus(
// String.format(
// "Downloading additional files: %.0f%%",
// percent));
// loadingWindow.setProgress((int) percent);
// }
// break;
// case EXTRACTING:
// loadingWindow.setStatus("Extracting files...");
// loadingWindow.setProgress(60);
// break;
// case INITIALIZING:
// loadingWindow.setStatus("Initializing UI...");
// loadingWindow.setProgress(80);
// break;
// case INITIALIZED:
// loadingWindow.setStatus("Finalising startup...");
// loadingWindow.setProgress(90);
// break;
// }
// }
// });
// }
// };
// }
private void setupMainFrame() {
frame = new JFrame("Stirling-PDF");
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
frame.setUndecorated(true);
frame.setOpacity(0.0f);
// private void setupMainFrame() {
// frame = new JFrame("Stirling-PDF");
// frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
// frame.setUndecorated(true);
// frame.setOpacity(0.0f);
JPanel contentPane = new JPanel(new BorderLayout());
contentPane.setDoubleBuffered(true);
contentPane.add(browser.getUIComponent(), BorderLayout.CENTER);
frame.setContentPane(contentPane);
// JPanel contentPane = new JPanel(new BorderLayout());
// contentPane.setDoubleBuffered(true);
// contentPane.add(browser.getUIComponent(), BorderLayout.CENTER);
// frame.setContentPane(contentPane);
frame.addWindowListener(
new java.awt.event.WindowAdapter() {
@Override
public void windowClosing(java.awt.event.WindowEvent windowEvent) {
cleanup();
System.exit(0);
}
});
// frame.addWindowListener(
// new java.awt.event.WindowAdapter() {
// @Override
// public void windowClosing(java.awt.event.WindowEvent windowEvent) {
// cleanup();
// System.exit(0);
// }
// });
frame.setSize(UIScaling.scaleWidth(1280), UIScaling.scaleHeight(800));
frame.setLocationRelativeTo(null);
// frame.setSize(UIScaling.scaleWidth(1280), UIScaling.scaleHeight(800));
// frame.setLocationRelativeTo(null);
loadIcon();
}
// loadIcon();
// }
private void setupLoadHandler() {
final long initStartTime = System.currentTimeMillis();
log.info("Setting up load handler at: {}", initStartTime);
// private void setupLoadHandler() {
// final long initStartTime = System.currentTimeMillis();
// log.info("Setting up load handler at: {}", initStartTime);
client.addLoadHandler(
new CefLoadHandlerAdapter() {
@Override
public void onLoadingStateChange(
CefBrowser browser,
boolean isLoading,
boolean canGoBack,
boolean canGoForward) {
log.debug(
"Loading state change - isLoading: {}, canGoBack: {}, canGoForward:"
+ " {}, browserInitialized: {}, Time elapsed: {}ms",
isLoading,
canGoBack,
canGoForward,
browserInitialized,
System.currentTimeMillis() - initStartTime);
// client.addLoadHandler(
// new CefLoadHandlerAdapter() {
// @Override
// public void onLoadingStateChange(
// CefBrowser browser,
// boolean isLoading,
// boolean canGoBack,
// boolean canGoForward) {
// log.debug(
// "Loading state change - isLoading: {}, canGoBack: {}, canGoForward:"
// + " {}, browserInitialized: {}, Time elapsed: {}ms",
// isLoading,
// canGoBack,
// canGoForward,
// browserInitialized,
// System.currentTimeMillis() - initStartTime);
if (!isLoading && !browserInitialized) {
log.info(
"Browser finished loading, preparing to initialize UI"
+ " components");
browserInitialized = true;
SwingUtilities.invokeLater(
() -> {
try {
if (loadingWindow != null) {
log.info("Starting UI initialization sequence");
// if (!isLoading && !browserInitialized) {
// log.info(
// "Browser finished loading, preparing to initialize UI"
// + " components");
// browserInitialized = true;
// SwingUtilities.invokeLater(
// () -> {
// try {
// if (loadingWindow != null) {
// log.info("Starting UI initialization sequence");
// Close loading window first
loadingWindow.setVisible(false);
loadingWindow.dispose();
loadingWindow = null;
log.info("Loading window disposed");
// // Close loading window first
// loadingWindow.setVisible(false);
// loadingWindow.dispose();
// loadingWindow = null;
// log.info("Loading window disposed");
// Then setup the main frame
frame.setVisible(false);
frame.dispose();
frame.setOpacity(1.0f);
frame.setUndecorated(false);
frame.pack();
frame.setSize(
UIScaling.scaleWidth(1280),
UIScaling.scaleHeight(800));
frame.setLocationRelativeTo(null);
log.debug("Frame reconfigured");
// // Then setup the main frame
// frame.setVisible(false);
// frame.dispose();
// frame.setOpacity(1.0f);
// frame.setUndecorated(false);
// frame.pack();
// frame.setSize(
// UIScaling.scaleWidth(1280),
// UIScaling.scaleHeight(800));
// frame.setLocationRelativeTo(null);
// log.debug("Frame reconfigured");
// Show the main frame
frame.setVisible(true);
frame.requestFocus();
frame.toFront();
log.info("Main frame displayed and focused");
// // Show the main frame
// frame.setVisible(true);
// frame.requestFocus();
// frame.toFront();
// log.info("Main frame displayed and focused");
// Focus the browser component
Timer focusTimer =
new Timer(
100,
e -> {
try {
browser.getUIComponent()
.requestFocus();
log.info(
"Browser component"
+ " focused");
} catch (Exception ex) {
log.error(
"Error focusing"
+ " browser",
ex);
}
});
focusTimer.setRepeats(false);
focusTimer.start();
}
} catch (Exception e) {
log.error("Error during UI initialization", e);
// Attempt cleanup on error
if (loadingWindow != null) {
loadingWindow.dispose();
loadingWindow = null;
}
if (frame != null) {
frame.setVisible(true);
frame.requestFocus();
}
}
});
}
}
});
}
// // Focus the browser component
// Timer focusTimer =
// new Timer(
// 100,
// e -> {
// try {
// browser.getUIComponent()
// .requestFocus();
// log.info(
// "Browser component"
// + " focused");
// } catch (Exception ex) {
// log.error(
// "Error focusing"
// + " browser",
// ex);
// }
// });
// focusTimer.setRepeats(false);
// focusTimer.start();
// }
// } catch (Exception e) {
// log.error("Error during UI initialization", e);
// // Attempt cleanup on error
// if (loadingWindow != null) {
// loadingWindow.dispose();
// loadingWindow = null;
// }
// if (frame != null) {
// frame.setVisible(true);
// frame.requestFocus();
// }
// }
// });
// }
// }
// });
// }
private void setupTrayIcon(Image icon) {
if (!SystemTray.isSupported()) {
log.warn("System tray is not supported");
return;
}
// private void setupTrayIcon(Image icon) {
// if (!SystemTray.isSupported()) {
// log.warn("System tray is not supported");
// return;
// }
try {
systemTray = SystemTray.getSystemTray();
// try {
// systemTray = SystemTray.getSystemTray();
// Create popup menu
PopupMenu popup = new PopupMenu();
// // Create popup menu
// PopupMenu popup = new PopupMenu();
// Create menu items
MenuItem showItem = new MenuItem("Show");
showItem.addActionListener(
e -> {
frame.setVisible(true);
frame.setState(Frame.NORMAL);
});
// // Create menu items
// MenuItem showItem = new MenuItem("Show");
// showItem.addActionListener(
// e -> {
// frame.setVisible(true);
// frame.setState(Frame.NORMAL);
// });
MenuItem exitItem = new MenuItem("Exit");
exitItem.addActionListener(
e -> {
cleanup();
System.exit(0);
});
// MenuItem exitItem = new MenuItem("Exit");
// exitItem.addActionListener(
// e -> {
// cleanup();
// System.exit(0);
// });
// Add menu items to popup menu
popup.add(showItem);
popup.addSeparator();
popup.add(exitItem);
// // Add menu items to popup menu
// popup.add(showItem);
// popup.addSeparator();
// popup.add(exitItem);
// Create tray icon
trayIcon = new TrayIcon(icon, "Stirling-PDF", popup);
trayIcon.setImageAutoSize(true);
// // Create tray icon
// trayIcon = new TrayIcon(icon, "Stirling-PDF", popup);
// trayIcon.setImageAutoSize(true);
// Add double-click behavior
trayIcon.addActionListener(
e -> {
frame.setVisible(true);
frame.setState(Frame.NORMAL);
});
// // Add double-click behavior
// trayIcon.addActionListener(
// e -> {
// frame.setVisible(true);
// frame.setState(Frame.NORMAL);
// });
// Add tray icon to system tray
systemTray.add(trayIcon);
// // Add tray icon to system tray
// systemTray.add(trayIcon);
// Modify frame behavior to minimize to tray
frame.addWindowStateListener(
new WindowStateListener() {
public void windowStateChanged(WindowEvent e) {
if (e.getNewState() == Frame.ICONIFIED) {
frame.setVisible(false);
}
}
});
// // Modify frame behavior to minimize to tray
// frame.addWindowStateListener(
// new WindowStateListener() {
// public void windowStateChanged(WindowEvent e) {
// if (e.getNewState() == Frame.ICONIFIED) {
// frame.setVisible(false);
// }
// }
// });
} catch (AWTException e) {
log.error("Error setting up system tray icon", e);
}
}
// } catch (AWTException e) {
// log.error("Error setting up system tray icon", e);
// }
// }
private void loadIcon() {
try {
Image icon = null;
String[] iconPaths = {"/static/favicon.ico"};
// private void loadIcon() {
// try {
// Image icon = null;
// String[] iconPaths = {"/static/favicon.ico"};
for (String path : iconPaths) {
if (icon != null) break;
try {
try (InputStream is = getClass().getResourceAsStream(path)) {
if (is != null) {
icon = ImageIO.read(is);
break;
}
}
} catch (Exception e) {
log.debug("Could not load icon from " + path, e);
}
}
// for (String path : iconPaths) {
// if (icon != null) break;
// try {
// try (InputStream is = getClass().getResourceAsStream(path)) {
// if (is != null) {
// icon = ImageIO.read(is);
// break;
// }
// }
// } catch (Exception e) {
// log.debug("Could not load icon from " + path, e);
// }
// }
if (icon != null) {
frame.setIconImage(icon);
setupTrayIcon(icon);
} else {
log.warn("Could not load icon from any source");
}
} catch (Exception e) {
log.error("Error loading icon", e);
}
}
// if (icon != null) {
// frame.setIconImage(icon);
// setupTrayIcon(icon);
// } else {
// log.warn("Could not load icon from any source");
// }
// } catch (Exception e) {
// log.error("Error loading icon", e);
// }
// }
@PreDestroy
public void cleanup() {
if (browser != null) browser.close(true);
if (client != null) client.dispose();
if (cefApp != null) cefApp.dispose();
if (loadingWindow != null) loadingWindow.dispose();
}
// @PreDestroy
// public void cleanup() {
// if (browser != null) browser.close(true);
// if (client != null) client.dispose();
// if (cefApp != null) cefApp.dispose();
// if (loadingWindow != null) loadingWindow.dispose();
// }
public static void forceInitializeUI() {
try {
if (loadingWindow != null) {
log.info("Forcing start of UI initialization sequence");
// public static void forceInitializeUI() {
// try {
// if (loadingWindow != null) {
// log.info("Forcing start of UI initialization sequence");
// Close loading window first
loadingWindow.setVisible(false);
loadingWindow.dispose();
loadingWindow = null;
log.info("Loading window disposed");
// // Close loading window first
// loadingWindow.setVisible(false);
// loadingWindow.dispose();
// loadingWindow = null;
// log.info("Loading window disposed");
// Then setup the main frame
frame.setVisible(false);
frame.dispose();
frame.setOpacity(1.0f);
frame.setUndecorated(false);
frame.pack();
frame.setSize(UIScaling.scaleWidth(1280), UIScaling.scaleHeight(800));
frame.setLocationRelativeTo(null);
log.debug("Frame reconfigured");
// // Then setup the main frame
// frame.setVisible(false);
// frame.dispose();
// frame.setOpacity(1.0f);
// frame.setUndecorated(false);
// frame.pack();
// frame.setSize(UIScaling.scaleWidth(1280), UIScaling.scaleHeight(800));
// frame.setLocationRelativeTo(null);
// log.debug("Frame reconfigured");
// Show the main frame
frame.setVisible(true);
frame.requestFocus();
frame.toFront();
log.info("Main frame displayed and focused");
// // Show the main frame
// frame.setVisible(true);
// frame.requestFocus();
// frame.toFront();
// log.info("Main frame displayed and focused");
// Focus the browser component if available
if (browser != null) {
Timer focusTimer =
new Timer(
100,
e -> {
try {
browser.getUIComponent().requestFocus();
log.info("Browser component focused");
} catch (Exception ex) {
log.error(
"Error focusing browser during force ui"
+ " initialization.",
ex);
}
});
focusTimer.setRepeats(false);
focusTimer.start();
}
}
} catch (Exception e) {
log.error("Error during Forced UI initialization.", e);
// Attempt cleanup on error
if (loadingWindow != null) {
loadingWindow.dispose();
loadingWindow = null;
}
if (frame != null) {
frame.setVisible(true);
frame.setOpacity(1.0f);
frame.setUndecorated(false);
frame.requestFocus();
}
}
}
}
// // Focus the browser component if available
// if (browser != null) {
// Timer focusTimer =
// new Timer(
// 100,
// e -> {
// try {
// browser.getUIComponent().requestFocus();
// log.info("Browser component focused");
// } catch (Exception ex) {
// log.error(
// "Error focusing browser during force ui"
// + " initialization.",
// ex);
// }
// });
// focusTimer.setRepeats(false);
// focusTimer.start();
// }
// }
// } catch (Exception e) {
// log.error("Error during Forced UI initialization.", e);
// // Attempt cleanup on error
// if (loadingWindow != null) {
// loadingWindow.dispose();
// loadingWindow = null;
// }
// if (frame != null) {
// frame.setVisible(true);
// frame.setOpacity(1.0f);
// frame.setUndecorated(false);
// frame.requestFocus();
// }
// }
// }
// }