diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c18e5c16..bdd9edab4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,7 @@ All notable changes to this project will be documented in this file. - [#2236], [#2451] Replacing sound stream block ranges - Importing sound stream block ranges - Commandline replacing sound stream block ranges +- [#1625] Error log frame - Save all to file button ### Changed - AS1/2 - Single DoAction tag inside frame is now displayed directly as frame node @@ -3855,6 +3856,7 @@ Major version of SWF to XML export changed to 2. [#2463]: https://www.free-decompiler.com/flash/issues/2463 [#2236]: https://www.free-decompiler.com/flash/issues/2236 [#2451]: https://www.free-decompiler.com/flash/issues/2451 +[#1625]: https://www.free-decompiler.com/flash/issues/1625 [#2456]: https://www.free-decompiler.com/flash/issues/2456 [#2459]: https://www.free-decompiler.com/flash/issues/2459 [#2460]: https://www.free-decompiler.com/flash/issues/2460 diff --git a/src/com/jpexs/decompiler/flash/gui/ErrorLogFrame.java b/src/com/jpexs/decompiler/flash/gui/ErrorLogFrame.java index 1ad9a9856..4074b5fa3 100644 --- a/src/com/jpexs/decompiler/flash/gui/ErrorLogFrame.java +++ b/src/com/jpexs/decompiler/flash/gui/ErrorLogFrame.java @@ -30,10 +30,17 @@ import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.StringSelection; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; +import java.io.Writer; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Date; +import java.util.List; +import java.util.Locale; import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Handler; import java.util.logging.Level; @@ -45,12 +52,15 @@ import javax.swing.BoxLayout; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JComponent; +import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; +import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JToggleButton; +import javax.swing.filechooser.FileFilter; /** * @author JPEXS @@ -75,6 +85,10 @@ public class ErrorLogFrame extends AppFrame { private final AtomicInteger logItemCount = new AtomicInteger(); + private List logHistory = new ArrayList<>(); + + private JButton saveToFileButton; + public Handler getHandler() { return handler; } @@ -138,8 +152,61 @@ public class ErrorLogFrame extends AppFrame { clearLog(); } }); + saveToFileButton = new JButton(translate("saveToFile")); + saveToFileButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + JFileChooser fc = View.getFileChooserWithIcon("save"); + fc.setCurrentDirectory(new File(Configuration.lastSaveDir.get())); + + FileFilter txtFilter = new FileFilter() { + @Override + public boolean accept(File f) { + return (f.getName().toLowerCase(Locale.ENGLISH).endsWith(".txt")) + || (f.isDirectory()); + } + + @Override + public String getDescription() { + return translate("filter.txt"); + } + }; + fc.addChoosableFileFilter(txtFilter); + fc.setAcceptAllFileFilterUsed(true); + if (fc.showSaveDialog(Main.getDefaultMessagesComponent()) != JFileChooser.APPROVE_OPTION) { + return; + } + File file = Helper.fixDialogFile(fc.getSelectedFile()); + try (Writer w = new FileWriter(file); PrintWriter pw = new PrintWriter(w);) { + List logHistoryCopy = new ArrayList<>(logHistory); + boolean first = true; + for (String entry : logHistoryCopy) { + if (!first) { + pw.println("-------------------------"); + } + pw.println(entry); + first = false; + } + } catch (IOException ex) { + ViewMessages.showMessageDialog(Main.getDefaultMessagesComponent(), translate("error.cannotSave").replace("%error%", ex.getLocalizedMessage()), AppStrings.translate("error"), JOptionPane.ERROR_MESSAGE); + } + } + }); buttonsPanel.add(clearButton); + /* + JButton makeErrorButton = new JButton("Do error"); + makeErrorButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + Logger.getLogger(ErrorLogFrame.class.getName()).log(Level.SEVERE, "Test message", new Exception()); + } + }); + buttonsPanel.add(makeErrorButton); + */ + saveToFileButton.setEnabled(false); + buttonsPanel.add(saveToFileButton); + expandIcon = View.getIcon("expand16"); collapseIcon = View.getIcon("collapse16"); cnt.add(buttonsPanel, BorderLayout.SOUTH); @@ -167,6 +234,8 @@ public class ErrorLogFrame extends AppFrame { } public void clearLog() { + saveToFileButton.setEnabled(false); + logHistory.clear(); logViewInner.removeAll(); logItemCount.set(0); Main.clearLogFile(); @@ -239,6 +308,7 @@ public class ErrorLogFrame extends AppFrame { } SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); final String dateStr = format.format(new Date()); + final String logEntry = dateStr + " " + level.toString() + " " + msg + "\r\n" + detail; JToggleButton copyButton = new JToggleButton(View.getIcon("copy16")); copyButton.setFocusPainted(false); @@ -252,10 +322,11 @@ public class ErrorLogFrame extends AppFrame { @Override public void actionPerformed(ActionEvent e) { Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); - StringSelection stringSelection = new StringSelection(dateStr + " " + level.toString() + " " + msg + "\r\n" + detail); + StringSelection stringSelection = new StringSelection(logEntry); clipboard.setContents(stringSelection, null); } }); + logHistory.add(logEntry); final JToggleButton expandButton = new JToggleButton(collapseIcon); expandButton.setFocusPainted(false); @@ -316,6 +387,7 @@ public class ErrorLogFrame extends AppFrame { if (logViewInner != null) { //may be disposed or what? #1904 logViewInner.add(pan); } + saveToFileButton.setEnabled(true); revalidate(); repaint(); }); diff --git a/src/com/jpexs/decompiler/flash/gui/locales/ErrorLogFrame.properties b/src/com/jpexs/decompiler/flash/gui/locales/ErrorLogFrame.properties index e9ff803ae..269899f7b 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/ErrorLogFrame.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/ErrorLogFrame.properties @@ -17,3 +17,7 @@ details = View details dialog.title = Log #after version 1.7.0u1: clear = Clear +#after version 23.0.1: +saveToFile = Save to file... +filter.txt = Text files (*.txt) +error.cannotSave = Cannot save log file: %error% \ No newline at end of file diff --git a/src/com/jpexs/decompiler/flash/gui/locales/ErrorLogFrame_cs.properties b/src/com/jpexs/decompiler/flash/gui/locales/ErrorLogFrame_cs.properties index fd2fce555..9e62fe3df 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/ErrorLogFrame_cs.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/ErrorLogFrame_cs.properties @@ -17,3 +17,7 @@ details = Zobrazit detaily dialog.title = Log #after version 1.7.0u1: clear = Vypr\u00e1zdnit +#after version 23.0.1: +saveToFile = Ulo\u017eit do souboru... +filter.txt = Textov\u00e9 soubory (*.txt) +error.cannotSave = Nelze ulo\u017eit soubor s logem: %error% \ No newline at end of file