diff --git a/diylc/diylc-core/src/org/diylc/common/INetlistProcessor.java b/diylc/diylc-core/src/org/diylc/common/INetlistProcessor.java index 8e09dfd0..6b890c01 100644 --- a/diylc/diylc-core/src/org/diylc/common/INetlistProcessor.java +++ b/diylc/diylc-core/src/org/diylc/common/INetlistProcessor.java @@ -22,12 +22,10 @@ package org.diylc.common; import java.util.List; -import java.util.Map; import org.diylc.netlist.Netlist; -import org.diylc.netlist.SwitchSetup; public interface INetlistProcessor { - Map> extractNetlists(); + List extractNetlists(); } diff --git a/diylc/diylc-core/src/org/diylc/netlist/Group.java b/diylc/diylc-core/src/org/diylc/netlist/Group.java index 1c4730f7..666eba44 100644 --- a/diylc/diylc-core/src/org/diylc/netlist/Group.java +++ b/diylc/diylc-core/src/org/diylc/netlist/Group.java @@ -21,7 +21,10 @@ */ package org.diylc.netlist; +import java.util.ArrayList; +import java.util.Collections; import java.util.HashSet; +import java.util.List; import java.util.Set; /** @@ -29,7 +32,7 @@ import java.util.Set; * * @author Branislav Stojkovic */ -public class Group { +public class Group implements Comparable { private Set nodes = new HashSet(); @@ -41,6 +44,12 @@ public class Group { public Set getNodes() { return nodes; } + + public List getSortedNodes() { + List list = new ArrayList(nodes); + Collections.sort(list); + return list; + } @Override public int hashCode() { @@ -70,11 +79,17 @@ public class Group { @Override public String toString() { StringBuilder sb = new StringBuilder(); - for (Node n : nodes) { + List list = getSortedNodes(); + for (Node n : list) { if (sb.length() > 0) sb.append(" <-> "); sb.append(n); } return sb.toString(); } + + @Override + public int compareTo(Group o) { + return toString().compareToIgnoreCase(o.toString()); + } } diff --git a/diylc/diylc-core/src/org/diylc/netlist/Netlist.java b/diylc/diylc-core/src/org/diylc/netlist/Netlist.java index abef51a8..5b6a7e11 100644 --- a/diylc/diylc-core/src/org/diylc/netlist/Netlist.java +++ b/diylc/diylc-core/src/org/diylc/netlist/Netlist.java @@ -21,24 +21,38 @@ */ package org.diylc.netlist; +import java.util.ArrayList; +import java.util.Collections; import java.util.HashSet; +import java.util.List; import java.util.Set; -public class Netlist { +public class Netlist implements Comparable { private Set groups = new HashSet(); + private List switchSetup = new ArrayList(); - public Netlist() { + public Netlist() { } public Set getGroups() { return groups; } - public boolean verticesMatch(Netlist other) { - return this.groups.equals(other.groups); + public List getSortedGroups() { + List list = new ArrayList(groups); + Collections.sort(list); + return list; } + public List getSwitchSetup() { + return switchSetup; + } + + public void done() { + Collections.sort(switchSetup); + } + @Override public int hashCode() { final int prime = 31; @@ -67,9 +81,15 @@ public class Netlist { @Override public String toString() { StringBuilder sb = new StringBuilder(); - for (Group v : groups) { - sb.append("\t").append(v).append("\n"); + List list = getSortedGroups(); + for (Group g : list) { + sb.append("\t").append(g).append("\n"); } return sb.toString(); } + + @Override + public int compareTo(Netlist o) { + return switchSetup.toString().compareToIgnoreCase(o.switchSetup.toString()); + } } diff --git a/diylc/diylc-core/src/org/diylc/netlist/Node.java b/diylc/diylc-core/src/org/diylc/netlist/Node.java index bf5b4e8f..29eee7b6 100644 --- a/diylc/diylc-core/src/org/diylc/netlist/Node.java +++ b/diylc/diylc-core/src/org/diylc/netlist/Node.java @@ -28,7 +28,7 @@ import org.diylc.core.IDIYComponent; * * @author Branislav Stojkovic */ -public class Node { +public class Node implements Comparable { private IDIYComponent component; private int pointIndex; @@ -79,4 +79,9 @@ public class Node { public String toString() { return component.getName() + "." + component.getControlPointNodeName(pointIndex) /*+ " @ (" + component.getControlPoint(pointIndex).getX() + ":" + component.getControlPoint(pointIndex).getY() + ")"*/; } + + @Override + public int compareTo(Node o) { + return toString().compareToIgnoreCase(o.toString()); + } } diff --git a/diylc/diylc-core/src/org/diylc/netlist/Position.java b/diylc/diylc-core/src/org/diylc/netlist/Position.java index d2015f14..c6e3d651 100644 --- a/diylc/diylc-core/src/org/diylc/netlist/Position.java +++ b/diylc/diylc-core/src/org/diylc/netlist/Position.java @@ -29,7 +29,7 @@ import org.diylc.core.ISwitch; * * @author Branislav Stojkovic */ -public class Position { +public class Position implements Comparable { private ISwitch theSwitch; private int position; @@ -80,4 +80,11 @@ public class Position { public String toString() { return (theSwitch instanceof IDIYComponent ? ((IDIYComponent) theSwitch).getName() + "." : "") + theSwitch.getPositionName(position); } + + @Override + public int compareTo(Position o) { + if (theSwitch instanceof IDIYComponent && o.theSwitch instanceof IDIYComponent) + return ((IDIYComponent) theSwitch).getName().compareToIgnoreCase(((IDIYComponent) o.theSwitch).getName()); + return 0; + } } diff --git a/diylc/diylc-core/src/org/diylc/netlist/SwitchSetup.java b/diylc/diylc-core/src/org/diylc/netlist/SwitchSetup.java index 078d7f48..b75f8657 100644 --- a/diylc/diylc-core/src/org/diylc/netlist/SwitchSetup.java +++ b/diylc/diylc-core/src/org/diylc/netlist/SwitchSetup.java @@ -21,6 +21,7 @@ */ package org.diylc.netlist; +import java.util.Collections; import java.util.List; /** @@ -28,13 +29,14 @@ import java.util.List; * * @author Branislav Stojkovic */ -public class SwitchSetup { +public class SwitchSetup implements Comparable { private List positions; public SwitchSetup(List positions) { super(); this.positions = positions; + Collections.sort(this.positions); } public List getPositions() { @@ -77,4 +79,9 @@ public class SwitchSetup { } return sb.toString(); } + + @Override + public int compareTo(SwitchSetup o) { + return toString().compareToIgnoreCase(o.toString()); + } } diff --git a/diylc/diylc-core/src/org/diylc/presenter/Presenter.java b/diylc/diylc-core/src/org/diylc/presenter/Presenter.java index 05b79538..89c249fa 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/Presenter.java +++ b/diylc/diylc-core/src/org/diylc/presenter/Presenter.java @@ -2687,8 +2687,8 @@ public class Presenter implements IPlugInPort { @SuppressWarnings("unchecked") @Override - public Map> extractNetlists() { - Map> result = new HashMap>(); + public List extractNetlists() { + Map result = new HashMap(); List nodes = new ArrayList(); List switches = new ArrayList(); @@ -2756,11 +2756,10 @@ public class Presenter implements IPlugInPort { // merge graphs that are effectivelly the same if (result.containsKey(graph)) { - result.get(graph).add(new SwitchSetup(posList)); - } else { - List list = new ArrayList(); - list.add(new SwitchSetup(posList)); - result.put(graph, list); + result.get(graph).getSwitchSetup().add(new SwitchSetup(posList)); + } else { + graph.getSwitchSetup().add(new SwitchSetup(posList)); + result.put(graph, graph); } // find the next combination if possible @@ -2777,13 +2776,18 @@ public class Presenter implements IPlugInPort { } } } - - return result; + + // sort everything alphabetically + List netlists = new ArrayList(result.keySet()); + Collections.sort(netlists); + + return netlists; } private Netlist constructGraph(List nodes, List connections, List continuityAreas) { - Netlist graph = new Netlist(); + Netlist netlist = new Netlist(); +// debugging code // StringBuilder sb = new StringBuilder(); // sb.append("Nodes:").append("\n"); // for (Node n : nodes) { @@ -2809,20 +2813,22 @@ public class Presenter implements IPlugInPort { checkGraphConnection(point2, point1, connections, continuityAreas, new boolean[connections.size()])) { boolean added = false; // add to an existing vertex if possible - for (Group v :graph.getGroups()) - if (v.getNodes().contains(node1)) { - v.getNodes().add(node2); + for (Group g : netlist.getGroups()) + if (g.getNodes().contains(node1)) { + g.getNodes().add(node2); added = true; - } else if (v.getNodes().contains(node2)) { - v.getNodes().add(node1); + } else if (g.getNodes().contains(node2)) { + g.getNodes().add(node1); added = true; } if (!added) - graph.getGroups().add(new Group(node1, node2)); + netlist.getGroups().add(new Group(node1, node2)); } } - return graph; + netlist.done(); + + return netlist; } private boolean checkGraphConnection(Point2D point1, Point2D point2, List connections, diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar index 065d044f..13389c9d 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/electromechanical/ClosedJack1_4.java b/diylc/diylc-library/src/org/diylc/components/electromechanical/ClosedJack1_4.java index 3a0d7805..e6e7f9dd 100644 --- a/diylc/diylc-library/src/org/diylc/components/electromechanical/ClosedJack1_4.java +++ b/diylc/diylc-library/src/org/diylc/components/electromechanical/ClosedJack1_4.java @@ -350,5 +350,18 @@ public class ClosedJack1_4 extends AbstractMultiPartComponent { public void setOrientation(Orientation orientation) { this.orientation = orientation; updateControlPoints(); + } + + @Override + public String getControlPointNodeName(int index) { + switch (index) { + case 0: + return "Tip"; + case 1: + return "Sleeve"; + case 2: + return "Ring"; + } + return null; } } diff --git a/diylc/diylc-library/src/org/diylc/components/guitar/SingleCoilPickup.java b/diylc/diylc-library/src/org/diylc/components/guitar/SingleCoilPickup.java index 577fb102..534f6add 100644 --- a/diylc/diylc-library/src/org/diylc/components/guitar/SingleCoilPickup.java +++ b/diylc/diylc-library/src/org/diylc/components/guitar/SingleCoilPickup.java @@ -238,7 +238,7 @@ public class SingleCoilPickup extends AbstractTransparentComponent { // terminal labels Point[] points = getControlPoints(); - g2d.setColor(finalBorderColor); + g2d.setColor(darkerOrLighter(baseColor)); g2d.setFont(project.getFont().deriveFont(TERMINAL_FONT_SIZE * 1f)); int dx = 0; diff --git a/diylc/diylc-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar index 065d044f..13389c9d 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 904c3f8c..b02a5ebb 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/src/org/diylc/swing/ActionFactory.java b/diylc/diylc-swing/src/org/diylc/swing/ActionFactory.java index b7ef4380..4765eff7 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/ActionFactory.java +++ b/diylc/diylc-swing/src/org/diylc/swing/ActionFactory.java @@ -18,7 +18,6 @@ package org.diylc.swing; import java.awt.Dimension; -import java.awt.Font; import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.ClipboardOwner; @@ -66,7 +65,6 @@ import org.diylc.core.measures.SizeUnit; import org.diylc.images.IconLoader; import org.diylc.netlist.Group; import org.diylc.netlist.Netlist; -import org.diylc.netlist.SwitchSetup; import org.diylc.presenter.Presenter; import org.diylc.swing.gui.DialogFactory; import org.diylc.swing.gui.editor.PropertyEditorDialog; @@ -77,12 +75,10 @@ import org.diylc.swing.plugins.file.FileFilterEnum; import org.diylc.swingframework.ButtonDialog; import org.diylc.swingframework.CheckBoxListDialog; import org.diylc.swingframework.IDrawingProvider; -import org.diylc.swingframework.TextDialog; import org.diylc.swingframework.export.DrawingExporter; +import org.diylc.swingframework.text.TextDialog; import org.diylc.utils.BomEntry; -import sun.java2d.pipe.hw.ExtendedBufferCapabilities.VSyncType; - import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.xml.DomDriver; @@ -709,14 +705,12 @@ public class ActionFactory { private static final long serialVersionUID = 1L; private ISwingUI swingUI; - private IPlugInPort plugInPort; private Map typeMap = new TreeMap(String.CASE_INSENSITIVE_ORDER); public ExportVariantsAction(ISwingUI swingUI, IPlugInPort plugInPort) { super(); this.swingUI = swingUI; - this.plugInPort = plugInPort; putValue(AbstractAction.NAME, "Export Variants"); Map> componentTypes = plugInPort.getComponentTypes(); @@ -1657,24 +1651,34 @@ public class ActionFactory { super(); this.plugInPort = plugInPort; this.swingUI = swingUI; - putValue(AbstractAction.NAME, "Create Netlist"); + putValue(AbstractAction.NAME, "Create Netlist (beta)"); putValue(AbstractAction.SMALL_ICON, IconLoader.Web.getIcon()); } @Override public void actionPerformed(ActionEvent e) { - Map> g = plugInPort.extractNetlists(); - if (g == null) + List res = plugInPort.extractNetlists(); + if (res == null) { + swingUI.showMessage("The generated netlist is empty, nothing to show.", "Netlist", ISwingUI.INFORMATION_MESSAGE); return; - StringBuilder sb = new StringBuilder("

"); - for (Map.Entry> en : g.entrySet()) { - sb.append("").append(en.getValue()).append("
"); - for (Group v : en.getKey().getGroups()) { - sb.append(v).append("
"); - } - sb.append("
"); } - sb.append("

"); + StringBuilder sb = new StringBuilder(""); + + for (Netlist netlist : res) { + sb.append("

Switch configuration: ").append(netlist.getSwitchSetup()).append("

Connected node groups:
"); + for (Group v : netlist.getSortedGroups()) { +// boolean first = true; +// for (Node n : v.getSortedNodes()) { +// if (!first) +// sb.append(" <-> "); +// first = false; +// +// } + sb.append("  ").append(v.getSortedNodes()).append("
"); + } + sb.append("



"); + } + sb.append(""); new TextDialog(swingUI.getOwnerFrame().getRootPane(), sb.toString(), "Netlist", new Dimension(600, 480)).setVisible(true); } diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/file/FileMenuPlugin.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/file/FileMenuPlugin.java index fa7e6ec3..73fb0eaf 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/file/FileMenuPlugin.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/file/FileMenuPlugin.java @@ -47,7 +47,8 @@ public class FileMenuPlugin implements IPlugIn, IDynamicSubmenuHandler { private static final String FILE_TITLE = "File"; private static final String TRACE_MASK_TITLE = "Trace Mask"; - private static final String INTEGRATION_TITLE = "Integration"; + private static final String INTEGRATION_TITLE = "Integration"; + private static final String ANALYZE_TITLE = "Analyze"; private ProjectDrawingProvider drawingProvider; private TraceMaskDrawingProvider traceMaskDrawingProvider; @@ -84,9 +85,10 @@ public class FileMenuPlugin implements IPlugIn, IDynamicSubmenuHandler { swingUI.injectMenuAction(actionFactory.createExportPNGAction(plugInPort, traceMaskDrawingProvider, swingUI, " (mask)"), TRACE_MASK_TITLE); swingUI.injectMenuAction( actionFactory.createPrintAction(traceMaskDrawingProvider, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask() - | KeyEvent.SHIFT_DOWN_MASK), TRACE_MASK_TITLE); - swingUI.injectMenuAction(actionFactory.createBomAction(plugInPort), FILE_TITLE); - swingUI.injectMenuAction(actionFactory.createGenerateNetlistAction(plugInPort, swingUI), FILE_TITLE); + | KeyEvent.SHIFT_DOWN_MASK), TRACE_MASK_TITLE); + swingUI.injectSubmenu(ANALYZE_TITLE, IconLoader.Node.getIcon(), FILE_TITLE); + swingUI.injectMenuAction(actionFactory.createBomAction(plugInPort), ANALYZE_TITLE); + swingUI.injectMenuAction(actionFactory.createGenerateNetlistAction(plugInPort, swingUI), ANALYZE_TITLE); swingUI.injectMenuAction(null, FILE_TITLE); swingUI.injectSubmenu(INTEGRATION_TITLE, IconLoader.Node.getIcon(), FILE_TITLE); swingUI.injectMenuAction(actionFactory.createImportBlocksAction(swingUI, plugInPort), INTEGRATION_TITLE);