From c4970cc4addedd4565cf8c3ed9ea92b6a4487e0c Mon Sep 17 00:00:00 2001 From: Thomas Guillemard Date: Fri, 12 Aug 2016 19:23:54 +0200 Subject: Implement Enigma directory format (#1) Others changes: ~ Rework File menu ~ Force UTF-8 for all I/O operations ~ Enigma now detect the original file format and use the correct one when you save a mapping--- src/main/java/cuchaz/enigma/gui/Gui.java | 33 +++++---- src/main/java/cuchaz/enigma/gui/GuiController.java | 35 ++++++--- .../java/cuchaz/enigma/gui/elements/MenuBar.java | 85 +++++++++++++--------- .../enigma/gui/filechooser/FileChooserAny.java | 11 +++ 4 files changed, 104 insertions(+), 60 deletions(-) create mode 100644 src/main/java/cuchaz/enigma/gui/filechooser/FileChooserAny.java (limited to 'src/main/java/cuchaz/enigma/gui') diff --git a/src/main/java/cuchaz/enigma/gui/Gui.java b/src/main/java/cuchaz/enigma/gui/Gui.java index 5b0b599..2269476 100644 --- a/src/main/java/cuchaz/enigma/gui/Gui.java +++ b/src/main/java/cuchaz/enigma/gui/Gui.java @@ -34,6 +34,7 @@ import cuchaz.enigma.analysis.*; import cuchaz.enigma.gui.dialog.CrashDialog; import cuchaz.enigma.gui.elements.MenuBar; import cuchaz.enigma.gui.elements.PopupMenuBar; +import cuchaz.enigma.gui.filechooser.FileChooserAny; import cuchaz.enigma.gui.filechooser.FileChooserFile; import cuchaz.enigma.gui.filechooser.FileChooserFolder; import cuchaz.enigma.gui.highlight.DeobfuscatedHighlightPainter; @@ -78,8 +79,8 @@ public class Gui { public EntryReference m_reference; public JFileChooser jarFileChooser; - public JFileChooser mappingsFileChooser; - public JFileChooser oldMappingsFileChooser; + public JFileChooser jsonMappingsFileChooser; + public JFileChooser enigmaMappingsFileChooser; public JFileChooser exportSourceFileChooser; public JFileChooser exportJarFileChooser; @@ -106,10 +107,10 @@ public class Gui { // init file choosers this.jarFileChooser = new FileChooserFile(); - this.mappingsFileChooser = new FileChooserFolder(); + this.jsonMappingsFileChooser = new FileChooserFolder(); - this.oldMappingsFileChooser = new FileChooserFile(); + this.enigmaMappingsFileChooser = new FileChooserAny(); this.exportSourceFileChooser = new FileChooserFolder(); this.exportJarFileChooser = new FileChooserFile(); @@ -315,11 +316,12 @@ public class Gui { // update menu this.menuBar.closeJarMenu.setEnabled(true); - this.menuBar.openOldMappingsMenu.setEnabled(true); - this.menuBar.openMappingsMenu.setEnabled(true); + this.menuBar.openEnigmaMappingsMenu.setEnabled(true); + this.menuBar.openMappingsJsonMenu.setEnabled(true); this.menuBar.saveMappingsMenu.setEnabled(false); - this.menuBar.saveMappingsAsMenu.setEnabled(true); - this.menuBar.saveMappingsOldMenu.setEnabled(true); + this.menuBar.saveMappingsJsonMenu.setEnabled(true); + this.menuBar.saveMappingEnigmaFileMenu.setEnabled(true); + this.menuBar.saveMappingEnigmaDirectoryMenu.setEnabled(true); this.menuBar.saveMappingsSrgMenu.setEnabled(true); this.menuBar.closeMappingsMenu.setEnabled(true); this.menuBar.exportSourceMenu.setEnabled(true); @@ -338,11 +340,12 @@ public class Gui { // update menu this.menuBar.closeJarMenu.setEnabled(false); - this.menuBar.openOldMappingsMenu.setEnabled(false); - this.menuBar.openMappingsMenu.setEnabled(false); + this.menuBar.openEnigmaMappingsMenu.setEnabled(false); + this.menuBar.openMappingsJsonMenu.setEnabled(false); this.menuBar.saveMappingsMenu.setEnabled(false); - this.menuBar.saveMappingsAsMenu.setEnabled(false); - this.menuBar.saveMappingsOldMenu.setEnabled(false); + this.menuBar.saveMappingsJsonMenu.setEnabled(false); + this.menuBar.saveMappingEnigmaFileMenu.setEnabled(false); + this.menuBar.saveMappingEnigmaDirectoryMenu.setEnabled(false); this.menuBar.saveMappingsSrgMenu.setEnabled(false); this.menuBar.closeMappingsMenu.setEnabled(false); this.menuBar.exportSourceMenu.setEnabled(false); @@ -360,7 +363,7 @@ public class Gui { } public void setMappingsFile(File file) { - this.mappingsFileChooser.setSelectedFile(file); + this.jsonMappingsFileChooser.setSelectedFile(file); this.menuBar.saveMappingsMenu.setEnabled(file != null); } @@ -721,9 +724,9 @@ public class Gui { JOptionPane.QUESTION_MESSAGE, null, options, options[2]); switch (response) { case JOptionPane.YES_OPTION: // save and exit - if (this.mappingsFileChooser.getSelectedFile() != null || this.mappingsFileChooser.showSaveDialog(this.frame) == JFileChooser.APPROVE_OPTION) { + if (this.jsonMappingsFileChooser.getSelectedFile() != null || this.jsonMappingsFileChooser.showSaveDialog(this.frame) == JFileChooser.APPROVE_OPTION) { try { - this.controller.saveMappings(this.mappingsFileChooser.getCurrentDirectory()); + this.controller.saveMappings(this.jsonMappingsFileChooser.getCurrentDirectory()); this.frame.dispose(); } catch (IOException ex) { throw new Error(ex); diff --git a/src/main/java/cuchaz/enigma/gui/GuiController.java b/src/main/java/cuchaz/enigma/gui/GuiController.java index fe7d097..d416345 100644 --- a/src/main/java/cuchaz/enigma/gui/GuiController.java +++ b/src/main/java/cuchaz/enigma/gui/GuiController.java @@ -16,7 +16,6 @@ import com.google.common.collect.Queues; import com.strobel.decompiler.languages.java.ast.CompilationUnit; import java.io.File; -import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.Collection; @@ -65,18 +64,16 @@ public class GuiController { this.gui.onCloseJar(); } - public void openOldMappings(File file) throws IOException, MappingParseException { - FileReader in = new FileReader(file); - this.deobfuscator.setMappings(new MappingsReaderOld().read(in)); - in.close(); + public void openEnigmaMappings(File file) throws IOException, MappingParseException { + this.deobfuscator.setMappings(new MappingsEnigmaReader().read(file)); this.isDirty = false; this.gui.setMappingsFile(file); refreshClasses(); refreshCurrentClass(); } - public void openMappings(File file) throws IOException { - this.deobfuscator.setMappings(new MappingsReader().read(file)); + public void openJsonMappings(File file) throws IOException { + this.deobfuscator.setMappings(new MappingsJsonReader().read(file)); this.isDirty = false; this.gui.setMappingsFile(file); refreshClasses(); @@ -84,13 +81,29 @@ public class GuiController { } public void saveMappings(File file) throws IOException { - new MappingsWriter().write(file, this.deobfuscator.getMappings()); + Mappings mappings = this.deobfuscator.getMappings(); + switch (mappings.getOriginMappingFormat()) + { + case SRG_FILE: + saveSRGMappings(file); + break; + case JSON_DIRECTORY: + saveJsonMappings(file); + break; + default: + saveEnigmaMappings(file, Mappings.FormatType.ENIGMA_FILE != mappings.getOriginMappingFormat()); + break; + } + + } + + public void saveJsonMappings(File file) throws IOException { + new MappingsJsonWriter().write(file, this.deobfuscator.getMappings()); this.isDirty = false; } - public void saveOldMappings(File file) throws IOException { - FileWriter out = new FileWriter(file); - new MappingsOldWriter().write(out, this.deobfuscator.getMappings()); + public void saveEnigmaMappings(File file, boolean isDirectoryFormat) throws IOException { + new MappingsEnigmaWriter().write(file, this.deobfuscator.getMappings(), isDirectoryFormat); this.isDirty = false; } diff --git a/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java b/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java index e79476b..e988d74 100644 --- a/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java +++ b/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java @@ -17,12 +17,13 @@ public class MenuBar extends JMenuBar { public final JMenuItem closeJarMenu; - public final JMenuItem openMappingsMenu; - public final JMenuItem openOldMappingsMenu; + public final JMenuItem openMappingsJsonMenu; + public final JMenuItem openEnigmaMappingsMenu; public final JMenuItem saveMappingsMenu; - public final JMenuItem saveMappingsAsMenu; - public final JMenuItem saveMappingsOldMenu; + public final JMenuItem saveMappingsJsonMenu; + public final JMenuItem saveMappingEnigmaFileMenu; + public final JMenuItem saveMappingEnigmaDirectoryMenu; public final JMenuItem saveMappingsSrgMenu; public final JMenuItem closeMappingsMenu; @@ -62,43 +63,44 @@ public class MenuBar extends JMenuBar { this.closeJarMenu = item; } menu.addSeparator(); + JMenu openMenu = new JMenu("Open Mappings..."); { - JMenuItem item = new JMenuItem("Open Mappings..."); - menu.add(item); + JMenuItem item = new JMenuItem("Enigma"); + openMenu.add(item); item.addActionListener(event -> { - if (this.gui.mappingsFileChooser.showOpenDialog(this.gui.getFrame()) == JFileChooser.APPROVE_OPTION) { + if (this.gui.enigmaMappingsFileChooser.showOpenDialog(this.gui.getFrame()) == JFileChooser.APPROVE_OPTION) { try { - this.gui.getController().openMappings(this.gui.mappingsFileChooser.getSelectedFile()); + this.gui.getController().openEnigmaMappings(this.gui.enigmaMappingsFileChooser.getSelectedFile()); } catch (IOException ex) { throw new Error(ex); + } catch (MappingParseException ex) { + JOptionPane.showMessageDialog(this.gui.getFrame(), ex.getMessage()); } } }); - this.openMappingsMenu = item; + this.openEnigmaMappingsMenu = item; } + menu.add(openMenu); { - JMenuItem item = new JMenuItem("Open Old Mappings..."); - menu.add(item); + JMenuItem item = new JMenuItem("JSON (directory)"); + openMenu.add(item); item.addActionListener(event -> { - if (this.gui.oldMappingsFileChooser.showOpenDialog(this.gui.getFrame()) == JFileChooser.APPROVE_OPTION) { + if (this.gui.jsonMappingsFileChooser.showOpenDialog(this.gui.getFrame()) == JFileChooser.APPROVE_OPTION) { try { - this.gui.getController().openOldMappings(this.gui.oldMappingsFileChooser.getSelectedFile()); + this.gui.getController().openJsonMappings(this.gui.jsonMappingsFileChooser.getSelectedFile()); } catch (IOException ex) { throw new Error(ex); - } catch (MappingParseException ex) { - JOptionPane.showMessageDialog(this.gui.getFrame(), ex.getMessage()); } } }); - this.openOldMappingsMenu = item; + this.openMappingsJsonMenu = item; } - menu.addSeparator(); { JMenuItem item = new JMenuItem("Save Mappings"); menu.add(item); item.addActionListener(event -> { try { - this.gui.getController().saveMappings(this.gui.mappingsFileChooser.getSelectedFile()); + this.gui.getController().saveMappings(this.gui.jsonMappingsFileChooser.getSelectedFile()); } catch (IOException ex) { throw new Error(ex); } @@ -106,29 +108,29 @@ public class MenuBar extends JMenuBar { item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_DOWN_MASK)); this.saveMappingsMenu = item; } + JMenu saveMenu = new JMenu("Save Mappings As..."); { - JMenuItem item = new JMenuItem("Save Mappings As..."); - menu.add(item); + JMenuItem item = new JMenuItem("Enigma (single file)"); + saveMenu.add(item); item.addActionListener(event -> { - if (this.gui.mappingsFileChooser.showSaveDialog(this.gui.getFrame()) == JFileChooser.APPROVE_OPTION) { + if (this.gui.jsonMappingsFileChooser.showSaveDialog(this.gui.getFrame()) == JFileChooser.APPROVE_OPTION) { try { - this.gui.getController().saveMappings(this.gui.mappingsFileChooser.getSelectedFile()); + this.gui.getController().saveEnigmaMappings(this.gui.jsonMappingsFileChooser.getSelectedFile(), false); this.saveMappingsMenu.setEnabled(true); } catch (IOException ex) { throw new Error(ex); } } }); - item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK)); - this.saveMappingsAsMenu = item; + this.saveMappingEnigmaFileMenu = item; } { - JMenuItem item = new JMenuItem("Save Mappings as Enigma"); - menu.add(item); + JMenuItem item = new JMenuItem("Enigma (directory)"); + saveMenu.add(item); item.addActionListener(event -> { - if (this.gui.mappingsFileChooser.showSaveDialog(this.gui.getFrame()) == JFileChooser.APPROVE_OPTION) { + if (this.gui.jsonMappingsFileChooser.showSaveDialog(this.gui.getFrame()) == JFileChooser.APPROVE_OPTION) { try { - this.gui.getController().saveOldMappings(this.gui.mappingsFileChooser.getSelectedFile()); + this.gui.getController().saveEnigmaMappings(this.gui.jsonMappingsFileChooser.getSelectedFile(), true); this.saveMappingsMenu.setEnabled(true); } catch (IOException ex) { throw new Error(ex); @@ -136,22 +138,37 @@ public class MenuBar extends JMenuBar { } }); item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK)); - this.saveMappingsOldMenu = item; + this.saveMappingEnigmaDirectoryMenu = item; } + menu.add(saveMenu); { - JMenuItem item = new JMenuItem("Save Mappings as SRG"); - menu.add(item); + JMenuItem item = new JMenuItem("JSON (directory)"); + saveMenu.add(item); item.addActionListener(event -> { - if (this.gui.mappingsFileChooser.showSaveDialog(this.gui.getFrame()) == JFileChooser.APPROVE_OPTION) { + if (this.gui.jsonMappingsFileChooser.showSaveDialog(this.gui.getFrame()) == JFileChooser.APPROVE_OPTION) { try { - this.gui.getController().saveSRGMappings(this.gui.mappingsFileChooser.getSelectedFile()); + this.gui.getController().saveJsonMappings(this.gui.jsonMappingsFileChooser.getSelectedFile()); + this.saveMappingsMenu.setEnabled(true); + } catch (IOException ex) { + throw new Error(ex); + } + } + }); + this.saveMappingsJsonMenu = item; + } + { + JMenuItem item = new JMenuItem("SRG"); + saveMenu.add(item); + item.addActionListener(event -> { + if (this.gui.jsonMappingsFileChooser.showSaveDialog(this.gui.getFrame()) == JFileChooser.APPROVE_OPTION) { + try { + this.gui.getController().saveSRGMappings(this.gui.jsonMappingsFileChooser.getSelectedFile()); this.saveMappingsMenu.setEnabled(true); } catch (IOException ex) { throw new Error(ex); } } }); - item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK)); this.saveMappingsSrgMenu = item; } { diff --git a/src/main/java/cuchaz/enigma/gui/filechooser/FileChooserAny.java b/src/main/java/cuchaz/enigma/gui/filechooser/FileChooserAny.java new file mode 100644 index 0000000..2339334 --- /dev/null +++ b/src/main/java/cuchaz/enigma/gui/filechooser/FileChooserAny.java @@ -0,0 +1,11 @@ +package cuchaz.enigma.gui.filechooser; + +import javax.swing.*; + +public class FileChooserAny extends JFileChooser +{ + public FileChooserAny() { + this.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); + this.setAcceptAllFileFilterUsed(false); + } +} \ No newline at end of file -- cgit v1.2.3