package ctbrec.ui.tabs; import ctbrec.Config; import ctbrec.OS; import ctbrec.docs.DocServer; import ctbrec.ui.DesktopIntegration; import javafx.application.Platform; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.control.Button; import javafx.scene.control.Tab; import javafx.scene.control.Label; import javafx.scene.layout.BorderPane; import javafx.scene.layout.VBox; import lombok.extern.slf4j.Slf4j; // import java.awt.Desktop; import java.io.File; import java.io.IOException; @Slf4j public class HelpTab extends Tab { private boolean serverStarted = false; public HelpTab() { setClosable(false); setText("Help"); Button openHelp = new Button("Open Help"); Button openLog = new Button("Open Log File"); Button openCfg = new Button("Open config dir"); openHelp.setPadding(new Insets(20)); openLog.setPadding(new Insets(20)); openCfg.setPadding(new Insets(20)); Label logFilePathLabel = new Label("Log file: " + new File("ctbrec.log").getAbsolutePath()); File cfgDir = Config.getInstance().getConfigDir(); String path = (cfgDir != null) ? cfgDir.getAbsolutePath() : "Unknown"; Label configPathLabel = new Label("Config dir: " + path); VBox vbox = new VBox(); vbox.setAlignment(Pos.CENTER); // Center align the buttons vbox.setSpacing(20); // Set a 20 pixel gap between the buttons vbox.getChildren().addAll(openHelp, openCfg, configPathLabel, openLog, logFilePathLabel); BorderPane layout = new BorderPane(); // Add the VBox to the center region of the BorderPane layout.setCenter(vbox); setContent(layout); openHelp.setOnAction(e -> { if (!serverStarted) { startDocumentationServer(); } else { openDocumentationPage(); } }); openLog.setOnAction(e -> { File logFile = new File("ctbrec.log"); if (logFile.exists()) { try { // Use Runtime.getRuntime().exec() to open the file in a separate process String osName = System.getProperty("os.name").toLowerCase(); ProcessBuilder pb = null; if (osName.contains("mac")) { pb = new ProcessBuilder("open", logFile.getAbsolutePath()); } else if (osName.contains("win")) { pb = new ProcessBuilder("explorer.exe", logFile.getAbsolutePath()); } else { // Assume it's a Unix/Linux system pb = new ProcessBuilder("xdg-open", logFile.getAbsolutePath()); } pb.start(); } catch (IOException ex) { log.error("Couldn't open log file", ex); } } else { log.warn("Log file doesn't exist: {}", logFile.getAbsolutePath()); } }); openCfg.setOnAction(e -> { File configDir = Config.getInstance().getConfigDir(); if (configDir.exists()) { try { // Use Runtime.getRuntime().exec() to open the file in a separate process String osName = System.getProperty("os.name").toLowerCase(); ProcessBuilder pb = null; if (osName.contains("mac")) { pb = new ProcessBuilder("open", configDir.getAbsolutePath()); } else if (osName.contains("win")) { pb = new ProcessBuilder("explorer.exe", configDir.getAbsolutePath()); } else { // Assume it's a Unix/Linux system pb = new ProcessBuilder("xdg-open", configDir.getAbsolutePath()); } pb.start(); } catch (IOException ex) { log.error("Couldn't open config dir", ex); } } else { log.warn("Config dir doesn't exist: {}", configDir.getAbsolutePath()); } }); } private void startDocumentationServer() { new Thread(() -> { try { DocServer.start(() -> Platform.runLater(() -> { serverStarted = true; openDocumentationPage(); })); } catch (Exception ex) { log.error("Couldn't start documentation server", ex); } }).start(); } private void openDocumentationPage() { DesktopIntegration.open("http://localhost:5689/docs/index.md"); } }