diff --git a/src/main/java/com/marginallyclever/ro3/apps/actions/AddNode.java b/src/main/java/com/marginallyclever/ro3/apps/actions/AddNode.java index 38d151d99..d0b685bc9 100644 --- a/src/main/java/com/marginallyclever/ro3/apps/actions/AddNode.java +++ b/src/main/java/com/marginallyclever/ro3/apps/actions/AddNode.java @@ -20,10 +20,10 @@ public class AddNode extends AbstractAction { public AddNode(NodeTreeView treeView) { super(); + this.treeView = treeView; putValue(Action.NAME,"Add"); putValue(SMALL_ICON,new ImageIcon(Objects.requireNonNull(getClass().getResource("icons8-add-16.png")))); putValue(SHORT_DESCRIPTION,"Add a new instance of a Node to every selected branches of the tree."); - this.treeView = treeView; } /** diff --git a/src/main/java/com/marginallyclever/ro3/apps/logpanel/LogPanel.java b/src/main/java/com/marginallyclever/ro3/apps/logpanel/LogPanel.java index 5486419e2..36acb18e9 100644 --- a/src/main/java/com/marginallyclever/ro3/apps/logpanel/LogPanel.java +++ b/src/main/java/com/marginallyclever/ro3/apps/logpanel/LogPanel.java @@ -2,12 +2,22 @@ import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.Appender; +import ch.qos.logback.core.FileAppender; import com.marginallyclever.ro3.apps.DockingPanel; import org.slf4j.LoggerFactory; import javax.swing.*; import java.awt.*; +import java.io.File; +import java.io.IOException; +import java.lang.module.Configuration; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Iterator; import java.util.Locale; +import java.util.Objects; import java.util.Properties; /** @@ -15,11 +25,17 @@ * because it is created before {@link ModernDocking.app.Docking} is initialized. */ public class LogPanel extends JPanel { + private static final org.slf4j.Logger logger = LoggerFactory.getLogger(LogPanel.class); private final JTextArea logArea = new JTextArea(); public LogPanel() { super(new BorderLayout()); + JToolBar toolbar = new JToolBar(); + toolbar.setFloatable(false); + toolbar.add(new JButton(new OpenLogFileLocation())); + add(toolbar, BorderLayout.NORTH); + logArea.setEditable(false); JScrollPane scroll = new JScrollPane(); scroll.setViewportView(logArea); @@ -27,16 +43,16 @@ public LogPanel() { // append log events to this panel LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); - Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); + Logger rootLogger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); LogPanelAppender appender = new LogPanelAppender(this); appender.setContext(lc); - logger.addAppender(appender); + rootLogger.addAppender(appender); appender.start(); - reportSystemInfo(logger); + reportSystemInfo(); } - private void reportSystemInfo(Logger logger) { + private void reportSystemInfo() { logger.info("------------------------------------------------"); Properties p = System.getProperties(); for(String n : p.stringPropertyNames()) { diff --git a/src/main/java/com/marginallyclever/ro3/apps/logpanel/OpenLogFileLocation.java b/src/main/java/com/marginallyclever/ro3/apps/logpanel/OpenLogFileLocation.java new file mode 100644 index 000000000..6eadda805 --- /dev/null +++ b/src/main/java/com/marginallyclever/ro3/apps/logpanel/OpenLogFileLocation.java @@ -0,0 +1,57 @@ +package com.marginallyclever.ro3.apps.logpanel; + +import ch.qos.logback.classic.Logger; +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.Appender; +import ch.qos.logback.core.FileAppender; +import org.slf4j.LoggerFactory; + +import javax.swing.*; +import java.awt.*; +import java.io.File; +import java.io.IOException; +import java.util.Iterator; +import java.util.Objects; + +public class OpenLogFileLocation extends AbstractAction { + private final org.slf4j.Logger logger = LoggerFactory.getLogger(OpenLogFileLocation.class); + + public OpenLogFileLocation() { + super(); + putValue(Action.NAME,"Open Log File Location"); + putValue(Action.SMALL_ICON,new ImageIcon(Objects.requireNonNull(getClass().getResource("icons8-folder-16.png")))); + putValue(Action.SHORT_DESCRIPTION,"Open the folder containing the log file."); + } + + @Override + public void actionPerformed(java.awt.event.ActionEvent e) { + String logFileName = getLogFile(); + if(logFileName==null) { + logger.error("Failed to find log file."); + return; + } + + logger.debug("Opening log file location: "+logFileName); + try { + File file = new File(logFileName); + String absolutePath = file.getAbsolutePath(); + File parentDirectory = new File(absolutePath).getParentFile(); + Desktop.getDesktop().open(parentDirectory); + } catch(IOException ex) { + logger.error("Failed to open log file location.",ex); + } + } + + private String getLogFile() { + Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); + + for (Iterator> it = logger.iteratorForAppenders(); it.hasNext(); ) { + Appender appender = it.next(); + if (appender instanceof FileAppender) { + FileAppender fileAppender = (FileAppender) appender; + return fileAppender.getFile(); + } + } + return null; + } +} \ No newline at end of file diff --git a/src/main/resources/com/marginallyclever/ro3/apps/logpanel/icons8-folder-16.png b/src/main/resources/com/marginallyclever/ro3/apps/logpanel/icons8-folder-16.png new file mode 100644 index 000000000..114747374 Binary files /dev/null and b/src/main/resources/com/marginallyclever/ro3/apps/logpanel/icons8-folder-16.png differ