diff --git a/diylc/diylc-core/src/org/diylc/presenter/Presenter.java b/diylc/diylc-core/src/org/diylc/presenter/Presenter.java index b8584229..84edacc4 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/Presenter.java +++ b/diylc/diylc-core/src/org/diylc/presenter/Presenter.java @@ -300,8 +300,9 @@ public class Presenter implements IPlugInPort { @Override public void loadProjectFromFile(String fileName) { LOG.info(String.format("loadProjectFromFile(%s)", fileName)); + List warnings = null; try { - List warnings = new ArrayList(); + warnings = new ArrayList(); Project project = (Project) projectFileManager.deserializeProjectFromFile(fileName, warnings); loadProject(project, true); projectFileManager.fireFileStatusChanged(); @@ -317,7 +318,15 @@ public class Presenter implements IPlugInPort { addToRecentFiles(fileName); } catch (Exception ex) { LOG.error("Could not load file", ex); - view.showMessage("Could not open file " + fileName + ". Check the log for details.", "Error", IView.ERROR_MESSAGE); + String errorMessage = "Could not open file " + fileName + ". Check the log for details."; + if (warnings != null && !warnings.isEmpty()) { + errorMessage += " Possible reasons are:\n\n"; + for (String warn : warnings) { + errorMessage += warn; + errorMessage += "\n"; + } + } + view.showMessage(errorMessage, "Error", IView.ERROR_MESSAGE); } } diff --git a/diylc/diylc-core/src/org/diylc/presenter/ProjectFileManager.java b/diylc/diylc-core/src/org/diylc/presenter/ProjectFileManager.java index 8277ece4..f0c58bda 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/ProjectFileManager.java +++ b/diylc/diylc-core/src/org/diylc/presenter/ProjectFileManager.java @@ -44,10 +44,13 @@ import javax.xml.parsers.ParserConfigurationException; import org.apache.log4j.Logger; import org.diylc.appframework.miscutils.Utils; import org.diylc.appframework.simplemq.MessageDispatcher; +import org.diylc.appframework.update.VersionNumber; import org.diylc.common.EventType; import org.diylc.core.Project; import org.diylc.parsing.IOldFileParser; import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import org.xml.sax.SAXException; @@ -209,7 +212,15 @@ public class ProjectFileManager { } private Project parseV3File(String fileName, List warnings) throws IOException { - Project project; + Project project; + VersionNumber fileVersion; + try { + fileVersion = readV3Version(fileName); + if (fileVersion.compareTo(Presenter.CURRENT_VERSION) > 0) + warnings.add("The file is created with a newer version of DIYLC and may contain features that are not supported by your version of DIYLC. Please update."); + } catch (Exception e) { + warnings.add("Could not read file version number, the file may be corrupted."); + } FileInputStream fis = new FileInputStream(fileName); missingFields.clear(); try { @@ -226,5 +237,32 @@ public class ProjectFileManager { } fis.close(); return project; + } + + private VersionNumber readV3Version(String fileName) throws Exception { + File fXmlFile = new File(fileName); + DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); + Document doc = dBuilder.parse(fXmlFile); + + doc.getDocumentElement().normalize(); + + NodeList nList = doc.getElementsByTagName("fileVersion"); + + int items = nList.getLength(); + + if (items != 1) + throw new Exception("File version information could not be read from the XML."); + + Node versionNode = nList.item(0); + Node n = versionNode.getFirstChild().getNextSibling(); + int major = Integer.parseInt(n.getFirstChild().getNodeValue()); + n = n.getNextSibling().getNextSibling(); + int minor = Integer.parseInt(n.getFirstChild().getNodeValue()); + n = n.getNextSibling().getNextSibling(); + int build = Integer.parseInt(n.getFirstChild().getNodeValue()); + + return new VersionNumber(major, minor, build); + } } diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar index 7fa620bd..723dd0f6 100644 Binary files a/diylc/diylc-library/lib/diylc-core.jar and b/diylc/diylc-library/lib/diylc-core.jar differ diff --git a/diylc/diylc-library/src/org/diylc/components/semiconductors/AbstractTransistorPackage.java b/diylc/diylc-library/src/org/diylc/components/semiconductors/AbstractTransistorPackage.java index 22fd0b07..e84d8267 100644 --- a/diylc/diylc-library/src/org/diylc/components/semiconductors/AbstractTransistorPackage.java +++ b/diylc/diylc-library/src/org/diylc/components/semiconductors/AbstractTransistorPackage.java @@ -89,7 +89,14 @@ public abstract class AbstractTransistorPackage extends AbstractTransparentCompo @Override public String getComment() { - return getPinout() == null ? null : (getPinout().toString() + " pinout"); + return getPinout() == null ? "Pinout not configured, validate this line" : (getPinout().toString() + " pinout"); + } + + @Override + public String getPrefix() { + if (getPinout() == null) + return null; + return getPinout().name().substring(0, 1); } @EditableProperty diff --git a/diylc/diylc-library/src/org/diylc/netlist/ISpiceMapper.java b/diylc/diylc-library/src/org/diylc/netlist/ISpiceMapper.java index 80021b0d..7a3063dc 100644 --- a/diylc/diylc-library/src/org/diylc/netlist/ISpiceMapper.java +++ b/diylc/diylc-library/src/org/diylc/netlist/ISpiceMapper.java @@ -31,4 +31,6 @@ public interface ISpiceMapper { int mapToSpiceNode(int pontIndex); String getComment(); + + String getPrefix(); } diff --git a/diylc/diylc-library/src/org/diylc/netlist/SpiceAnalyzer.java b/diylc/diylc-library/src/org/diylc/netlist/SpiceAnalyzer.java index 8aade615..c37442d6 100644 --- a/diylc/diylc-library/src/org/diylc/netlist/SpiceAnalyzer.java +++ b/diylc/diylc-library/src/org/diylc/netlist/SpiceAnalyzer.java @@ -80,8 +80,16 @@ public class SpiceAnalyzer extends NetlistAnalyzer implements INetlistAnalyzer { maxLen = c.getName().length(); } - for (IDIYComponent c : allComponents) { - sb.append(fill(c.getName(), (int) (Math.ceil(maxLen / 5.0) * 5))); + for (IDIYComponent c : allComponents) { + // change the prefix to match spice convention if needed + String name = c.getName(); + String prefix = null; + if (c instanceof ISpiceMapper) + prefix = ((ISpiceMapper)c).getPrefix(); + if (prefix != null && !name.toLowerCase().startsWith(prefix.toLowerCase())) + name = prefix + name; + + sb.append(fill(name, (int) (Math.ceil(maxLen / 5.0) * 5))); sb.append(" "); int[] nodeIndices = new int[c.getControlPointCount()]; diff --git a/diylc/diylc-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar index 7fa620bd..723dd0f6 100644 Binary files a/diylc/diylc-swing/lib/diylc-core.jar and b/diylc/diylc-swing/lib/diylc-core.jar differ diff --git a/diylc/diylc-swing/library/main.jar b/diylc/diylc-swing/library/main.jar index 63f7194d..f3358e68 100644 Binary files a/diylc/diylc-swing/library/main.jar and b/diylc/diylc-swing/library/main.jar differ diff --git a/diylc/diylc-swing/update.xml b/diylc/diylc-swing/update.xml index a9ffc4b8..b00f5e6c 100644 --- a/diylc/diylc-swing/update.xml +++ b/diylc/diylc-swing/update.xml @@ -2598,6 +2598,10 @@ IMPROVEMENT Cleaner and more compact XML format for .DIY files resulting in files about half the size of originals. Backward compatible with older files, but might introduce issues when opening files from the new version using an old version! + + IMPROVEMENT + Detect when a file is created with a newer version of DIYLC and show a warning + BUG_FIX "Highlight Connected Areas" doesn't follow multiple chained wires and jumpers