From 5361e4126e06416f6ddab21b895c9c130be4401a Mon Sep 17 00:00:00 2001 From: "Dr.Ir.Ing. Theo Kluter" Date: Fri, 8 Oct 2021 20:00:33 +0200 Subject: [PATCH 01/31] New take on projekt export, now a zip file is generated --- .../cburch/logisim/file/LibraryManager.java | 12 +++- .../java/com/cburch/logisim/file/Loader.java | 30 ++++---- .../com/cburch/logisim/file/LogisimFile.java | 22 ++++-- .../com/cburch/logisim/file/XmlWriter.java | 72 +++++++++++++------ .../cburch/logisim/proj/ProjectActions.java | 28 ++++---- 5 files changed, 107 insertions(+), 57 deletions(-) diff --git a/src/main/java/com/cburch/logisim/file/LibraryManager.java b/src/main/java/com/cburch/logisim/file/LibraryManager.java index 225a122088..c57d6aa5b7 100644 --- a/src/main/java/com/cburch/logisim/file/LibraryManager.java +++ b/src/main/java/com/cburch/logisim/file/LibraryManager.java @@ -269,7 +269,17 @@ public Library loadLibrary(Loader loader, String desc) { return null; } } - + + public static boolean isJarLibrary(Loader loader, String desc) { + final var sep = desc.indexOf(DESC_SEP); + if (sep < 0) { + loader.showError(S.get("fileDescriptorError", desc)); + return false; + } + final var type = desc.substring(0, sep); + return "jar".equals(type); + } + public static String getLibraryFilePath(Loader loader, String desc) { final var sep = desc.indexOf(DESC_SEP); if (sep < 0) { diff --git a/src/main/java/com/cburch/logisim/file/Loader.java b/src/main/java/com/cburch/logisim/file/Loader.java index a24feea7df..8501195d9a 100644 --- a/src/main/java/com/cburch/logisim/file/Loader.java +++ b/src/main/java/com/cburch/logisim/file/Loader.java @@ -15,8 +15,6 @@ import com.cburch.logisim.std.Builtin; import com.cburch.logisim.tools.Library; import com.cburch.logisim.util.JFileChoosers; -import com.cburch.logisim.util.LineBuffer; -import com.cburch.logisim.util.StringUtil; import com.cburch.logisim.util.ZipClassLoader; import com.cburch.logisim.vhdl.file.HdlFile; import java.awt.Component; @@ -29,6 +27,8 @@ import java.util.HashMap; import java.util.Map; import java.util.Stack; +import java.util.zip.ZipOutputStream; + import javax.swing.JFileChooser; import javax.swing.JScrollPane; import javax.swing.JTextArea; @@ -109,7 +109,6 @@ public String getDescription() { public static final String LOGISIM_EXTENSION = ".circ"; public static final String LOGISIM_LIBRARY_DIR = "library"; - public static final String LOGISIM_CIRCUIT_DIR = "circuit"; public static final FileFilter LOGISIM_FILTER = new LogisimFileFilter(); public static final FileFilter LOGISIM_DIRECTORY = new LogisimDirectoryFilter(); public static final FileFilter JAR_FILTER = new JarFileFilter(); @@ -123,6 +122,7 @@ public String getDescription() { private File mainFile = null; private final Stack filesOpening = new Stack<>(); private Map substitutions = new HashMap<>(); + private ZipOutputStream zipFile; public Loader(Component parent) { this.parent = parent; @@ -327,21 +327,21 @@ public void reload(LoadedLibrary lib) { LibraryManager.instance.reload(this, lib); } - public boolean export(LogisimFile file, String homeDirectory) { - try { - final var mainCircFile = LineBuffer.format("{{1}}{{2}}{{3}}{{2}}{{4}}", homeDirectory, File.separator, - LOGISIM_CIRCUIT_DIR, getMainFile().getName()); - final var libraryHome = String.format("%s%s%s", homeDirectory, File.separator, LOGISIM_LIBRARY_DIR); - final var fwrite = new FileOutputStream(mainCircFile); - file.write(fwrite, this, libraryHome); - } catch (IOException e) { - //TODO: give an error message to the user #1136 - System.err.println("Unable to export file"); - return false; - } + public boolean export(LogisimFile file, ZipOutputStream zipFile) { + this.zipFile = zipFile; + file.write(zipFile, this, getMainFile().getName()); + this.zipFile = null; return true; } + public ZipOutputStream getZipFile() { + return zipFile; + } + + public void setZipFile(ZipOutputStream file) { + zipFile = file; + } + public boolean save(LogisimFile file, File dest) { final var reference = LibraryManager.instance.findReference(file, dest); if (reference != null) { diff --git a/src/main/java/com/cburch/logisim/file/LogisimFile.java b/src/main/java/com/cburch/logisim/file/LogisimFile.java index 6fe212c7da..d6ebb83530 100644 --- a/src/main/java/com/cburch/logisim/file/LogisimFile.java +++ b/src/main/java/com/cburch/logisim/file/LogisimFile.java @@ -591,16 +591,24 @@ public void setName(String name) { // other methods // void write(OutputStream out, LibraryLoader loader) { - write(out, loader, null, null); + write(out, loader, null, null, false); } - void write(OutputStream out, LibraryLoader loader, String libraryHome) { - write(out, loader, null, libraryHome); + void write(OutputStream out, LibraryLoader loader, String mainCircFile) { + write(out, loader, null, mainCircFile, false); } - void write(OutputStream out, LibraryLoader loader, File dest, String libraryHome) { + void write(OutputStream out, LibraryLoader loader, String mainCircFile, boolean recurse) { + write(out, loader, null, mainCircFile, recurse); + } + + void write(OutputStream out, LibraryLoader loader, File dest, String mainCircFile) { + write(out, loader, dest, mainCircFile, false); + } + + void write(OutputStream out, LibraryLoader loader, File dest, String mainCircFile, boolean recurse) { try { - XmlWriter.write(this, out, loader, dest, libraryHome); + XmlWriter.write(this, out, loader, dest, mainCircFile, recurse); } catch (TransformerConfigurationException e) { loader.showError("internal error configuring transformer"); } catch (ParserConfigurationException e) { @@ -610,6 +618,10 @@ void write(OutputStream out, LibraryLoader loader, File dest, String libraryHome var err = S.get("xmlConversionError"); if (msg == null) err += ": " + msg; loader.showError(err); + } catch (IOException e) { + loader.showError("Unable to create zip file"); + } catch (LoadFailedException e) { + loader.showError("Unable to create zip file"); } } diff --git a/src/main/java/com/cburch/logisim/file/XmlWriter.java b/src/main/java/com/cburch/logisim/file/XmlWriter.java index 0af8901f2e..3cb812938b 100644 --- a/src/main/java/com/cburch/logisim/file/XmlWriter.java +++ b/src/main/java/com/cburch/logisim/file/XmlWriter.java @@ -28,19 +28,19 @@ import com.cburch.logisim.tools.Tool; import com.cburch.logisim.util.InputEventUtil; import com.cburch.logisim.util.LineBuffer; -import com.cburch.logisim.util.StringUtil; import com.cburch.logisim.vhdl.base.VhdlContent; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; -import java.nio.file.Files; import java.nio.file.Paths; -import java.nio.file.StandardCopyOption; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; @@ -65,29 +65,31 @@ final class XmlWriter { * Path of the file which is being written on disk -- used to relativize components stored in it. */ private final String outFilePath; - private final String librariesPath; private final boolean isProjectExport; private final LibraryLoader loader; private final HashMap libs = new HashMap<>(); + private final boolean isRecursiveCall; private XmlWriter(LogisimFile file, Document doc, LibraryLoader loader) { - this(file, doc, loader, null, null); + this(file, doc, loader, null, null, false); } private XmlWriter(LogisimFile file, Document doc, LibraryLoader loader, String outFilePath) { - this(file, doc, loader, outFilePath, null); + this(file, doc, loader, outFilePath, null, false); } - private XmlWriter(LogisimFile file, Document doc, LibraryLoader loader, String outFilePath, String librariesPath) { + private XmlWriter(LogisimFile file, Document doc, LibraryLoader loader, String outFilePath, + String mainCircFile, boolean recursiveCall) { this.file = file; this.doc = doc; this.loader = loader; this.outFilePath = outFilePath; - this.librariesPath = librariesPath; - isProjectExport = (librariesPath != null && !librariesPath.isEmpty()); + isProjectExport = (mainCircFile != null && !mainCircFile.isEmpty()); + isRecursiveCall = recursiveCall; } + /* We sort some parts of the xml tree, to help with reproducibility and to * ease testing (e.g. diff a circuit file). Attribute name=value pairs seem * to be sorted already, so we don't worry about those. The code below sorts @@ -173,8 +175,8 @@ static void sort(Node top) { } } - static void write(LogisimFile file, OutputStream out, LibraryLoader loader, File destFile, String libraryHome) - throws ParserConfigurationException, TransformerException { + static void write(LogisimFile file, OutputStream out, LibraryLoader loader, File destFile, String mainCircFile, boolean recurse) + throws ParserConfigurationException, TransformerException, IOException, LoadFailedException { final var docFactory = DocumentBuilderFactory.newInstance(); final var docBuilder = docFactory.newDocumentBuilder(); @@ -185,8 +187,8 @@ static void write(LogisimFile file, OutputStream out, LibraryLoader loader, File var dstFilePath = destFile.getAbsolutePath(); dstFilePath = dstFilePath.substring(0, dstFilePath.lastIndexOf(File.separator)); context = new XmlWriter(file, doc, loader, dstFilePath); - } else if (libraryHome != null) { - context = new XmlWriter(file, doc, loader, null, libraryHome); + } else if (mainCircFile != null) { + context = new XmlWriter(file, doc, loader, null, mainCircFile, recurse); } else context = new XmlWriter(file, doc, loader); context.fromLogisimFile(); @@ -204,6 +206,9 @@ static void write(LogisimFile file, OutputStream out, LibraryLoader loader, File } catch (IllegalArgumentException ignored) { } + if ((mainCircFile != null) && (out instanceof ZipOutputStream zipFile)) { + zipFile.putNextEntry(new ZipEntry(mainCircFile)); + } doc.normalize(); sort(doc); Source src = new DOMSource(doc); @@ -368,7 +373,7 @@ Element fromComponent(Component comp) { return ret; } - Element fromLibrary(Library lib) { + Element fromLibrary(Library lib) throws IOException, LoadFailedException { final var ret = doc.createElement("lib"); if (libs.containsKey(lib)) return null; final var name = Integer.toString(libs.size()); @@ -400,18 +405,22 @@ Element fromLibrary(Library lib) { if (isProjectExport) { if (lib instanceof LoadedLibrary) { final var origFile = LibraryManager.getLibraryFilePath(file.getLoader(), desc); + final var isJarLibrary = LibraryManager.isJarLibrary(file.getLoader(), desc); if (origFile != null) { final var names = origFile.split(File.separator); final var filename = names[names.length - 1]; - final var newFile = String.format("%s%s%s", librariesPath, File.separator, filename); - try { - Files.copy(Paths.get(origFile), Paths.get(newFile), StandardCopyOption.REPLACE_EXISTING); - } catch (IOException e) { - //TODO: error message to user - return null; + final var newFile = LineBuffer.format("{{1}}{{2}}{{3}}", Loader.LOGISIM_LIBRARY_DIR, File.separator, filename); + final var zipFile = file.getLoader().getZipFile(); + if (zipFile != null) { + if (isJarLibrary) { + writeJarToZip(zipFile, origFile, newFile); + } else { + writeLogisimFileToZip(zipFile, origFile, newFile); + } + desc = LibraryManager.getReplacementDescriptor(file.getLoader(), desc, isRecursiveCall + ? LineBuffer.format(".{{1}}{{2}}", File.separator, filename) + : LineBuffer.format(".{{1}}{{2}}{{1}}{{3}}", File.separator, Loader.LOGISIM_LIBRARY_DIR, filename)); } - final var newFilePath = LineBuffer.format("..{{1}}{{2}}{{1}}{{3}}", File.separator, Loader.LOGISIM_LIBRARY_DIR, filename); - desc = LibraryManager.getReplacementDescriptor(file.getLoader(), desc, newFilePath); } } } @@ -431,7 +440,7 @@ Element fromLibrary(Library lib) { return ret; } - Element fromLogisimFile() { + Element fromLogisimFile() throws IOException, LoadFailedException { final var ret = doc.createElement("project"); doc.appendChild(ret); ret.appendChild( @@ -538,4 +547,21 @@ boolean libraryContains(Library lib, Tool query) { } return false; } + + private void writeJarToZip(ZipOutputStream zipFile, String inputFileName, String outputFileName) throws IOException { + final var fileToRead = new File(inputFileName); + final var fileReader = new FileInputStream(fileToRead); + zipFile.putNextEntry(new ZipEntry(outputFileName)); + final var bytes = new byte[1024]; + var length = 0; + while ((length = fileReader.read(bytes)) >= 0) zipFile.write(bytes, 0, length); + fileReader.close(); + } + + private void writeLogisimFileToZip(ZipOutputStream zipFile,String inputFileName, String outputFileName) throws IOException, LoadFailedException { + final var newLoader = new Loader(null); + newLoader.setZipFile(zipFile); + final var library = newLoader.openLogisimFile(new File(inputFileName).getCanonicalFile()); + library.write(zipFile, newLoader, outputFileName, true); + } } diff --git a/src/main/java/com/cburch/logisim/proj/ProjectActions.java b/src/main/java/com/cburch/logisim/proj/ProjectActions.java index c1afdb2a34..bdbf5bacad 100644 --- a/src/main/java/com/cburch/logisim/proj/ProjectActions.java +++ b/src/main/java/com/cburch/logisim/proj/ProjectActions.java @@ -26,6 +26,7 @@ import com.cburch.logisim.util.JFileChoosers; import java.awt.Component; import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; @@ -37,6 +38,9 @@ import java.util.HashSet; import java.util.Map; import java.util.regex.Pattern; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; @@ -410,28 +414,27 @@ public static boolean doExportProject(Project proj) { chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); chooser.setAcceptAllFileFilterUsed(false); var isCorrectDirectory = false; - var exportRootDir = ""; do { ret &= chooser.showSaveDialog(proj.getFrame()) == JFileChooser.APPROVE_OPTION; if (!ret) { proj.setTool(oldTool); return false; } - final var exportHome = chooser.getSelectedFile(); - final var exportRoot = loader.getMainFile().getName().replace(".circ", ""); - exportRootDir = String.format("%s%s%s", exportHome, File.separator, exportRoot); - final var exportLibDir = String.format("%s%s%s", exportRootDir, File.separator, Loader.LOGISIM_LIBRARY_DIR); - final var exportCircDir = String.format("%s%s%s", exportRootDir, File.separator, Loader.LOGISIM_CIRCUIT_DIR); + final var projectName = loader.getMainFile().getName().replace(".circ", ""); + final var projectPath = chooser.getSelectedFile(); + final var zipFile = String.format("%s%s%s.zip", projectPath, File.separator, projectName); try { - final var path = Paths.get(exportRootDir); + final var path = Paths.get(zipFile); if (Files.exists(path)) { - OptionPane.showMessageDialog(proj.getFrame(), S.get("ProjExistsUnableToCreate", exportRoot)); + OptionPane.showMessageDialog(proj.getFrame(), S.get("ProjExistsUnableToCreate", zipFile)); } else { isCorrectDirectory = true; - } - if (isCorrectDirectory) { - Files.createDirectories(Paths.get(exportLibDir)); - Files.createDirectories(Paths.get(exportCircDir)); + final var projectFile = new FileOutputStream(zipFile); + final var projectZipFile = new ZipOutputStream(projectFile); + projectZipFile.putNextEntry(new ZipEntry(String.format("%s%s", Loader.LOGISIM_LIBRARY_DIR, File.separator))); + ret &= loader.export(proj.getLogisimFile(), projectZipFile); + projectZipFile.close(); + projectFile.close(); } } catch (IOException e) { OptionPane.showMessageDialog(proj.getFrame(), S.get("ProjUnableToCreate", e.getMessage())); @@ -439,7 +442,6 @@ public static boolean doExportProject(Project proj) { return false; } } while (!isCorrectDirectory); - ret &= loader.export(proj.getLogisimFile(), exportRootDir); proj.setTool(oldTool); } return ret; From f4cdfb53be6a705ae8bbbce6a6302b5448ad0211 Mon Sep 17 00:00:00 2001 From: "Dr.Ir.Ing. Theo Kluter" Date: Fri, 8 Oct 2021 20:03:25 +0200 Subject: [PATCH 02/31] Made linter happy --- src/main/java/com/cburch/logisim/file/XmlWriter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cburch/logisim/file/XmlWriter.java b/src/main/java/com/cburch/logisim/file/XmlWriter.java index 3cb812938b..e78f20029f 100644 --- a/src/main/java/com/cburch/logisim/file/XmlWriter.java +++ b/src/main/java/com/cburch/logisim/file/XmlWriter.java @@ -558,7 +558,7 @@ private void writeJarToZip(ZipOutputStream zipFile, String inputFileName, String fileReader.close(); } - private void writeLogisimFileToZip(ZipOutputStream zipFile,String inputFileName, String outputFileName) throws IOException, LoadFailedException { + private void writeLogisimFileToZip(ZipOutputStream zipFile, String inputFileName, String outputFileName) throws IOException, LoadFailedException { final var newLoader = new Loader(null); newLoader.setZipFile(zipFile); final var library = newLoader.openLogisimFile(new File(inputFileName).getCanonicalFile()); From 994f91fada207e61849ebb7c1768226a97daed11 Mon Sep 17 00:00:00 2001 From: "Dr.Ir.Ing. Theo Kluter" Date: Sun, 10 Oct 2021 11:08:51 +0200 Subject: [PATCH 03/31] First step in bundle export with user selactable added manifest Ignore the System.out.println message, will be replaced --- .../java/com/cburch/logisim/file/Loader.java | 16 +++++++++++- .../cburch/logisim/proj/ProjectActions.java | 26 ++++++++++++------- .../logisim/strings/file/file.properties | 1 + .../logisim/strings/file/file_de.properties | 1 + .../logisim/strings/file/file_el.properties | 1 + .../logisim/strings/file/file_es.properties | 1 + .../logisim/strings/file/file_fr.properties | 1 + .../logisim/strings/file/file_it.properties | 1 + .../logisim/strings/file/file_ja.properties | 1 + .../logisim/strings/file/file_nl.properties | 1 + .../logisim/strings/file/file_pl.properties | 1 + .../logisim/strings/file/file_pt.properties | 1 + .../logisim/strings/file/file_ru.properties | 1 + .../logisim/strings/gui/gui.properties | 2 +- .../logisim/strings/gui/gui_nl.properties | 2 +- .../logisim/strings/gui/gui_pl.properties | 2 +- .../logisim/strings/proj/proj.properties | 4 ++- .../logisim/strings/proj/proj_de.properties | 4 ++- .../logisim/strings/proj/proj_el.properties | 4 ++- .../logisim/strings/proj/proj_es.properties | 4 ++- .../logisim/strings/proj/proj_fr.properties | 4 ++- .../logisim/strings/proj/proj_it.properties | 4 ++- .../logisim/strings/proj/proj_ja.properties | 4 ++- .../logisim/strings/proj/proj_nl.properties | 4 ++- .../logisim/strings/proj/proj_pl.properties | 4 ++- .../logisim/strings/proj/proj_pt.properties | 4 ++- .../logisim/strings/proj/proj_ru.properties | 4 ++- 27 files changed, 79 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/cburch/logisim/file/Loader.java b/src/main/java/com/cburch/logisim/file/Loader.java index 8501195d9a..d9ff8d3612 100644 --- a/src/main/java/com/cburch/logisim/file/Loader.java +++ b/src/main/java/com/cburch/logisim/file/Loader.java @@ -83,6 +83,18 @@ public String getDescription() { } } + private static class LogisimProjectBundleFilter extends FileFilter { + @Override + public boolean accept(File f) { + return f.isDirectory() || f.getName().endsWith(LOGISIM_PROJECT_BUNDLE_EXTENSION); + } + + @Override + public String getDescription() { + return S.get("logisimProjectBundleFilter"); + } + } + private static class LogisimDirectoryFilter extends FileFilter { @Override public boolean accept(File f) { @@ -108,8 +120,10 @@ public String getDescription() { } public static final String LOGISIM_EXTENSION = ".circ"; - public static final String LOGISIM_LIBRARY_DIR = "library"; + public static final String LOGISIM_PROJECT_BUNDLE_EXTENSION = ".lsebdl"; + public static final String LOGISIM_LIBRARY_DIR = "libraries"; public static final FileFilter LOGISIM_FILTER = new LogisimFileFilter(); + public static final FileFilter LOGISIM_BUNDLE_FILTER = new LogisimProjectBundleFilter(); public static final FileFilter LOGISIM_DIRECTORY = new LogisimDirectoryFilter(); public static final FileFilter JAR_FILTER = new JarFileFilter(); public static final FileFilter TXT_FILTER = new TxtFileFilter(); diff --git a/src/main/java/com/cburch/logisim/proj/ProjectActions.java b/src/main/java/com/cburch/logisim/proj/ProjectActions.java index bdbf5bacad..a36107add4 100644 --- a/src/main/java/com/cburch/logisim/proj/ProjectActions.java +++ b/src/main/java/com/cburch/logisim/proj/ProjectActions.java @@ -409,30 +409,38 @@ public static boolean doExportProject(Project proj) { final var loader = proj.getLogisimFile().getLoader(); final var oldTool = proj.getTool(); proj.setTool(null); + var zipFile = loader.getMainFile().getName().replace(Loader.LOGISIM_EXTENSION, Loader.LOGISIM_PROJECT_BUNDLE_EXTENSION); final var chooser = loader.createChooser(); - chooser.setFileFilter(Loader.LOGISIM_DIRECTORY); - chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + chooser.setFileFilter(Loader.LOGISIM_BUNDLE_FILTER); chooser.setAcceptAllFileFilterUsed(false); - var isCorrectDirectory = false; + chooser.setSelectedFile(new File(zipFile)); + chooser.setDialogTitle(S.get("projExportBundle")); + var isCorrectDirectory = true; do { ret &= chooser.showSaveDialog(proj.getFrame()) == JFileChooser.APPROVE_OPTION; if (!ret) { proj.setTool(oldTool); return false; } - final var projectName = loader.getMainFile().getName().replace(".circ", ""); - final var projectPath = chooser.getSelectedFile(); - final var zipFile = String.format("%s%s%s.zip", projectPath, File.separator, projectName); try { + zipFile = chooser.getSelectedFile().getAbsolutePath(); + if (!zipFile.endsWith(Loader.LOGISIM_PROJECT_BUNDLE_EXTENSION)) { + zipFile = zipFile.concat(Loader.LOGISIM_PROJECT_BUNDLE_EXTENSION); + } final var path = Paths.get(zipFile); if (Files.exists(path)) { - OptionPane.showMessageDialog(proj.getFrame(), S.get("ProjExistsUnableToCreate", zipFile)); - } else { - isCorrectDirectory = true; + isCorrectDirectory = OptionPane.showConfirmDialog(proj.getFrame(), S.fmt("projExistsOverwrite", + new File(zipFile).getName()), S.get("projExportBundle"), OptionPane.YES_NO_OPTION) == OptionPane.YES_OPTION; + } + if (isCorrectDirectory) { final var projectFile = new FileOutputStream(zipFile); final var projectZipFile = new ZipOutputStream(projectFile); projectZipFile.putNextEntry(new ZipEntry(String.format("%s%s", Loader.LOGISIM_LIBRARY_DIR, File.separator))); ret &= loader.export(proj.getLogisimFile(), projectZipFile); + if (OptionPane.showConfirmDialog(proj.getFrame(), S.get("projAddManifest"), + S.get("projExportBundle"), OptionPane.YES_NO_OPTION) == OptionPane.YES_OPTION) { +System.out.println("Add manifest"); + } projectZipFile.close(); projectFile.close(); } diff --git a/src/main/resources/resources/logisim/strings/file/file.properties b/src/main/resources/resources/logisim/strings/file/file.properties index 90b7818217..b9a044d9e7 100644 --- a/src/main/resources/resources/logisim/strings/file/file.properties +++ b/src/main/resources/resources/logisim/strings/file/file.properties @@ -28,6 +28,7 @@ jarFileFilter = Java Archive (*.jar) jarLibraryNotCreatedError = The %s library could not be instantiated. logisimCircularError = The file %s contains within it a reference to itself. logisimFileFilter = Logisim project (*.circ) +logisimProjectBundleFilter = Logisim project bundle (*.lsebdl) logisimDirectoryFilter = Logisim project directory logisimLoadError = Error encountered opening %s: %s tclFileFilter = TCL files (*.tcl) diff --git a/src/main/resources/resources/logisim/strings/file/file_de.properties b/src/main/resources/resources/logisim/strings/file/file_de.properties index ffb7f258ac..47b4d78fe6 100644 --- a/src/main/resources/resources/logisim/strings/file/file_de.properties +++ b/src/main/resources/resources/logisim/strings/file/file_de.properties @@ -28,6 +28,7 @@ jarFileFilter = Java-Archiv (*.jar) jarLibraryNotCreatedError = Die Bibliothek %s konnte nicht instanziiert werden. logisimCircularError = Die Datei %s enthält einen Verweis auf sich selbst. logisimFileFilter = Logisim-Projekt (*.circ) +# == > logisimProjectBundleFilter = logisimDirectoryFilter = Logisim Projektverzeichniss logisimLoadError = Fehler beim Öffnen von %s: %s tclFileFilter = TCL-Dateien (*.tcl) diff --git a/src/main/resources/resources/logisim/strings/file/file_el.properties b/src/main/resources/resources/logisim/strings/file/file_el.properties index 5a9a955a64..8e698bf1be 100644 --- a/src/main/resources/resources/logisim/strings/file/file_el.properties +++ b/src/main/resources/resources/logisim/strings/file/file_el.properties @@ -28,6 +28,7 @@ jarFileFilter = Java Archive (*.jar) jarLibraryNotCreatedError = Η βιβλιοθήκη %s δεν ήταν δυνατόν να αρχικοποιηθεί. logisimCircularError = Το αρχείο %s περιέχει μέσα του μια αναφορά στο ίδιο (αυτοαναφορά). logisimFileFilter = Έργο Logisim (*.circ) +# == > logisimProjectBundleFilter = # ==> logisimDirectoryFilter = logisimLoadError = Σφάλμα παρουσιάστηκε κατά το άνοιγμα %s: %s # ==> tclFileFilter = diff --git a/src/main/resources/resources/logisim/strings/file/file_es.properties b/src/main/resources/resources/logisim/strings/file/file_es.properties index 394339b6cb..34068e3eee 100644 --- a/src/main/resources/resources/logisim/strings/file/file_es.properties +++ b/src/main/resources/resources/logisim/strings/file/file_es.properties @@ -28,6 +28,7 @@ jarFileFilter = Archivo Java (*.jar) jarLibraryNotCreatedError = La librería %s no ha podido ser instanciada. logisimCircularError = El archivo %s contiene una referencia a sí mismo. logisimFileFilter = Proyecto Logisim (*.circ) +# == > logisimProjectBundleFilter = # ==> logisimDirectoryFilter = logisimLoadError = Error encontrado al abrir %s: %s tclFileFilter = Archivos TCL (*.tcl) diff --git a/src/main/resources/resources/logisim/strings/file/file_fr.properties b/src/main/resources/resources/logisim/strings/file/file_fr.properties index a322f39c5f..d97d34e181 100644 --- a/src/main/resources/resources/logisim/strings/file/file_fr.properties +++ b/src/main/resources/resources/logisim/strings/file/file_fr.properties @@ -28,6 +28,7 @@ jarFileFilter = Archives Java (*.jar) jarLibraryNotCreatedError = La librairie %s n'a pas pu être installée. logisimCircularError = Le fichier %s contient une référence à lui-même. logisimFileFilter = Projets Logisim (*.circ) +# == > logisimProjectBundleFilter = # ==> logisimDirectoryFilter = logisimLoadError = Erreur rencontrée à l'ouverture de %s : %s tclFileFilter = Fichiers TCL (*.tcl) diff --git a/src/main/resources/resources/logisim/strings/file/file_it.properties b/src/main/resources/resources/logisim/strings/file/file_it.properties index c3299d5b9b..15a091b37c 100644 --- a/src/main/resources/resources/logisim/strings/file/file_it.properties +++ b/src/main/resources/resources/logisim/strings/file/file_it.properties @@ -28,6 +28,7 @@ jarFileFilter = Archivio Java (*.jar) jarLibraryNotCreatedError = La libreria %s non può essere istanziata. logisimCircularError = Il file %s contiene al suo interno un riferimento a se stesso. logisimFileFilter = Progetto Logisim (*.circ) +# == > logisimProjectBundleFilter = # ==> logisimDirectoryFilter = logisimLoadError = Errore incontrato aprendo %s: %s tclFileFilter = File TCL (*.tcl) diff --git a/src/main/resources/resources/logisim/strings/file/file_ja.properties b/src/main/resources/resources/logisim/strings/file/file_ja.properties index 6f52b62418..aca354843e 100644 --- a/src/main/resources/resources/logisim/strings/file/file_ja.properties +++ b/src/main/resources/resources/logisim/strings/file/file_ja.properties @@ -28,6 +28,7 @@ jarFileFilter = Java Archive (*.jar) jarLibraryNotCreatedError = %s ライブラリをインスタンス化できませんでした。 logisimCircularError = ファイル %s にはそれ自身への参照が含まれています。 logisimFileFilter = Logisim プロジェクト (*.circ) +# == > logisimProjectBundleFilter = # ==> logisimDirectoryFilter = logisimLoadError = エラーが発生しました。 tclFileFilter = TCL ファイル (*.tcl) diff --git a/src/main/resources/resources/logisim/strings/file/file_nl.properties b/src/main/resources/resources/logisim/strings/file/file_nl.properties index 04bc171e17..1c8c3b3c67 100644 --- a/src/main/resources/resources/logisim/strings/file/file_nl.properties +++ b/src/main/resources/resources/logisim/strings/file/file_nl.properties @@ -28,6 +28,7 @@ jarFileFilter = Java-archief (*.jar) jarLibraryNotCreatedError = De %s bibliotheek kon niet worden geïnstrueerd. logisimCircularError = Het bestand %s bevat een verwijzing naar zichzelf. logisimFileFilter = Logisim Project (*.circ) +# == > logisimProjectBundleFilter = # ==> logisimDirectoryFilter = logisimLoadError = Fout bij het openen %s: %s tclFileFilter = TCL bestanden (*.tcl) diff --git a/src/main/resources/resources/logisim/strings/file/file_pl.properties b/src/main/resources/resources/logisim/strings/file/file_pl.properties index d046d29221..dfb80724ad 100644 --- a/src/main/resources/resources/logisim/strings/file/file_pl.properties +++ b/src/main/resources/resources/logisim/strings/file/file_pl.properties @@ -28,6 +28,7 @@ jarFileFilter = Archiwum Java (*.jar) jarLibraryNotCreatedError = Biblioteka %s nie może zostać utworzona. logisimCircularError = Plik %s zawiera odniesienia do siebie samego. logisimFileFilter = Projekt Logisim (*.circ) +# == > logisimProjectBundleFilter = logisimDirectoryFilter = Katalog z projektem Logisim logisimLoadError = Napotkano błąd poczas otwierania %s: %s tclFileFilter = Pliki TCL (*.tcl) diff --git a/src/main/resources/resources/logisim/strings/file/file_pt.properties b/src/main/resources/resources/logisim/strings/file/file_pt.properties index b1e0ebc891..da3b76d898 100644 --- a/src/main/resources/resources/logisim/strings/file/file_pt.properties +++ b/src/main/resources/resources/logisim/strings/file/file_pt.properties @@ -28,6 +28,7 @@ jarFileFilter = Arquivo compactado Java (*.jar) jarLibraryNotCreatedError = Impossível instanciar a biblioteca %s. logisimCircularError = O arquivo %s contém uma referência circular. logisimFileFilter = Projeto do Logisim (*.circ) +# == > logisimProjectBundleFilter = # ==> logisimDirectoryFilter = logisimLoadError = Erro encontrado ao abrir %s: %s tclFileFilter = Arquivos TCL (*.tcl) diff --git a/src/main/resources/resources/logisim/strings/file/file_ru.properties b/src/main/resources/resources/logisim/strings/file/file_ru.properties index 40d4382d13..3c6b456530 100644 --- a/src/main/resources/resources/logisim/strings/file/file_ru.properties +++ b/src/main/resources/resources/logisim/strings/file/file_ru.properties @@ -28,6 +28,7 @@ jarFileFilter = Архив Java (*.jar) jarLibraryNotCreatedError = Невозможно создать экземпляр библиотеки %s. logisimCircularError = Файл %s содержит ссылку на себя. logisimFileFilter = Проект Logisim (*.circ) +# == > logisimProjectBundleFilter = # ==> logisimDirectoryFilter = logisimLoadError = Произошла ошибка открытия %s: %s tclFileFilter = TCL файлы (*.tcl) diff --git a/src/main/resources/resources/logisim/strings/gui/gui.properties b/src/main/resources/resources/logisim/strings/gui/gui.properties index 5f6604dfdc..51448d268a 100644 --- a/src/main/resources/resources/logisim/strings/gui/gui.properties +++ b/src/main/resources/resources/logisim/strings/gui/gui.properties @@ -336,7 +336,7 @@ filePrintItem = Print... fileQuitItem = Exit fileSaveAsItem = Save As... fileSaveItem = Save -fileExportProject = Export project +fileExportProject = Export project bundle... # # menu/MenuHelp.java # diff --git a/src/main/resources/resources/logisim/strings/gui/gui_nl.properties b/src/main/resources/resources/logisim/strings/gui/gui_nl.properties index 776a1c002a..5313218e8a 100644 --- a/src/main/resources/resources/logisim/strings/gui/gui_nl.properties +++ b/src/main/resources/resources/logisim/strings/gui/gui_nl.properties @@ -336,7 +336,7 @@ filePrintItem = Afdrukken.... fileQuitItem = Afsluiten fileSaveAsItem = Opslaan als... fileSaveItem = Opslaan -fileExportProject = Projekt exporteren +fileExportProject = Projekt bundel exporteren... # # menu/MenuHelp.java # diff --git a/src/main/resources/resources/logisim/strings/gui/gui_pl.properties b/src/main/resources/resources/logisim/strings/gui/gui_pl.properties index d8c8c81b11..c78f25d906 100644 --- a/src/main/resources/resources/logisim/strings/gui/gui_pl.properties +++ b/src/main/resources/resources/logisim/strings/gui/gui_pl.properties @@ -384,7 +384,7 @@ filePrintItem = Drukuj... fileQuitItem = Zakończ... fileSaveAsItem = Zapisz jako... fileSaveItem = Zapisz... -fileExportProject = Eksportuj projekt +# == > fileExportProject = # # menu/MenuHelp.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj.properties b/src/main/resources/resources/logisim/strings/proj/proj.properties index a606428506..e7970f4de5 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj.properties @@ -37,7 +37,9 @@ templateOpenError = Could not open template: %s templateOpenErrorTitle = Error Loading Template UsedLibraryToolnameError = The filename may not be equal to a circuit name, tool name, or library name used in your project.\n The specified filename equals to one of these names. ProjUnableToCreate = Failed to create project: %s -ProjExistsUnableToCreate = Folder named "%s" already exists in selected directory. Please select another location. +projExportBundle = Exporting a project bundle +projExistsOverwrite = Project bundle "%s" already exists, overwrite it? +projAddManifest = Do you want to include a manifest-file in your project bundle? # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_de.properties b/src/main/resources/resources/logisim/strings/proj/proj_de.properties index 19ae12191e..59236d6bdf 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_de.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_de.properties @@ -37,7 +37,9 @@ templateOpenError = Konnte Vorlage %s nicht öffnen templateOpenErrorTitle = Fehler beim Laden der Vorlage UsedLibraryToolnameError = Der Dateiname muss sich von den Schaltkreisnamen, Werkzeugnamen oder Bibliotheksnamen, die in Ihrem Projekt verwendet werden, unterscheiden.\n Der angegebene Dateiname entspricht einem dieser Namen. # ==> ProjUnableToCreate = -# ==> ProjExistsUnableToCreate = +# ==> projExportBundle = +# ==> projExistsOverwrite = +# ==> projAddManifest = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_el.properties b/src/main/resources/resources/logisim/strings/proj/proj_el.properties index 718f151df5..c321cdb301 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_el.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_el.properties @@ -37,7 +37,9 @@ templateOpenError = Δεν είναι δυνατό το άνοιγμα του π templateOpenErrorTitle = Σφάλμα στο Άνοιγμα Προτύπου # ==> UsedLibraryToolnameError = # ==> ProjUnableToCreate = -# ==> ProjExistsUnableToCreate = +# ==> projExportBundle = +# ==> projExistsOverwrite = +# ==> projAddManifest = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_es.properties b/src/main/resources/resources/logisim/strings/proj/proj_es.properties index 44c07532b2..d4b3cbb317 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_es.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_es.properties @@ -37,7 +37,9 @@ templateOpenError = No se pudo abrir la plantilla: %s templateOpenErrorTitle = Error al cargar plantilla UsedLibraryToolnameError = El nombre de archivo no debe coincidir con el nombre de un circuito, herramienta o librería de tu proyecto.\n El nombre especificado coincide con uno de ellos. # ==> ProjUnableToCreate = -# ==> ProjExistsUnableToCreate = +# ==> projExportBundle = +# ==> projExistsOverwrite = +# ==> projAddManifest = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_fr.properties b/src/main/resources/resources/logisim/strings/proj/proj_fr.properties index 42b8c18437..4fa43bbed4 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_fr.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_fr.properties @@ -37,7 +37,9 @@ templateOpenError = Impossible d'ouvrir le modèle : %s templateOpenErrorTitle = Impossible de charger le modèle UsedLibraryToolnameError = Le nom de fichier ne doit pas correspondre à un nom de circuit, à un nom d'outil ou à un nom de bibliothèque utilisé dans votre projet. # ==> ProjUnableToCreate = -# ==> ProjExistsUnableToCreate = +# ==> projExportBundle = +# ==> projExistsOverwrite = +# ==> projAddManifest = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_it.properties b/src/main/resources/resources/logisim/strings/proj/proj_it.properties index 928de40b90..74064ae26f 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_it.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_it.properties @@ -37,7 +37,9 @@ templateOpenError = Impossibile aprire il modello: %s templateOpenErrorTitle = Errore caricamento modello UsedLibraryToolnameError = Il nome del file potrebbe non essere uguale al nome del circuito, del tool o della libreria utilizzati nel progetto.\n Il nome del file specificato equivale a uno di questi nomi. # ==> ProjUnableToCreate = -# ==> ProjExistsUnableToCreate = +# ==> projExportBundle = +# ==> projExistsOverwrite = +# ==> projAddManifest = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_ja.properties b/src/main/resources/resources/logisim/strings/proj/proj_ja.properties index 5c5a4629de..227f40859f 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_ja.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_ja.properties @@ -37,7 +37,9 @@ templateOpenError = テンプレートを開けませんでした: %s templateOpenErrorTitle = テンプレートの読み込みエラー UsedLibraryToolnameError = ファイル名は、プロジェクトで使用されている回路名、ツール名、ライブラリ名と一致しない場合があります。\n 指定されたファイル名は、これらの名前のいずれかに等しくなります。 # ==> ProjUnableToCreate = -# ==> ProjExistsUnableToCreate = +# ==> projExportBundle = +# ==> projExistsOverwrite = +# ==> projAddManifest = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_nl.properties b/src/main/resources/resources/logisim/strings/proj/proj_nl.properties index 7f26add804..e5b89c0def 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_nl.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_nl.properties @@ -37,7 +37,9 @@ templateOpenError = Kon sjabloon niet openen: %s templateOpenErrorTitle = Fout Laden van de sjabloon UsedLibraryToolnameError = De bestandsnaam mag niet gelijk zijn aan de naam van een circuit, gereedschapsnaam of bibliotheeknaam die in uw project wordt gebruikt.\n De opgegeven bestandsnaam is gelijk aan een van deze namen. # ==> ProjUnableToCreate = -# ==> ProjExistsUnableToCreate = +# ==> projExportBundle = +# ==> projExistsOverwrite = +# ==> projAddManifest = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_pl.properties b/src/main/resources/resources/logisim/strings/proj/proj_pl.properties index 8535fbcaef..536db1fc02 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_pl.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_pl.properties @@ -40,7 +40,9 @@ templateOpenError = Nie można otworzyć szablonu: %s templateOpenErrorTitle = Błąd ładowania szablonu UsedLibraryToolnameError = Nazwa pliku nie może być taka sama jak nazwa obwodu, narzędzia lub biblioteki użytej w projekcie.\n Podana nazwa pliku jest taka sama jak nazwa jednego z wymienionych elementów. ProjUnableToCreate = Utworzenie projektu nie powiodło się: %s -ProjExistsUnableToCreate = Katalog o nazwie "%s" już istnieje. Proszę wybierz inny katalog. +# ==> projExportBundle = +# ==> projExistsOverwrite = +# ==> projAddManifest = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_pt.properties b/src/main/resources/resources/logisim/strings/proj/proj_pt.properties index aa1f89caff..5c6949be72 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_pt.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_pt.properties @@ -37,7 +37,9 @@ templateOpenError = Impossível abrir gabarito: %s templateOpenErrorTitle = Erro ao carregar gabarito UsedLibraryToolnameError = O nome do arquivo não pode ser igual a um nome de circuito, nome de ferramenta ou nome de biblioteca usado em seu projeto.\n O nome de arquivo especificado é igual a um desses nomes. # ==> ProjUnableToCreate = -# ==> ProjExistsUnableToCreate = +# ==> projExportBundle = +# ==> projExistsOverwrite = +# ==> projAddManifest = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_ru.properties b/src/main/resources/resources/logisim/strings/proj/proj_ru.properties index 305c1fb4b9..1388e8c64b 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_ru.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_ru.properties @@ -37,7 +37,9 @@ templateOpenError = Невозможно открыть шаблон: %s templateOpenErrorTitle = Ошибка при загрузке шаблона UsedLibraryToolnameError = Имя файла может не совпадать с именем схемы, инструмента или библиотеки, используемой в вашем проекте.\n Указанное имя файла равно одному из этих имен. # ==> ProjUnableToCreate = -# ==> ProjExistsUnableToCreate = +# ==> projExportBundle = +# ==> projExistsOverwrite = +# ==> projAddManifest = # # Template.java # From 225ea7f93103726148b599c3e4956a95f77fa1f5 Mon Sep 17 00:00:00 2001 From: "Dr.Ir.Ing. Theo Kluter" Date: Sun, 10 Oct 2021 11:55:07 +0200 Subject: [PATCH 04/31] Added placeholder for import and added a .info file to zip file --- .../java/com/cburch/logisim/file/Loader.java | 1 + .../com/cburch/logisim/gui/menu/MenuFile.java | 11 +++++++++- .../cburch/logisim/proj/ProjectActions.java | 21 +++++++++++++++++-- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/cburch/logisim/file/Loader.java b/src/main/java/com/cburch/logisim/file/Loader.java index d9ff8d3612..2d8aaaa20a 100644 --- a/src/main/java/com/cburch/logisim/file/Loader.java +++ b/src/main/java/com/cburch/logisim/file/Loader.java @@ -122,6 +122,7 @@ public String getDescription() { public static final String LOGISIM_EXTENSION = ".circ"; public static final String LOGISIM_PROJECT_BUNDLE_EXTENSION = ".lsebdl"; public static final String LOGISIM_LIBRARY_DIR = "libraries"; + public static final String LOGISIM_PROJECT_BUNDLE_INFO_FILE = "LogisimEvolutionBundle.info"; public static final FileFilter LOGISIM_FILTER = new LogisimFileFilter(); public static final FileFilter LOGISIM_BUNDLE_FILTER = new LogisimProjectBundleFilter(); public static final FileFilter LOGISIM_DIRECTORY = new LogisimDirectoryFilter(); diff --git a/src/main/java/com/cburch/logisim/gui/menu/MenuFile.java b/src/main/java/com/cburch/logisim/gui/menu/MenuFile.java index 0d220f7882..c9df6e55ae 100644 --- a/src/main/java/com/cburch/logisim/gui/menu/MenuFile.java +++ b/src/main/java/com/cburch/logisim/gui/menu/MenuFile.java @@ -34,6 +34,7 @@ class MenuFile extends Menu implements ActionListener { private final JMenuItem save = new JMenuItem(); private final JMenuItem saveAs = new JMenuItem(); private final JMenuItem exportProj = new JMenuItem(); + private final JMenuItem importProj = new JMenuItem(); private final MenuItemImpl print = new MenuItemImpl(this, LogisimMenuBar.PRINT); private final MenuItemImpl exportImage = new MenuItemImpl(this, LogisimMenuBar.EXPORT_IMAGE); private final JMenuItem prefs = new JMenuItem(); @@ -51,7 +52,8 @@ public MenuFile(LogisimMenuBar menubar) { close.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W, menuMask | InputEvent.SHIFT_DOWN_MASK)); save.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, menuMask)); saveAs.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, menuMask | InputEvent.SHIFT_DOWN_MASK)); - exportProj.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E, menuMask | InputEvent.SHIFT_DOWN_MASK)); + exportProj.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E, menuMask)); + importProj.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_I, menuMask)); print.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, menuMask)); quit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, menuMask)); @@ -63,7 +65,9 @@ public MenuFile(LogisimMenuBar menubar) { add(close); add(save); add(saveAs); + addSeparator(); add(exportProj); + add(importProj); addSeparator(); add(exportImage); add(print); @@ -85,12 +89,14 @@ public MenuFile(LogisimMenuBar menubar) { save.setEnabled(false); saveAs.setEnabled(false); exportProj.setEnabled(false); + importProj.setEnabled(false); } else { merge.addActionListener(this); close.addActionListener(this); save.addActionListener(this); saveAs.addActionListener(this); exportProj.addActionListener(this); + importProj.addActionListener(this); } menubar.registerItem(LogisimMenuBar.EXPORT_IMAGE, exportImage); menubar.registerItem(LogisimMenuBar.PRINT, print); @@ -163,6 +169,8 @@ public void actionPerformed(ActionEvent e) { ProjectActions.doSaveAs(proj); } else if (src == exportProj) { ProjectActions.doExportProject(proj); + } else if (src == importProj) { + ProjectActions.doImportProject(proj); } } } @@ -183,6 +191,7 @@ public void localeChanged() { save.setText(S.get("fileSaveItem")); saveAs.setText(S.get("fileSaveAsItem")); exportProj.setText(S.get("fileExportProject")); + importProj.setText(S.get("fileImportProject")); exportImage.setText(S.get("fileExportImageItem")); print.setText(S.get("filePrintItem")); prefs.setText(S.get("filePreferencesItem")); diff --git a/src/main/java/com/cburch/logisim/proj/ProjectActions.java b/src/main/java/com/cburch/logisim/proj/ProjectActions.java index a36107add4..7399ccf8a6 100644 --- a/src/main/java/com/cburch/logisim/proj/ProjectActions.java +++ b/src/main/java/com/cburch/logisim/proj/ProjectActions.java @@ -11,12 +11,14 @@ import static com.cburch.logisim.proj.Strings.S; +import com.cburch.logisim.LogisimVersion; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.file.LoadFailedException; import com.cburch.logisim.file.LoadedLibrary; import com.cburch.logisim.file.Loader; import com.cburch.logisim.file.LogisimFile; import com.cburch.logisim.file.LogisimFileActions; +import com.cburch.logisim.generated.BuildInfo; import com.cburch.logisim.gui.generic.OptionPane; import com.cburch.logisim.gui.main.Frame; import com.cburch.logisim.gui.start.SplashScreen; @@ -396,9 +398,21 @@ public static boolean doSave(Project proj, File f) { } /** - * Exports a Logisim project in a seperate directory + * Imports a Logisim project in a zip file * - *

It is the action listener for the File->Export project... menu option. + *

It is the action listener for the File->Import project bundle... menu option. + * + * @param proj the current project to perform the file->open action afterwards + * @return true if success, false otherwise + */ + public static boolean doImportProject(Project proj) { + return false; + } + + /** + * Exports a Logisim project in a zip file + * + *

It is the action listener for the File->Export project bundle... menu option. * * @param proj Project to be exported * @return true if success, false otherwise @@ -441,6 +455,9 @@ public static boolean doExportProject(Project proj) { S.get("projExportBundle"), OptionPane.YES_NO_OPTION) == OptionPane.YES_OPTION) { System.out.println("Add manifest"); } + projectZipFile.putNextEntry(new ZipEntry(Loader.LOGISIM_PROJECT_BUNDLE_INFO_FILE)); + projectZipFile.write(String.format("Created with: %s\n", BuildInfo.displayName).getBytes()); + projectZipFile.write(String.format("Main file: %s\n", loader.getMainFile().getName()).getBytes()); projectZipFile.close(); projectFile.close(); } From 110f28e20a35dcdde6d6f3da797ed41d7053bcce Mon Sep 17 00:00:00 2001 From: "Dr.Ir.Ing. Theo Kluter" Date: Sun, 10 Oct 2021 14:39:50 +0200 Subject: [PATCH 05/31] Reading and writing of information file --- .../com/cburch/logisim/gui/menu/MenuFile.java | 4 +- .../cburch/logisim/proj/ProjectActions.java | 44 ++++++-- .../logisim/proj/ProjectBundleInfoFile.java | 106 ++++++++++++++++++ .../logisim/strings/gui/gui.properties | 1 + .../logisim/strings/gui/gui_de.properties | 1 + .../logisim/strings/gui/gui_el.properties | 1 + .../logisim/strings/gui/gui_es.properties | 1 + .../logisim/strings/gui/gui_fr.properties | 1 + .../logisim/strings/gui/gui_it.properties | 1 + .../logisim/strings/gui/gui_ja.properties | 1 + .../logisim/strings/gui/gui_nl.properties | 1 + .../logisim/strings/gui/gui_pl.properties | 1 + .../logisim/strings/gui/gui_pt.properties | 1 + .../logisim/strings/gui/gui_ru.properties | 1 + .../logisim/strings/proj/proj.properties | 3 + .../logisim/strings/proj/proj_de.properties | 3 + .../logisim/strings/proj/proj_el.properties | 3 + .../logisim/strings/proj/proj_es.properties | 3 + .../logisim/strings/proj/proj_fr.properties | 3 + .../logisim/strings/proj/proj_it.properties | 3 + .../logisim/strings/proj/proj_ja.properties | 3 + .../logisim/strings/proj/proj_nl.properties | 3 + .../logisim/strings/proj/proj_pl.properties | 3 + .../logisim/strings/proj/proj_pt.properties | 3 + .../logisim/strings/proj/proj_ru.properties | 3 + 25 files changed, 187 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/cburch/logisim/proj/ProjectBundleInfoFile.java diff --git a/src/main/java/com/cburch/logisim/gui/menu/MenuFile.java b/src/main/java/com/cburch/logisim/gui/menu/MenuFile.java index c9df6e55ae..01e7f7a3b7 100644 --- a/src/main/java/com/cburch/logisim/gui/menu/MenuFile.java +++ b/src/main/java/com/cburch/logisim/gui/menu/MenuFile.java @@ -52,8 +52,8 @@ public MenuFile(LogisimMenuBar menubar) { close.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W, menuMask | InputEvent.SHIFT_DOWN_MASK)); save.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, menuMask)); saveAs.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, menuMask | InputEvent.SHIFT_DOWN_MASK)); - exportProj.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E, menuMask)); - importProj.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_I, menuMask)); + exportProj.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E, menuMask | InputEvent.SHIFT_DOWN_MASK)); + importProj.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_I, menuMask | InputEvent.SHIFT_DOWN_MASK)); print.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, menuMask)); quit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, menuMask)); diff --git a/src/main/java/com/cburch/logisim/proj/ProjectActions.java b/src/main/java/com/cburch/logisim/proj/ProjectActions.java index 7399ccf8a6..bb1b41f860 100644 --- a/src/main/java/com/cburch/logisim/proj/ProjectActions.java +++ b/src/main/java/com/cburch/logisim/proj/ProjectActions.java @@ -11,7 +11,6 @@ import static com.cburch.logisim.proj.Strings.S; -import com.cburch.logisim.LogisimVersion; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.file.LoadFailedException; import com.cburch.logisim.file.LoadedLibrary; @@ -41,6 +40,7 @@ import java.util.Map; import java.util.regex.Pattern; import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; import java.util.zip.ZipOutputStream; import javax.swing.JFileChooser; @@ -406,7 +406,34 @@ public static boolean doSave(Project proj, File f) { * @return true if success, false otherwise */ public static boolean doImportProject(Project proj) { - return false; + var ret = true; + final var loader = proj.getLogisimFile().getLoader(); + final var chooser = loader.createChooser(); + chooser.setFileFilter(Loader.LOGISIM_BUNDLE_FILTER); + chooser.setAcceptAllFileFilterUsed(false); + chooser.setDialogTitle(S.get("projImportBundle")); + var isCorrectFile = true; + do { + ret &= chooser.showOpenDialog(proj.getFrame()) == JFileChooser.APPROVE_OPTION; + if (!ret) return ret; + final var zipFileName = chooser.getSelectedFile().getAbsolutePath(); + isCorrectFile = Files.exists(Paths.get(zipFileName)); + if (isCorrectFile) { + try { + final var zipFile = new ZipFile(zipFileName); + final var bundleInfo = ProjectBundleInfoFile.getBundleInfoFileContents(zipFile, proj.getFrame()); + if (bundleInfo == null) return false; + zipFile.close(); + } catch (IOException e) { + isCorrectFile = false; + OptionPane.showMessageDialog(proj.getFrame(), S.fmt("fileOpenError", + String.format("%s\n%s", zipFileName, e.getMessage()))); + } + } else { + OptionPane.showMessageDialog(proj.getFrame(), S.fmt("fileOpenError", zipFileName)); + } + } while (!isCorrectFile); + return ret; } /** @@ -429,7 +456,7 @@ public static boolean doExportProject(Project proj) { chooser.setAcceptAllFileFilterUsed(false); chooser.setSelectedFile(new File(zipFile)); chooser.setDialogTitle(S.get("projExportBundle")); - var isCorrectDirectory = true; + var isCorrectFile = true; do { ret &= chooser.showSaveDialog(proj.getFrame()) == JFileChooser.APPROVE_OPTION; if (!ret) { @@ -443,10 +470,10 @@ public static boolean doExportProject(Project proj) { } final var path = Paths.get(zipFile); if (Files.exists(path)) { - isCorrectDirectory = OptionPane.showConfirmDialog(proj.getFrame(), S.fmt("projExistsOverwrite", + isCorrectFile = OptionPane.showConfirmDialog(proj.getFrame(), S.fmt("projExistsOverwrite", new File(zipFile).getName()), S.get("projExportBundle"), OptionPane.YES_NO_OPTION) == OptionPane.YES_OPTION; } - if (isCorrectDirectory) { + if (isCorrectFile) { final var projectFile = new FileOutputStream(zipFile); final var projectZipFile = new ZipOutputStream(projectFile); projectZipFile.putNextEntry(new ZipEntry(String.format("%s%s", Loader.LOGISIM_LIBRARY_DIR, File.separator))); @@ -455,9 +482,8 @@ public static boolean doExportProject(Project proj) { S.get("projExportBundle"), OptionPane.YES_NO_OPTION) == OptionPane.YES_OPTION) { System.out.println("Add manifest"); } - projectZipFile.putNextEntry(new ZipEntry(Loader.LOGISIM_PROJECT_BUNDLE_INFO_FILE)); - projectZipFile.write(String.format("Created with: %s\n", BuildInfo.displayName).getBytes()); - projectZipFile.write(String.format("Main file: %s\n", loader.getMainFile().getName()).getBytes()); + ProjectBundleInfoFile.writeBundleInfoFile(projectZipFile, + ProjectBundleInfoFile.getInfoContainer(BuildInfo.displayName, loader.getMainFile().getName())); projectZipFile.close(); projectFile.close(); } @@ -466,7 +492,7 @@ public static boolean doExportProject(Project proj) { proj.setTool(oldTool); return false; } - } while (!isCorrectDirectory); + } while (!isCorrectFile); proj.setTool(oldTool); } return ret; diff --git a/src/main/java/com/cburch/logisim/proj/ProjectBundleInfoFile.java b/src/main/java/com/cburch/logisim/proj/ProjectBundleInfoFile.java new file mode 100644 index 0000000000..d29038dc80 --- /dev/null +++ b/src/main/java/com/cburch/logisim/proj/ProjectBundleInfoFile.java @@ -0,0 +1,106 @@ +/* + * Logisim-evolution - digital logic design tool and simulator + * Copyright by the Logisim-evolution developers + * + * https://github.com/logisim-evolution/ + * + * This is free software released under GNU GPLv3 license + */ + +package com.cburch.logisim.proj; + +import static com.cburch.logisim.proj.Strings.S; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; +import java.util.zip.ZipOutputStream; + +import com.cburch.logisim.file.Loader; +import com.cburch.logisim.gui.generic.OptionPane; +import com.cburch.logisim.gui.main.Frame; + +public class ProjectBundleInfoFile { + + public static final String VERSION_PREAMBLE = "Created with: "; + public static final String MAIN_FILE_PREAMBLE = "Main file: "; + + public static class infofileInformation { + private final String logisimVersion; + private final String mainCircuitFile; + + public infofileInformation(String logisimVersion, String mainCircuitFile) { + this.logisimVersion = logisimVersion; + this.mainCircuitFile = mainCircuitFile; + } + + public String getBundleLogisimVersion() { + return logisimVersion; + } + + public String getMainLogisimFilename() { + return mainCircuitFile; + } + } + + public static infofileInformation getInfoContainer(String logisimVersion, String mainCircuitFile) { + return new infofileInformation(logisimVersion, mainCircuitFile); + } + + public static void writeBundleInfoFile(ZipOutputStream zipFile, infofileInformation info) throws IOException { + zipFile.putNextEntry(new ZipEntry(Loader.LOGISIM_PROJECT_BUNDLE_INFO_FILE)); + zipFile.write(String.format("%s%s\n", VERSION_PREAMBLE, info.logisimVersion).getBytes()); + zipFile.write(String.format("%s%s\n", MAIN_FILE_PREAMBLE, info.mainCircuitFile).getBytes()); + + } + + public static infofileInformation getBundleInfoFileContents(ZipFile zipFile, Frame frame) throws IOException { + final var projInfoEntry = zipFile.getEntry(Loader.LOGISIM_PROJECT_BUNDLE_INFO_FILE); + if (projInfoEntry == null) { + OptionPane.showMessageDialog(frame, S.fmt("projBundleReadError" , S.get("projBundleNoInfo"))); + return null; + } + final var projInfoStream = zipFile.getInputStream(projInfoEntry); + final var projInputLines = new ArrayList(); + final var oneLine = new StringBuilder(); + int kar; + do { + kar = projInfoStream.read(); + if (kar == '\n') { + projInputLines .add(oneLine.toString()); + oneLine.setLength(0); + } else if (kar >= 0) { + oneLine.append((char) kar); + } + } while (kar >= 0); + if (oneLine.length() > 0) projInputLines.add(oneLine.toString()); + projInfoStream.close(); + String infoCreatedVersion = null; + String infoMainCircuit = null; + final var infoEntryIterator = projInputLines.iterator(); + while (infoEntryIterator.hasNext()) { + final var infoLine = infoEntryIterator.next(); + if (infoLine.startsWith(VERSION_PREAMBLE)) { + if (infoCreatedVersion != null) { + OptionPane.showMessageDialog(frame, S.fmt("projBundleReadError" , S.get("projBundleMisformatted"))); + return null; + } + infoCreatedVersion = infoLine.replace(VERSION_PREAMBLE, ""); + infoEntryIterator.remove(); + } else if (infoLine.startsWith(MAIN_FILE_PREAMBLE)) { + if (infoMainCircuit != null) { + OptionPane.showMessageDialog(frame, S.fmt("projBundleReadError" , S.get("projBundleMisformatted"))); + return null; + } + infoMainCircuit = infoLine.replace(MAIN_FILE_PREAMBLE, ""); + infoEntryIterator.remove(); + } + } + if (projInputLines.size() != 0) { + OptionPane.showMessageDialog(frame, S.fmt("projBundleReadError" , S.get("projBundleMisformatted"))); + return null; + } + return new infofileInformation(infoCreatedVersion, infoMainCircuit); + } +} diff --git a/src/main/resources/resources/logisim/strings/gui/gui.properties b/src/main/resources/resources/logisim/strings/gui/gui.properties index 51448d268a..f94e10c3e0 100644 --- a/src/main/resources/resources/logisim/strings/gui/gui.properties +++ b/src/main/resources/resources/logisim/strings/gui/gui.properties @@ -337,6 +337,7 @@ fileQuitItem = Exit fileSaveAsItem = Save As... fileSaveItem = Save fileExportProject = Export project bundle... +fileImportProject = Import project bundle... # # menu/MenuHelp.java # diff --git a/src/main/resources/resources/logisim/strings/gui/gui_de.properties b/src/main/resources/resources/logisim/strings/gui/gui_de.properties index f2b5247cfb..ecfcf42306 100644 --- a/src/main/resources/resources/logisim/strings/gui/gui_de.properties +++ b/src/main/resources/resources/logisim/strings/gui/gui_de.properties @@ -337,6 +337,7 @@ fileQuitItem = Beenden fileSaveAsItem = Speichern unter... fileSaveItem = Speichern # ==> fileExportProject = +# ==> fileImportProject = # # menu/MenuHelp.java # diff --git a/src/main/resources/resources/logisim/strings/gui/gui_el.properties b/src/main/resources/resources/logisim/strings/gui/gui_el.properties index d088eb997f..a4f044b3c8 100644 --- a/src/main/resources/resources/logisim/strings/gui/gui_el.properties +++ b/src/main/resources/resources/logisim/strings/gui/gui_el.properties @@ -337,6 +337,7 @@ fileQuitItem = Έξοδος fileSaveAsItem = Αποθήκευση ως... fileSaveItem = Αποθήκευση # ==> fileExportProject = +# ==> fileImportProject = # # menu/MenuHelp.java # diff --git a/src/main/resources/resources/logisim/strings/gui/gui_es.properties b/src/main/resources/resources/logisim/strings/gui/gui_es.properties index 2c8f71d302..7d840d4dee 100644 --- a/src/main/resources/resources/logisim/strings/gui/gui_es.properties +++ b/src/main/resources/resources/logisim/strings/gui/gui_es.properties @@ -337,6 +337,7 @@ fileQuitItem = Salir fileSaveAsItem = Guardar como... fileSaveItem = Guardar # ==> fileExportProject = +# ==> fileImportProject = # # menu/MenuHelp.java # diff --git a/src/main/resources/resources/logisim/strings/gui/gui_fr.properties b/src/main/resources/resources/logisim/strings/gui/gui_fr.properties index fd1c807c81..ae2fff7fe9 100644 --- a/src/main/resources/resources/logisim/strings/gui/gui_fr.properties +++ b/src/main/resources/resources/logisim/strings/gui/gui_fr.properties @@ -337,6 +337,7 @@ fileQuitItem = Sortir fileSaveAsItem = Enregistrer sous... fileSaveItem = Enregistrer # ==> fileExportProject = +# ==> fileImportProject = # # menu/MenuHelp.java # diff --git a/src/main/resources/resources/logisim/strings/gui/gui_it.properties b/src/main/resources/resources/logisim/strings/gui/gui_it.properties index 1268a6c4ec..a20ad92fb7 100644 --- a/src/main/resources/resources/logisim/strings/gui/gui_it.properties +++ b/src/main/resources/resources/logisim/strings/gui/gui_it.properties @@ -337,6 +337,7 @@ fileQuitItem = Esci fileSaveAsItem = Salva Come... fileSaveItem = Salva # ==> fileExportProject = +# ==> fileImportProject = # # menu/MenuHelp.java # diff --git a/src/main/resources/resources/logisim/strings/gui/gui_ja.properties b/src/main/resources/resources/logisim/strings/gui/gui_ja.properties index b93c9fadb1..6a10fe8029 100644 --- a/src/main/resources/resources/logisim/strings/gui/gui_ja.properties +++ b/src/main/resources/resources/logisim/strings/gui/gui_ja.properties @@ -337,6 +337,7 @@ fileQuitItem = 終了する fileSaveAsItem = 新規ファイルで保存... fileSaveItem = 保存 # ==> fileExportProject = +# ==> fileImportProject = # # menu/MenuHelp.java # diff --git a/src/main/resources/resources/logisim/strings/gui/gui_nl.properties b/src/main/resources/resources/logisim/strings/gui/gui_nl.properties index 5313218e8a..a7ac056ed8 100644 --- a/src/main/resources/resources/logisim/strings/gui/gui_nl.properties +++ b/src/main/resources/resources/logisim/strings/gui/gui_nl.properties @@ -337,6 +337,7 @@ fileQuitItem = Afsluiten fileSaveAsItem = Opslaan als... fileSaveItem = Opslaan fileExportProject = Projekt bundel exporteren... +fileImportProject = Projekt bundel importeren... # # menu/MenuHelp.java # diff --git a/src/main/resources/resources/logisim/strings/gui/gui_pl.properties b/src/main/resources/resources/logisim/strings/gui/gui_pl.properties index c78f25d906..ca14109c31 100644 --- a/src/main/resources/resources/logisim/strings/gui/gui_pl.properties +++ b/src/main/resources/resources/logisim/strings/gui/gui_pl.properties @@ -385,6 +385,7 @@ fileQuitItem = Zakończ... fileSaveAsItem = Zapisz jako... fileSaveItem = Zapisz... # == > fileExportProject = +# ==> fileImportProject = # # menu/MenuHelp.java # diff --git a/src/main/resources/resources/logisim/strings/gui/gui_pt.properties b/src/main/resources/resources/logisim/strings/gui/gui_pt.properties index 6797e566ff..324fc8c8a0 100644 --- a/src/main/resources/resources/logisim/strings/gui/gui_pt.properties +++ b/src/main/resources/resources/logisim/strings/gui/gui_pt.properties @@ -337,6 +337,7 @@ fileQuitItem = Sair fileSaveAsItem = Salvar como... fileSaveItem = Salvar # ==> fileExportProject = +# ==> fileImportProject = # # menu/MenuHelp.java # diff --git a/src/main/resources/resources/logisim/strings/gui/gui_ru.properties b/src/main/resources/resources/logisim/strings/gui/gui_ru.properties index ddac1877ea..bb985949d2 100644 --- a/src/main/resources/resources/logisim/strings/gui/gui_ru.properties +++ b/src/main/resources/resources/logisim/strings/gui/gui_ru.properties @@ -337,6 +337,7 @@ fileQuitItem = Выход fileSaveAsItem = Сохранить как... fileSaveItem = Сохранить # ==> fileExportProject = +# ==> fileImportProject = # # menu/MenuHelp.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj.properties b/src/main/resources/resources/logisim/strings/proj/proj.properties index e7970f4de5..0222d7965c 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj.properties @@ -40,6 +40,9 @@ ProjUnableToCreate = Failed to create project: %s projExportBundle = Exporting a project bundle projExistsOverwrite = Project bundle "%s" already exists, overwrite it? projAddManifest = Do you want to include a manifest-file in your project bundle? +projBundleReadError = Error reading project bundle: %s +projBundleNoInfo = Bundle does not contain info-file, aborting import! +projBundleMisformatted = Bundle info-file is not correctly formatted, aborting import! # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_de.properties b/src/main/resources/resources/logisim/strings/proj/proj_de.properties index 59236d6bdf..6bf86b3c9a 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_de.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_de.properties @@ -40,6 +40,9 @@ UsedLibraryToolnameError = Der Dateiname muss sich von den Schaltkreisnamen, Wer # ==> projExportBundle = # ==> projExistsOverwrite = # ==> projAddManifest = +# ==> projBundleReadError = +# ==> projBundleNoInfo = +# ==> projBundleMisformatted = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_el.properties b/src/main/resources/resources/logisim/strings/proj/proj_el.properties index c321cdb301..adf89e5c1a 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_el.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_el.properties @@ -40,6 +40,9 @@ templateOpenErrorTitle = Σφάλμα στο Άνοιγμα Προτύπου # ==> projExportBundle = # ==> projExistsOverwrite = # ==> projAddManifest = +# ==> projBundleReadError = +# ==> projBundleNoInfo = +# ==> projBundleMisformatted = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_es.properties b/src/main/resources/resources/logisim/strings/proj/proj_es.properties index d4b3cbb317..37a43cb02f 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_es.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_es.properties @@ -40,6 +40,9 @@ UsedLibraryToolnameError = El nombre de archivo no debe coincidir con el nombre # ==> projExportBundle = # ==> projExistsOverwrite = # ==> projAddManifest = +# ==> projBundleReadError = +# ==> projBundleNoInfo = +# ==> projBundleMisformatted = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_fr.properties b/src/main/resources/resources/logisim/strings/proj/proj_fr.properties index 4fa43bbed4..059fa76b2c 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_fr.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_fr.properties @@ -40,6 +40,9 @@ UsedLibraryToolnameError = Le nom de fichier ne doit pas correspondre à un nom # ==> projExportBundle = # ==> projExistsOverwrite = # ==> projAddManifest = +# ==> projBundleReadError = +# ==> projBundleNoInfo = +# ==> projBundleMisformatted = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_it.properties b/src/main/resources/resources/logisim/strings/proj/proj_it.properties index 74064ae26f..2dab47c8a9 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_it.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_it.properties @@ -40,6 +40,9 @@ UsedLibraryToolnameError = Il nome del file potrebbe non essere uguale al nome d # ==> projExportBundle = # ==> projExistsOverwrite = # ==> projAddManifest = +# ==> projBundleReadError = +# ==> projBundleNoInfo = +# ==> projBundleMisformatted = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_ja.properties b/src/main/resources/resources/logisim/strings/proj/proj_ja.properties index 227f40859f..3a95eb4059 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_ja.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_ja.properties @@ -40,6 +40,9 @@ UsedLibraryToolnameError = ファイル名は、プロジェクトで使用さ # ==> projExportBundle = # ==> projExistsOverwrite = # ==> projAddManifest = +# ==> projBundleReadError = +# ==> projBundleNoInfo = +# ==> projBundleMisformatted = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_nl.properties b/src/main/resources/resources/logisim/strings/proj/proj_nl.properties index e5b89c0def..9b99db4d82 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_nl.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_nl.properties @@ -40,6 +40,9 @@ UsedLibraryToolnameError = De bestandsnaam mag niet gelijk zijn aan de naam van # ==> projExportBundle = # ==> projExistsOverwrite = # ==> projAddManifest = +# ==> projBundleReadError = +# ==> projBundleNoInfo = +# ==> projBundleMisformatted = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_pl.properties b/src/main/resources/resources/logisim/strings/proj/proj_pl.properties index 536db1fc02..fd5599d6ca 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_pl.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_pl.properties @@ -43,6 +43,9 @@ ProjUnableToCreate = Utworzenie projektu nie powiodło się: %s # ==> projExportBundle = # ==> projExistsOverwrite = # ==> projAddManifest = +# ==> projBundleReadError = +# ==> projBundleNoInfo = +# ==> projBundleMisformatted = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_pt.properties b/src/main/resources/resources/logisim/strings/proj/proj_pt.properties index 5c6949be72..11dd73aa7e 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_pt.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_pt.properties @@ -40,6 +40,9 @@ UsedLibraryToolnameError = O nome do arquivo não pode ser igual a um nome de ci # ==> projExportBundle = # ==> projExistsOverwrite = # ==> projAddManifest = +# ==> projBundleReadError = +# ==> projBundleNoInfo = +# ==> projBundleMisformatted = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_ru.properties b/src/main/resources/resources/logisim/strings/proj/proj_ru.properties index 1388e8c64b..3b38167b85 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_ru.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_ru.properties @@ -40,6 +40,9 @@ UsedLibraryToolnameError = Имя файла может не совпадать # ==> projExportBundle = # ==> projExistsOverwrite = # ==> projAddManifest = +# ==> projBundleReadError = +# ==> projBundleNoInfo = +# ==> projBundleMisformatted = # # Template.java # From da44bc70f8e73a765dabec6a16c6aace4657fb9d Mon Sep 17 00:00:00 2001 From: "Dr.Ir.Ing. Theo Kluter" Date: Sun, 10 Oct 2021 16:22:12 +0200 Subject: [PATCH 06/31] Finished project bundle import option --- .../cburch/logisim/proj/ProjectActions.java | 83 ++++++++++++++++++- .../logisim/strings/proj/proj.properties | 5 ++ .../logisim/strings/proj/proj_de.properties | 5 ++ .../logisim/strings/proj/proj_el.properties | 5 ++ .../logisim/strings/proj/proj_es.properties | 5 ++ .../logisim/strings/proj/proj_fr.properties | 5 ++ .../logisim/strings/proj/proj_it.properties | 5 ++ .../logisim/strings/proj/proj_ja.properties | 5 ++ .../logisim/strings/proj/proj_nl.properties | 5 ++ .../logisim/strings/proj/proj_pl.properties | 5 ++ .../logisim/strings/proj/proj_pt.properties | 5 ++ .../logisim/strings/proj/proj_ru.properties | 5 ++ 12 files changed, 135 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/cburch/logisim/proj/ProjectActions.java b/src/main/java/com/cburch/logisim/proj/ProjectActions.java index bb1b41f860..1b7a963073 100644 --- a/src/main/java/com/cburch/logisim/proj/ProjectActions.java +++ b/src/main/java/com/cburch/logisim/proj/ProjectActions.java @@ -409,11 +409,12 @@ public static boolean doImportProject(Project proj) { var ret = true; final var loader = proj.getLogisimFile().getLoader(); final var chooser = loader.createChooser(); - chooser.setFileFilter(Loader.LOGISIM_BUNDLE_FILTER); - chooser.setAcceptAllFileFilterUsed(false); - chooser.setDialogTitle(S.get("projImportBundle")); var isCorrectFile = true; do { + chooser.setFileFilter(Loader.LOGISIM_BUNDLE_FILTER); + chooser.setAcceptAllFileFilterUsed(false); + chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); + chooser.setDialogTitle(S.get("projImportBundle")); ret &= chooser.showOpenDialog(proj.getFrame()) == JFileChooser.APPROVE_OPTION; if (!ret) return ret; final var zipFileName = chooser.getSelectedFile().getAbsolutePath(); @@ -423,6 +424,80 @@ public static boolean doImportProject(Project proj) { final var zipFile = new ZipFile(zipFileName); final var bundleInfo = ProjectBundleInfoFile.getBundleInfoFileContents(zipFile, proj.getFrame()); if (bundleInfo == null) return false; + final var mainFileEntry = zipFile.getEntry(bundleInfo.getMainLogisimFilename()); + if (mainFileEntry == null) { + OptionPane.showMessageDialog(proj.getFrame(), S.fmt("projBundleReadError" , S.get("projBundleMainNotFound"))); + return false; + } + // TODO: check for manifest file and show it when present + chooser.setFileFilter(Loader.LOGISIM_DIRECTORY); + chooser.setAcceptAllFileFilterUsed(false); + chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + chooser.setDialogTitle(S.get("projBundleDirectory")); + var isCorrectDirectory = true; + do { + ret &= chooser.showOpenDialog(proj.getFrame()) == JFileChooser.APPROVE_OPTION; + if (!ret) return ret; + final var exportDirectory = chooser.getSelectedFile().getAbsolutePath(); + final var mainProjectFileName = String.format("%s%s%s", exportDirectory, File.separator, bundleInfo.getMainLogisimFilename()); + var filename = mainProjectFileName; + if (Files.exists(Paths.get(filename)) + || Files.exists(Paths.get(String.format("%s%s%s", exportDirectory, File.separator, Loader.LOGISIM_LIBRARY_DIR)))) { + isCorrectDirectory = false; + OptionPane.showMessageDialog(proj.getFrame(), S.fmt("projContainsFileDir", bundleInfo.getMainLogisimFilename(), Loader.LOGISIM_LIBRARY_DIR)); + } else { + isCorrectDirectory = true; + // extract the main file + var zipInput = zipFile.getInputStream(mainFileEntry); + var fileOutput = new FileOutputStream(filename); + var data = zipInput.read(); + while (data > 0) { + fileOutput.write(data); + data = zipInput.read(); + } + zipInput.close(); + fileOutput.close(); + final var zipFileEntries = zipFile.entries(); + final var libDir = String.format("%s%s%s", exportDirectory, File.separator, Loader.LOGISIM_LIBRARY_DIR); + while (zipFileEntries.hasMoreElements()) { + final var entry = zipFileEntries.nextElement(); + if (entry.isDirectory()) { + final var dirName = entry.getName(); + if (!dirName.equals(Loader.LOGISIM_LIBRARY_DIR)) continue; + new File(String.format("%s%s%s", exportDirectory, File.separator, dirName)).mkdirs(); + } else { + final var entryName = entry.getName(); + if (!entryName.startsWith(String.format("%s%s", Loader.LOGISIM_LIBRARY_DIR, File.separator))) continue; + if (entryName.lastIndexOf(File.separator) != entryName.indexOf(File.separator)) continue; + if (!entryName.endsWith(Loader.LOGISIM_EXTENSION) && + !entryName.toLowerCase().endsWith(".jar")) continue; + // make sure the library dir exists + if (!Files.exists(Paths.get(libDir))) new File(libDir).mkdirs(); + filename = String.format("%s%s%s", exportDirectory, File.separator, entry.getName()); + zipInput = zipFile.getInputStream(entry); + fileOutput = new FileOutputStream(filename); + data = zipInput.read(); + while (data > 0) { + fileOutput.write(data); + data = zipInput.read(); + } + zipInput.close(); + fileOutput.close(); + } + } + // ask to open + if (OptionPane.showConfirmDialog(proj.getFrame(), S.get("projOpenProject"), S.get("projImportBundle"), + JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { + final var newProj = ProjectActions.doOpen(proj.getFrame().getCanvas(), proj, new File(mainProjectFileName)); + if (newProj != null + && proj != null + && !proj.isFileDirty() + && proj.getLogisimFile().getLoader().getMainFile() == null) { + proj.getFrame().dispose(); + } + } + } + } while (!isCorrectDirectory); zipFile.close(); } catch (IOException e) { isCorrectFile = false; @@ -472,6 +547,8 @@ public static boolean doExportProject(Project proj) { if (Files.exists(path)) { isCorrectFile = OptionPane.showConfirmDialog(proj.getFrame(), S.fmt("projExistsOverwrite", new File(zipFile).getName()), S.get("projExportBundle"), OptionPane.YES_NO_OPTION) == OptionPane.YES_OPTION; + } else { + isCorrectFile = true; } if (isCorrectFile) { final var projectFile = new FileOutputStream(zipFile); diff --git a/src/main/resources/resources/logisim/strings/proj/proj.properties b/src/main/resources/resources/logisim/strings/proj/proj.properties index 0222d7965c..aeef3ffe51 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj.properties @@ -38,11 +38,16 @@ templateOpenErrorTitle = Error Loading Template UsedLibraryToolnameError = The filename may not be equal to a circuit name, tool name, or library name used in your project.\n The specified filename equals to one of these names. ProjUnableToCreate = Failed to create project: %s projExportBundle = Exporting a project bundle +projBundleDirectory = Choose directory to extract project bundle: projExistsOverwrite = Project bundle "%s" already exists, overwrite it? projAddManifest = Do you want to include a manifest-file in your project bundle? projBundleReadError = Error reading project bundle: %s projBundleNoInfo = Bundle does not contain info-file, aborting import! projBundleMisformatted = Bundle info-file is not correctly formatted, aborting import! +projBundleMainNotFound = Bundle does not contain the main file, aborting import! +projContainsFileDir = Selected directory contains either the file "%s" or a sub-directory called "%s".\nPlease select a directory that does not contain these elements! +projImportBundle = Importing a project bundle +projOpenProject = Open the imported project in Logisim-evolution? # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_de.properties b/src/main/resources/resources/logisim/strings/proj/proj_de.properties index 6bf86b3c9a..f29df5e4fa 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_de.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_de.properties @@ -43,6 +43,11 @@ UsedLibraryToolnameError = Der Dateiname muss sich von den Schaltkreisnamen, Wer # ==> projBundleReadError = # ==> projBundleNoInfo = # ==> projBundleMisformatted = +# ==> projBundleMainNotFound = +# ==> projBundleDirectory = +# ==> projContainsFileDir = +# ==> projImportBundle = +# ==> projOpenProject = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_el.properties b/src/main/resources/resources/logisim/strings/proj/proj_el.properties index adf89e5c1a..f8d8aeb255 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_el.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_el.properties @@ -43,6 +43,11 @@ templateOpenErrorTitle = Σφάλμα στο Άνοιγμα Προτύπου # ==> projBundleReadError = # ==> projBundleNoInfo = # ==> projBundleMisformatted = +# ==> projBundleMainNotFound = +# ==> projBundleDirectory = +# ==> projContainsFileDir = +# ==> projImportBundle = +# ==> projOpenProject = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_es.properties b/src/main/resources/resources/logisim/strings/proj/proj_es.properties index 37a43cb02f..d481fe143c 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_es.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_es.properties @@ -43,6 +43,11 @@ UsedLibraryToolnameError = El nombre de archivo no debe coincidir con el nombre # ==> projBundleReadError = # ==> projBundleNoInfo = # ==> projBundleMisformatted = +# ==> projBundleMainNotFound = +# ==> projBundleDirectory = +# ==> projContainsFileDir = +# ==> projImportBundle = +# ==> projOpenProject = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_fr.properties b/src/main/resources/resources/logisim/strings/proj/proj_fr.properties index 059fa76b2c..d5b3e3ab58 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_fr.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_fr.properties @@ -43,6 +43,11 @@ UsedLibraryToolnameError = Le nom de fichier ne doit pas correspondre à un nom # ==> projBundleReadError = # ==> projBundleNoInfo = # ==> projBundleMisformatted = +# ==> projBundleMainNotFound = +# ==> projBundleDirectory = +# ==> projContainsFileDir = +# ==> projImportBundle = +# ==> projOpenProject = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_it.properties b/src/main/resources/resources/logisim/strings/proj/proj_it.properties index 2dab47c8a9..88f26f2619 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_it.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_it.properties @@ -43,6 +43,11 @@ UsedLibraryToolnameError = Il nome del file potrebbe non essere uguale al nome d # ==> projBundleReadError = # ==> projBundleNoInfo = # ==> projBundleMisformatted = +# ==> projBundleMainNotFound = +# ==> projBundleDirectory = +# ==> projContainsFileDir = +# ==> projImportBundle = +# ==> projOpenProject = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_ja.properties b/src/main/resources/resources/logisim/strings/proj/proj_ja.properties index 3a95eb4059..0f49a16bad 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_ja.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_ja.properties @@ -43,6 +43,11 @@ UsedLibraryToolnameError = ファイル名は、プロジェクトで使用さ # ==> projBundleReadError = # ==> projBundleNoInfo = # ==> projBundleMisformatted = +# ==> projBundleMainNotFound = +# ==> projBundleDirectory = +# ==> projContainsFileDir = +# ==> projImportBundle = +# ==> projOpenProject = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_nl.properties b/src/main/resources/resources/logisim/strings/proj/proj_nl.properties index 9b99db4d82..056e220a98 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_nl.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_nl.properties @@ -43,6 +43,11 @@ UsedLibraryToolnameError = De bestandsnaam mag niet gelijk zijn aan de naam van # ==> projBundleReadError = # ==> projBundleNoInfo = # ==> projBundleMisformatted = +# ==> projBundleMainNotFound = +# ==> projBundleDirectory = +# ==> projContainsFileDir = +# ==> projImportBundle = +# ==> projOpenProject = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_pl.properties b/src/main/resources/resources/logisim/strings/proj/proj_pl.properties index fd5599d6ca..d970a716d8 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_pl.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_pl.properties @@ -46,6 +46,11 @@ ProjUnableToCreate = Utworzenie projektu nie powiodło się: %s # ==> projBundleReadError = # ==> projBundleNoInfo = # ==> projBundleMisformatted = +# ==> projBundleMainNotFound = +# ==> projBundleDirectory = +# ==> projContainsFileDir = +# ==> projImportBundle = +# ==> projOpenProject = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_pt.properties b/src/main/resources/resources/logisim/strings/proj/proj_pt.properties index 11dd73aa7e..2764d0c2db 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_pt.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_pt.properties @@ -43,6 +43,11 @@ UsedLibraryToolnameError = O nome do arquivo não pode ser igual a um nome de ci # ==> projBundleReadError = # ==> projBundleNoInfo = # ==> projBundleMisformatted = +# ==> projBundleMainNotFound = +# ==> projBundleDirectory = +# ==> projContainsFileDir = +# ==> projImportBundle = +# ==> projOpenProject = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_ru.properties b/src/main/resources/resources/logisim/strings/proj/proj_ru.properties index 3b38167b85..e9b451e222 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_ru.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_ru.properties @@ -43,6 +43,11 @@ UsedLibraryToolnameError = Имя файла может не совпадать # ==> projBundleReadError = # ==> projBundleNoInfo = # ==> projBundleMisformatted = +# ==> projBundleMainNotFound = +# ==> projBundleDirectory = +# ==> projContainsFileDir = +# ==> projImportBundle = +# ==> projOpenProject = # # Template.java # From 296ffaf3fc93bcd66c483696f738157250597546 Mon Sep 17 00:00:00 2001 From: "Dr.Ir.Ing. Theo Kluter" Date: Sun, 10 Oct 2021 16:33:19 +0200 Subject: [PATCH 07/31] Small bugfix --- .../java/com/cburch/logisim/proj/ProjectActions.java | 6 +++--- .../com/cburch/logisim/proj/ProjectBundleInfoFile.java | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/cburch/logisim/proj/ProjectActions.java b/src/main/java/com/cburch/logisim/proj/ProjectActions.java index 1b7a963073..8cafa1d20b 100644 --- a/src/main/java/com/cburch/logisim/proj/ProjectActions.java +++ b/src/main/java/com/cburch/logisim/proj/ProjectActions.java @@ -426,7 +426,7 @@ public static boolean doImportProject(Project proj) { if (bundleInfo == null) return false; final var mainFileEntry = zipFile.getEntry(bundleInfo.getMainLogisimFilename()); if (mainFileEntry == null) { - OptionPane.showMessageDialog(proj.getFrame(), S.fmt("projBundleReadError" , S.get("projBundleMainNotFound"))); + OptionPane.showMessageDialog(proj.getFrame(), S.fmt("projBundleReadError", S.get("projBundleMainNotFound"))); return false; } // TODO: check for manifest file and show it when present @@ -469,8 +469,8 @@ public static boolean doImportProject(Project proj) { final var entryName = entry.getName(); if (!entryName.startsWith(String.format("%s%s", Loader.LOGISIM_LIBRARY_DIR, File.separator))) continue; if (entryName.lastIndexOf(File.separator) != entryName.indexOf(File.separator)) continue; - if (!entryName.endsWith(Loader.LOGISIM_EXTENSION) && - !entryName.toLowerCase().endsWith(".jar")) continue; + if (!entryName.endsWith(Loader.LOGISIM_EXTENSION) + && !entryName.toLowerCase().endsWith(".jar")) continue; // make sure the library dir exists if (!Files.exists(Paths.get(libDir))) new File(libDir).mkdirs(); filename = String.format("%s%s%s", exportDirectory, File.separator, entry.getName()); diff --git a/src/main/java/com/cburch/logisim/proj/ProjectBundleInfoFile.java b/src/main/java/com/cburch/logisim/proj/ProjectBundleInfoFile.java index d29038dc80..6caeef3b7c 100644 --- a/src/main/java/com/cburch/logisim/proj/ProjectBundleInfoFile.java +++ b/src/main/java/com/cburch/logisim/proj/ProjectBundleInfoFile.java @@ -58,7 +58,7 @@ public static void writeBundleInfoFile(ZipOutputStream zipFile, infofileInformat public static infofileInformation getBundleInfoFileContents(ZipFile zipFile, Frame frame) throws IOException { final var projInfoEntry = zipFile.getEntry(Loader.LOGISIM_PROJECT_BUNDLE_INFO_FILE); if (projInfoEntry == null) { - OptionPane.showMessageDialog(frame, S.fmt("projBundleReadError" , S.get("projBundleNoInfo"))); + OptionPane.showMessageDialog(frame, S.fmt("projBundleReadError", S.get("projBundleNoInfo"))); return null; } final var projInfoStream = zipFile.getInputStream(projInfoEntry); @@ -83,22 +83,22 @@ public static infofileInformation getBundleInfoFileContents(ZipFile zipFile, Fra final var infoLine = infoEntryIterator.next(); if (infoLine.startsWith(VERSION_PREAMBLE)) { if (infoCreatedVersion != null) { - OptionPane.showMessageDialog(frame, S.fmt("projBundleReadError" , S.get("projBundleMisformatted"))); + OptionPane.showMessageDialog(frame, S.fmt("projBundleReadError", S.get("projBundleMisformatted"))); return null; } infoCreatedVersion = infoLine.replace(VERSION_PREAMBLE, ""); infoEntryIterator.remove(); } else if (infoLine.startsWith(MAIN_FILE_PREAMBLE)) { if (infoMainCircuit != null) { - OptionPane.showMessageDialog(frame, S.fmt("projBundleReadError" , S.get("projBundleMisformatted"))); + OptionPane.showMessageDialog(frame, S.fmt("projBundleReadError", S.get("projBundleMisformatted"))); return null; } infoMainCircuit = infoLine.replace(MAIN_FILE_PREAMBLE, ""); infoEntryIterator.remove(); } } - if (projInputLines.size() != 0) { - OptionPane.showMessageDialog(frame, S.fmt("projBundleReadError" , S.get("projBundleMisformatted"))); + if ((projInputLines.size() != 0) || (infoCreatedVersion == null) || (infoMainCircuit == null)) { + OptionPane.showMessageDialog(frame, S.fmt("projBundleReadError", S.get("projBundleMisformatted"))); return null; } return new infofileInformation(infoCreatedVersion, infoMainCircuit); From 72861bc6ca3daa4af2f0542fc412af7c50991951 Mon Sep 17 00:00:00 2001 From: "Dr.Ir.Ing. Theo Kluter" Date: Sun, 10 Oct 2021 21:13:12 +0200 Subject: [PATCH 08/31] Showing the manifest file when opening the file bundle and it contains a manifest file. The manifest file is in Markdown format and shows formatted. Current limitation: links do not open in a webbrowser: TODO --- build.gradle.kts | 1 + .../cburch/logisim/proj/ProjectActions.java | 8 +- .../logisim/proj/ProjectBundleInfoFile.java | 2 +- .../logisim/proj/ProjectBundleManifest.java | 79 +++++++++++++++++++ .../logisim/strings/proj/proj.properties | 2 + .../logisim/strings/proj/proj_de.properties | 2 + .../logisim/strings/proj/proj_el.properties | 2 + .../logisim/strings/proj/proj_es.properties | 2 + .../logisim/strings/proj/proj_fr.properties | 2 + .../logisim/strings/proj/proj_it.properties | 2 + .../logisim/strings/proj/proj_ja.properties | 2 + .../logisim/strings/proj/proj_nl.properties | 2 + .../logisim/strings/proj/proj_pl.properties | 2 + .../logisim/strings/proj/proj_pt.properties | 2 + .../logisim/strings/proj/proj_ru.properties | 2 + 15 files changed, 110 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java diff --git a/build.gradle.kts b/build.gradle.kts index b0d49f994d..d9450a1e5d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -41,6 +41,7 @@ dependencies { implementation("org.slf4j:slf4j-simple:1.7.30") implementation("com.formdev:flatlaf:1.2") implementation("commons-cli:commons-cli:1.4") + implementation("com.vladsch.flexmark:flexmark-all:0.62.2") compileOnly("org.jetbrains:annotations:22.0.0") diff --git a/src/main/java/com/cburch/logisim/proj/ProjectActions.java b/src/main/java/com/cburch/logisim/proj/ProjectActions.java index 8cafa1d20b..1bfa392e3a 100644 --- a/src/main/java/com/cburch/logisim/proj/ProjectActions.java +++ b/src/main/java/com/cburch/logisim/proj/ProjectActions.java @@ -27,6 +27,7 @@ import com.cburch.logisim.util.JFileChoosers; import java.awt.Component; import java.io.File; +import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; @@ -429,7 +430,12 @@ public static boolean doImportProject(Project proj) { OptionPane.showMessageDialog(proj.getFrame(), S.fmt("projBundleReadError", S.get("projBundleMainNotFound"))); return false; } - // TODO: check for manifest file and show it when present + final var manifestFileEntry = zipFile.getEntry(ProjectBundleManifest.MANIFEST_FILE_NAME); + if (manifestFileEntry != null) { + final var manifestInStream = zipFile.getInputStream(manifestFileEntry); + final var dialog = new ProjectBundleManifest(proj); + dialog.showManifest(manifestInStream); + } chooser.setFileFilter(Loader.LOGISIM_DIRECTORY); chooser.setAcceptAllFileFilterUsed(false); chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); diff --git a/src/main/java/com/cburch/logisim/proj/ProjectBundleInfoFile.java b/src/main/java/com/cburch/logisim/proj/ProjectBundleInfoFile.java index 6caeef3b7c..1e950936df 100644 --- a/src/main/java/com/cburch/logisim/proj/ProjectBundleInfoFile.java +++ b/src/main/java/com/cburch/logisim/proj/ProjectBundleInfoFile.java @@ -68,7 +68,7 @@ public static infofileInformation getBundleInfoFileContents(ZipFile zipFile, Fra do { kar = projInfoStream.read(); if (kar == '\n') { - projInputLines .add(oneLine.toString()); + projInputLines.add(oneLine.toString()); oneLine.setLength(0); } else if (kar >= 0) { oneLine.append((char) kar); diff --git a/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java b/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java new file mode 100644 index 0000000000..8b6be35238 --- /dev/null +++ b/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java @@ -0,0 +1,79 @@ +/* + * Logisim-evolution - digital logic design tool and simulator + * Copyright by the Logisim-evolution developers + * + * https://github.com/logisim-evolution/ + * + * This is free software released under GNU GPLv3 license + */ + +package com.cburch.logisim.proj; + +import static com.cburch.logisim.proj.Strings.S; + +import java.io.IOException; +import java.io.InputStream; + +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JEditorPane; +import javax.swing.JScrollPane; +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import com.cburch.logisim.gui.main.Frame; +import com.cburch.logisim.prefs.AppPreferences; +import com.vladsch.flexmark.html.HtmlRenderer; +import com.vladsch.flexmark.parser.Parser; +import com.vladsch.flexmark.util.data.MutableDataSet; + +public class ProjectBundleManifest extends JDialog implements ActionListener { + + public static final String MANIFEST_FILE_NAME = "README.txt"; + + private JButton closeButton = new JButton(); + private final Frame parrent; + + public ProjectBundleManifest(Project project) { + super(project.getFrame(), S.get("projBundleManifestWindow")); + setPreferredSize(new Dimension(AppPreferences.getScaled(500),AppPreferences.getScaled(400))); + setModal(true); + setAlwaysOnTop(true); + setVisible(false); + closeButton.addActionListener(this); + parrent = project.getFrame(); + } + + public void showManifest(InputStream file) throws IOException { + final var lines = new StringBuilder(); + var kar = 0; + do { + kar = file.read(); + if (kar >= 0) lines.append((char) kar); + } while (kar >= 0); + final var options = new MutableDataSet(); + final var parser = Parser.builder(options).build(); + final var renderer = HtmlRenderer.builder(options).build(); + final var manifest = parser.parse(lines.toString()); + final var text = renderer.render(manifest); + final var dialog = new JEditorPane("text/html", text); + dialog.setEditable(false); + dialog.setCaretPosition(0); + final var scroller = new JScrollPane(dialog); + setLayout(new BorderLayout()); + add(scroller, BorderLayout.CENTER); + closeButton.setText(S.get("projCloseManifest")); + add(closeButton, BorderLayout.SOUTH); + setDefaultCloseOperation(DISPOSE_ON_CLOSE); + setLocationRelativeTo(parrent); + pack(); + setVisible(true); + } + + @Override + public void actionPerformed(ActionEvent e) { + if (closeButton.equals(e.getSource())) setVisible(false); + } +} diff --git a/src/main/resources/resources/logisim/strings/proj/proj.properties b/src/main/resources/resources/logisim/strings/proj/proj.properties index aeef3ffe51..c46582b6e9 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj.properties @@ -48,6 +48,8 @@ projBundleMainNotFound = Bundle does not contain the main file, aborting import! projContainsFileDir = Selected directory contains either the file "%s" or a sub-directory called "%s".\nPlease select a directory that does not contain these elements! projImportBundle = Importing a project bundle projOpenProject = Open the imported project in Logisim-evolution? +projBundleManifestWindow = Project bundle manifest information +projCloseManifest = Close project bundle manifest # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_de.properties b/src/main/resources/resources/logisim/strings/proj/proj_de.properties index f29df5e4fa..3089d7cf44 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_de.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_de.properties @@ -48,6 +48,8 @@ UsedLibraryToolnameError = Der Dateiname muss sich von den Schaltkreisnamen, Wer # ==> projContainsFileDir = # ==> projImportBundle = # ==> projOpenProject = +# ==> projBundleManifestWindow = +# ==> projCloseManifest = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_el.properties b/src/main/resources/resources/logisim/strings/proj/proj_el.properties index f8d8aeb255..94b79139a9 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_el.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_el.properties @@ -48,6 +48,8 @@ templateOpenErrorTitle = Σφάλμα στο Άνοιγμα Προτύπου # ==> projContainsFileDir = # ==> projImportBundle = # ==> projOpenProject = +# ==> projBundleManifestWindow = +# ==> projCloseManifest = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_es.properties b/src/main/resources/resources/logisim/strings/proj/proj_es.properties index d481fe143c..f77d883ded 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_es.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_es.properties @@ -48,6 +48,8 @@ UsedLibraryToolnameError = El nombre de archivo no debe coincidir con el nombre # ==> projContainsFileDir = # ==> projImportBundle = # ==> projOpenProject = +# ==> projBundleManifestWindow = +# ==> projCloseManifest = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_fr.properties b/src/main/resources/resources/logisim/strings/proj/proj_fr.properties index d5b3e3ab58..e8395937a2 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_fr.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_fr.properties @@ -48,6 +48,8 @@ UsedLibraryToolnameError = Le nom de fichier ne doit pas correspondre à un nom # ==> projContainsFileDir = # ==> projImportBundle = # ==> projOpenProject = +# ==> projBundleManifestWindow = +# ==> projCloseManifest = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_it.properties b/src/main/resources/resources/logisim/strings/proj/proj_it.properties index 88f26f2619..991673159b 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_it.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_it.properties @@ -48,6 +48,8 @@ UsedLibraryToolnameError = Il nome del file potrebbe non essere uguale al nome d # ==> projContainsFileDir = # ==> projImportBundle = # ==> projOpenProject = +# ==> projBundleManifestWindow = +# ==> projCloseManifest = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_ja.properties b/src/main/resources/resources/logisim/strings/proj/proj_ja.properties index 0f49a16bad..14a7bacb29 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_ja.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_ja.properties @@ -48,6 +48,8 @@ UsedLibraryToolnameError = ファイル名は、プロジェクトで使用さ # ==> projContainsFileDir = # ==> projImportBundle = # ==> projOpenProject = +# ==> projBundleManifestWindow = +# ==> projCloseManifest = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_nl.properties b/src/main/resources/resources/logisim/strings/proj/proj_nl.properties index 056e220a98..b9887c2fbb 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_nl.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_nl.properties @@ -48,6 +48,8 @@ UsedLibraryToolnameError = De bestandsnaam mag niet gelijk zijn aan de naam van # ==> projContainsFileDir = # ==> projImportBundle = # ==> projOpenProject = +# ==> projBundleManifestWindow = +# ==> projCloseManifest = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_pl.properties b/src/main/resources/resources/logisim/strings/proj/proj_pl.properties index d970a716d8..99672e932d 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_pl.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_pl.properties @@ -51,6 +51,8 @@ ProjUnableToCreate = Utworzenie projektu nie powiodło się: %s # ==> projContainsFileDir = # ==> projImportBundle = # ==> projOpenProject = +# ==> projBundleManifestWindow = +# ==> projCloseManifest = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_pt.properties b/src/main/resources/resources/logisim/strings/proj/proj_pt.properties index 2764d0c2db..c0f03c7dc7 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_pt.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_pt.properties @@ -48,6 +48,8 @@ UsedLibraryToolnameError = O nome do arquivo não pode ser igual a um nome de ci # ==> projContainsFileDir = # ==> projImportBundle = # ==> projOpenProject = +# ==> projBundleManifestWindow = +# ==> projCloseManifest = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_ru.properties b/src/main/resources/resources/logisim/strings/proj/proj_ru.properties index e9b451e222..f6e011b876 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_ru.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_ru.properties @@ -48,6 +48,8 @@ UsedLibraryToolnameError = Имя файла может не совпадать # ==> projContainsFileDir = # ==> projImportBundle = # ==> projOpenProject = +# ==> projBundleManifestWindow = +# ==> projCloseManifest = # # Template.java # From 0c984e1ad7dedb75aa973563b2d02c0926cf91ca Mon Sep 17 00:00:00 2001 From: "Dr.Ir.Ing. Theo Kluter" Date: Sun, 10 Oct 2021 22:36:16 +0200 Subject: [PATCH 09/31] Code cleanup --- .../com/cburch/logisim/proj/ProjectActions.java | 2 +- .../cburch/logisim/proj/ProjectBundleManifest.java | 13 ++++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/cburch/logisim/proj/ProjectActions.java b/src/main/java/com/cburch/logisim/proj/ProjectActions.java index 1bfa392e3a..1a7c46d0b9 100644 --- a/src/main/java/com/cburch/logisim/proj/ProjectActions.java +++ b/src/main/java/com/cburch/logisim/proj/ProjectActions.java @@ -27,7 +27,6 @@ import com.cburch.logisim.util.JFileChoosers; import java.awt.Component; import java.io.File; -import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; @@ -435,6 +434,7 @@ public static boolean doImportProject(Project proj) { final var manifestInStream = zipFile.getInputStream(manifestFileEntry); final var dialog = new ProjectBundleManifest(proj); dialog.showManifest(manifestInStream); + manifestInStream.close(); } chooser.setFileFilter(Loader.LOGISIM_DIRECTORY); chooser.setAcceptAllFileFilterUsed(false); diff --git a/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java b/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java index 8b6be35238..5eaf4125ae 100644 --- a/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java +++ b/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java @@ -31,7 +31,7 @@ public class ProjectBundleManifest extends JDialog implements ActionListener { - public static final String MANIFEST_FILE_NAME = "README.txt"; + public static final String MANIFEST_FILE_NAME = "README.md"; private JButton closeButton = new JButton(); private final Frame parrent; @@ -40,6 +40,8 @@ public ProjectBundleManifest(Project project) { super(project.getFrame(), S.get("projBundleManifestWindow")); setPreferredSize(new Dimension(AppPreferences.getScaled(500),AppPreferences.getScaled(400))); setModal(true); + setLayout(new BorderLayout()); + setDefaultCloseOperation(DISPOSE_ON_CLOSE); setAlwaysOnTop(true); setVisible(false); closeButton.addActionListener(this); @@ -62,18 +64,19 @@ public void showManifest(InputStream file) throws IOException { dialog.setEditable(false); dialog.setCaretPosition(0); final var scroller = new JScrollPane(dialog); - setLayout(new BorderLayout()); add(scroller, BorderLayout.CENTER); closeButton.setText(S.get("projCloseManifest")); add(closeButton, BorderLayout.SOUTH); - setDefaultCloseOperation(DISPOSE_ON_CLOSE); - setLocationRelativeTo(parrent); pack(); + setLocationRelativeTo(parrent); setVisible(true); } @Override public void actionPerformed(ActionEvent e) { - if (closeButton.equals(e.getSource())) setVisible(false); + if (closeButton.equals(e.getSource())) { + setVisible(false); + dispose(); + } } } From 50558623fc7008fef18fc1d5b808fbd2088f5b6a Mon Sep 17 00:00:00 2001 From: "Dr.Ir.Ing. Theo Kluter" Date: Sun, 10 Oct 2021 22:50:31 +0200 Subject: [PATCH 10/31] Only strip the unused libraries in case the option is set in app-preferences (to account for the comment of David Hutchens) --- src/main/java/com/cburch/logisim/file/XmlWriter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cburch/logisim/file/XmlWriter.java b/src/main/java/com/cburch/logisim/file/XmlWriter.java index 190c79e755..08ee4e5eee 100644 --- a/src/main/java/com/cburch/logisim/file/XmlWriter.java +++ b/src/main/java/com/cburch/logisim/file/XmlWriter.java @@ -383,7 +383,7 @@ Element fromLibrary(Library lib) throws IOException, LoadFailedException { return null; } libs.put(lib, name); - if (isProjectExport || AppPreferences.REMOVE_UNUSED_LIBRARIES.getBoolean()) { + if (AppPreferences.REMOVE_UNUSED_LIBRARIES.getBoolean()) { // first we check if the library is used and if this is not the case we do not add it var isUsed = false; final var tools = lib.getTools(); From a1da9b15081766ab866aa98dc667003281d67215 Mon Sep 17 00:00:00 2001 From: "Dr.Ir.Ing. Theo Kluter" Date: Mon, 11 Oct 2021 09:01:49 +0200 Subject: [PATCH 11/31] Added manifets writing phase 1 --- .../cburch/logisim/proj/ProjectActions.java | 10 +- .../logisim/proj/ProjectBundleManifest.java | 110 +++++++++++++++++- .../logisim/strings/proj/proj.properties | 11 ++ .../logisim/strings/proj/proj_de.properties | 11 ++ .../logisim/strings/proj/proj_el.properties | 11 ++ .../logisim/strings/proj/proj_es.properties | 11 ++ .../logisim/strings/proj/proj_fr.properties | 11 ++ .../logisim/strings/proj/proj_it.properties | 11 ++ .../logisim/strings/proj/proj_ja.properties | 11 ++ .../logisim/strings/proj/proj_nl.properties | 11 ++ .../logisim/strings/proj/proj_pl.properties | 11 ++ .../logisim/strings/proj/proj_pt.properties | 11 ++ .../logisim/strings/proj/proj_ru.properties | 11 ++ 13 files changed, 236 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/cburch/logisim/proj/ProjectActions.java b/src/main/java/com/cburch/logisim/proj/ProjectActions.java index 1a7c46d0b9..6629360c7f 100644 --- a/src/main/java/com/cburch/logisim/proj/ProjectActions.java +++ b/src/main/java/com/cburch/logisim/proj/ProjectActions.java @@ -432,7 +432,7 @@ public static boolean doImportProject(Project proj) { final var manifestFileEntry = zipFile.getEntry(ProjectBundleManifest.MANIFEST_FILE_NAME); if (manifestFileEntry != null) { final var manifestInStream = zipFile.getInputStream(manifestFileEntry); - final var dialog = new ProjectBundleManifest(proj); + final var dialog = new ProjectBundleManifest(proj, ""); dialog.showManifest(manifestInStream); manifestInStream.close(); } @@ -563,7 +563,13 @@ public static boolean doExportProject(Project proj) { ret &= loader.export(proj.getLogisimFile(), projectZipFile); if (OptionPane.showConfirmDialog(proj.getFrame(), S.get("projAddManifest"), S.get("projExportBundle"), OptionPane.YES_NO_OPTION) == OptionPane.YES_OPTION) { -System.out.println("Add manifest"); + final var dialog = new ProjectBundleManifest(proj, loader.getMainFile().getName().replace(Loader.LOGISIM_EXTENSION, "")); + if (!dialog.writeManifest(projectZipFile)) { + OptionPane.showMessageDialog(proj.getFrame(), S.get("ProjUnableToCreate", S.get("projManifestError"))); + projectZipFile.close(); + projectFile.close(); + return false; + } } ProjectBundleInfoFile.writeBundleInfoFile(projectZipFile, ProjectBundleInfoFile.getInfoContainer(BuildInfo.displayName, loader.getMainFile().getName())); diff --git a/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java b/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java index 5eaf4125ae..2b4c9f17f3 100644 --- a/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java +++ b/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java @@ -13,16 +13,26 @@ import java.io.IOException; import java.io.InputStream; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JEditorPane; +import javax.swing.JLabel; +import javax.swing.JPanel; import javax.swing.JScrollPane; +import javax.swing.JTextField; +import javax.swing.SwingConstants; + import java.awt.BorderLayout; +import java.awt.GridBagLayout; +import java.awt.GridBagConstraints; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import com.cburch.logisim.file.Loader; import com.cburch.logisim.gui.main.Frame; import com.cburch.logisim.prefs.AppPreferences; import com.vladsch.flexmark.html.HtmlRenderer; @@ -34,17 +44,25 @@ public class ProjectBundleManifest extends JDialog implements ActionListener { public static final String MANIFEST_FILE_NAME = "README.md"; private JButton closeButton = new JButton(); + private JButton writeButton = new JButton(); + private JTextField projectName = new JTextField(20); + private JTextField projectAuthor = new JTextField(20); + private JTextField projectKeywords = new JTextField(20); + private JEditorPane projectDescription = new JEditorPane(); private final Frame parrent; + private ZipOutputStream zipfile; + private boolean manifestWritten; - public ProjectBundleManifest(Project project) { + public ProjectBundleManifest(Project project, String projName) { super(project.getFrame(), S.get("projBundleManifestWindow")); - setPreferredSize(new Dimension(AppPreferences.getScaled(500),AppPreferences.getScaled(400))); setModal(true); - setLayout(new BorderLayout()); setDefaultCloseOperation(DISPOSE_ON_CLOSE); setAlwaysOnTop(true); setVisible(false); + setResizable(false); closeButton.addActionListener(this); + writeButton.addActionListener(this); + projectName.setText(projName); parrent = project.getFrame(); } @@ -64,6 +82,7 @@ public void showManifest(InputStream file) throws IOException { dialog.setEditable(false); dialog.setCaretPosition(0); final var scroller = new JScrollPane(dialog); + setLayout(new BorderLayout()); add(scroller, BorderLayout.CENTER); closeButton.setText(S.get("projCloseManifest")); add(closeButton, BorderLayout.SOUTH); @@ -72,11 +91,96 @@ public void showManifest(InputStream file) throws IOException { setVisible(true); } + public boolean writeManifest(ZipOutputStream zipfile) { + this.zipfile = zipfile; + manifestWritten = false; + setLayout(new GridBagLayout()); + final var gbc = new GridBagConstraints(); + gbc.gridx = 0; + gbc.gridy = 0; + gbc.fill = GridBagConstraints.HORIZONTAL; + add(new JLabel(S.get("projName")), gbc); + gbc.gridx = 1; + add(projectName, gbc); + gbc.gridx = 0; + gbc.gridy++; + add(new JLabel(S.get("projAuthor")), gbc); + gbc.gridx = 1; + add(projectAuthor, gbc); + gbc.gridx = 0; + gbc.gridy++; + add(new JLabel(S.get("projKeywords")), gbc); + gbc.gridx = 1; + add(projectKeywords, gbc); + gbc.gridx = 0; + gbc.gridy++; + gbc.gridwidth = 2; + add(new JLabel(S.get("projDescription"), SwingConstants.CENTER), gbc); + gbc.gridy++; + final var scroller = new JScrollPane(projectDescription); + scroller.setPreferredSize(new Dimension(AppPreferences.getScaled(500), AppPreferences.getScaled(300))); + add(scroller, gbc); + gbc.gridx = 0; + gbc.gridy++; + gbc.gridwidth = 1; + closeButton.setText(S.get("projCancel")); + add(closeButton, gbc); + writeButton.setText(S.get("projWriteManifest")); + gbc.gridx = 1; + add(writeButton, gbc); + pack(); + setLocationRelativeTo(parrent); + setVisible(true); + return manifestWritten; + } + @Override public void actionPerformed(ActionEvent e) { if (closeButton.equals(e.getSource())) { setVisible(false); dispose(); + } else if (writeButton.equals(e.getSource())) { + ceateManifest(); + setVisible(false); + dispose(); + } + } + + private void ceateManifest() { + if (zipfile == null) return; + try { + final var seperator = "\n---\n"; + var wroteheader1 = false; + zipfile.putNextEntry(new ZipEntry(MANIFEST_FILE_NAME)); + final var projName = projectName.getText(); + zipfile.write(S.get("projHeader").getBytes()); + if ((projName != null) && !projName.isEmpty()) { + zipfile.write(S.get("projHeader1").getBytes()); + wroteheader1 = true; + zipfile.write(S.fmt("projIntro", projName).getBytes()); + } + final var projAuthor = projectAuthor.getText(); + if ((projAuthor != null) && !projAuthor.isEmpty()) { + final var authors = projAuthor.split(","); + if (authors.length > 0) { + if (!wroteheader1) { + zipfile.write(S.get("projHeader1").getBytes()); + wroteheader1 = true; + } + zipfile.write(S.get("projAuthor").getBytes()); + for (var authorid = 0; authorid < authors.length; authorid++) { + if (authorid > 0) { + var authSep = authorid == (authors.length - 1) ? authors.length == 2 ? " and " : ", and " : ", "; + zipfile.write(authSep.getBytes()); + } + zipfile.write(String.format("`%s`", authors[authorid]).getBytes()); + } + zipfile.write("\n".getBytes()); + } + } + } catch (IOException e) { + manifestWritten = false; } + manifestWritten = true; } } diff --git a/src/main/resources/resources/logisim/strings/proj/proj.properties b/src/main/resources/resources/logisim/strings/proj/proj.properties index c46582b6e9..ce0ee383e5 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj.properties @@ -50,6 +50,17 @@ projImportBundle = Importing a project bundle projOpenProject = Open the imported project in Logisim-evolution? projBundleManifestWindow = Project bundle manifest information projCloseManifest = Close project bundle manifest +projCancel = Cancel +projManifestError = Could not write manifest file, aborting! +projWriteManifest = Done, write manifest +projName = Project's name: +projAuthor = Author(s): +projKeywords = Keywords: +projDescription = Project description: +projHeader = # Logisim-evolution project-bundle #\n\n +projHeader1 = ## Project-bundle information ##\n\n +projIntro = This project-bundle contains the required Logisim-files for the project `%s`.\n +projAuthor = The author(s) of this project is/are: # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_de.properties b/src/main/resources/resources/logisim/strings/proj/proj_de.properties index 3089d7cf44..19db5ea242 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_de.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_de.properties @@ -50,6 +50,17 @@ UsedLibraryToolnameError = Der Dateiname muss sich von den Schaltkreisnamen, Wer # ==> projOpenProject = # ==> projBundleManifestWindow = # ==> projCloseManifest = +# ==> projCancel = +# ==> projWriteManifest = +# ==> projName = +# ==> projAuthor = +# ==> projKeywords = +# ==> projDescription = +# ==> projHeader = +# ==> projHeader1 = +# ==> projIntro = +# ==> projAuthor = +# ==> projManifestError = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_el.properties b/src/main/resources/resources/logisim/strings/proj/proj_el.properties index 94b79139a9..de9183fabd 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_el.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_el.properties @@ -50,6 +50,17 @@ templateOpenErrorTitle = Σφάλμα στο Άνοιγμα Προτύπου # ==> projOpenProject = # ==> projBundleManifestWindow = # ==> projCloseManifest = +# ==> projCancel = +# ==> projWriteManifest = +# ==> projName = +# ==> projAuthor = +# ==> projKeywords = +# ==> projDescription = +# ==> projHeader = +# ==> projHeader1 = +# ==> projIntro = +# ==> projAuthor = +# ==> projManifestError = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_es.properties b/src/main/resources/resources/logisim/strings/proj/proj_es.properties index f77d883ded..a9f23ab480 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_es.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_es.properties @@ -50,6 +50,17 @@ UsedLibraryToolnameError = El nombre de archivo no debe coincidir con el nombre # ==> projOpenProject = # ==> projBundleManifestWindow = # ==> projCloseManifest = +# ==> projCancel = +# ==> projWriteManifest = +# ==> projName = +# ==> projAuthor = +# ==> projKeywords = +# ==> projDescription = +# ==> projHeader = +# ==> projHeader1 = +# ==> projIntro = +# ==> projAuthor = +# ==> projManifestError = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_fr.properties b/src/main/resources/resources/logisim/strings/proj/proj_fr.properties index e8395937a2..56fa00cb34 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_fr.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_fr.properties @@ -50,6 +50,17 @@ UsedLibraryToolnameError = Le nom de fichier ne doit pas correspondre à un nom # ==> projOpenProject = # ==> projBundleManifestWindow = # ==> projCloseManifest = +# ==> projCancel = +# ==> projWriteManifest = +# ==> projName = +# ==> projAuthor = +# ==> projKeywords = +# ==> projDescription = +# ==> projHeader = +# ==> projHeader1 = +# ==> projIntro = +# ==> projAuthor = +# ==> projManifestError = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_it.properties b/src/main/resources/resources/logisim/strings/proj/proj_it.properties index 991673159b..61bd2020df 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_it.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_it.properties @@ -50,6 +50,17 @@ UsedLibraryToolnameError = Il nome del file potrebbe non essere uguale al nome d # ==> projOpenProject = # ==> projBundleManifestWindow = # ==> projCloseManifest = +# ==> projCancel = +# ==> projWriteManifest = +# ==> projName = +# ==> projAuthor = +# ==> projKeywords = +# ==> projDescription = +# ==> projHeader = +# ==> projHeader1 = +# ==> projIntro = +# ==> projAuthor = +# ==> projManifestError = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_ja.properties b/src/main/resources/resources/logisim/strings/proj/proj_ja.properties index 14a7bacb29..dbbef05ff8 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_ja.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_ja.properties @@ -50,6 +50,17 @@ UsedLibraryToolnameError = ファイル名は、プロジェクトで使用さ # ==> projOpenProject = # ==> projBundleManifestWindow = # ==> projCloseManifest = +# ==> projCancel = +# ==> projWriteManifest = +# ==> projName = +# ==> projAuthor = +# ==> projKeywords = +# ==> projDescription = +# ==> projHeader = +# ==> projHeader1 = +# ==> projIntro = +# ==> projAuthor = +# ==> projManifestError = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_nl.properties b/src/main/resources/resources/logisim/strings/proj/proj_nl.properties index b9887c2fbb..1ba39e7d95 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_nl.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_nl.properties @@ -50,6 +50,17 @@ UsedLibraryToolnameError = De bestandsnaam mag niet gelijk zijn aan de naam van # ==> projOpenProject = # ==> projBundleManifestWindow = # ==> projCloseManifest = +# ==> projCancel = +# ==> projWriteManifest = +# ==> projName = +# ==> projAuthor = +# ==> projKeywords = +# ==> projDescription = +# ==> projHeader = +# ==> projHeader1 = +# ==> projIntro = +# ==> projAuthor = +# ==> projManifestError = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_pl.properties b/src/main/resources/resources/logisim/strings/proj/proj_pl.properties index 99672e932d..ec6d932f75 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_pl.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_pl.properties @@ -53,6 +53,17 @@ ProjUnableToCreate = Utworzenie projektu nie powiodło się: %s # ==> projOpenProject = # ==> projBundleManifestWindow = # ==> projCloseManifest = +# ==> projCancel = +# ==> projWriteManifest = +# ==> projName = +# ==> projAuthor = +# ==> projKeywords = +# ==> projDescription = +# ==> projHeader = +# ==> projHeader1 = +# ==> projIntro = +# ==> projAuthor = +# ==> projManifestError = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_pt.properties b/src/main/resources/resources/logisim/strings/proj/proj_pt.properties index c0f03c7dc7..e3fe9be31c 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_pt.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_pt.properties @@ -50,6 +50,17 @@ UsedLibraryToolnameError = O nome do arquivo não pode ser igual a um nome de ci # ==> projOpenProject = # ==> projBundleManifestWindow = # ==> projCloseManifest = +# ==> projCancel = +# ==> projWriteManifest = +# ==> projName = +# ==> projAuthor = +# ==> projKeywords = +# ==> projDescription = +# ==> projHeader = +# ==> projHeader1 = +# ==> projIntro = +# ==> projAuthor = +# ==> projManifestError = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_ru.properties b/src/main/resources/resources/logisim/strings/proj/proj_ru.properties index f6e011b876..0de0d2d0d4 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_ru.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_ru.properties @@ -50,6 +50,17 @@ UsedLibraryToolnameError = Имя файла может не совпадать # ==> projOpenProject = # ==> projBundleManifestWindow = # ==> projCloseManifest = +# ==> projCancel = +# ==> projWriteManifest = +# ==> projName = +# ==> projAuthor = +# ==> projKeywords = +# ==> projDescription = +# ==> projHeader = +# ==> projHeader1 = +# ==> projIntro = +# ==> projAuthor = +# ==> projManifestError = # # Template.java # From edf851607b2330d8ddbc8d6ab4233c7ea5d23cc6 Mon Sep 17 00:00:00 2001 From: "Dr.Ir.Ing. Theo Kluter" Date: Mon, 11 Oct 2021 12:39:31 +0200 Subject: [PATCH 12/31] Bugfix --- src/main/java/com/cburch/logisim/file/XmlReader.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/cburch/logisim/file/XmlReader.java b/src/main/java/com/cburch/logisim/file/XmlReader.java index cb5dc0efef..3ff19818d3 100644 --- a/src/main/java/com/cburch/logisim/file/XmlReader.java +++ b/src/main/java/com/cburch/logisim/file/XmlReader.java @@ -413,14 +413,14 @@ private void toLogisimFile(Element elt, Project proj) { } // first, load the sublibraries - final var libsToAddAfter = new HashSet(); + final var libsToAddAfter = new HashSet(); final var baseLibsToEnable = new HashSet(); final var libsLoaded = new HashSet(); for (final var o : XmlIterator.forChildElements(elt, "lib")) { final var lib = toLibrary(o, isHolyCrossFile, isEvolutionFile); if (lib instanceof LoadedLibrary loadedLib) { - if (loadedLib.getBase() instanceof LogisimFile logiLib) { - libsToAddAfter.add(logiLib); + if (loadedLib.getBase() instanceof LogisimFile) { + libsToAddAfter.add(lib); continue; } } From 35371ecbfc7f7942c76501fe9f19ef7edcf95462 Mon Sep 17 00:00:00 2001 From: "Dr.Ir.Ing. Theo Kluter" Date: Mon, 11 Oct 2021 18:15:29 +0200 Subject: [PATCH 13/31] Finished project export and manifest --- .../logisim/proj/ProjectBundleManifest.java | 62 +++++++++++++------ .../logisim/strings/proj/proj.properties | 13 ++-- .../logisim/strings/proj/proj_de.properties | 3 + .../logisim/strings/proj/proj_el.properties | 3 + .../logisim/strings/proj/proj_es.properties | 3 + .../logisim/strings/proj/proj_fr.properties | 3 + .../logisim/strings/proj/proj_it.properties | 3 + .../logisim/strings/proj/proj_ja.properties | 3 + .../logisim/strings/proj/proj_nl.properties | 3 + .../logisim/strings/proj/proj_pl.properties | 3 + .../logisim/strings/proj/proj_pt.properties | 3 + .../logisim/strings/proj/proj_ru.properties | 3 + 12 files changed, 82 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java b/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java index 2b4c9f17f3..c7defaca40 100644 --- a/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java +++ b/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java @@ -13,6 +13,8 @@ import java.io.IOException; import java.io.InputStream; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; @@ -20,7 +22,6 @@ import javax.swing.JDialog; import javax.swing.JEditorPane; import javax.swing.JLabel; -import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.SwingConstants; @@ -32,7 +33,7 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import com.cburch.logisim.file.Loader; +import com.cburch.logisim.generated.BuildInfo; import com.cburch.logisim.gui.main.Frame; import com.cburch.logisim.prefs.AppPreferences; import com.vladsch.flexmark.html.HtmlRenderer; @@ -51,7 +52,7 @@ public class ProjectBundleManifest extends JDialog implements ActionListener { private JEditorPane projectDescription = new JEditorPane(); private final Frame parrent; private ZipOutputStream zipfile; - private boolean manifestWritten; + private boolean manifestWritten = true; public ProjectBundleManifest(Project project, String projName) { super(project.getFrame(), S.get("projBundleManifestWindow")); @@ -59,7 +60,6 @@ public ProjectBundleManifest(Project project, String projName) { setDefaultCloseOperation(DISPOSE_ON_CLOSE); setAlwaysOnTop(true); setVisible(false); - setResizable(false); closeButton.addActionListener(this); writeButton.addActionListener(this); projectName.setText(projName); @@ -93,8 +93,8 @@ public void showManifest(InputStream file) throws IOException { public boolean writeManifest(ZipOutputStream zipfile) { this.zipfile = zipfile; - manifestWritten = false; setLayout(new GridBagLayout()); + setResizable(false); final var gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; @@ -140,47 +140,73 @@ public void actionPerformed(ActionEvent e) { setVisible(false); dispose(); } else if (writeButton.equals(e.getSource())) { - ceateManifest(); + writeManifestFile(); setVisible(false); dispose(); } } - private void ceateManifest() { + private void writeManifestFile() { if (zipfile == null) return; try { - final var seperator = "\n---\n"; + final var seperator = "---\n\n"; var wroteheader1 = false; zipfile.putNextEntry(new ZipEntry(MANIFEST_FILE_NAME)); final var projName = projectName.getText(); - zipfile.write(S.get("projHeader").getBytes()); + zipfile.write(S.get("projHeader").concat("\n\n").getBytes()); if ((projName != null) && !projName.isEmpty()) { - zipfile.write(S.get("projHeader1").getBytes()); + zipfile.write(S.get("projHeader1").concat("\n\n").getBytes()); wroteheader1 = true; - zipfile.write(S.fmt("projIntro", projName).getBytes()); + zipfile.write(S.fmt("projIntro", projName).concat("\n\n").getBytes()); } final var projAuthor = projectAuthor.getText(); if ((projAuthor != null) && !projAuthor.isEmpty()) { final var authors = projAuthor.split(","); if (authors.length > 0) { if (!wroteheader1) { - zipfile.write(S.get("projHeader1").getBytes()); + zipfile.write(S.get("projHeader1").concat("\n\n").getBytes()); wroteheader1 = true; } zipfile.write(S.get("projAuthor").getBytes()); - for (var authorid = 0; authorid < authors.length; authorid++) { - if (authorid > 0) { - var authSep = authorid == (authors.length - 1) ? authors.length == 2 ? " and " : ", and " : ", "; + for (var authorId = 0; authorId < authors.length; authorId++) { + if (authorId > 0) { + var authSep = authorId == (authors.length - 1) ? authors.length == 2 ? " and " : ", and " : ", "; zipfile.write(authSep.getBytes()); } - zipfile.write(String.format("`%s`", authors[authorid]).getBytes()); + zipfile.write(String.format("`%s`", authors[authorId]).getBytes()); } - zipfile.write("\n".getBytes()); + zipfile.write("\n\n".getBytes()); } } + final var projKeywords = projectKeywords.getText(); + if ((projKeywords != null) && !projKeywords.isEmpty()) { + final var keywords = projKeywords.split(","); + if (keywords.length > 0) { + if (!wroteheader1) { + zipfile.write(S.get("projHeader1").concat("\n\n").getBytes()); + wroteheader1 = true; + } else { + zipfile.write(seperator.getBytes()); + } + for (var keywordId = 0; keywordId < keywords.length; keywordId++) { + if (keywordId > 0) zipfile.write(", ".getBytes()); + zipfile.write(String.format("`%s`", keywords[keywordId]).getBytes()); + } + zipfile.write("\n\n".getBytes()); + } + } + final var projDescription = projectDescription.getText(); + if ((projDescription != null) && !projDescription.isEmpty()) { + zipfile.write(S.get("projHeader2").concat("\n\n").getBytes()); + zipfile.write(projDescription.getBytes()); + zipfile.write("\n".getBytes()); + } + final var dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"); + final var now = LocalDateTime.now(); + zipfile.write(S.get("projHeader3").concat("\n\n").getBytes()); + zipfile.write(S.fmt("projGenerateInfo", BuildInfo.displayName, dtf.format(now)).concat("\n\n").getBytes()); } catch (IOException e) { manifestWritten = false; } - manifestWritten = true; } } diff --git a/src/main/resources/resources/logisim/strings/proj/proj.properties b/src/main/resources/resources/logisim/strings/proj/proj.properties index ce0ee383e5..52d346d754 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj.properties @@ -53,14 +53,17 @@ projCloseManifest = Close project bundle manifest projCancel = Cancel projManifestError = Could not write manifest file, aborting! projWriteManifest = Done, write manifest -projName = Project's name: +projName = Project name: projAuthor = Author(s): projKeywords = Keywords: projDescription = Project description: -projHeader = # Logisim-evolution project-bundle #\n\n -projHeader1 = ## Project-bundle information ##\n\n -projIntro = This project-bundle contains the required Logisim-files for the project `%s`.\n -projAuthor = The author(s) of this project is/are: +projHeader = # Logisim-evolution project bundle # +projHeader1 = ## Project information: ## +projHeader2 = ## Project description: ## +projHeader3 = ## Project bundle file information: ## +projGenerateInfo = This project bundle was generated by %s (%s) +projIntro = This project bundle contains the required Logisim-evolution-files for the project `%s`. +projAuthor = Project author(s): # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_de.properties b/src/main/resources/resources/logisim/strings/proj/proj_de.properties index 19db5ea242..72adb67a17 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_de.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_de.properties @@ -61,6 +61,9 @@ UsedLibraryToolnameError = Der Dateiname muss sich von den Schaltkreisnamen, Wer # ==> projIntro = # ==> projAuthor = # ==> projManifestError = +# ==> projHeader2 = +# ==> projHeader3 = +# ==> projGenerateInfo = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_el.properties b/src/main/resources/resources/logisim/strings/proj/proj_el.properties index de9183fabd..7cb6e789b8 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_el.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_el.properties @@ -61,6 +61,9 @@ templateOpenErrorTitle = Σφάλμα στο Άνοιγμα Προτύπου # ==> projIntro = # ==> projAuthor = # ==> projManifestError = +# ==> projHeader2 = +# ==> projHeader3 = +# ==> projGenerateInfo = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_es.properties b/src/main/resources/resources/logisim/strings/proj/proj_es.properties index a9f23ab480..dafd7d18c6 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_es.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_es.properties @@ -61,6 +61,9 @@ UsedLibraryToolnameError = El nombre de archivo no debe coincidir con el nombre # ==> projIntro = # ==> projAuthor = # ==> projManifestError = +# ==> projHeader2 = +# ==> projHeader3 = +# ==> projGenerateInfo = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_fr.properties b/src/main/resources/resources/logisim/strings/proj/proj_fr.properties index 56fa00cb34..69bbdf8a50 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_fr.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_fr.properties @@ -61,6 +61,9 @@ UsedLibraryToolnameError = Le nom de fichier ne doit pas correspondre à un nom # ==> projIntro = # ==> projAuthor = # ==> projManifestError = +# ==> projHeader2 = +# ==> projHeader3 = +# ==> projGenerateInfo = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_it.properties b/src/main/resources/resources/logisim/strings/proj/proj_it.properties index 61bd2020df..ecfcea4670 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_it.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_it.properties @@ -61,6 +61,9 @@ UsedLibraryToolnameError = Il nome del file potrebbe non essere uguale al nome d # ==> projIntro = # ==> projAuthor = # ==> projManifestError = +# ==> projHeader2 = +# ==> projHeader3 = +# ==> projGenerateInfo = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_ja.properties b/src/main/resources/resources/logisim/strings/proj/proj_ja.properties index dbbef05ff8..9e5ddc2112 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_ja.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_ja.properties @@ -61,6 +61,9 @@ UsedLibraryToolnameError = ファイル名は、プロジェクトで使用さ # ==> projIntro = # ==> projAuthor = # ==> projManifestError = +# ==> projHeader2 = +# ==> projHeader3 = +# ==> projGenerateInfo = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_nl.properties b/src/main/resources/resources/logisim/strings/proj/proj_nl.properties index 1ba39e7d95..23577deac5 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_nl.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_nl.properties @@ -61,6 +61,9 @@ UsedLibraryToolnameError = De bestandsnaam mag niet gelijk zijn aan de naam van # ==> projIntro = # ==> projAuthor = # ==> projManifestError = +# ==> projHeader2 = +# ==> projHeader3 = +# ==> projGenerateInfo = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_pl.properties b/src/main/resources/resources/logisim/strings/proj/proj_pl.properties index ec6d932f75..efe668149f 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_pl.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_pl.properties @@ -64,6 +64,9 @@ ProjUnableToCreate = Utworzenie projektu nie powiodło się: %s # ==> projIntro = # ==> projAuthor = # ==> projManifestError = +# ==> projHeader2 = +# ==> projHeader3 = +# ==> projGenerateInfo = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_pt.properties b/src/main/resources/resources/logisim/strings/proj/proj_pt.properties index e3fe9be31c..e19dfb163d 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_pt.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_pt.properties @@ -61,6 +61,9 @@ UsedLibraryToolnameError = O nome do arquivo não pode ser igual a um nome de ci # ==> projIntro = # ==> projAuthor = # ==> projManifestError = +# ==> projHeader2 = +# ==> projHeader3 = +# ==> projGenerateInfo = # # Template.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj_ru.properties b/src/main/resources/resources/logisim/strings/proj/proj_ru.properties index 0de0d2d0d4..ae19375014 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_ru.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_ru.properties @@ -61,6 +61,9 @@ UsedLibraryToolnameError = Имя файла может не совпадать # ==> projIntro = # ==> projAuthor = # ==> projManifestError = +# ==> projHeader2 = +# ==> projHeader3 = +# ==> projGenerateInfo = # # Template.java # From 6f5b1523c3ec1e329de23ae631b61981a1be9614 Mon Sep 17 00:00:00 2001 From: "Dr.Ir.Ing. Theo Kluter" Date: Mon, 11 Oct 2021 18:17:40 +0200 Subject: [PATCH 14/31] Updated changelog --- CHANGES.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index c75bca0e30..e5166ea660 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -22,8 +22,9 @@ * Each circuit stores/restores the last board used for Download (handy for templates to give to students) * Fixed startup crash related to incorrectly localized date format. * Added a setting to select lower- or upper-case VHDL keywords. - * Added project export feature. + * Added project export/import feature. * Cleaned-up the written .circ file. + * Cleaned-up the library tree of loaded projects. * v3.6.1 (2021-09-27) * Fixed bug in LED-array From abda9ac5de299734ac95bc52a95cc8f2f7ca52a5 Mon Sep 17 00:00:00 2001 From: "Dr.Ir.Ing. Theo Kluter" Date: Tue, 12 Oct 2021 07:52:15 +0200 Subject: [PATCH 15/31] Updated changelog --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index 275f343103..cf1e976440 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -3,6 +3,7 @@ # Changes # * @dev (????-??-??) + * New take on project export/import a zip-file is generated which can include a user provided manifest * v3.7.0 (2021-10-12) * Reworked the slider component in the I/O extra library From c38b73cd44e5dbca5dd663b8c7ab072900f98cb0 Mon Sep 17 00:00:00 2001 From: "Dr.Ir.Ing. Theo Kluter" Date: Thu, 14 Oct 2021 07:34:19 +0200 Subject: [PATCH 16/31] Adressed reviewers comments --- .../com/cburch/logisim/gui/menu/MenuFile.java | 2 +- .../logisim/proj/ProjectBundleManifest.java | 2 +- .../logisim/strings/proj/proj.properties | 16 ++++++++-------- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/cburch/logisim/gui/menu/MenuFile.java b/src/main/java/com/cburch/logisim/gui/menu/MenuFile.java index 01e7f7a3b7..0f001e9846 100644 --- a/src/main/java/com/cburch/logisim/gui/menu/MenuFile.java +++ b/src/main/java/com/cburch/logisim/gui/menu/MenuFile.java @@ -66,8 +66,8 @@ public MenuFile(LogisimMenuBar menubar) { add(save); add(saveAs); addSeparator(); - add(exportProj); add(importProj); + add(exportProj); addSeparator(); add(exportImage); add(print); diff --git a/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java b/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java index c7defaca40..f1603ea651 100644 --- a/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java +++ b/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java @@ -204,7 +204,7 @@ private void writeManifestFile() { final var dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"); final var now = LocalDateTime.now(); zipfile.write(S.get("projHeader3").concat("\n\n").getBytes()); - zipfile.write(S.fmt("projGenerateInfo", BuildInfo.displayName, dtf.format(now)).concat("\n\n").getBytes()); + zipfile.write(S.fmt("projGenerateInfo", BuildInfo.displayName, BuildInfo.url, dtf.format(now)).concat("\n\n").getBytes()); } catch (IOException e) { manifestWritten = false; } diff --git a/src/main/resources/resources/logisim/strings/proj/proj.properties b/src/main/resources/resources/logisim/strings/proj/proj.properties index 52d346d754..97ae57660a 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj.properties @@ -40,7 +40,7 @@ ProjUnableToCreate = Failed to create project: %s projExportBundle = Exporting a project bundle projBundleDirectory = Choose directory to extract project bundle: projExistsOverwrite = Project bundle "%s" already exists, overwrite it? -projAddManifest = Do you want to include a manifest-file in your project bundle? +projAddManifest = Do you want to include a readme.md-file in your project bundle? projBundleReadError = Error reading project bundle: %s projBundleNoInfo = Bundle does not contain info-file, aborting import! projBundleMisformatted = Bundle info-file is not correctly formatted, aborting import! @@ -48,20 +48,20 @@ projBundleMainNotFound = Bundle does not contain the main file, aborting import! projContainsFileDir = Selected directory contains either the file "%s" or a sub-directory called "%s".\nPlease select a directory that does not contain these elements! projImportBundle = Importing a project bundle projOpenProject = Open the imported project in Logisim-evolution? -projBundleManifestWindow = Project bundle manifest information -projCloseManifest = Close project bundle manifest +projBundleManifestWindow = Project bundle readme.md information +projCloseManifest = Close project bundle readme.md projCancel = Cancel -projManifestError = Could not write manifest file, aborting! -projWriteManifest = Done, write manifest +projManifestError = Could not write readme.md file, aborting! +projWriteManifest = Done, write readme.md file projName = Project name: -projAuthor = Author(s): -projKeywords = Keywords: +projAuthor = Author(s) (comma seperated): +projKeywords = Keywords (comma seperated): projDescription = Project description: projHeader = # Logisim-evolution project bundle # projHeader1 = ## Project information: ## projHeader2 = ## Project description: ## projHeader3 = ## Project bundle file information: ## -projGenerateInfo = This project bundle was generated by %s (%s) +projGenerateInfo = This project bundle was generated by %s (%s) at %s projIntro = This project bundle contains the required Logisim-evolution-files for the project `%s`. projAuthor = Project author(s): # From 5dfefe68260972fd9aba80480d8564c48fbe0395 Mon Sep 17 00:00:00 2001 From: "Dr.Ir.Ing. Theo Kluter" Date: Fri, 15 Oct 2021 19:28:02 +0200 Subject: [PATCH 17/31] Renamed manifest to readme --- .../com/cburch/logisim/file/XmlWriter.java | 13 -------- .../cburch/logisim/proj/ProjectActions.java | 20 ++++++------ ...Manifest.java => ProjectBundleReadme.java} | 32 +++++++++---------- .../logisim/strings/proj/proj.properties | 10 +++--- .../logisim/strings/proj/proj_de.properties | 10 +++--- .../logisim/strings/proj/proj_el.properties | 10 +++--- .../logisim/strings/proj/proj_es.properties | 10 +++--- .../logisim/strings/proj/proj_fr.properties | 10 +++--- .../logisim/strings/proj/proj_it.properties | 10 +++--- .../logisim/strings/proj/proj_ja.properties | 10 +++--- .../logisim/strings/proj/proj_nl.properties | 10 +++--- .../logisim/strings/proj/proj_pl.properties | 10 +++--- .../logisim/strings/proj/proj_pt.properties | 10 +++--- .../logisim/strings/proj/proj_ru.properties | 10 +++--- 14 files changed, 81 insertions(+), 94 deletions(-) rename src/main/java/com/cburch/logisim/proj/{ProjectBundleManifest.java => ProjectBundleReadme.java} (88%) diff --git a/src/main/java/com/cburch/logisim/file/XmlWriter.java b/src/main/java/com/cburch/logisim/file/XmlWriter.java index e5a3e74466..37d79fba03 100644 --- a/src/main/java/com/cburch/logisim/file/XmlWriter.java +++ b/src/main/java/com/cburch/logisim/file/XmlWriter.java @@ -40,13 +40,8 @@ import java.util.Collections; import java.util.Comparator; import java.util.HashMap; -<<<<<<< HEAD import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; - -import javax.xml.parsers.DocumentBuilderFactory; -======= ->>>>>>> f47fe87d51cc50026300ec6374159a7c2c6aab2d import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys; import javax.xml.transform.Result; @@ -191,17 +186,9 @@ static void write(LogisimFile file, OutputStream out, LibraryLoader loader, File var dstFilePath = destFile.getAbsolutePath(); dstFilePath = dstFilePath.substring(0, dstFilePath.lastIndexOf(File.separator)); context = new XmlWriter(file, doc, loader, dstFilePath); -<<<<<<< HEAD } else if (mainCircFile != null) { context = new XmlWriter(file, doc, loader, null, mainCircFile, recurse); } else context = new XmlWriter(file, doc, loader); -======= - } else if (libraryHome != null) { - context = new XmlWriter(file, doc, loader, null, libraryHome); - } else { - context = new XmlWriter(file, doc, loader); - } ->>>>>>> f47fe87d51cc50026300ec6374159a7c2c6aab2d context.fromLogisimFile(); diff --git a/src/main/java/com/cburch/logisim/proj/ProjectActions.java b/src/main/java/com/cburch/logisim/proj/ProjectActions.java index 6629360c7f..f24beac43f 100644 --- a/src/main/java/com/cburch/logisim/proj/ProjectActions.java +++ b/src/main/java/com/cburch/logisim/proj/ProjectActions.java @@ -429,12 +429,12 @@ public static boolean doImportProject(Project proj) { OptionPane.showMessageDialog(proj.getFrame(), S.fmt("projBundleReadError", S.get("projBundleMainNotFound"))); return false; } - final var manifestFileEntry = zipFile.getEntry(ProjectBundleManifest.MANIFEST_FILE_NAME); - if (manifestFileEntry != null) { - final var manifestInStream = zipFile.getInputStream(manifestFileEntry); - final var dialog = new ProjectBundleManifest(proj, ""); - dialog.showManifest(manifestInStream); - manifestInStream.close(); + final var readmeFileEntry = zipFile.getEntry(ProjectBundleReadme.README_FILE_NAME); + if (readmeFileEntry != null) { + final var readmeInStream = zipFile.getInputStream(readmeFileEntry); + final var dialog = new ProjectBundleReadme(proj, ""); + dialog.showReadme(readmeInStream); + readmeInStream.close(); } chooser.setFileFilter(Loader.LOGISIM_DIRECTORY); chooser.setAcceptAllFileFilterUsed(false); @@ -561,11 +561,11 @@ public static boolean doExportProject(Project proj) { final var projectZipFile = new ZipOutputStream(projectFile); projectZipFile.putNextEntry(new ZipEntry(String.format("%s%s", Loader.LOGISIM_LIBRARY_DIR, File.separator))); ret &= loader.export(proj.getLogisimFile(), projectZipFile); - if (OptionPane.showConfirmDialog(proj.getFrame(), S.get("projAddManifest"), + if (OptionPane.showConfirmDialog(proj.getFrame(), S.get("projAddReadme"), S.get("projExportBundle"), OptionPane.YES_NO_OPTION) == OptionPane.YES_OPTION) { - final var dialog = new ProjectBundleManifest(proj, loader.getMainFile().getName().replace(Loader.LOGISIM_EXTENSION, "")); - if (!dialog.writeManifest(projectZipFile)) { - OptionPane.showMessageDialog(proj.getFrame(), S.get("ProjUnableToCreate", S.get("projManifestError"))); + final var dialog = new ProjectBundleReadme(proj, loader.getMainFile().getName().replace(Loader.LOGISIM_EXTENSION, "")); + if (!dialog.writeReadme(projectZipFile)) { + OptionPane.showMessageDialog(proj.getFrame(), S.get("ProjUnableToCreate", S.get("projReadmeError"))); projectZipFile.close(); projectFile.close(); return false; diff --git a/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java b/src/main/java/com/cburch/logisim/proj/ProjectBundleReadme.java similarity index 88% rename from src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java rename to src/main/java/com/cburch/logisim/proj/ProjectBundleReadme.java index f1603ea651..3dce86fbd2 100644 --- a/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java +++ b/src/main/java/com/cburch/logisim/proj/ProjectBundleReadme.java @@ -40,9 +40,9 @@ import com.vladsch.flexmark.parser.Parser; import com.vladsch.flexmark.util.data.MutableDataSet; -public class ProjectBundleManifest extends JDialog implements ActionListener { +public class ProjectBundleReadme extends JDialog implements ActionListener { - public static final String MANIFEST_FILE_NAME = "README.md"; + public static final String README_FILE_NAME = "README.md"; private JButton closeButton = new JButton(); private JButton writeButton = new JButton(); @@ -52,10 +52,10 @@ public class ProjectBundleManifest extends JDialog implements ActionListener { private JEditorPane projectDescription = new JEditorPane(); private final Frame parrent; private ZipOutputStream zipfile; - private boolean manifestWritten = true; + private boolean readmeWritten = true; - public ProjectBundleManifest(Project project, String projName) { - super(project.getFrame(), S.get("projBundleManifestWindow")); + public ProjectBundleReadme(Project project, String projName) { + super(project.getFrame(), S.get("projBundleReadmeWindow")); setModal(true); setDefaultCloseOperation(DISPOSE_ON_CLOSE); setAlwaysOnTop(true); @@ -66,7 +66,7 @@ public ProjectBundleManifest(Project project, String projName) { parrent = project.getFrame(); } - public void showManifest(InputStream file) throws IOException { + public void showReadme(InputStream file) throws IOException { final var lines = new StringBuilder(); var kar = 0; do { @@ -76,22 +76,22 @@ public void showManifest(InputStream file) throws IOException { final var options = new MutableDataSet(); final var parser = Parser.builder(options).build(); final var renderer = HtmlRenderer.builder(options).build(); - final var manifest = parser.parse(lines.toString()); - final var text = renderer.render(manifest); + final var readme = parser.parse(lines.toString()); + final var text = renderer.render(readme); final var dialog = new JEditorPane("text/html", text); dialog.setEditable(false); dialog.setCaretPosition(0); final var scroller = new JScrollPane(dialog); setLayout(new BorderLayout()); add(scroller, BorderLayout.CENTER); - closeButton.setText(S.get("projCloseManifest")); + closeButton.setText(S.get("projCloseReadme")); add(closeButton, BorderLayout.SOUTH); pack(); setLocationRelativeTo(parrent); setVisible(true); } - public boolean writeManifest(ZipOutputStream zipfile) { + public boolean writeReadme(ZipOutputStream zipfile) { this.zipfile = zipfile; setLayout(new GridBagLayout()); setResizable(false); @@ -125,13 +125,13 @@ public boolean writeManifest(ZipOutputStream zipfile) { gbc.gridwidth = 1; closeButton.setText(S.get("projCancel")); add(closeButton, gbc); - writeButton.setText(S.get("projWriteManifest")); + writeButton.setText(S.get("projWriteReadme")); gbc.gridx = 1; add(writeButton, gbc); pack(); setLocationRelativeTo(parrent); setVisible(true); - return manifestWritten; + return readmeWritten; } @Override @@ -140,18 +140,18 @@ public void actionPerformed(ActionEvent e) { setVisible(false); dispose(); } else if (writeButton.equals(e.getSource())) { - writeManifestFile(); + writeReadmeFile(); setVisible(false); dispose(); } } - private void writeManifestFile() { + private void writeReadmeFile() { if (zipfile == null) return; try { final var seperator = "---\n\n"; var wroteheader1 = false; - zipfile.putNextEntry(new ZipEntry(MANIFEST_FILE_NAME)); + zipfile.putNextEntry(new ZipEntry(README_FILE_NAME)); final var projName = projectName.getText(); zipfile.write(S.get("projHeader").concat("\n\n").getBytes()); if ((projName != null) && !projName.isEmpty()) { @@ -206,7 +206,7 @@ private void writeManifestFile() { zipfile.write(S.get("projHeader3").concat("\n\n").getBytes()); zipfile.write(S.fmt("projGenerateInfo", BuildInfo.displayName, BuildInfo.url, dtf.format(now)).concat("\n\n").getBytes()); } catch (IOException e) { - manifestWritten = false; + readmeWritten = false; } } } diff --git a/src/main/resources/resources/logisim/strings/proj/proj.properties b/src/main/resources/resources/logisim/strings/proj/proj.properties index 97ae57660a..f8eba2ca39 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj.properties @@ -40,7 +40,7 @@ ProjUnableToCreate = Failed to create project: %s projExportBundle = Exporting a project bundle projBundleDirectory = Choose directory to extract project bundle: projExistsOverwrite = Project bundle "%s" already exists, overwrite it? -projAddManifest = Do you want to include a readme.md-file in your project bundle? +projAddReadme = Do you want to include a readme.md-file in your project bundle? projBundleReadError = Error reading project bundle: %s projBundleNoInfo = Bundle does not contain info-file, aborting import! projBundleMisformatted = Bundle info-file is not correctly formatted, aborting import! @@ -48,11 +48,11 @@ projBundleMainNotFound = Bundle does not contain the main file, aborting import! projContainsFileDir = Selected directory contains either the file "%s" or a sub-directory called "%s".\nPlease select a directory that does not contain these elements! projImportBundle = Importing a project bundle projOpenProject = Open the imported project in Logisim-evolution? -projBundleManifestWindow = Project bundle readme.md information -projCloseManifest = Close project bundle readme.md +projBundleReadmeWindow = Project bundle readme.md information +projCloseReadme = Close project bundle readme.md projCancel = Cancel -projManifestError = Could not write readme.md file, aborting! -projWriteManifest = Done, write readme.md file +projReadmeError = Could not write readme.md file, aborting! +projWriteReadme = Done, write readme.md file projName = Project name: projAuthor = Author(s) (comma seperated): projKeywords = Keywords (comma seperated): diff --git a/src/main/resources/resources/logisim/strings/proj/proj_de.properties b/src/main/resources/resources/logisim/strings/proj/proj_de.properties index 72adb67a17..f51b183622 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_de.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_de.properties @@ -39,7 +39,7 @@ UsedLibraryToolnameError = Der Dateiname muss sich von den Schaltkreisnamen, Wer # ==> ProjUnableToCreate = # ==> projExportBundle = # ==> projExistsOverwrite = -# ==> projAddManifest = +# ==> projAddReadme = # ==> projBundleReadError = # ==> projBundleNoInfo = # ==> projBundleMisformatted = @@ -48,10 +48,10 @@ UsedLibraryToolnameError = Der Dateiname muss sich von den Schaltkreisnamen, Wer # ==> projContainsFileDir = # ==> projImportBundle = # ==> projOpenProject = -# ==> projBundleManifestWindow = -# ==> projCloseManifest = +# ==> projBundleReadmeWindow = +# ==> projCloseReadme = # ==> projCancel = -# ==> projWriteManifest = +# ==> projWriteReadme = # ==> projName = # ==> projAuthor = # ==> projKeywords = @@ -60,7 +60,7 @@ UsedLibraryToolnameError = Der Dateiname muss sich von den Schaltkreisnamen, Wer # ==> projHeader1 = # ==> projIntro = # ==> projAuthor = -# ==> projManifestError = +# ==> projReadmeError = # ==> projHeader2 = # ==> projHeader3 = # ==> projGenerateInfo = diff --git a/src/main/resources/resources/logisim/strings/proj/proj_el.properties b/src/main/resources/resources/logisim/strings/proj/proj_el.properties index 7cb6e789b8..8b7bdf6421 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_el.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_el.properties @@ -39,7 +39,7 @@ templateOpenErrorTitle = Σφάλμα στο Άνοιγμα Προτύπου # ==> ProjUnableToCreate = # ==> projExportBundle = # ==> projExistsOverwrite = -# ==> projAddManifest = +# ==> projAddReadme = # ==> projBundleReadError = # ==> projBundleNoInfo = # ==> projBundleMisformatted = @@ -48,10 +48,10 @@ templateOpenErrorTitle = Σφάλμα στο Άνοιγμα Προτύπου # ==> projContainsFileDir = # ==> projImportBundle = # ==> projOpenProject = -# ==> projBundleManifestWindow = -# ==> projCloseManifest = +# ==> projBundleReadmeWindow = +# ==> projCloseReadme = # ==> projCancel = -# ==> projWriteManifest = +# ==> projWriteReadme = # ==> projName = # ==> projAuthor = # ==> projKeywords = @@ -60,7 +60,7 @@ templateOpenErrorTitle = Σφάλμα στο Άνοιγμα Προτύπου # ==> projHeader1 = # ==> projIntro = # ==> projAuthor = -# ==> projManifestError = +# ==> projReadmeError = # ==> projHeader2 = # ==> projHeader3 = # ==> projGenerateInfo = diff --git a/src/main/resources/resources/logisim/strings/proj/proj_es.properties b/src/main/resources/resources/logisim/strings/proj/proj_es.properties index dafd7d18c6..6bffc9f4b3 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_es.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_es.properties @@ -39,7 +39,7 @@ UsedLibraryToolnameError = El nombre de archivo no debe coincidir con el nombre # ==> ProjUnableToCreate = # ==> projExportBundle = # ==> projExistsOverwrite = -# ==> projAddManifest = +# ==> projAddReadme = # ==> projBundleReadError = # ==> projBundleNoInfo = # ==> projBundleMisformatted = @@ -48,10 +48,10 @@ UsedLibraryToolnameError = El nombre de archivo no debe coincidir con el nombre # ==> projContainsFileDir = # ==> projImportBundle = # ==> projOpenProject = -# ==> projBundleManifestWindow = -# ==> projCloseManifest = +# ==> projBundleReadmeWindow = +# ==> projCloseReadme = # ==> projCancel = -# ==> projWriteManifest = +# ==> projWriteReadme = # ==> projName = # ==> projAuthor = # ==> projKeywords = @@ -60,7 +60,7 @@ UsedLibraryToolnameError = El nombre de archivo no debe coincidir con el nombre # ==> projHeader1 = # ==> projIntro = # ==> projAuthor = -# ==> projManifestError = +# ==> projReadmeError = # ==> projHeader2 = # ==> projHeader3 = # ==> projGenerateInfo = diff --git a/src/main/resources/resources/logisim/strings/proj/proj_fr.properties b/src/main/resources/resources/logisim/strings/proj/proj_fr.properties index 69bbdf8a50..3a344b3906 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_fr.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_fr.properties @@ -39,7 +39,7 @@ UsedLibraryToolnameError = Le nom de fichier ne doit pas correspondre à un nom # ==> ProjUnableToCreate = # ==> projExportBundle = # ==> projExistsOverwrite = -# ==> projAddManifest = +# ==> projAddReadme = # ==> projBundleReadError = # ==> projBundleNoInfo = # ==> projBundleMisformatted = @@ -48,10 +48,10 @@ UsedLibraryToolnameError = Le nom de fichier ne doit pas correspondre à un nom # ==> projContainsFileDir = # ==> projImportBundle = # ==> projOpenProject = -# ==> projBundleManifestWindow = -# ==> projCloseManifest = +# ==> projBundleReadmeWindow = +# ==> projCloseReadme = # ==> projCancel = -# ==> projWriteManifest = +# ==> projWriteReadme = # ==> projName = # ==> projAuthor = # ==> projKeywords = @@ -60,7 +60,7 @@ UsedLibraryToolnameError = Le nom de fichier ne doit pas correspondre à un nom # ==> projHeader1 = # ==> projIntro = # ==> projAuthor = -# ==> projManifestError = +# ==> projReadmeError = # ==> projHeader2 = # ==> projHeader3 = # ==> projGenerateInfo = diff --git a/src/main/resources/resources/logisim/strings/proj/proj_it.properties b/src/main/resources/resources/logisim/strings/proj/proj_it.properties index ecfcea4670..9776d402de 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_it.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_it.properties @@ -39,7 +39,7 @@ UsedLibraryToolnameError = Il nome del file potrebbe non essere uguale al nome d # ==> ProjUnableToCreate = # ==> projExportBundle = # ==> projExistsOverwrite = -# ==> projAddManifest = +# ==> projAddReadme = # ==> projBundleReadError = # ==> projBundleNoInfo = # ==> projBundleMisformatted = @@ -48,10 +48,10 @@ UsedLibraryToolnameError = Il nome del file potrebbe non essere uguale al nome d # ==> projContainsFileDir = # ==> projImportBundle = # ==> projOpenProject = -# ==> projBundleManifestWindow = -# ==> projCloseManifest = +# ==> projBundleReadmeWindow = +# ==> projCloseReadme = # ==> projCancel = -# ==> projWriteManifest = +# ==> projWriteReadme = # ==> projName = # ==> projAuthor = # ==> projKeywords = @@ -60,7 +60,7 @@ UsedLibraryToolnameError = Il nome del file potrebbe non essere uguale al nome d # ==> projHeader1 = # ==> projIntro = # ==> projAuthor = -# ==> projManifestError = +# ==> projReadmeError = # ==> projHeader2 = # ==> projHeader3 = # ==> projGenerateInfo = diff --git a/src/main/resources/resources/logisim/strings/proj/proj_ja.properties b/src/main/resources/resources/logisim/strings/proj/proj_ja.properties index 9e5ddc2112..dfea90a9ce 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_ja.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_ja.properties @@ -39,7 +39,7 @@ UsedLibraryToolnameError = ファイル名は、プロジェクトで使用さ # ==> ProjUnableToCreate = # ==> projExportBundle = # ==> projExistsOverwrite = -# ==> projAddManifest = +# ==> projAddReadme = # ==> projBundleReadError = # ==> projBundleNoInfo = # ==> projBundleMisformatted = @@ -48,10 +48,10 @@ UsedLibraryToolnameError = ファイル名は、プロジェクトで使用さ # ==> projContainsFileDir = # ==> projImportBundle = # ==> projOpenProject = -# ==> projBundleManifestWindow = -# ==> projCloseManifest = +# ==> projBundleReadmeWindow = +# ==> projCloseReadme = # ==> projCancel = -# ==> projWriteManifest = +# ==> projWriteReadme = # ==> projName = # ==> projAuthor = # ==> projKeywords = @@ -60,7 +60,7 @@ UsedLibraryToolnameError = ファイル名は、プロジェクトで使用さ # ==> projHeader1 = # ==> projIntro = # ==> projAuthor = -# ==> projManifestError = +# ==> projReadmeError = # ==> projHeader2 = # ==> projHeader3 = # ==> projGenerateInfo = diff --git a/src/main/resources/resources/logisim/strings/proj/proj_nl.properties b/src/main/resources/resources/logisim/strings/proj/proj_nl.properties index 23577deac5..94bb09bcd5 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_nl.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_nl.properties @@ -39,7 +39,7 @@ UsedLibraryToolnameError = De bestandsnaam mag niet gelijk zijn aan de naam van # ==> ProjUnableToCreate = # ==> projExportBundle = # ==> projExistsOverwrite = -# ==> projAddManifest = +# ==> projAddReadme = # ==> projBundleReadError = # ==> projBundleNoInfo = # ==> projBundleMisformatted = @@ -48,10 +48,10 @@ UsedLibraryToolnameError = De bestandsnaam mag niet gelijk zijn aan de naam van # ==> projContainsFileDir = # ==> projImportBundle = # ==> projOpenProject = -# ==> projBundleManifestWindow = -# ==> projCloseManifest = +# ==> projBundleReadmeWindow = +# ==> projCloseReadme = # ==> projCancel = -# ==> projWriteManifest = +# ==> projWriteReadme = # ==> projName = # ==> projAuthor = # ==> projKeywords = @@ -60,7 +60,7 @@ UsedLibraryToolnameError = De bestandsnaam mag niet gelijk zijn aan de naam van # ==> projHeader1 = # ==> projIntro = # ==> projAuthor = -# ==> projManifestError = +# ==> projReadmeError = # ==> projHeader2 = # ==> projHeader3 = # ==> projGenerateInfo = diff --git a/src/main/resources/resources/logisim/strings/proj/proj_pl.properties b/src/main/resources/resources/logisim/strings/proj/proj_pl.properties index efe668149f..eb88cdc944 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_pl.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_pl.properties @@ -42,7 +42,7 @@ UsedLibraryToolnameError = Nazwa pliku nie może być taka sama jak nazwa obwodu ProjUnableToCreate = Utworzenie projektu nie powiodło się: %s # ==> projExportBundle = # ==> projExistsOverwrite = -# ==> projAddManifest = +# ==> projAddReadme = # ==> projBundleReadError = # ==> projBundleNoInfo = # ==> projBundleMisformatted = @@ -51,10 +51,10 @@ ProjUnableToCreate = Utworzenie projektu nie powiodło się: %s # ==> projContainsFileDir = # ==> projImportBundle = # ==> projOpenProject = -# ==> projBundleManifestWindow = -# ==> projCloseManifest = +# ==> projBundleReadmeWindow = +# ==> projCloseReadme = # ==> projCancel = -# ==> projWriteManifest = +# ==> projWriteReadme = # ==> projName = # ==> projAuthor = # ==> projKeywords = @@ -63,7 +63,7 @@ ProjUnableToCreate = Utworzenie projektu nie powiodło się: %s # ==> projHeader1 = # ==> projIntro = # ==> projAuthor = -# ==> projManifestError = +# ==> projReadmeError = # ==> projHeader2 = # ==> projHeader3 = # ==> projGenerateInfo = diff --git a/src/main/resources/resources/logisim/strings/proj/proj_pt.properties b/src/main/resources/resources/logisim/strings/proj/proj_pt.properties index e19dfb163d..38174cf746 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_pt.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_pt.properties @@ -39,7 +39,7 @@ UsedLibraryToolnameError = O nome do arquivo não pode ser igual a um nome de ci # ==> ProjUnableToCreate = # ==> projExportBundle = # ==> projExistsOverwrite = -# ==> projAddManifest = +# ==> projAddReadme = # ==> projBundleReadError = # ==> projBundleNoInfo = # ==> projBundleMisformatted = @@ -48,10 +48,10 @@ UsedLibraryToolnameError = O nome do arquivo não pode ser igual a um nome de ci # ==> projContainsFileDir = # ==> projImportBundle = # ==> projOpenProject = -# ==> projBundleManifestWindow = -# ==> projCloseManifest = +# ==> projBundleReadmeWindow = +# ==> projCloseReadme = # ==> projCancel = -# ==> projWriteManifest = +# ==> projWriteReadme = # ==> projName = # ==> projAuthor = # ==> projKeywords = @@ -60,7 +60,7 @@ UsedLibraryToolnameError = O nome do arquivo não pode ser igual a um nome de ci # ==> projHeader1 = # ==> projIntro = # ==> projAuthor = -# ==> projManifestError = +# ==> projReadmeError = # ==> projHeader2 = # ==> projHeader3 = # ==> projGenerateInfo = diff --git a/src/main/resources/resources/logisim/strings/proj/proj_ru.properties b/src/main/resources/resources/logisim/strings/proj/proj_ru.properties index ae19375014..4cf0283424 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_ru.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_ru.properties @@ -39,7 +39,7 @@ UsedLibraryToolnameError = Имя файла может не совпадать # ==> ProjUnableToCreate = # ==> projExportBundle = # ==> projExistsOverwrite = -# ==> projAddManifest = +# ==> projAddReadme = # ==> projBundleReadError = # ==> projBundleNoInfo = # ==> projBundleMisformatted = @@ -48,10 +48,10 @@ UsedLibraryToolnameError = Имя файла может не совпадать # ==> projContainsFileDir = # ==> projImportBundle = # ==> projOpenProject = -# ==> projBundleManifestWindow = -# ==> projCloseManifest = +# ==> projBundleReadmeWindow = +# ==> projCloseReadme = # ==> projCancel = -# ==> projWriteManifest = +# ==> projWriteReadme = # ==> projName = # ==> projAuthor = # ==> projKeywords = @@ -60,7 +60,7 @@ UsedLibraryToolnameError = Имя файла может не совпадать # ==> projHeader1 = # ==> projIntro = # ==> projAuthor = -# ==> projManifestError = +# ==> projReadmeError = # ==> projHeader2 = # ==> projHeader3 = # ==> projGenerateInfo = From b20b290b893dbc400e0b59ee3477a8af01533812 Mon Sep 17 00:00:00 2001 From: "Dr.Ir.Ing. Theo Kluter" Date: Fri, 15 Oct 2021 22:03:47 +0200 Subject: [PATCH 18/31] Added always written manifest file --- .../cburch/logisim/proj/ProjectActions.java | 6 +- .../logisim/proj/ProjectBundleInfoFile.java | 106 ----------- .../logisim/proj/ProjectBundleManifest.java | 173 ++++++++++++++++++ 3 files changed, 176 insertions(+), 109 deletions(-) delete mode 100644 src/main/java/com/cburch/logisim/proj/ProjectBundleInfoFile.java create mode 100644 src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java diff --git a/src/main/java/com/cburch/logisim/proj/ProjectActions.java b/src/main/java/com/cburch/logisim/proj/ProjectActions.java index f24beac43f..40d6c3b615 100644 --- a/src/main/java/com/cburch/logisim/proj/ProjectActions.java +++ b/src/main/java/com/cburch/logisim/proj/ProjectActions.java @@ -422,7 +422,7 @@ public static boolean doImportProject(Project proj) { if (isCorrectFile) { try { final var zipFile = new ZipFile(zipFileName); - final var bundleInfo = ProjectBundleInfoFile.getBundleInfoFileContents(zipFile, proj.getFrame()); + final var bundleInfo = ProjectBundleManifest.getManifestInfo(zipFile, proj.getFrame()); if (bundleInfo == null) return false; final var mainFileEntry = zipFile.getEntry(bundleInfo.getMainLogisimFilename()); if (mainFileEntry == null) { @@ -571,8 +571,8 @@ public static boolean doExportProject(Project proj) { return false; } } - ProjectBundleInfoFile.writeBundleInfoFile(projectZipFile, - ProjectBundleInfoFile.getInfoContainer(BuildInfo.displayName, loader.getMainFile().getName())); + final var info = ProjectBundleManifest.getInfoContainer(BuildInfo.displayName, loader.getMainFile().getName()); + ProjectBundleManifest.writeManifest(projectZipFile, info); projectZipFile.close(); projectFile.close(); } diff --git a/src/main/java/com/cburch/logisim/proj/ProjectBundleInfoFile.java b/src/main/java/com/cburch/logisim/proj/ProjectBundleInfoFile.java deleted file mode 100644 index 1e950936df..0000000000 --- a/src/main/java/com/cburch/logisim/proj/ProjectBundleInfoFile.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Logisim-evolution - digital logic design tool and simulator - * Copyright by the Logisim-evolution developers - * - * https://github.com/logisim-evolution/ - * - * This is free software released under GNU GPLv3 license - */ - -package com.cburch.logisim.proj; - -import static com.cburch.logisim.proj.Strings.S; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; -import java.util.zip.ZipOutputStream; - -import com.cburch.logisim.file.Loader; -import com.cburch.logisim.gui.generic.OptionPane; -import com.cburch.logisim.gui.main.Frame; - -public class ProjectBundleInfoFile { - - public static final String VERSION_PREAMBLE = "Created with: "; - public static final String MAIN_FILE_PREAMBLE = "Main file: "; - - public static class infofileInformation { - private final String logisimVersion; - private final String mainCircuitFile; - - public infofileInformation(String logisimVersion, String mainCircuitFile) { - this.logisimVersion = logisimVersion; - this.mainCircuitFile = mainCircuitFile; - } - - public String getBundleLogisimVersion() { - return logisimVersion; - } - - public String getMainLogisimFilename() { - return mainCircuitFile; - } - } - - public static infofileInformation getInfoContainer(String logisimVersion, String mainCircuitFile) { - return new infofileInformation(logisimVersion, mainCircuitFile); - } - - public static void writeBundleInfoFile(ZipOutputStream zipFile, infofileInformation info) throws IOException { - zipFile.putNextEntry(new ZipEntry(Loader.LOGISIM_PROJECT_BUNDLE_INFO_FILE)); - zipFile.write(String.format("%s%s\n", VERSION_PREAMBLE, info.logisimVersion).getBytes()); - zipFile.write(String.format("%s%s\n", MAIN_FILE_PREAMBLE, info.mainCircuitFile).getBytes()); - - } - - public static infofileInformation getBundleInfoFileContents(ZipFile zipFile, Frame frame) throws IOException { - final var projInfoEntry = zipFile.getEntry(Loader.LOGISIM_PROJECT_BUNDLE_INFO_FILE); - if (projInfoEntry == null) { - OptionPane.showMessageDialog(frame, S.fmt("projBundleReadError", S.get("projBundleNoInfo"))); - return null; - } - final var projInfoStream = zipFile.getInputStream(projInfoEntry); - final var projInputLines = new ArrayList(); - final var oneLine = new StringBuilder(); - int kar; - do { - kar = projInfoStream.read(); - if (kar == '\n') { - projInputLines.add(oneLine.toString()); - oneLine.setLength(0); - } else if (kar >= 0) { - oneLine.append((char) kar); - } - } while (kar >= 0); - if (oneLine.length() > 0) projInputLines.add(oneLine.toString()); - projInfoStream.close(); - String infoCreatedVersion = null; - String infoMainCircuit = null; - final var infoEntryIterator = projInputLines.iterator(); - while (infoEntryIterator.hasNext()) { - final var infoLine = infoEntryIterator.next(); - if (infoLine.startsWith(VERSION_PREAMBLE)) { - if (infoCreatedVersion != null) { - OptionPane.showMessageDialog(frame, S.fmt("projBundleReadError", S.get("projBundleMisformatted"))); - return null; - } - infoCreatedVersion = infoLine.replace(VERSION_PREAMBLE, ""); - infoEntryIterator.remove(); - } else if (infoLine.startsWith(MAIN_FILE_PREAMBLE)) { - if (infoMainCircuit != null) { - OptionPane.showMessageDialog(frame, S.fmt("projBundleReadError", S.get("projBundleMisformatted"))); - return null; - } - infoMainCircuit = infoLine.replace(MAIN_FILE_PREAMBLE, ""); - infoEntryIterator.remove(); - } - } - if ((projInputLines.size() != 0) || (infoCreatedVersion == null) || (infoMainCircuit == null)) { - OptionPane.showMessageDialog(frame, S.fmt("projBundleReadError", S.get("projBundleMisformatted"))); - return null; - } - return new infofileInformation(infoCreatedVersion, infoMainCircuit); - } -} diff --git a/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java b/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java new file mode 100644 index 0000000000..435423813d --- /dev/null +++ b/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java @@ -0,0 +1,173 @@ +/* + * Logisim-evolution - digital logic design tool and simulator + * Copyright by the Logisim-evolution developers + * + * https://github.com/logisim-evolution/ + * + * This is free software released under GNU GPLv3 license + */ + +package com.cburch.logisim.proj; + +import static com.cburch.logisim.proj.Strings.S; + +import java.io.IOException; +import java.io.StringWriter; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; +import java.util.zip.ZipOutputStream; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.TransformerConfigurationException; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + +import org.xml.sax.SAXException; + +import com.cburch.logisim.gui.generic.OptionPane; +import com.cburch.logisim.gui.main.Frame; +import com.cburch.logisim.util.XmlUtil; + +public class ProjectBundleManifest { + + private static final String VERSION_STRING = "Version"; + private static final String VERSION = "0.9"; + private static final String PROJECTINFO = "ProjectInformation"; + public static final String VERSION_PREAMBLE = "Created_with"; + public static final String MAIN_FILE_PREAMBLE = "Main_file"; + + public static class infofileInformation { + private final String logisimVersion; + private final String mainCircuitFile; + + public infofileInformation(String logisimVersion, String mainCircuitFile) { + this.logisimVersion = logisimVersion; + this.mainCircuitFile = mainCircuitFile; + } + + public String getBundleLogisimVersion() { + return logisimVersion; + } + + public String getMainLogisimFilename() { + return mainCircuitFile; + } + } + + public static infofileInformation getInfoContainer(String logisimVersion, String mainCircuitFile) { + return new infofileInformation(logisimVersion, mainCircuitFile); + } + + public static void writeManifest(ZipOutputStream zipfile, infofileInformation info) throws IOException { + if (zipfile == null) return; + try { + // Create instance of DocumentBuilderFactory + final var factory = XmlUtil.getHardenedBuilderFactory(); + // Get the DocumentBuilder + final var parser = factory.newDocumentBuilder(); + // Create blank DOM Document + final var boardInfo = parser.newDocument(); + final var manifest = boardInfo.createElement("element"); + boardInfo.appendChild(manifest); + manifest.setAttribute("name", "Manifest"); + manifest.setAttribute("type", "ds:ManifestType"); + final var version = boardInfo.createElement(VERSION_STRING); + version.setAttribute("name", VERSION); + manifest.appendChild(version); + final var progInfo = boardInfo.createElement(PROJECTINFO); + manifest.appendChild(progInfo); + progInfo.setAttribute(VERSION_PREAMBLE, info.logisimVersion.replace(" ", "_")); + progInfo.setAttribute(MAIN_FILE_PREAMBLE, info.mainCircuitFile); + final var tranFactory = TransformerFactory.newInstance(); + final var aTransformer = tranFactory.newTransformer(); + aTransformer.setOutputProperty(OutputKeys.INDENT, "yes"); + final var src = new DOMSource(boardInfo); + final var dest = new StreamResult(new StringWriter()); + aTransformer.transform(src, dest); + zipfile.putNextEntry(new ZipEntry("manifest.xml")); + zipfile.write(dest.getWriter().toString().getBytes()); + } catch (ParserConfigurationException e) { + //FIXME: handle exception + System.err.println(e.getMessage()); + } catch (TransformerConfigurationException e) { + //FIXME: handle exception + System.err.println(e.getMessage()); + } catch (TransformerException e) { + //FIXME: handle exception + System.err.println(e.getMessage()); + } + } + + public static infofileInformation getManifestInfo(ZipFile zipFile, Frame frame) throws IOException { + try { + // Create instance of DocumentBuilderFactory + final var factory = XmlUtil.getHardenedBuilderFactory(); + // Get the DocumentBuilder + final var parser = factory.newDocumentBuilder(); + // Create blank DOM Document + final var projInfoEntry = zipFile.getEntry("manifest.xml"); + if (projInfoEntry == null) { + OptionPane.showMessageDialog(frame, S.fmt("projBundleReadError", S.get("projBundleNoInfo"))); + return null; + } + final var projInfoStream = zipFile.getInputStream(projInfoEntry); + final var docInfo = parser.parse(projInfoStream); + final var manifestNodes = docInfo.getElementsByTagName("element"); + if (manifestNodes.getLength() != 1) { + OptionPane.showMessageDialog(frame, S.fmt("projBundleReadError", S.get("projBundleMisformatted"))); + return null; + } + final var manifestNode = manifestNodes.item(0); + final var manifestInfo = manifestNode.getChildNodes(); + // first we find the version + var versionFound = false; + for (var nodeId = 0; nodeId < manifestInfo.getLength(); nodeId++) { + final var node = manifestInfo.item(nodeId); + if (VERSION_STRING.equals(node.getNodeName())) { + versionFound = true; + final var nodeAttr = node.getAttributes(); + if (nodeAttr.getLength() != 1) { + OptionPane.showMessageDialog(frame, S.fmt("projBundleReadError", S.get("projBundleMisformatted"))); + return null; + } + final var attr = nodeAttr.item(0); + if (!"name".equals(attr.getNodeName()) || !VERSION.equals(attr.getNodeValue())) { + OptionPane.showMessageDialog(frame, S.fmt("projBundleReadError", S.get("projBundleMisformatted"))); + return null; + } + } + } + if (!versionFound) { + OptionPane.showMessageDialog(frame, S.fmt("projBundleReadError", S.get("projBundleMisformatted"))); + return null; + } + // now we find the info + var main = ""; + var creator = ""; + for (var nodeId = 0; nodeId < manifestInfo.getLength(); nodeId++) { + final var node = manifestInfo.item(nodeId); + if (PROJECTINFO.equals(node.getNodeName())) { + final var attrs = node.getAttributes(); + for (var attrId = 0; attrId < attrs.getLength(); attrId++) { + final var attr = attrs.item(attrId); + if (VERSION_PREAMBLE.equals(attr.getNodeName())) creator = attr.getNodeValue(); + else if (MAIN_FILE_PREAMBLE.equals(attr.getNodeName())) main = attr.getNodeValue(); + } + } + if (!main.isEmpty() && !creator.isEmpty()) { + return new infofileInformation(creator, main); + } + } + } catch (ParserConfigurationException e) { + //FIXME: handle exception + System.err.println(e.getMessage()); + } catch (SAXException e) { + //FIXME: handle exception + System.err.println(e.getMessage()); + } + return null; + } +} From 7231e7745d51a87a01ff8c1cabbefc57a813b9ec Mon Sep 17 00:00:00 2001 From: "Dr.Ir.Ing. Theo Kluter" Date: Fri, 15 Oct 2021 23:28:41 +0200 Subject: [PATCH 19/31] Adressed reviewers comments --- .../logisim/proj/ProjectBundleManifest.java | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java b/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java index 435423813d..37bdfc4b81 100644 --- a/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java +++ b/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java @@ -61,14 +61,18 @@ public static infofileInformation getInfoContainer(String logisimVersion, String return new infofileInformation(logisimVersion, mainCircuitFile); } + /** + * This function writes the manifest file to a given zip-file + * + * @param zipfile Zipfile to write to + * @param info Logisim version with which this manifest was created and main-circuit-file + * @throws IOException + */ public static void writeManifest(ZipOutputStream zipfile, infofileInformation info) throws IOException { if (zipfile == null) return; try { - // Create instance of DocumentBuilderFactory final var factory = XmlUtil.getHardenedBuilderFactory(); - // Get the DocumentBuilder final var parser = factory.newDocumentBuilder(); - // Create blank DOM Document final var boardInfo = parser.newDocument(); final var manifest = boardInfo.createElement("element"); boardInfo.appendChild(manifest); @@ -90,24 +94,26 @@ public static void writeManifest(ZipOutputStream zipfile, infofileInformation in zipfile.putNextEntry(new ZipEntry("manifest.xml")); zipfile.write(dest.getWriter().toString().getBytes()); } catch (ParserConfigurationException e) { - //FIXME: handle exception System.err.println(e.getMessage()); } catch (TransformerConfigurationException e) { - //FIXME: handle exception System.err.println(e.getMessage()); } catch (TransformerException e) { - //FIXME: handle exception System.err.println(e.getMessage()); } } + /** + * This function reads the contents of the manifest-file from a given zip-file + * + * @param zipFile zipfile to read from + * @param frame parrent frame of the caller + * @return Information contained in the manifest-file + * @throws IOException + */ public static infofileInformation getManifestInfo(ZipFile zipFile, Frame frame) throws IOException { try { - // Create instance of DocumentBuilderFactory final var factory = XmlUtil.getHardenedBuilderFactory(); - // Get the DocumentBuilder final var parser = factory.newDocumentBuilder(); - // Create blank DOM Document final var projInfoEntry = zipFile.getEntry("manifest.xml"); if (projInfoEntry == null) { OptionPane.showMessageDialog(frame, S.fmt("projBundleReadError", S.get("projBundleNoInfo"))); @@ -122,7 +128,7 @@ public static infofileInformation getManifestInfo(ZipFile zipFile, Frame frame) } final var manifestNode = manifestNodes.item(0); final var manifestInfo = manifestNode.getChildNodes(); - // first we find the version + // first we find the version of the manifest to check if we can process var versionFound = false; for (var nodeId = 0; nodeId < manifestInfo.getLength(); nodeId++) { final var node = manifestInfo.item(nodeId); From 36218936cdc21ab170406fe9b4565115a72945cb Mon Sep 17 00:00:00 2001 From: "Dr.Ir.Ing. Theo Kluter" Date: Fri, 15 Oct 2021 23:36:25 +0200 Subject: [PATCH 20/31] Fixed missed redundant remark lines --- .../java/com/cburch/logisim/proj/ProjectBundleManifest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java b/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java index 37bdfc4b81..cbab09ba85 100644 --- a/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java +++ b/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java @@ -168,10 +168,8 @@ public static infofileInformation getManifestInfo(ZipFile zipFile, Frame frame) } } } catch (ParserConfigurationException e) { - //FIXME: handle exception System.err.println(e.getMessage()); } catch (SAXException e) { - //FIXME: handle exception System.err.println(e.getMessage()); } return null; From 651752ec0f2332fc92f45386cb8f7e0ba928b534 Mon Sep 17 00:00:00 2001 From: "Dr.Ir.Ing. Theo Kluter" Date: Sun, 17 Oct 2021 08:13:11 +0200 Subject: [PATCH 21/31] Removed save of project --- .../cburch/logisim/proj/ProjectActions.java | 107 +++++++++--------- 1 file changed, 53 insertions(+), 54 deletions(-) diff --git a/src/main/java/com/cburch/logisim/proj/ProjectActions.java b/src/main/java/com/cburch/logisim/proj/ProjectActions.java index 40d6c3b615..dd3b2074df 100644 --- a/src/main/java/com/cburch/logisim/proj/ProjectActions.java +++ b/src/main/java/com/cburch/logisim/proj/ProjectActions.java @@ -526,66 +526,65 @@ public static boolean doImportProject(Project proj) { * @return true if success, false otherwise */ public static boolean doExportProject(Project proj) { - var ret = proj.isFileDirty() ? doSave(proj) : true; - if (ret) { - final var loader = proj.getLogisimFile().getLoader(); - final var oldTool = proj.getTool(); - proj.setTool(null); - var zipFile = loader.getMainFile().getName().replace(Loader.LOGISIM_EXTENSION, Loader.LOGISIM_PROJECT_BUNDLE_EXTENSION); - final var chooser = loader.createChooser(); - chooser.setFileFilter(Loader.LOGISIM_BUNDLE_FILTER); - chooser.setAcceptAllFileFilterUsed(false); - chooser.setSelectedFile(new File(zipFile)); - chooser.setDialogTitle(S.get("projExportBundle")); - var isCorrectFile = true; - do { - ret &= chooser.showSaveDialog(proj.getFrame()) == JFileChooser.APPROVE_OPTION; - if (!ret) { - proj.setTool(oldTool); - return false; + var ret = true; + final var loader = proj.getLogisimFile().getLoader(); + final var oldTool = proj.getTool(); + proj.setTool(null); + var zipFile = loader.getMainFile().getName().replace(Loader.LOGISIM_EXTENSION, Loader.LOGISIM_PROJECT_BUNDLE_EXTENSION); + final var chooser = loader.createChooser(); + chooser.setFileFilter(Loader.LOGISIM_BUNDLE_FILTER); + chooser.setAcceptAllFileFilterUsed(false); + chooser.setSelectedFile(new File(zipFile)); + chooser.setDialogTitle(S.get("projExportBundle")); + var isCorrectFile = true; + do { + ret &= chooser.showSaveDialog(proj.getFrame()) == JFileChooser.APPROVE_OPTION; + if (!ret) { + proj.setTool(oldTool); + return false; + } + try { + zipFile = chooser.getSelectedFile().getAbsolutePath(); + if (!zipFile.endsWith(Loader.LOGISIM_PROJECT_BUNDLE_EXTENSION)) { + zipFile = zipFile.concat(Loader.LOGISIM_PROJECT_BUNDLE_EXTENSION); } - try { - zipFile = chooser.getSelectedFile().getAbsolutePath(); - if (!zipFile.endsWith(Loader.LOGISIM_PROJECT_BUNDLE_EXTENSION)) { - zipFile = zipFile.concat(Loader.LOGISIM_PROJECT_BUNDLE_EXTENSION); - } - final var path = Paths.get(zipFile); - if (Files.exists(path)) { - isCorrectFile = OptionPane.showConfirmDialog(proj.getFrame(), S.fmt("projExistsOverwrite", - new File(zipFile).getName()), S.get("projExportBundle"), OptionPane.YES_NO_OPTION) == OptionPane.YES_OPTION; - } else { - isCorrectFile = true; - } - if (isCorrectFile) { - final var projectFile = new FileOutputStream(zipFile); - final var projectZipFile = new ZipOutputStream(projectFile); - projectZipFile.putNextEntry(new ZipEntry(String.format("%s%s", Loader.LOGISIM_LIBRARY_DIR, File.separator))); - ret &= loader.export(proj.getLogisimFile(), projectZipFile); - if (OptionPane.showConfirmDialog(proj.getFrame(), S.get("projAddReadme"), - S.get("projExportBundle"), OptionPane.YES_NO_OPTION) == OptionPane.YES_OPTION) { - final var dialog = new ProjectBundleReadme(proj, loader.getMainFile().getName().replace(Loader.LOGISIM_EXTENSION, "")); - if (!dialog.writeReadme(projectZipFile)) { - OptionPane.showMessageDialog(proj.getFrame(), S.get("ProjUnableToCreate", S.get("projReadmeError"))); - projectZipFile.close(); - projectFile.close(); - return false; - } + final var path = Paths.get(zipFile); + if (Files.exists(path)) { + isCorrectFile = OptionPane.showConfirmDialog(proj.getFrame(), S.fmt("projExistsOverwrite", + new File(zipFile).getName()), S.get("projExportBundle"), OptionPane.YES_NO_OPTION) == OptionPane.YES_OPTION; + } else { + isCorrectFile = true; + } + if (isCorrectFile) { + final var projectFile = new FileOutputStream(zipFile); + final var projectZipFile = new ZipOutputStream(projectFile); + projectZipFile.putNextEntry(new ZipEntry(String.format("%s%s", Loader.LOGISIM_LIBRARY_DIR, File.separator))); + ret &= loader.export(proj.getLogisimFile(), projectZipFile); + if (OptionPane.showConfirmDialog(proj.getFrame(), S.get("projAddReadme"), + S.get("projExportBundle"), OptionPane.YES_NO_OPTION) == OptionPane.YES_OPTION) { + final var dialog = new ProjectBundleReadme(proj, loader.getMainFile().getName().replace(Loader.LOGISIM_EXTENSION, "")); + if (!dialog.writeReadme(projectZipFile)) { + OptionPane.showMessageDialog(proj.getFrame(), S.get("ProjUnableToCreate", S.get("projReadmeError"))); + projectZipFile.close(); + projectFile.close(); + return false; } - final var info = ProjectBundleManifest.getInfoContainer(BuildInfo.displayName, loader.getMainFile().getName()); - ProjectBundleManifest.writeManifest(projectZipFile, info); - projectZipFile.close(); - projectFile.close(); } - } catch (IOException e) { - OptionPane.showMessageDialog(proj.getFrame(), S.get("ProjUnableToCreate", e.getMessage())); - proj.setTool(oldTool); - return false; + final var info = ProjectBundleManifest.getInfoContainer(BuildInfo.displayName, loader.getMainFile().getName()); + ProjectBundleManifest.writeManifest(projectZipFile, info); + projectZipFile.close(); + projectFile.close(); } - } while (!isCorrectFile); - proj.setTool(oldTool); - } + } catch (IOException e) { + OptionPane.showMessageDialog(proj.getFrame(), S.get("ProjUnableToCreate", e.getMessage())); + proj.setTool(oldTool); + return false; + } + } while (!isCorrectFile); + proj.setTool(oldTool); return ret; } + /** * Saves a Logisim project in a .circ file. From 2ef20bcf4e1c522357661542aac5d26236ab7e78 Mon Sep 17 00:00:00 2001 From: "Dr.Ir.Ing. Theo Kluter" Date: Sun, 17 Oct 2021 10:16:07 +0200 Subject: [PATCH 22/31] As result of not forcing a save the the main-file could be null (no save yet) fixed. --- src/main/java/com/cburch/logisim/proj/ProjectActions.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/cburch/logisim/proj/ProjectActions.java b/src/main/java/com/cburch/logisim/proj/ProjectActions.java index dd3b2074df..7d5dbe29bf 100644 --- a/src/main/java/com/cburch/logisim/proj/ProjectActions.java +++ b/src/main/java/com/cburch/logisim/proj/ProjectActions.java @@ -530,7 +530,8 @@ public static boolean doExportProject(Project proj) { final var loader = proj.getLogisimFile().getLoader(); final var oldTool = proj.getTool(); proj.setTool(null); - var zipFile = loader.getMainFile().getName().replace(Loader.LOGISIM_EXTENSION, Loader.LOGISIM_PROJECT_BUNDLE_EXTENSION); + final var mainFileName = loader.getMainFile() == null ? "Untitled.circ" : loader.getMainFile().getName(); + var zipFile = mainFileName.replace(Loader.LOGISIM_EXTENSION, Loader.LOGISIM_PROJECT_BUNDLE_EXTENSION); final var chooser = loader.createChooser(); chooser.setFileFilter(Loader.LOGISIM_BUNDLE_FILTER); chooser.setAcceptAllFileFilterUsed(false); @@ -562,7 +563,7 @@ public static boolean doExportProject(Project proj) { ret &= loader.export(proj.getLogisimFile(), projectZipFile); if (OptionPane.showConfirmDialog(proj.getFrame(), S.get("projAddReadme"), S.get("projExportBundle"), OptionPane.YES_NO_OPTION) == OptionPane.YES_OPTION) { - final var dialog = new ProjectBundleReadme(proj, loader.getMainFile().getName().replace(Loader.LOGISIM_EXTENSION, "")); + final var dialog = new ProjectBundleReadme(proj, mainFileName.replace(Loader.LOGISIM_EXTENSION, "")); if (!dialog.writeReadme(projectZipFile)) { OptionPane.showMessageDialog(proj.getFrame(), S.get("ProjUnableToCreate", S.get("projReadmeError"))); projectZipFile.close(); @@ -570,7 +571,7 @@ public static boolean doExportProject(Project proj) { return false; } } - final var info = ProjectBundleManifest.getInfoContainer(BuildInfo.displayName, loader.getMainFile().getName()); + final var info = ProjectBundleManifest.getInfoContainer(BuildInfo.displayName, mainFileName); ProjectBundleManifest.writeManifest(projectZipFile, info); projectZipFile.close(); projectFile.close(); From 0df7e820540d0a4a06ad496b93a23ca04392e393 Mon Sep 17 00:00:00 2001 From: "Dr.Ir.Ing. Theo Kluter" Date: Sun, 17 Oct 2021 10:20:46 +0200 Subject: [PATCH 23/31] Fixed last NPE --- src/main/java/com/cburch/logisim/file/Loader.java | 4 ++-- src/main/java/com/cburch/logisim/proj/ProjectActions.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/cburch/logisim/file/Loader.java b/src/main/java/com/cburch/logisim/file/Loader.java index 2d8aaaa20a..6044f85480 100644 --- a/src/main/java/com/cburch/logisim/file/Loader.java +++ b/src/main/java/com/cburch/logisim/file/Loader.java @@ -342,9 +342,9 @@ public void reload(LoadedLibrary lib) { LibraryManager.instance.reload(this, lib); } - public boolean export(LogisimFile file, ZipOutputStream zipFile) { + public boolean export(LogisimFile file, ZipOutputStream zipFile, String mainFileName) { this.zipFile = zipFile; - file.write(zipFile, this, getMainFile().getName()); + file.write(zipFile, this, mainFileName); this.zipFile = null; return true; } diff --git a/src/main/java/com/cburch/logisim/proj/ProjectActions.java b/src/main/java/com/cburch/logisim/proj/ProjectActions.java index 7d5dbe29bf..c6453824e5 100644 --- a/src/main/java/com/cburch/logisim/proj/ProjectActions.java +++ b/src/main/java/com/cburch/logisim/proj/ProjectActions.java @@ -560,7 +560,7 @@ public static boolean doExportProject(Project proj) { final var projectFile = new FileOutputStream(zipFile); final var projectZipFile = new ZipOutputStream(projectFile); projectZipFile.putNextEntry(new ZipEntry(String.format("%s%s", Loader.LOGISIM_LIBRARY_DIR, File.separator))); - ret &= loader.export(proj.getLogisimFile(), projectZipFile); + ret &= loader.export(proj.getLogisimFile(), projectZipFile, mainFileName); if (OptionPane.showConfirmDialog(proj.getFrame(), S.get("projAddReadme"), S.get("projExportBundle"), OptionPane.YES_NO_OPTION) == OptionPane.YES_OPTION) { final var dialog = new ProjectBundleReadme(proj, mainFileName.replace(Loader.LOGISIM_EXTENSION, "")); From 09b1b7eb7ce9c1ce4826e1fbb3839f795ab31797 Mon Sep 17 00:00:00 2001 From: "Dr.Ir.Ing. Theo Kluter" Date: Sun, 17 Oct 2021 12:10:17 +0200 Subject: [PATCH 24/31] Updated changelog --- CHANGES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 794f3b0d01..f0b7dc7f23 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -5,7 +5,7 @@ * @dev (????-??-??) * Logisim has now an internal font-chooser to comply to the font-values used * Fixed VHDL-component pins not visible bug - * New take on project export/import a zip-file is generated which can include a user provided manifest + * New take on project export/import a zip-file is generated which can include a user provided "README.md" * v3.7.0 (2021-10-12) * Reworked the slider component in the I/O extra library From f590d10ee3332129fbcac270782c385bc17fb847 Mon Sep 17 00:00:00 2001 From: "Dr.Ir.Ing. Theo Kluter" Date: Sun, 17 Oct 2021 12:19:28 +0200 Subject: [PATCH 25/31] Main circ file in bundle now has same name as the bundle --- src/main/java/com/cburch/logisim/proj/ProjectActions.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/cburch/logisim/proj/ProjectActions.java b/src/main/java/com/cburch/logisim/proj/ProjectActions.java index c6453824e5..76484fb17d 100644 --- a/src/main/java/com/cburch/logisim/proj/ProjectActions.java +++ b/src/main/java/com/cburch/logisim/proj/ProjectActions.java @@ -530,7 +530,7 @@ public static boolean doExportProject(Project proj) { final var loader = proj.getLogisimFile().getLoader(); final var oldTool = proj.getTool(); proj.setTool(null); - final var mainFileName = loader.getMainFile() == null ? "Untitled.circ" : loader.getMainFile().getName(); + var mainFileName = loader.getMainFile() == null ? "Untitled.circ" : loader.getMainFile().getName(); var zipFile = mainFileName.replace(Loader.LOGISIM_EXTENSION, Loader.LOGISIM_PROJECT_BUNDLE_EXTENSION); final var chooser = loader.createChooser(); chooser.setFileFilter(Loader.LOGISIM_BUNDLE_FILTER); @@ -560,6 +560,7 @@ public static boolean doExportProject(Project proj) { final var projectFile = new FileOutputStream(zipFile); final var projectZipFile = new ZipOutputStream(projectFile); projectZipFile.putNextEntry(new ZipEntry(String.format("%s%s", Loader.LOGISIM_LIBRARY_DIR, File.separator))); + mainFileName = chooser.getSelectedFile().getName().replace(Loader.LOGISIM_PROJECT_BUNDLE_EXTENSION, "").concat(Loader.LOGISIM_EXTENSION); ret &= loader.export(proj.getLogisimFile(), projectZipFile, mainFileName); if (OptionPane.showConfirmDialog(proj.getFrame(), S.get("projAddReadme"), S.get("projExportBundle"), OptionPane.YES_NO_OPTION) == OptionPane.YES_OPTION) { From 84aed5b5adfb4bb1e6cf0b856233b333ba84d919 Mon Sep 17 00:00:00 2001 From: "Dr.Ir.Ing. Theo Kluter" Date: Mon, 18 Oct 2021 15:34:16 +0200 Subject: [PATCH 26/31] Fixed README.md problem --- .../cburch/logisim/proj/ProjectActions.java | 14 ++--- .../logisim/proj/ProjectBundleReadme.java | 52 ++++++++++++------- .../logisim/strings/proj/proj.properties | 8 ++- .../logisim/strings/proj/proj_de.properties | 2 - .../logisim/strings/proj/proj_el.properties | 2 - .../logisim/strings/proj/proj_es.properties | 2 - .../logisim/strings/proj/proj_fr.properties | 2 - .../logisim/strings/proj/proj_it.properties | 2 - .../logisim/strings/proj/proj_ja.properties | 2 - .../logisim/strings/proj/proj_nl.properties | 2 - .../logisim/strings/proj/proj_pl.properties | 2 - .../logisim/strings/proj/proj_pt.properties | 2 - .../logisim/strings/proj/proj_ru.properties | 2 - 13 files changed, 41 insertions(+), 53 deletions(-) diff --git a/src/main/java/com/cburch/logisim/proj/ProjectActions.java b/src/main/java/com/cburch/logisim/proj/ProjectActions.java index 76484fb17d..fd79529c52 100644 --- a/src/main/java/com/cburch/logisim/proj/ProjectActions.java +++ b/src/main/java/com/cburch/logisim/proj/ProjectActions.java @@ -557,21 +557,15 @@ public static boolean doExportProject(Project proj) { isCorrectFile = true; } if (isCorrectFile) { + final var dialog = new ProjectBundleReadme(proj, mainFileName.replace(Loader.LOGISIM_EXTENSION, "")); + final var readmeInfo = dialog.getReadmeInfo(); + if (readmeInfo == null) return false; final var projectFile = new FileOutputStream(zipFile); final var projectZipFile = new ZipOutputStream(projectFile); + ProjectBundleReadme.writeReadmeFile(projectZipFile, readmeInfo); projectZipFile.putNextEntry(new ZipEntry(String.format("%s%s", Loader.LOGISIM_LIBRARY_DIR, File.separator))); mainFileName = chooser.getSelectedFile().getName().replace(Loader.LOGISIM_PROJECT_BUNDLE_EXTENSION, "").concat(Loader.LOGISIM_EXTENSION); ret &= loader.export(proj.getLogisimFile(), projectZipFile, mainFileName); - if (OptionPane.showConfirmDialog(proj.getFrame(), S.get("projAddReadme"), - S.get("projExportBundle"), OptionPane.YES_NO_OPTION) == OptionPane.YES_OPTION) { - final var dialog = new ProjectBundleReadme(proj, mainFileName.replace(Loader.LOGISIM_EXTENSION, "")); - if (!dialog.writeReadme(projectZipFile)) { - OptionPane.showMessageDialog(proj.getFrame(), S.get("ProjUnableToCreate", S.get("projReadmeError"))); - projectZipFile.close(); - projectFile.close(); - return false; - } - } final var info = ProjectBundleManifest.getInfoContainer(BuildInfo.displayName, mainFileName); ProjectBundleManifest.writeManifest(projectZipFile, info); projectZipFile.close(); diff --git a/src/main/java/com/cburch/logisim/proj/ProjectBundleReadme.java b/src/main/java/com/cburch/logisim/proj/ProjectBundleReadme.java index 3dce86fbd2..775b62000e 100644 --- a/src/main/java/com/cburch/logisim/proj/ProjectBundleReadme.java +++ b/src/main/java/com/cburch/logisim/proj/ProjectBundleReadme.java @@ -36,6 +36,7 @@ import com.cburch.logisim.generated.BuildInfo; import com.cburch.logisim.gui.main.Frame; import com.cburch.logisim.prefs.AppPreferences; +import com.cburch.logisim.util.StringUtil; import com.vladsch.flexmark.html.HtmlRenderer; import com.vladsch.flexmark.parser.Parser; import com.vladsch.flexmark.util.data.MutableDataSet; @@ -50,9 +51,22 @@ public class ProjectBundleReadme extends JDialog implements ActionListener { private JTextField projectAuthor = new JTextField(20); private JTextField projectKeywords = new JTextField(20); private JEditorPane projectDescription = new JEditorPane(); + private ReadmeInfo projectReadmeInfo; private final Frame parrent; - private ZipOutputStream zipfile; - private boolean readmeWritten = true; + + public class ReadmeInfo { + private String projectName; + private String projectAuthor; + private String projectKeywords; + private String projectDescription; + + public ReadmeInfo(String name, String author, String keyword, String description) { + projectName = name; + projectAuthor = author; + projectKeywords = keyword; + projectDescription = description; + } + } public ProjectBundleReadme(Project project, String projName) { super(project.getFrame(), S.get("projBundleReadmeWindow")); @@ -91,8 +105,7 @@ public void showReadme(InputStream file) throws IOException { setVisible(true); } - public boolean writeReadme(ZipOutputStream zipfile) { - this.zipfile = zipfile; + public ReadmeInfo getReadmeInfo() { setLayout(new GridBagLayout()); setResizable(false); final var gbc = new GridBagConstraints(); @@ -124,14 +137,15 @@ public boolean writeReadme(ZipOutputStream zipfile) { gbc.gridy++; gbc.gridwidth = 1; closeButton.setText(S.get("projCancel")); + gbc.gridx = 1; add(closeButton, gbc); writeButton.setText(S.get("projWriteReadme")); - gbc.gridx = 1; + gbc.gridx = 0; add(writeButton, gbc); pack(); setLocationRelativeTo(parrent); setVisible(true); - return readmeWritten; + return projectReadmeInfo; } @Override @@ -140,27 +154,29 @@ public void actionPerformed(ActionEvent e) { setVisible(false); dispose(); } else if (writeButton.equals(e.getSource())) { - writeReadmeFile(); + projectReadmeInfo = new ReadmeInfo(projectName.getText(), projectAuthor.getText(), + projectKeywords.getText(), projectDescription.getText()); setVisible(false); dispose(); } } - private void writeReadmeFile() { - if (zipfile == null) return; + public static void writeReadmeFile(ZipOutputStream zipfile, ReadmeInfo info) { + if ((zipfile == null) || (StringUtil.isNullOrEmpty(info.projectAuthor) + && StringUtil.isNullOrEmpty(info.projectDescription) && StringUtil.isNullOrEmpty(info.projectKeywords))) return; try { final var seperator = "---\n\n"; var wroteheader1 = false; zipfile.putNextEntry(new ZipEntry(README_FILE_NAME)); - final var projName = projectName.getText(); zipfile.write(S.get("projHeader").concat("\n\n").getBytes()); - if ((projName != null) && !projName.isEmpty()) { + final var projName = info.projectName; + if (StringUtil.isNotEmpty(projName)) { zipfile.write(S.get("projHeader1").concat("\n\n").getBytes()); wroteheader1 = true; zipfile.write(S.fmt("projIntro", projName).concat("\n\n").getBytes()); } - final var projAuthor = projectAuthor.getText(); - if ((projAuthor != null) && !projAuthor.isEmpty()) { + final var projAuthor = info.projectAuthor; + if (StringUtil.isNotEmpty(projAuthor)) { final var authors = projAuthor.split(","); if (authors.length > 0) { if (!wroteheader1) { @@ -178,8 +194,8 @@ private void writeReadmeFile() { zipfile.write("\n\n".getBytes()); } } - final var projKeywords = projectKeywords.getText(); - if ((projKeywords != null) && !projKeywords.isEmpty()) { + final var projKeywords = info.projectKeywords; + if (StringUtil.isNotEmpty(projKeywords)) { final var keywords = projKeywords.split(","); if (keywords.length > 0) { if (!wroteheader1) { @@ -195,8 +211,8 @@ private void writeReadmeFile() { zipfile.write("\n\n".getBytes()); } } - final var projDescription = projectDescription.getText(); - if ((projDescription != null) && !projDescription.isEmpty()) { + final var projDescription = info.projectDescription; + if (StringUtil.isNotEmpty(projDescription)) { zipfile.write(S.get("projHeader2").concat("\n\n").getBytes()); zipfile.write(projDescription.getBytes()); zipfile.write("\n".getBytes()); @@ -206,7 +222,7 @@ private void writeReadmeFile() { zipfile.write(S.get("projHeader3").concat("\n\n").getBytes()); zipfile.write(S.fmt("projGenerateInfo", BuildInfo.displayName, BuildInfo.url, dtf.format(now)).concat("\n\n").getBytes()); } catch (IOException e) { - readmeWritten = false; + System.err.println(e.getMessage()); } } } diff --git a/src/main/resources/resources/logisim/strings/proj/proj.properties b/src/main/resources/resources/logisim/strings/proj/proj.properties index f8eba2ca39..a12b60ffb7 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj.properties @@ -40,7 +40,6 @@ ProjUnableToCreate = Failed to create project: %s projExportBundle = Exporting a project bundle projBundleDirectory = Choose directory to extract project bundle: projExistsOverwrite = Project bundle "%s" already exists, overwrite it? -projAddReadme = Do you want to include a readme.md-file in your project bundle? projBundleReadError = Error reading project bundle: %s projBundleNoInfo = Bundle does not contain info-file, aborting import! projBundleMisformatted = Bundle info-file is not correctly formatted, aborting import! @@ -48,11 +47,10 @@ projBundleMainNotFound = Bundle does not contain the main file, aborting import! projContainsFileDir = Selected directory contains either the file "%s" or a sub-directory called "%s".\nPlease select a directory that does not contain these elements! projImportBundle = Importing a project bundle projOpenProject = Open the imported project in Logisim-evolution? -projBundleReadmeWindow = Project bundle readme.md information -projCloseReadme = Close project bundle readme.md +projBundleReadmeWindow = Project bundle README.md information +projCloseReadme = Close project bundle README.md projCancel = Cancel -projReadmeError = Could not write readme.md file, aborting! -projWriteReadme = Done, write readme.md file +projWriteReadme = Ok projName = Project name: projAuthor = Author(s) (comma seperated): projKeywords = Keywords (comma seperated): diff --git a/src/main/resources/resources/logisim/strings/proj/proj_de.properties b/src/main/resources/resources/logisim/strings/proj/proj_de.properties index f51b183622..7d432ee9a7 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_de.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_de.properties @@ -39,7 +39,6 @@ UsedLibraryToolnameError = Der Dateiname muss sich von den Schaltkreisnamen, Wer # ==> ProjUnableToCreate = # ==> projExportBundle = # ==> projExistsOverwrite = -# ==> projAddReadme = # ==> projBundleReadError = # ==> projBundleNoInfo = # ==> projBundleMisformatted = @@ -60,7 +59,6 @@ UsedLibraryToolnameError = Der Dateiname muss sich von den Schaltkreisnamen, Wer # ==> projHeader1 = # ==> projIntro = # ==> projAuthor = -# ==> projReadmeError = # ==> projHeader2 = # ==> projHeader3 = # ==> projGenerateInfo = diff --git a/src/main/resources/resources/logisim/strings/proj/proj_el.properties b/src/main/resources/resources/logisim/strings/proj/proj_el.properties index 8b7bdf6421..2c57d7ac83 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_el.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_el.properties @@ -39,7 +39,6 @@ templateOpenErrorTitle = Σφάλμα στο Άνοιγμα Προτύπου # ==> ProjUnableToCreate = # ==> projExportBundle = # ==> projExistsOverwrite = -# ==> projAddReadme = # ==> projBundleReadError = # ==> projBundleNoInfo = # ==> projBundleMisformatted = @@ -60,7 +59,6 @@ templateOpenErrorTitle = Σφάλμα στο Άνοιγμα Προτύπου # ==> projHeader1 = # ==> projIntro = # ==> projAuthor = -# ==> projReadmeError = # ==> projHeader2 = # ==> projHeader3 = # ==> projGenerateInfo = diff --git a/src/main/resources/resources/logisim/strings/proj/proj_es.properties b/src/main/resources/resources/logisim/strings/proj/proj_es.properties index 6bffc9f4b3..73dd037938 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_es.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_es.properties @@ -39,7 +39,6 @@ UsedLibraryToolnameError = El nombre de archivo no debe coincidir con el nombre # ==> ProjUnableToCreate = # ==> projExportBundle = # ==> projExistsOverwrite = -# ==> projAddReadme = # ==> projBundleReadError = # ==> projBundleNoInfo = # ==> projBundleMisformatted = @@ -60,7 +59,6 @@ UsedLibraryToolnameError = El nombre de archivo no debe coincidir con el nombre # ==> projHeader1 = # ==> projIntro = # ==> projAuthor = -# ==> projReadmeError = # ==> projHeader2 = # ==> projHeader3 = # ==> projGenerateInfo = diff --git a/src/main/resources/resources/logisim/strings/proj/proj_fr.properties b/src/main/resources/resources/logisim/strings/proj/proj_fr.properties index 3a344b3906..8d06dfedaa 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_fr.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_fr.properties @@ -39,7 +39,6 @@ UsedLibraryToolnameError = Le nom de fichier ne doit pas correspondre à un nom # ==> ProjUnableToCreate = # ==> projExportBundle = # ==> projExistsOverwrite = -# ==> projAddReadme = # ==> projBundleReadError = # ==> projBundleNoInfo = # ==> projBundleMisformatted = @@ -60,7 +59,6 @@ UsedLibraryToolnameError = Le nom de fichier ne doit pas correspondre à un nom # ==> projHeader1 = # ==> projIntro = # ==> projAuthor = -# ==> projReadmeError = # ==> projHeader2 = # ==> projHeader3 = # ==> projGenerateInfo = diff --git a/src/main/resources/resources/logisim/strings/proj/proj_it.properties b/src/main/resources/resources/logisim/strings/proj/proj_it.properties index 9776d402de..d3d1c7ebe6 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_it.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_it.properties @@ -39,7 +39,6 @@ UsedLibraryToolnameError = Il nome del file potrebbe non essere uguale al nome d # ==> ProjUnableToCreate = # ==> projExportBundle = # ==> projExistsOverwrite = -# ==> projAddReadme = # ==> projBundleReadError = # ==> projBundleNoInfo = # ==> projBundleMisformatted = @@ -60,7 +59,6 @@ UsedLibraryToolnameError = Il nome del file potrebbe non essere uguale al nome d # ==> projHeader1 = # ==> projIntro = # ==> projAuthor = -# ==> projReadmeError = # ==> projHeader2 = # ==> projHeader3 = # ==> projGenerateInfo = diff --git a/src/main/resources/resources/logisim/strings/proj/proj_ja.properties b/src/main/resources/resources/logisim/strings/proj/proj_ja.properties index dfea90a9ce..8996814b09 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_ja.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_ja.properties @@ -39,7 +39,6 @@ UsedLibraryToolnameError = ファイル名は、プロジェクトで使用さ # ==> ProjUnableToCreate = # ==> projExportBundle = # ==> projExistsOverwrite = -# ==> projAddReadme = # ==> projBundleReadError = # ==> projBundleNoInfo = # ==> projBundleMisformatted = @@ -60,7 +59,6 @@ UsedLibraryToolnameError = ファイル名は、プロジェクトで使用さ # ==> projHeader1 = # ==> projIntro = # ==> projAuthor = -# ==> projReadmeError = # ==> projHeader2 = # ==> projHeader3 = # ==> projGenerateInfo = diff --git a/src/main/resources/resources/logisim/strings/proj/proj_nl.properties b/src/main/resources/resources/logisim/strings/proj/proj_nl.properties index 94bb09bcd5..fa5f27669a 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_nl.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_nl.properties @@ -39,7 +39,6 @@ UsedLibraryToolnameError = De bestandsnaam mag niet gelijk zijn aan de naam van # ==> ProjUnableToCreate = # ==> projExportBundle = # ==> projExistsOverwrite = -# ==> projAddReadme = # ==> projBundleReadError = # ==> projBundleNoInfo = # ==> projBundleMisformatted = @@ -60,7 +59,6 @@ UsedLibraryToolnameError = De bestandsnaam mag niet gelijk zijn aan de naam van # ==> projHeader1 = # ==> projIntro = # ==> projAuthor = -# ==> projReadmeError = # ==> projHeader2 = # ==> projHeader3 = # ==> projGenerateInfo = diff --git a/src/main/resources/resources/logisim/strings/proj/proj_pl.properties b/src/main/resources/resources/logisim/strings/proj/proj_pl.properties index eb88cdc944..eecc79679a 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_pl.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_pl.properties @@ -42,7 +42,6 @@ UsedLibraryToolnameError = Nazwa pliku nie może być taka sama jak nazwa obwodu ProjUnableToCreate = Utworzenie projektu nie powiodło się: %s # ==> projExportBundle = # ==> projExistsOverwrite = -# ==> projAddReadme = # ==> projBundleReadError = # ==> projBundleNoInfo = # ==> projBundleMisformatted = @@ -63,7 +62,6 @@ ProjUnableToCreate = Utworzenie projektu nie powiodło się: %s # ==> projHeader1 = # ==> projIntro = # ==> projAuthor = -# ==> projReadmeError = # ==> projHeader2 = # ==> projHeader3 = # ==> projGenerateInfo = diff --git a/src/main/resources/resources/logisim/strings/proj/proj_pt.properties b/src/main/resources/resources/logisim/strings/proj/proj_pt.properties index 38174cf746..40ba30f062 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_pt.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_pt.properties @@ -39,7 +39,6 @@ UsedLibraryToolnameError = O nome do arquivo não pode ser igual a um nome de ci # ==> ProjUnableToCreate = # ==> projExportBundle = # ==> projExistsOverwrite = -# ==> projAddReadme = # ==> projBundleReadError = # ==> projBundleNoInfo = # ==> projBundleMisformatted = @@ -60,7 +59,6 @@ UsedLibraryToolnameError = O nome do arquivo não pode ser igual a um nome de ci # ==> projHeader1 = # ==> projIntro = # ==> projAuthor = -# ==> projReadmeError = # ==> projHeader2 = # ==> projHeader3 = # ==> projGenerateInfo = diff --git a/src/main/resources/resources/logisim/strings/proj/proj_ru.properties b/src/main/resources/resources/logisim/strings/proj/proj_ru.properties index 4cf0283424..b47e4cee72 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_ru.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_ru.properties @@ -39,7 +39,6 @@ UsedLibraryToolnameError = Имя файла может не совпадать # ==> ProjUnableToCreate = # ==> projExportBundle = # ==> projExistsOverwrite = -# ==> projAddReadme = # ==> projBundleReadError = # ==> projBundleNoInfo = # ==> projBundleMisformatted = @@ -60,7 +59,6 @@ UsedLibraryToolnameError = Имя файла может не совпадать # ==> projHeader1 = # ==> projIntro = # ==> projAuthor = -# ==> projReadmeError = # ==> projHeader2 = # ==> projHeader3 = # ==> projGenerateInfo = From 81c41afb97528ce6066fe2870f02e22cdbe760e9 Mon Sep 17 00:00:00 2001 From: "Dr.Ir.Ing. Theo Kluter" Date: Mon, 18 Oct 2021 16:39:35 +0200 Subject: [PATCH 27/31] Fixed manifest --- .../logisim/proj/ProjectBundleManifest.java | 115 +++++++++++------- .../logisim/strings/proj/proj.properties | 2 +- 2 files changed, 72 insertions(+), 45 deletions(-) diff --git a/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java b/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java index cbab09ba85..3774477cf2 100644 --- a/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java +++ b/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java @@ -17,6 +17,7 @@ import java.util.zip.ZipFile; import java.util.zip.ZipOutputStream; +import javax.swing.filechooser.FileNameExtensionFilter; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys; import javax.xml.transform.TransformerConfigurationException; @@ -25,6 +26,7 @@ import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; +import org.w3c.dom.Text; import org.xml.sax.SAXException; import com.cburch.logisim.gui.generic.OptionPane; @@ -33,12 +35,6 @@ public class ProjectBundleManifest { - private static final String VERSION_STRING = "Version"; - private static final String VERSION = "0.9"; - private static final String PROJECTINFO = "ProjectInformation"; - public static final String VERSION_PREAMBLE = "Created_with"; - public static final String MAIN_FILE_PREAMBLE = "Main_file"; - public static class infofileInformation { private final String logisimVersion; private final String mainCircuitFile; @@ -74,17 +70,28 @@ public static void writeManifest(ZipOutputStream zipfile, infofileInformation in final var factory = XmlUtil.getHardenedBuilderFactory(); final var parser = factory.newDocumentBuilder(); final var boardInfo = parser.newDocument(); - final var manifest = boardInfo.createElement("element"); + final var manifest = boardInfo.createElement("logisim"); boardInfo.appendChild(manifest); - manifest.setAttribute("name", "Manifest"); - manifest.setAttribute("type", "ds:ManifestType"); - final var version = boardInfo.createElement(VERSION_STRING); - version.setAttribute("name", VERSION); - manifest.appendChild(version); - final var progInfo = boardInfo.createElement(PROJECTINFO); - manifest.appendChild(progInfo); - progInfo.setAttribute(VERSION_PREAMBLE, info.logisimVersion.replace(" ", "_")); - progInfo.setAttribute(MAIN_FILE_PREAMBLE, info.mainCircuitFile); + manifest.setAttribute("type", "bundle"); + manifest.setAttribute("version", "1"); + final var meta = boardInfo.createElement("meta"); + manifest.appendChild(meta); + final var progInfo = boardInfo.createElement("tool"); + meta.appendChild(progInfo); + final var parts = info.logisimVersion.split(" "); + progInfo.setAttribute("name", parts[0]); + if (parts.length > 1) { + progInfo.setAttribute("version", parts[1]); + } + final var project = boardInfo.createElement("project"); + manifest.appendChild(project); + final var files = boardInfo.createElement("files"); + project.appendChild(files); + final var mainFile = boardInfo.createElement("file"); + files.appendChild(mainFile); + mainFile.setAttribute("main", "true"); + final var fileName = boardInfo.createTextNode(info.mainCircuitFile); + mainFile.appendChild(fileName); final var tranFactory = TransformerFactory.newInstance(); final var aTransformer = tranFactory.newTransformer(); aTransformer.setOutputProperty(OutputKeys.INDENT, "yes"); @@ -121,7 +128,7 @@ public static infofileInformation getManifestInfo(ZipFile zipFile, Frame frame) } final var projInfoStream = zipFile.getInputStream(projInfoEntry); final var docInfo = parser.parse(projInfoStream); - final var manifestNodes = docInfo.getElementsByTagName("element"); + final var manifestNodes = docInfo.getElementsByTagName("logisim"); if (manifestNodes.getLength() != 1) { OptionPane.showMessageDialog(frame, S.fmt("projBundleReadError", S.get("projBundleMisformatted"))); return null; @@ -129,44 +136,64 @@ public static infofileInformation getManifestInfo(ZipFile zipFile, Frame frame) final var manifestNode = manifestNodes.item(0); final var manifestInfo = manifestNode.getChildNodes(); // first we find the version of the manifest to check if we can process - var versionFound = false; - for (var nodeId = 0; nodeId < manifestInfo.getLength(); nodeId++) { - final var node = manifestInfo.item(nodeId); - if (VERSION_STRING.equals(node.getNodeName())) { - versionFound = true; - final var nodeAttr = node.getAttributes(); - if (nodeAttr.getLength() != 1) { - OptionPane.showMessageDialog(frame, S.fmt("projBundleReadError", S.get("projBundleMisformatted"))); - return null; - } - final var attr = nodeAttr.item(0); - if (!"name".equals(attr.getNodeName()) || !VERSION.equals(attr.getNodeValue())) { - OptionPane.showMessageDialog(frame, S.fmt("projBundleReadError", S.get("projBundleMisformatted"))); - return null; - } - } + final var nodeAttr = manifestNode.getAttributes(); + if (nodeAttr.getLength() != 2) { + OptionPane.showMessageDialog(frame, S.fmt("projBundleReadError", S.get("projBundleMisformatted"))); + return null; } - if (!versionFound) { + final var attr0 = nodeAttr.item(0); + final var attr1 = nodeAttr.item(1); + if (!"type".equals(attr0.getNodeName()) || !"bundle".equals(attr0.getNodeValue()) || + !"version".equals(attr1.getNodeName()) || !"1".equals(attr1.getNodeValue())) { OptionPane.showMessageDialog(frame, S.fmt("projBundleReadError", S.get("projBundleMisformatted"))); return null; } - // now we find the info + // now we find the info of the main file var main = ""; var creator = ""; for (var nodeId = 0; nodeId < manifestInfo.getLength(); nodeId++) { final var node = manifestInfo.item(nodeId); - if (PROJECTINFO.equals(node.getNodeName())) { - final var attrs = node.getAttributes(); - for (var attrId = 0; attrId < attrs.getLength(); attrId++) { - final var attr = attrs.item(attrId); - if (VERSION_PREAMBLE.equals(attr.getNodeName())) creator = attr.getNodeValue(); - else if (MAIN_FILE_PREAMBLE.equals(attr.getNodeName())) main = attr.getNodeValue(); + if ("project".equals(node.getNodeName())) { + final var projectChilds = node.getChildNodes(); + for (var childId = 0; childId < projectChilds.getLength(); childId++) { + final var childNode = projectChilds.item(childId); + if ("files".equals(childNode.getNodeName())) { + final var fileNodes = childNode.getChildNodes(); + for (var fileId = 0; fileId < fileNodes.getLength(); fileId++) { + final var fileNode = fileNodes.item(fileId); + if ("file".equals(fileNode.getNodeName())) { + final var fileAttrs = fileNode.getAttributes(); + if (fileAttrs.getLength() == 1 && "main".equals(fileAttrs.item(0).getNodeName()) + && "true".equals(fileAttrs.item(0).getNodeValue())) { + final var mainNodes = fileNode.getChildNodes(); + if ((mainNodes.getLength() == 1) && (mainNodes.item(0) instanceof Text filename)) { + main = filename.getNodeValue(); + } + } + } + } + } + } + } else if ("meta".equals(node.getNodeName())) { + final var metaChilds = node.getChildNodes(); + for (var metaId = 0; metaId < metaChilds.getLength(); metaId++) { + final var metaNode = metaChilds.item(metaId); + if ("tool".equals(metaNode.getNodeName())) { + final var metaAttrs = metaNode.getAttributes(); + if (metaAttrs.getLength() == 2) { + final var metaAttr1 = metaAttrs.item(0); + final var metaAttr2 = metaAttrs.item(1); + if ("name".equals(metaAttr1.getNodeName()) && "version".equals(metaAttr2.getNodeName())) { + creator = String.format("%s %s", metaAttr1.getNodeValue(), metaAttr2.getNodeValue()); + } + } + } } - } - if (!main.isEmpty() && !creator.isEmpty()) { - return new infofileInformation(creator, main); } } + if (!main.isEmpty() && !creator.isEmpty()) { + return new infofileInformation(creator, main); + } } catch (ParserConfigurationException e) { System.err.println(e.getMessage()); } catch (SAXException e) { diff --git a/src/main/resources/resources/logisim/strings/proj/proj.properties b/src/main/resources/resources/logisim/strings/proj/proj.properties index a12b60ffb7..fdc1c123c0 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj.properties @@ -50,7 +50,7 @@ projOpenProject = Open the imported project in Logisim-evolution? projBundleReadmeWindow = Project bundle README.md information projCloseReadme = Close project bundle README.md projCancel = Cancel -projWriteReadme = Ok +projWriteReadme = Save projName = Project name: projAuthor = Author(s) (comma seperated): projKeywords = Keywords (comma seperated): From 5f3e93b89f1fb530563ad46f2f8dad53ac4e58fe Mon Sep 17 00:00:00 2001 From: "Dr.Ir.Ing. Theo Kluter" Date: Mon, 18 Oct 2021 16:41:34 +0200 Subject: [PATCH 28/31] Make linter happy --- .../java/com/cburch/logisim/proj/ProjectBundleManifest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java b/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java index 3774477cf2..493205a5c6 100644 --- a/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java +++ b/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java @@ -143,8 +143,8 @@ public static infofileInformation getManifestInfo(ZipFile zipFile, Frame frame) } final var attr0 = nodeAttr.item(0); final var attr1 = nodeAttr.item(1); - if (!"type".equals(attr0.getNodeName()) || !"bundle".equals(attr0.getNodeValue()) || - !"version".equals(attr1.getNodeName()) || !"1".equals(attr1.getNodeValue())) { + if (!"type".equals(attr0.getNodeName()) || !"bundle".equals(attr0.getNodeValue()) + || !"version".equals(attr1.getNodeName()) || !"1".equals(attr1.getNodeValue())) { OptionPane.showMessageDialog(frame, S.fmt("projBundleReadError", S.get("projBundleMisformatted"))); return null; } From 1e2ad9410dc3e73f86523b5214cef0d1d27dcdaa Mon Sep 17 00:00:00 2001 From: "Dr.Ir.Ing. Theo Kluter" Date: Mon, 18 Oct 2021 21:23:21 +0200 Subject: [PATCH 29/31] Extract and load project implemented --- .../com/cburch/logisim/file/XmlWriter.java | 4 ++- .../com/cburch/logisim/gui/menu/MenuFile.java | 15 +++++----- .../cburch/logisim/proj/ProjectActions.java | 28 +++++++------------ .../logisim/proj/ProjectBundleManifest.java | 1 - .../logisim/strings/gui/gui.properties | 2 +- .../logisim/strings/gui/gui_de.properties | 2 +- .../logisim/strings/gui/gui_el.properties | 2 +- .../logisim/strings/gui/gui_es.properties | 2 +- .../logisim/strings/gui/gui_fr.properties | 2 +- .../logisim/strings/gui/gui_it.properties | 2 +- .../logisim/strings/gui/gui_ja.properties | 2 +- .../logisim/strings/gui/gui_nl.properties | 2 +- .../logisim/strings/gui/gui_pl.properties | 2 +- .../logisim/strings/gui/gui_pt.properties | 2 +- .../logisim/strings/gui/gui_ru.properties | 2 +- .../logisim/strings/proj/proj.properties | 1 - .../logisim/strings/proj/proj_de.properties | 1 - .../logisim/strings/proj/proj_el.properties | 1 - .../logisim/strings/proj/proj_es.properties | 1 - .../logisim/strings/proj/proj_fr.properties | 1 - .../logisim/strings/proj/proj_it.properties | 1 - .../logisim/strings/proj/proj_ja.properties | 1 - .../logisim/strings/proj/proj_nl.properties | 1 - .../logisim/strings/proj/proj_pl.properties | 1 - .../logisim/strings/proj/proj_pt.properties | 1 - .../logisim/strings/proj/proj_ru.properties | 1 - 26 files changed, 31 insertions(+), 50 deletions(-) diff --git a/src/main/java/com/cburch/logisim/file/XmlWriter.java b/src/main/java/com/cburch/logisim/file/XmlWriter.java index 7b6e58b595..0820d46c43 100644 --- a/src/main/java/com/cburch/logisim/file/XmlWriter.java +++ b/src/main/java/com/cburch/logisim/file/XmlWriter.java @@ -551,7 +551,9 @@ private void writeJarToZip(ZipOutputStream zipFile, String inputFileName, String zipFile.putNextEntry(new ZipEntry(outputFileName)); final var bytes = new byte[1024]; var length = 0; - while ((length = fileReader.read(bytes)) >= 0) zipFile.write(bytes, 0, length); + while ((length = fileReader.read(bytes)) >= 0) { + zipFile.write(bytes, 0, length); + } fileReader.close(); } diff --git a/src/main/java/com/cburch/logisim/gui/menu/MenuFile.java b/src/main/java/com/cburch/logisim/gui/menu/MenuFile.java index 0f001e9846..a6d93b3a04 100644 --- a/src/main/java/com/cburch/logisim/gui/menu/MenuFile.java +++ b/src/main/java/com/cburch/logisim/gui/menu/MenuFile.java @@ -34,7 +34,7 @@ class MenuFile extends Menu implements ActionListener { private final JMenuItem save = new JMenuItem(); private final JMenuItem saveAs = new JMenuItem(); private final JMenuItem exportProj = new JMenuItem(); - private final JMenuItem importProj = new JMenuItem(); + private final JMenuItem extractRunProj = new JMenuItem(); private final MenuItemImpl print = new MenuItemImpl(this, LogisimMenuBar.PRINT); private final MenuItemImpl exportImage = new MenuItemImpl(this, LogisimMenuBar.EXPORT_IMAGE); private final JMenuItem prefs = new JMenuItem(); @@ -53,7 +53,6 @@ public MenuFile(LogisimMenuBar menubar) { save.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, menuMask)); saveAs.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, menuMask | InputEvent.SHIFT_DOWN_MASK)); exportProj.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E, menuMask | InputEvent.SHIFT_DOWN_MASK)); - importProj.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_I, menuMask | InputEvent.SHIFT_DOWN_MASK)); print.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, menuMask)); quit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, menuMask)); @@ -66,7 +65,7 @@ public MenuFile(LogisimMenuBar menubar) { add(save); add(saveAs); addSeparator(); - add(importProj); + add(extractRunProj); add(exportProj); addSeparator(); add(exportImage); @@ -89,14 +88,14 @@ public MenuFile(LogisimMenuBar menubar) { save.setEnabled(false); saveAs.setEnabled(false); exportProj.setEnabled(false); - importProj.setEnabled(false); + extractRunProj.setEnabled(false); } else { merge.addActionListener(this); close.addActionListener(this); save.addActionListener(this); saveAs.addActionListener(this); exportProj.addActionListener(this); - importProj.addActionListener(this); + extractRunProj.addActionListener(this); } menubar.registerItem(LogisimMenuBar.EXPORT_IMAGE, exportImage); menubar.registerItem(LogisimMenuBar.PRINT, print); @@ -169,8 +168,8 @@ public void actionPerformed(ActionEvent e) { ProjectActions.doSaveAs(proj); } else if (src == exportProj) { ProjectActions.doExportProject(proj); - } else if (src == importProj) { - ProjectActions.doImportProject(proj); + } else if (src == extractRunProj) { + ProjectActions.doExtractAndRunProject(proj); } } } @@ -191,7 +190,7 @@ public void localeChanged() { save.setText(S.get("fileSaveItem")); saveAs.setText(S.get("fileSaveAsItem")); exportProj.setText(S.get("fileExportProject")); - importProj.setText(S.get("fileImportProject")); + extractRunProj.setText(S.get("fileExtractRunProject")); exportImage.setText(S.get("fileExportImageItem")); print.setText(S.get("filePrintItem")); prefs.setText(S.get("filePreferencesItem")); diff --git a/src/main/java/com/cburch/logisim/proj/ProjectActions.java b/src/main/java/com/cburch/logisim/proj/ProjectActions.java index fd79529c52..e767788a03 100644 --- a/src/main/java/com/cburch/logisim/proj/ProjectActions.java +++ b/src/main/java/com/cburch/logisim/proj/ProjectActions.java @@ -405,7 +405,7 @@ public static boolean doSave(Project proj, File f) { * @param proj the current project to perform the file->open action afterwards * @return true if success, false otherwise */ - public static boolean doImportProject(Project proj) { + public static boolean doExtractAndRunProject(Project proj) { var ret = true; final var loader = proj.getLogisimFile().getLoader(); final var chooser = loader.createChooser(); @@ -476,32 +476,24 @@ public static boolean doImportProject(Project proj) { if (!entryName.startsWith(String.format("%s%s", Loader.LOGISIM_LIBRARY_DIR, File.separator))) continue; if (entryName.lastIndexOf(File.separator) != entryName.indexOf(File.separator)) continue; if (!entryName.endsWith(Loader.LOGISIM_EXTENSION) - && !entryName.toLowerCase().endsWith(".jar")) continue; + && !entryName.toLowerCase().endsWith(".jar")) { + continue; + } // make sure the library dir exists if (!Files.exists(Paths.get(libDir))) new File(libDir).mkdirs(); filename = String.format("%s%s%s", exportDirectory, File.separator, entry.getName()); zipInput = zipFile.getInputStream(entry); fileOutput = new FileOutputStream(filename); - data = zipInput.read(); - while (data > 0) { - fileOutput.write(data); - data = zipInput.read(); + final var bytes = new byte[1024]; + var length = 0; + while(((length = zipInput.read(bytes)) >= 0)) { + fileOutput.write(bytes, 0, length); } - zipInput.close(); fileOutput.close(); + zipInput.close(); } } - // ask to open - if (OptionPane.showConfirmDialog(proj.getFrame(), S.get("projOpenProject"), S.get("projImportBundle"), - JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { - final var newProj = ProjectActions.doOpen(proj.getFrame().getCanvas(), proj, new File(mainProjectFileName)); - if (newProj != null - && proj != null - && !proj.isFileDirty() - && proj.getLogisimFile().getLoader().getMainFile() == null) { - proj.getFrame().dispose(); - } - } + ProjectActions.doOpen(proj.getFrame().getCanvas(), proj, new File(mainProjectFileName)); } } while (!isCorrectDirectory); zipFile.close(); diff --git a/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java b/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java index 493205a5c6..4919a1a9a0 100644 --- a/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java +++ b/src/main/java/com/cburch/logisim/proj/ProjectBundleManifest.java @@ -17,7 +17,6 @@ import java.util.zip.ZipFile; import java.util.zip.ZipOutputStream; -import javax.swing.filechooser.FileNameExtensionFilter; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys; import javax.xml.transform.TransformerConfigurationException; diff --git a/src/main/resources/resources/logisim/strings/gui/gui.properties b/src/main/resources/resources/logisim/strings/gui/gui.properties index ce25606436..2f4424187e 100644 --- a/src/main/resources/resources/logisim/strings/gui/gui.properties +++ b/src/main/resources/resources/logisim/strings/gui/gui.properties @@ -340,7 +340,7 @@ fileQuitItem = Exit fileSaveAsItem = Save As... fileSaveItem = Save fileExportProject = Export project bundle... -fileImportProject = Import project bundle... +fileExtractRunProject = Extract and open project bundle... # # menu/MenuHelp.java # diff --git a/src/main/resources/resources/logisim/strings/gui/gui_de.properties b/src/main/resources/resources/logisim/strings/gui/gui_de.properties index bbe26fb165..a7592a8a65 100644 --- a/src/main/resources/resources/logisim/strings/gui/gui_de.properties +++ b/src/main/resources/resources/logisim/strings/gui/gui_de.properties @@ -340,7 +340,7 @@ fileQuitItem = Beenden fileSaveAsItem = Speichern unter... fileSaveItem = Speichern # ==> fileExportProject = -# ==> fileImportProject = +# ==> fileExtractRunProject = # # menu/MenuHelp.java # diff --git a/src/main/resources/resources/logisim/strings/gui/gui_el.properties b/src/main/resources/resources/logisim/strings/gui/gui_el.properties index 48896d29dc..c43be90e2d 100644 --- a/src/main/resources/resources/logisim/strings/gui/gui_el.properties +++ b/src/main/resources/resources/logisim/strings/gui/gui_el.properties @@ -340,7 +340,7 @@ fileQuitItem = Έξοδος fileSaveAsItem = Αποθήκευση ως... fileSaveItem = Αποθήκευση # ==> fileExportProject = -# ==> fileImportProject = +# ==> fileExtractRunProject = # # menu/MenuHelp.java # diff --git a/src/main/resources/resources/logisim/strings/gui/gui_es.properties b/src/main/resources/resources/logisim/strings/gui/gui_es.properties index d33cfdd3b9..da4db0b3b6 100644 --- a/src/main/resources/resources/logisim/strings/gui/gui_es.properties +++ b/src/main/resources/resources/logisim/strings/gui/gui_es.properties @@ -340,7 +340,7 @@ fileQuitItem = Salir fileSaveAsItem = Guardar como... fileSaveItem = Guardar # ==> fileExportProject = -# ==> fileImportProject = +# ==> fileExtractRunProject = # # menu/MenuHelp.java # diff --git a/src/main/resources/resources/logisim/strings/gui/gui_fr.properties b/src/main/resources/resources/logisim/strings/gui/gui_fr.properties index b955cbe41e..61518fd675 100644 --- a/src/main/resources/resources/logisim/strings/gui/gui_fr.properties +++ b/src/main/resources/resources/logisim/strings/gui/gui_fr.properties @@ -340,7 +340,7 @@ fileQuitItem = Sortir fileSaveAsItem = Enregistrer sous... fileSaveItem = Enregistrer # ==> fileExportProject = -# ==> fileImportProject = +# ==> fileExtractRunProject = # # menu/MenuHelp.java # diff --git a/src/main/resources/resources/logisim/strings/gui/gui_it.properties b/src/main/resources/resources/logisim/strings/gui/gui_it.properties index 71926d8711..2f35859960 100644 --- a/src/main/resources/resources/logisim/strings/gui/gui_it.properties +++ b/src/main/resources/resources/logisim/strings/gui/gui_it.properties @@ -340,7 +340,7 @@ fileQuitItem = Esci fileSaveAsItem = Salva Come... fileSaveItem = Salva # ==> fileExportProject = -# ==> fileImportProject = +# ==> fileExtractRunProject = # # menu/MenuHelp.java # diff --git a/src/main/resources/resources/logisim/strings/gui/gui_ja.properties b/src/main/resources/resources/logisim/strings/gui/gui_ja.properties index cbd7480acb..ba363f2307 100644 --- a/src/main/resources/resources/logisim/strings/gui/gui_ja.properties +++ b/src/main/resources/resources/logisim/strings/gui/gui_ja.properties @@ -340,7 +340,7 @@ fileQuitItem = 終了する fileSaveAsItem = 新規ファイルで保存... fileSaveItem = 保存 # ==> fileExportProject = -# ==> fileImportProject = +# ==> fileExtractRunProject = # # menu/MenuHelp.java # diff --git a/src/main/resources/resources/logisim/strings/gui/gui_nl.properties b/src/main/resources/resources/logisim/strings/gui/gui_nl.properties index 467796b749..4948dd806b 100644 --- a/src/main/resources/resources/logisim/strings/gui/gui_nl.properties +++ b/src/main/resources/resources/logisim/strings/gui/gui_nl.properties @@ -340,7 +340,7 @@ fileQuitItem = Afsluiten fileSaveAsItem = Opslaan als... fileSaveItem = Opslaan fileExportProject = Projekt bundel exporteren... -fileImportProject = Projekt bundel importeren... +fileExtractRunProject = Projekt bundel uitpakken en openen... # # menu/MenuHelp.java # diff --git a/src/main/resources/resources/logisim/strings/gui/gui_pl.properties b/src/main/resources/resources/logisim/strings/gui/gui_pl.properties index 57ff26e17c..bcac86b3b1 100644 --- a/src/main/resources/resources/logisim/strings/gui/gui_pl.properties +++ b/src/main/resources/resources/logisim/strings/gui/gui_pl.properties @@ -388,7 +388,7 @@ fileQuitItem = Zakończ... fileSaveAsItem = Zapisz jako... fileSaveItem = Zapisz... # == > fileExportProject = -# ==> fileImportProject = +# ==> fileExtractRunProject = # # menu/MenuHelp.java # diff --git a/src/main/resources/resources/logisim/strings/gui/gui_pt.properties b/src/main/resources/resources/logisim/strings/gui/gui_pt.properties index f56bdc3dd2..afa1fa66b3 100644 --- a/src/main/resources/resources/logisim/strings/gui/gui_pt.properties +++ b/src/main/resources/resources/logisim/strings/gui/gui_pt.properties @@ -340,7 +340,7 @@ fileQuitItem = Sair fileSaveAsItem = Salvar como... fileSaveItem = Salvar # ==> fileExportProject = -# ==> fileImportProject = +# ==> fileExtractRunProject = # # menu/MenuHelp.java # diff --git a/src/main/resources/resources/logisim/strings/gui/gui_ru.properties b/src/main/resources/resources/logisim/strings/gui/gui_ru.properties index b187fcafc5..092db83336 100644 --- a/src/main/resources/resources/logisim/strings/gui/gui_ru.properties +++ b/src/main/resources/resources/logisim/strings/gui/gui_ru.properties @@ -340,7 +340,7 @@ fileQuitItem = Выход fileSaveAsItem = Сохранить как... fileSaveItem = Сохранить # ==> fileExportProject = -# ==> fileImportProject = +# ==> fileExtractRunProject = # # menu/MenuHelp.java # diff --git a/src/main/resources/resources/logisim/strings/proj/proj.properties b/src/main/resources/resources/logisim/strings/proj/proj.properties index fdc1c123c0..62abdc9b26 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj.properties @@ -46,7 +46,6 @@ projBundleMisformatted = Bundle info-file is not correctly formatted, aborting i projBundleMainNotFound = Bundle does not contain the main file, aborting import! projContainsFileDir = Selected directory contains either the file "%s" or a sub-directory called "%s".\nPlease select a directory that does not contain these elements! projImportBundle = Importing a project bundle -projOpenProject = Open the imported project in Logisim-evolution? projBundleReadmeWindow = Project bundle README.md information projCloseReadme = Close project bundle README.md projCancel = Cancel diff --git a/src/main/resources/resources/logisim/strings/proj/proj_de.properties b/src/main/resources/resources/logisim/strings/proj/proj_de.properties index 7d432ee9a7..ca011efd43 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_de.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_de.properties @@ -46,7 +46,6 @@ UsedLibraryToolnameError = Der Dateiname muss sich von den Schaltkreisnamen, Wer # ==> projBundleDirectory = # ==> projContainsFileDir = # ==> projImportBundle = -# ==> projOpenProject = # ==> projBundleReadmeWindow = # ==> projCloseReadme = # ==> projCancel = diff --git a/src/main/resources/resources/logisim/strings/proj/proj_el.properties b/src/main/resources/resources/logisim/strings/proj/proj_el.properties index 2c57d7ac83..fbd50518b8 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_el.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_el.properties @@ -46,7 +46,6 @@ templateOpenErrorTitle = Σφάλμα στο Άνοιγμα Προτύπου # ==> projBundleDirectory = # ==> projContainsFileDir = # ==> projImportBundle = -# ==> projOpenProject = # ==> projBundleReadmeWindow = # ==> projCloseReadme = # ==> projCancel = diff --git a/src/main/resources/resources/logisim/strings/proj/proj_es.properties b/src/main/resources/resources/logisim/strings/proj/proj_es.properties index 73dd037938..7e856d068a 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_es.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_es.properties @@ -46,7 +46,6 @@ UsedLibraryToolnameError = El nombre de archivo no debe coincidir con el nombre # ==> projBundleDirectory = # ==> projContainsFileDir = # ==> projImportBundle = -# ==> projOpenProject = # ==> projBundleReadmeWindow = # ==> projCloseReadme = # ==> projCancel = diff --git a/src/main/resources/resources/logisim/strings/proj/proj_fr.properties b/src/main/resources/resources/logisim/strings/proj/proj_fr.properties index 8d06dfedaa..eb3dad71be 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_fr.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_fr.properties @@ -46,7 +46,6 @@ UsedLibraryToolnameError = Le nom de fichier ne doit pas correspondre à un nom # ==> projBundleDirectory = # ==> projContainsFileDir = # ==> projImportBundle = -# ==> projOpenProject = # ==> projBundleReadmeWindow = # ==> projCloseReadme = # ==> projCancel = diff --git a/src/main/resources/resources/logisim/strings/proj/proj_it.properties b/src/main/resources/resources/logisim/strings/proj/proj_it.properties index d3d1c7ebe6..643134dab2 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_it.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_it.properties @@ -46,7 +46,6 @@ UsedLibraryToolnameError = Il nome del file potrebbe non essere uguale al nome d # ==> projBundleDirectory = # ==> projContainsFileDir = # ==> projImportBundle = -# ==> projOpenProject = # ==> projBundleReadmeWindow = # ==> projCloseReadme = # ==> projCancel = diff --git a/src/main/resources/resources/logisim/strings/proj/proj_ja.properties b/src/main/resources/resources/logisim/strings/proj/proj_ja.properties index 8996814b09..53dfc983b6 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_ja.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_ja.properties @@ -46,7 +46,6 @@ UsedLibraryToolnameError = ファイル名は、プロジェクトで使用さ # ==> projBundleDirectory = # ==> projContainsFileDir = # ==> projImportBundle = -# ==> projOpenProject = # ==> projBundleReadmeWindow = # ==> projCloseReadme = # ==> projCancel = diff --git a/src/main/resources/resources/logisim/strings/proj/proj_nl.properties b/src/main/resources/resources/logisim/strings/proj/proj_nl.properties index fa5f27669a..007f98f6e2 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_nl.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_nl.properties @@ -46,7 +46,6 @@ UsedLibraryToolnameError = De bestandsnaam mag niet gelijk zijn aan de naam van # ==> projBundleDirectory = # ==> projContainsFileDir = # ==> projImportBundle = -# ==> projOpenProject = # ==> projBundleReadmeWindow = # ==> projCloseReadme = # ==> projCancel = diff --git a/src/main/resources/resources/logisim/strings/proj/proj_pl.properties b/src/main/resources/resources/logisim/strings/proj/proj_pl.properties index eecc79679a..ff5a5afc9c 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_pl.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_pl.properties @@ -49,7 +49,6 @@ ProjUnableToCreate = Utworzenie projektu nie powiodło się: %s # ==> projBundleDirectory = # ==> projContainsFileDir = # ==> projImportBundle = -# ==> projOpenProject = # ==> projBundleReadmeWindow = # ==> projCloseReadme = # ==> projCancel = diff --git a/src/main/resources/resources/logisim/strings/proj/proj_pt.properties b/src/main/resources/resources/logisim/strings/proj/proj_pt.properties index 40ba30f062..4308226bfc 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_pt.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_pt.properties @@ -46,7 +46,6 @@ UsedLibraryToolnameError = O nome do arquivo não pode ser igual a um nome de ci # ==> projBundleDirectory = # ==> projContainsFileDir = # ==> projImportBundle = -# ==> projOpenProject = # ==> projBundleReadmeWindow = # ==> projCloseReadme = # ==> projCancel = diff --git a/src/main/resources/resources/logisim/strings/proj/proj_ru.properties b/src/main/resources/resources/logisim/strings/proj/proj_ru.properties index b47e4cee72..bc8bed7869 100644 --- a/src/main/resources/resources/logisim/strings/proj/proj_ru.properties +++ b/src/main/resources/resources/logisim/strings/proj/proj_ru.properties @@ -46,7 +46,6 @@ UsedLibraryToolnameError = Имя файла может не совпадать # ==> projBundleDirectory = # ==> projContainsFileDir = # ==> projImportBundle = -# ==> projOpenProject = # ==> projBundleReadmeWindow = # ==> projCloseReadme = # ==> projCancel = From e3de62ca151464f223a0d31c69e8589125398fc7 Mon Sep 17 00:00:00 2001 From: "Dr.Ir.Ing. Theo Kluter" Date: Mon, 18 Oct 2021 21:36:21 +0200 Subject: [PATCH 30/31] Made linter happy --- src/main/java/com/cburch/logisim/proj/ProjectActions.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cburch/logisim/proj/ProjectActions.java b/src/main/java/com/cburch/logisim/proj/ProjectActions.java index e767788a03..689bfc059a 100644 --- a/src/main/java/com/cburch/logisim/proj/ProjectActions.java +++ b/src/main/java/com/cburch/logisim/proj/ProjectActions.java @@ -486,7 +486,7 @@ public static boolean doExtractAndRunProject(Project proj) { fileOutput = new FileOutputStream(filename); final var bytes = new byte[1024]; var length = 0; - while(((length = zipInput.read(bytes)) >= 0)) { + while (((length = zipInput.read(bytes)) >= 0)) { fileOutput.write(bytes, 0, length); } fileOutput.close(); From e3276e8421da0ce92db56f339e7986a3cc001d1a Mon Sep 17 00:00:00 2001 From: "Dr.Ir.Ing. Theo Kluter" Date: Sun, 7 Nov 2021 09:03:31 +0100 Subject: [PATCH 31/31] Fixed missed conflict --- src/main/java/com/cburch/logisim/proj/ProjectActions.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main/java/com/cburch/logisim/proj/ProjectActions.java b/src/main/java/com/cburch/logisim/proj/ProjectActions.java index dfe1379e4c..99bb39d073 100644 --- a/src/main/java/com/cburch/logisim/proj/ProjectActions.java +++ b/src/main/java/com/cburch/logisim/proj/ProjectActions.java @@ -406,13 +406,8 @@ public static boolean doSave(Project proj, File f) { * *

It is the action listener for the File->Import project bundle... menu option. * -<<<<<<< HEAD * @param proj the current project to perform the file->open action afterwards * @return true if success, false otherwise -======= - * @param proj Project to be exported - * @return true if success, false otherwise ->>>>>>> 442ec770176ad3894378ec0e981b5c6bf1d32d6d */ public static boolean doExtractAndRunProject(Project proj) { var ret = true;