diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/ComparatorFactory.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/ComparatorFactory.java index 3a39690e..3e87145a 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/ComparatorFactory.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/ComparatorFactory.java @@ -1,7 +1,6 @@ package org.diylc.presenter; import java.util.Comparator; -import java.util.List; import org.diylc.common.ComponentType; import org.diylc.common.PropertyWrapper; @@ -14,6 +13,7 @@ public class ComparatorFactory { private Comparator> componentNameComparator; private Comparator componentTypeComparator; private Comparator propertyNameComparator; + private Comparator> componentZOrderComparator; public static ComparatorFactory getInstance() { if (instance == null) { @@ -53,20 +53,6 @@ public class ComparatorFactory { return componentTypeComparator; } - public Comparator> getComponentZOrderComparator( - final List> components) { - Comparator> componentZOrderComparator = new Comparator>() { - - @Override - public int compare(IDIYComponent o1, IDIYComponent o2) { - int index1 = components.indexOf(o1); - int index2 = components.indexOf(o2); - return new Integer(index1).compareTo(index2); - } - }; - return componentZOrderComparator; - } - public Comparator getPropertyNameComparator() { if (propertyNameComparator == null) { propertyNameComparator = new Comparator() { @@ -80,4 +66,23 @@ public class ComparatorFactory { } return propertyNameComparator; } + + public Comparator> getComponentZOrderComparator() { + if (componentZOrderComparator == null) { + componentZOrderComparator = new Comparator>() { + + @Override + public int compare(IDIYComponent o1, IDIYComponent o2) { + ComponentType type1 = ComponentProcessor.getInstance() + .extractComponentTypeFrom( + (Class>) o1.getClass()); + ComponentType type2 = ComponentProcessor.getInstance() + .extractComponentTypeFrom( + (Class>) o2.getClass()); + return new Double(type1.getZOrder()).compareTo(type2.getZOrder()); + } + }; + } + return componentZOrderComparator; + } } diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/ComponentProcessor.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/ComponentProcessor.java index 95fa95a2..d98c59fa 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/ComponentProcessor.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/ComponentProcessor.java @@ -36,6 +36,7 @@ public class ComponentProcessor { private static ComponentProcessor instance; private Map, List> propertyCache; + private Map componentTypeMap; private Cloner cloner; @@ -50,9 +51,13 @@ public class ComponentProcessor { super(); this.cloner = new Cloner(); this.propertyCache = new HashMap, List>(); + this.componentTypeMap = new HashMap(); } - public ComponentType createComponentTypeFrom(Class> clazz) { + public ComponentType extractComponentTypeFrom(Class> clazz) { + if (componentTypeMap.containsKey(clazz.getName())) { + return componentTypeMap.get(clazz.getName()); + } String name; String description; CreationMethod creationMethod; @@ -101,6 +106,7 @@ public class ComponentProcessor { } ComponentType componentType = new ComponentType(name, description, creationMethod, category, namePrefix, author, icon, clazz, zOrder, stretchable); + componentTypeMap.put(clazz.getName(), componentType); return componentType; } diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/ComponentZOrderFiler.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/ComponentZOrderFiler.java index 7ff1ab09..5410f1df 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/ComponentZOrderFiler.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/ComponentZOrderFiler.java @@ -16,7 +16,7 @@ public class ComponentZOrderFiler implements IComponentFiler { @SuppressWarnings("unchecked") @Override public boolean testComponent(IDIYComponent component) { - ComponentType componentType = ComponentProcessor.getInstance().createComponentTypeFrom( + ComponentType componentType = ComponentProcessor.getInstance().extractComponentTypeFrom( (Class>) component.getClass()); return Math.round(componentType.getZOrder()) == zOrder; } diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/DrawingManager.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/DrawingManager.java index c2a1af3a..25232ecd 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/DrawingManager.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/DrawingManager.java @@ -11,7 +11,6 @@ import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.geom.Area; import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -283,14 +282,12 @@ public class DrawingManager { public List> findComponentsAt(Point point, Project project) { List> components = new ArrayList>(); - for (Map.Entry, Area> entry : componentAreaMap.entrySet()) { - if (entry.getValue().contains(point)) { - components.add(entry.getKey()); + for (int i = 0; i < project.getComponents().size(); i++) { + Area area = componentAreaMap.get(project.getComponents().get(i)); + if (area != null && area.contains(point)) { + components.add(project.getComponents().get(i)); } } - // Sort by z-order. - Collections.sort(components, ComparatorFactory.getInstance().getComponentZOrderComparator( - project.getComponents())); return components; } diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/Presenter.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/Presenter.java index 3b9b68e4..5e0bf008 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/Presenter.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/Presenter.java @@ -59,7 +59,6 @@ public class Presenter implements IPlugInPort { private Project currentProject; private Map> componentTypes; // Maps component class names to ComponentType objects. - private Map componentTypeMap; private List plugIns; private ComponentSelection selectedComponents; @@ -266,14 +265,12 @@ public class Presenter implements IPlugInPort { if (componentTypes == null) { LOG.info("Loading component types."); componentTypes = new HashMap>(); - componentTypeMap = new HashMap(); List> componentTypeClasses = JarScanner.getInstance().scanFolder("library/", IDIYComponent.class); for (Class clazz : componentTypeClasses) { if (!Modifier.isAbstract(clazz.getModifiers())) { ComponentType componentType = ComponentProcessor.getInstance() - .createComponentTypeFrom((Class>) clazz); - componentTypeMap.put(componentType.getInstanceClass().getName(), componentType); + .extractComponentTypeFrom((Class>) clazz); List nestedList; if (componentTypes.containsKey(componentType.getCategory())) { nestedList = componentTypes.get(componentType.getCategory()); @@ -456,7 +453,9 @@ public class Presenter implements IPlugInPort { // Go backwards so we take the highest z-order components first. for (int i = currentProject.getComponents().size() - 1; i >= 0; i--) { IDIYComponent component = currentProject.getComponents().get(i); - ComponentType componentType = componentTypeMap.get(component.getClass().getName()); + ComponentType componentType = ComponentProcessor.getInstance() + .extractComponentTypeFrom( + (Class>) component.getClass()); for (int pointIndex = 0; pointIndex < component.getControlPointCount(); pointIndex++) { Point controlPoint = component.getControlPoint(pointIndex); // Only consider selected components that are not grouped. @@ -590,7 +589,9 @@ public class Presenter implements IPlugInPort { int oldSize = controlPointMap.size(); LOG.debug("Expanding selected component map"); for (IDIYComponent component : currentProject.getComponents()) { - ComponentType componentType = componentTypeMap.get(component.getClass().getName()); + ComponentType componentType = ComponentProcessor.getInstance() + .extractComponentTypeFrom( + (Class>) component.getClass()); // Do not process a component if it's already in the map and if it's // locked. @@ -786,7 +787,8 @@ public class Presenter implements IPlugInPort { .getGridSpacing().convertToPixels()); component.setControlPoint(point, i); } - addComponent(component, componentTypeMap.get(component.getClass().getName())); + addComponent(component, ComponentProcessor.getInstance().extractComponentTypeFrom( + (Class>) component.getClass())); } messageDispatcher.dispatchMessage(EventType.PROJECT_MODIFIED, oldProject, cloner .deepClone(currentProject), "Add"); @@ -982,8 +984,10 @@ public class Presenter implements IPlugInPort { private void addComponent(IDIYComponent component, ComponentType componentType) { int index = 0; while (index < currentProject.getComponents().size() - && componentType.getZOrder() >= componentTypeMap.get( - currentProject.getComponents().get(index).getClass().getName()).getZOrder()) { + && componentType.getZOrder() >= ComponentProcessor.getInstance() + .extractComponentTypeFrom( + (Class>) currentProject.getComponents() + .get(index).getClass()).getZOrder()) { index++; } if (index < currentProject.getComponents().size()) { @@ -1104,7 +1108,8 @@ public class Presenter implements IPlugInPort { } private boolean isComponentLocked(IDIYComponent component) { - ComponentType componentType = componentTypeMap.get(component.getClass().getName()); + ComponentType componentType = ComponentProcessor.getInstance().extractComponentTypeFrom( + (Class>) component.getClass()); return currentProject.getLockedLayers().contains( (int) Math.round(componentType.getZOrder())); } diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/ProjectFileManager.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/ProjectFileManager.java index 280b7e83..b0c609eb 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/ProjectFileManager.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/ProjectFileManager.java @@ -7,7 +7,9 @@ import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; @@ -26,6 +28,7 @@ import org.diylc.components.connectivity.SolderPad; import org.diylc.components.passive.RadialFilmCapacitor; import org.diylc.components.passive.Resistor; import org.diylc.components.semiconductors.DIL_IC; +import org.diylc.components.semiconductors.DiodePlastic; import org.diylc.core.IDIYComponent; import org.diylc.core.Project; import org.diylc.core.measures.Capacitance; @@ -49,6 +52,15 @@ public class ProjectFileManager { private static final int V1_PIXELS_PER_INCH = 200; private static final Size V1_GRID_SPACING = new Size(0.1d, SizeUnit.in); + private static final Map V1_COLOR_MAP = new HashMap(); + static { + V1_COLOR_MAP.put("red", Color.red); + V1_COLOR_MAP.put("blue", Color.blue); + V1_COLOR_MAP.put("white", Color.white); + V1_COLOR_MAP.put("green", Color.green.darker()); + V1_COLOR_MAP.put("black", Color.black); + V1_COLOR_MAP.put("yellow", Color.yellow); + } private XStream xStream = new XStream(new DomDriver()); @@ -73,8 +85,8 @@ public class ProjectFileManager { fireFileStatusChanged(); } - public Project deserializeProjectFromFile(String fileName, List warnings) throws SAXException, IOException, - ParserConfigurationException { + public Project deserializeProjectFromFile(String fileName, List warnings) + throws SAXException, IOException, ParserConfigurationException { LOG.info(String.format("loadProjectFromFile(%s)", fileName)); Project project; File file = new File(fileName); @@ -176,6 +188,11 @@ public class ProjectFileManager { Point point2 = null; Integer x2Attr = null; Integer y2Attr = null; + Color color = null; + if (node.getAttributes().getNamedItem("Color") != null) { + String colorAttr = node.getAttributes().getNamedItem("Color").getNodeValue(); + color = V1_COLOR_MAP.get(colorAttr.toLowerCase()); + } if (node.getAttributes().getNamedItem("X2") != null && node.getAttributes().getNamedItem("Y2") != null) { x2Attr = Integer.parseInt(node.getAttributes().getNamedItem("X2") @@ -187,18 +204,21 @@ public class ProjectFileManager { IDIYComponent component = null; if (nodeName.equalsIgnoreCase("pad")) { LOG.debug("Recognized " + nodeName); - String colorAttr = node.getAttributes().getNamedItem("Color").getNodeValue(); SolderPad pad = new SolderPad(); pad.setName(nameAttr); - // pad.setColor(Color.getColor(colorAttr)); + if (color != null) { + pad.setColor(color); + } pad.setControlPoint(convertV1CoordinatesToV3Point(referencePoint, x1Attr, y1Attr), 0); component = pad; } else if (nodeName.equalsIgnoreCase("trace")) { LOG.debug("Recognized " + nodeName); - String colorAttr = node.getAttributes().getNamedItem("Color").getNodeValue(); CopperTrace trace = new CopperTrace(); trace.setName(nameAttr); + if (color != null) { + trace.setLeadColor(color); + } trace.setControlPoint(point1, 0); trace.setControlPoint(point2, 1); component = trace; @@ -237,6 +257,20 @@ public class ProjectFileManager { capacitor.setControlPoint(point1, 0); capacitor.setControlPoint(point2, 1); component = capacitor; + } else if (nodeName.equalsIgnoreCase("diode")) { + LOG.debug("Recognized " + nodeName); + DiodePlastic capacitor = new DiodePlastic(); + capacitor.setName(nameAttr); + try { + capacitor.setValue(valueAttr); + } catch (Exception e) { + LOG.debug("Could not set value of " + nameAttr); + } + capacitor.setWidth(new Size(6d, SizeUnit.mm)); + capacitor.setHeight(new Size(2d, SizeUnit.mm)); + capacitor.setControlPoint(point1, 0); + capacitor.setControlPoint(point2, 1); + component = capacitor; } else if (nodeName.equalsIgnoreCase("ic")) { LOG.debug("Recognized " + nodeName); DIL_IC ic = new DIL_IC(); @@ -253,11 +287,16 @@ public class ProjectFileManager { } } ic.setName(nameAttr); - ic.setControlPoint(point1, 0); + // Translate control points. + for (int j = 0; j < ic.getControlPointCount(); j++) { + Point p = new Point(ic.getControlPoint(j)); + p.translate(point1.x, point1.y); + ic.setControlPoint(p, j); + } ic.setValue(valueAttr); component = ic; } else { - String message = "Could not recognize component type " + nodeName; + String message = "Could not recognize component type " + nodeName; LOG.debug(message); if (!warnings.contains(message)) { warnings.add(message); @@ -268,6 +307,8 @@ public class ProjectFileManager { } } } + Collections.sort(project.getComponents(), ComparatorFactory.getInstance() + .getComponentZOrderComparator()); return project; }