diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/.classpath b/ diy-layout-creator --username bancika@gmail.com/DIYLC/.classpath index e90d9199..a620e108 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/.classpath +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/.classpath @@ -13,5 +13,6 @@ + diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/library/main.jar b/ diy-layout-creator --username bancika@gmail.com/DIYLC/library/main.jar index 46525bc2..16d4375d 100644 Binary files a/ diy-layout-creator --username bancika@gmail.com/DIYLC/library/main.jar and b/ diy-layout-creator --username bancika@gmail.com/DIYLC/library/main.jar differ diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/components/AbstractComponent.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/components/AbstractComponent.java index 32ee99d7..414c63c3 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/components/AbstractComponent.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/components/AbstractComponent.java @@ -15,7 +15,7 @@ public abstract class AbstractComponent implements IDIYComponent { private static final long serialVersionUID = 1L; - protected String name; + protected String name = ""; @EditableProperty(defaultable = false) @Override diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Capacitance.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Capacitance.java index 6c1a12ac..4e2e79c3 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Capacitance.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Capacitance.java @@ -18,4 +18,14 @@ public class Capacitance extends AbstractMeasure { public Capacitance clone() throws CloneNotSupportedException { return new Capacitance(value, unit); } + + public static Capacitance parseCapacitance(String value) { + for (CapacitanceUnit unit : CapacitanceUnit.values()) { + if (value.toLowerCase().endsWith(unit.toString().toLowerCase())) { + value = value.substring(0, value.length() - unit.toString().length() - 1).trim(); + return new Capacitance(Double.parseDouble(value), unit); + } + } + throw new IllegalArgumentException("Could not parse capacitance: " + value); + } } diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Inductance.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Inductance.java index a805feab..af598a2a 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Inductance.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Inductance.java @@ -18,4 +18,14 @@ public class Inductance extends AbstractMeasure { public Inductance clone() throws CloneNotSupportedException { return new Inductance(value, unit); } + + public static Inductance parseCapacitance(String value) { + for (InductanceUnit unit : InductanceUnit.values()) { + if (value.toLowerCase().endsWith(unit.toString().toLowerCase())) { + value = value.substring(0, value.length() - unit.toString().length() - 1).trim(); + return new Inductance(Double.parseDouble(value), unit); + } + } + throw new IllegalArgumentException("Could not parse inductance: " + value); + } } diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Resistance.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Resistance.java index 89161c7f..b897ace8 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Resistance.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Resistance.java @@ -18,4 +18,14 @@ public class Resistance extends AbstractMeasure { public Resistance clone() throws CloneNotSupportedException { return new Resistance(value, unit); } + + public static Resistance parseResistance(String value) { + for (ResistanceUnit unit : ResistanceUnit.values()) { + if (value.toLowerCase().endsWith(unit.toString().toLowerCase())) { + value = value.substring(0, value.length() - unit.toString().length() - 1).trim(); + return new Resistance(Double.parseDouble(value), unit); + } + } + throw new IllegalArgumentException("Could not parse resistance: " + value); + } } diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Size.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Size.java index 3be1be08..ec3b06a3 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Size.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Size.java @@ -29,4 +29,14 @@ public class Size extends AbstractMeasure { public Size clone() throws CloneNotSupportedException { return new Size(value, unit); } + + public static Size parseSize(String value) { + for (SizeUnit unit : SizeUnit.values()) { + if (value.toLowerCase().endsWith(unit.toString().toLowerCase())) { + value = value.substring(0, value.length() - unit.toString().length() - 1).trim(); + return new Size(Double.parseDouble(value), unit); + } + } + throw new IllegalArgumentException("Could not parse size: " + value); + } } diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/FileManager.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/FileManager.java deleted file mode 100644 index e69de29b..00000000 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 3dcb91d6..24ec4e7d 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 @@ -7,10 +7,6 @@ import java.awt.Point; import java.awt.Rectangle; import java.awt.geom.Area; import java.awt.geom.Point2D; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Modifier; import java.util.ArrayList; @@ -51,8 +47,6 @@ import com.diyfever.gui.miscutils.Utils; import com.diyfever.gui.simplemq.MessageDispatcher; import com.diyfever.gui.update.VersionNumber; import com.rits.cloning.Cloner; -import com.thoughtworks.xstream.XStream; -import com.thoughtworks.xstream.io.xml.DomDriver; /** * The main presenter class, contains core app logic and drawing routines. @@ -72,8 +66,6 @@ public class Presenter implements IPlugInPort { private double zoomLevel = ConfigurationManager.getInstance().readDouble(ZOOM_KEY, 1d); private Project currentProject; - private String currentFileName = null; - private boolean modified = false; private Map> componentTypes; // Maps component class names to ComponentType objects. private Map componentTypeMap; @@ -86,8 +78,8 @@ public class Presenter implements IPlugInPort { // Utilities private Cloner cloner; - private XStream xStream = new XStream(new DomDriver()); private ProjectPainter projectPainter; + private ProjectFileManager projectFileManager; private Rectangle selectionRect; @@ -121,6 +113,7 @@ public class Presenter implements IPlugInPort { currentProject = new Project(); cloner = new Cloner(); projectPainter = new ProjectPainter(); + projectFileManager = new ProjectFileManager(); // lockedLayers = EnumSet.noneOf(ComponentLayer.class); // visibleLayers = EnumSet.allOf(ComponentLayer.class); @@ -203,8 +196,6 @@ public class Presenter implements IPlugInPort { Project project = new Project(); setDefaultProperties(project); loadProject(project, true); - this.currentFileName = null; - this.modified = false; fireFileStatusChanged(); } catch (Exception e) { LOG.error("Could not create new file", e); @@ -217,18 +208,10 @@ public class Presenter implements IPlugInPort { public void loadProjectFromFile(String fileName) { LOG.info(String.format("loadProjectFromFile(%s)", fileName)); try { - FileInputStream fis = new FileInputStream(fileName); - Project project = (Project) xStream.fromXML(fis); + Project project = (Project) projectFileManager.deserializeProjectFromFile(fileName); loadProject(project, true); - fis.close(); - this.currentFileName = fileName; - this.modified = false; fireFileStatusChanged(); - } catch (FileNotFoundException ex) { - LOG.error("Could not load file", ex); - view.showMessage("Could not open file, " + fileName + " does not exist.", "Error", - JOptionPane.ERROR_MESSAGE); - } catch (IOException ex) { + } catch (Exception ex) { LOG.error("Could not load file", ex); view.showMessage("Could not open file " + fileName + ". Check the log for details.", "Error", JOptionPane.ERROR_MESSAGE); @@ -237,7 +220,7 @@ public class Presenter implements IPlugInPort { @Override public boolean allowFileAction() { - if (this.modified) { + if (projectFileManager.isModified()) { int response = view.showConfirmDialog( "There are unsaved changes. Are you sure you want to abandon these changes?", "Warning", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE); @@ -249,13 +232,8 @@ public class Presenter implements IPlugInPort { @Override public void saveProjectToFile(String fileName) { LOG.info(String.format("saveProjectToFile(%s)", fileName)); - FileOutputStream fos; try { - fos = new FileOutputStream(fileName); - xStream.toXML(currentProject, fos); - fos.close(); - this.currentFileName = fileName; - this.modified = false; + projectFileManager.serializeProjectToFile(currentProject, fileName); fireFileStatusChanged(); } catch (Exception ex) { LOG.error("Could not save file", ex); @@ -266,12 +244,12 @@ public class Presenter implements IPlugInPort { @Override public String getCurrentFileName() { - return this.currentFileName; + return projectFileManager.getCurrentFileName(); } @Override public boolean isProjectModified() { - return this.modified; + return projectFileManager.isModified(); } @SuppressWarnings("unchecked") @@ -749,7 +727,7 @@ public class Presenter implements IPlugInPort { if (!preDragProject.equals(currentProject)) { messageDispatcher.dispatchMessage(EventType.PROJECT_MODIFIED, preDragProject, cloner .deepClone(currentProject), "Drag"); - this.modified = true; + projectFileManager.notifyFileChange(); fireFileStatusChanged(); } fireSelectionChanged(); @@ -774,7 +752,7 @@ public class Presenter implements IPlugInPort { selectedComponents.addAll(components); messageDispatcher.dispatchMessage(EventType.PROJECT_MODIFIED, oldProject, cloner .deepClone(currentProject), "Add"); - this.modified = true; + projectFileManager.notifyFileChange(); fireFileStatusChanged(); fireSelectionChanged(); messageDispatcher.dispatchMessage(EventType.REPAINT); @@ -794,7 +772,7 @@ public class Presenter implements IPlugInPort { this.selectedComponents.clear(); messageDispatcher.dispatchMessage(EventType.PROJECT_MODIFIED, oldProject, cloner .deepClone(currentProject), "Delete"); - this.modified = true; + projectFileManager.notifyFileChange(); fireFileStatusChanged(); fireSelectionChanged(); messageDispatcher.dispatchMessage(EventType.REPAINT); @@ -839,7 +817,7 @@ public class Presenter implements IPlugInPort { if (!oldProject.equals(currentProject)) { messageDispatcher.dispatchMessage(EventType.PROJECT_MODIFIED, oldProject, cloner .deepClone(currentProject), "Group"); - this.modified = true; + projectFileManager.notifyFileChange(); fireFileStatusChanged(); } } @@ -854,7 +832,7 @@ public class Presenter implements IPlugInPort { if (!oldProject.equals(currentProject)) { messageDispatcher.dispatchMessage(EventType.PROJECT_MODIFIED, oldProject, cloner .deepClone(currentProject), "Group"); - this.modified = true; + projectFileManager.notifyFileChange(); fireFileStatusChanged(); } } @@ -876,8 +854,8 @@ public class Presenter implements IPlugInPort { } private void fireFileStatusChanged() { - messageDispatcher.dispatchMessage(EventType.FILE_STATUS_CHANGED, this.currentFileName, - this.modified); + messageDispatcher.dispatchMessage(EventType.FILE_STATUS_CHANGED, getCurrentFileName(), + isProjectModified()); } /** @@ -1025,7 +1003,7 @@ public class Presenter implements IPlugInPort { if (!oldProject.equals(currentProject)) { messageDispatcher.dispatchMessage(EventType.PROJECT_MODIFIED, oldProject, cloner .deepClone(currentProject), "Add " + componentType.getName()); - this.modified = true; + projectFileManager.notifyFileChange(); fireFileStatusChanged(); } @@ -1096,7 +1074,7 @@ public class Presenter implements IPlugInPort { if (!oldProject.equals(currentProject)) { messageDispatcher.dispatchMessage(EventType.PROJECT_MODIFIED, oldProject, cloner .deepClone(currentProject), "Edit Selection"); - this.modified = true; + projectFileManager.notifyFileChange(); fireFileStatusChanged(); } messageDispatcher.dispatchMessage(EventType.REPAINT); @@ -1138,7 +1116,7 @@ public class Presenter implements IPlugInPort { if (!oldProject.equals(currentProject)) { messageDispatcher.dispatchMessage(EventType.PROJECT_MODIFIED, oldProject, cloner .deepClone(currentProject), "Edit Project"); - this.modified = true; + projectFileManager.notifyFileChange(); fireFileStatusChanged(); } messageDispatcher.dispatchMessage(EventType.REPAINT); 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 new file mode 100644 index 00000000..bb9ba4c7 --- /dev/null +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/ProjectFileManager.java @@ -0,0 +1,291 @@ +package org.diylc.presenter; + +import java.awt.Color; +import java.awt.Point; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.apache.log4j.Logger; +import org.diylc.common.Orientation; +import org.diylc.components.boards.AbstractBoard; +import org.diylc.components.boards.BlankBoard; +import org.diylc.components.boards.PerfBoard; +import org.diylc.components.boards.VeroBoard; +import org.diylc.components.connectivity.CopperTrace; +import org.diylc.components.connectivity.Jumper; +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.core.IDIYComponent; +import org.diylc.core.Project; +import org.diylc.core.measures.Capacitance; +import org.diylc.core.measures.Resistance; +import org.diylc.core.measures.Size; +import org.diylc.core.measures.SizeUnit; +import org.diylc.utils.Constants; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import com.thoughtworks.xstream.XStream; +import com.thoughtworks.xstream.io.xml.DomDriver; + +public class ProjectFileManager { + + private static final Logger LOG = Logger.getLogger(ProjectFileManager.class); + + private static final int V1_PIXELS_PER_INCH = 200; + private static final Size V1_GRID_SPACING = new Size(0.1d, SizeUnit.in); + + private XStream xStream = new XStream(new DomDriver()); + + private String currentFileName = null; + private boolean modified = false; + + public void serializeProjectToFile(Project project, String fileName) throws IOException { + LOG.info(String.format("saveProjectToFile(%s)", fileName)); + FileOutputStream fos; + fos = new FileOutputStream(fileName); + xStream.toXML(project, fos); + fos.close(); + this.currentFileName = fileName; + this.modified = false; + // fireFileStatusChanged(); + } + + public Project deserializeProjectFromFile(String fileName) throws SAXException, IOException, + ParserConfigurationException { + LOG.info(String.format("loadProjectFromFile(%s)", fileName)); + Project project; + File file = new File(fileName); + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + DocumentBuilder db = dbf.newDocumentBuilder(); + Document doc = db.parse(file); + doc.getDocumentElement().normalize(); + if (doc.getDocumentElement().getNodeName().equalsIgnoreCase(Project.class.getName())) { + project = parseV3File(fileName); + } else { + if (!doc.getDocumentElement().getNodeName().equalsIgnoreCase("layout")) { + throw new IllegalArgumentException( + "Could not open DIY file. Root node is not named 'Layout'."); + } + String formatVersion = doc.getDocumentElement().getAttribute("formatVersion"); + if (formatVersion == null || formatVersion.trim().isEmpty()) { + LOG.debug("Detected v1 file."); + project = parseV1File(doc.getDocumentElement()); + } else if (formatVersion.equals("2.0")) { + LOG.debug("Detected v2 file."); + project = parseV2File(doc.getDocumentElement()); + } else { + throw new IllegalArgumentException("Unknown file format version: " + formatVersion); + } + } + this.currentFileName = fileName; + this.modified = false; + return project; + } + + public void notifyFileChange() { + this.modified = true; + } + + public String getCurrentFileName() { + return currentFileName; + } + + public boolean isModified() { + return modified; + } + + private Project parseV1File(Element root) { + Project project = new Project(); + project.setTitle(root.getAttribute("Project")); + project.setAuthor(root.getAttribute("Credits")); + project.setGridSpacing(V1_GRID_SPACING); + String type = root.getAttribute("Type"); + + // Create the board. + int width = Integer.parseInt(root.getAttribute("Width")) + 1; + int height = Integer.parseInt(root.getAttribute("Height")) + 1; + int boardWidth = (int) (width * Constants.PIXELS_PER_INCH * V1_GRID_SPACING.getValue()); + int boardHeight = (int) (height * Constants.PIXELS_PER_INCH * V1_GRID_SPACING.getValue()); + int projectWidth = project.getWidth().convertToPixels(); + int projectHeight = project.getHeight().convertToPixels(); + int x = (projectWidth - boardWidth) / 2; + int y = (projectHeight - boardHeight) / 2; + AbstractBoard board; + if (type.equalsIgnoreCase("pcb")) { + board = new BlankBoard(); + board.setBoardColor(Color.white); + board.setBorderColor(Color.black); + } else if (type.equalsIgnoreCase("perfboard")) { + board = new PerfBoard(); + } else if (type.equalsIgnoreCase("stripboard")) { + board = new VeroBoard(); + } else { + throw new IllegalArgumentException("Unrecognized board type: " + type); + } + board.setName("Main board"); + Point referencePoint = new Point(roundToGrid(x, V1_GRID_SPACING), roundToGrid(y, + V1_GRID_SPACING)); + board.setControlPoint(referencePoint, 0); + board.setControlPoint(new Point(roundToGrid(x + boardWidth, V1_GRID_SPACING), roundToGrid(y + + boardHeight, V1_GRID_SPACING)), 1); + project.getComponents().add(board); + + NodeList childNodes = root.getChildNodes(); + for (int i = 0; i < childNodes.getLength(); i++) { + Node node = childNodes.item(i); + if (node.getNodeType() == Node.ELEMENT_NODE) { + String nodeName = node.getNodeName(); + String nameAttr = node.getAttributes().getNamedItem("Name").getNodeValue(); + Node valueNode = node.getAttributes().getNamedItem("Value"); + String valueAttr = valueNode == null ? null : valueNode.getNodeValue(); + int x1Attr = Integer.parseInt(node.getAttributes().getNamedItem("X1") + .getNodeValue()); + int y1Attr = Integer.parseInt(node.getAttributes().getNamedItem("Y1") + .getNodeValue()); + Point point1 = convertV1CoordinatesToV3Point(referencePoint, x1Attr, y1Attr); + Point point2 = null; + Integer x2Attr = null; + Integer y2Attr = null; + if (node.getAttributes().getNamedItem("X2") != null + && node.getAttributes().getNamedItem("Y2") != null) { + x2Attr = Integer.parseInt(node.getAttributes().getNamedItem("X2") + .getNodeValue()); + y2Attr = Integer.parseInt(node.getAttributes().getNamedItem("Y2") + .getNodeValue()); + point2 = convertV1CoordinatesToV3Point(referencePoint, x2Attr, y2Attr); + } + 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)); + 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); + trace.setControlPoint(point1, 0); + trace.setControlPoint(point2, 1); + component = trace; + } else if (nodeName.equalsIgnoreCase("jumper")) { + LOG.debug("Recognized " + nodeName); + Jumper jumper = new Jumper(); + jumper.setName(nameAttr); + jumper.setControlPoint(point1, 0); + jumper.setControlPoint(point2, 1); + component = jumper; + } else if (nodeName.equalsIgnoreCase("resistor")) { + LOG.debug("Recognized " + nodeName); + Resistor resistor = new Resistor(); + resistor.setName(nameAttr); + try { + resistor.setValue(Resistance.parseResistance(valueAttr)); + } catch (Exception e) { + LOG.debug("Could not set value of " + nameAttr); + } + resistor.setWidth(new Size(6d, SizeUnit.mm)); + resistor.setHeight(new Size(2d, SizeUnit.mm)); + resistor.setControlPoint(point1, 0); + resistor.setControlPoint(point2, 1); + component = resistor; + } else if (nodeName.equalsIgnoreCase("capacitor")) { + LOG.debug("Recognized " + nodeName); + RadialFilmCapacitor capacitor = new RadialFilmCapacitor(); + capacitor.setName(nameAttr); + try { + capacitor.setValue(Capacitance.parseCapacitance(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(); + if (x1Attr + 3 == x2Attr) { + if (y1Attr < y2Attr) { + ic + .setPinCount(DIL_IC.PinCount.valueOf("_" + 2 + * (y2Attr - y1Attr + 1))); + } else { + ic.setOrientation(Orientation._180); + ic + .setPinCount(DIL_IC.PinCount.valueOf("_" + 2 + * (y1Attr - y2Attr + 1))); + } + } + ic.setName(nameAttr); + ic.setControlPoint(point1, 0); + ic.setValue(valueAttr); + component = ic; + } else { + LOG.debug("Could not recognize component type " + nodeName); + } + if (component != null) { + project.getComponents().add(component); + } + } + } + return project; + } + + private Point convertV1CoordinatesToV3Point(Point reference, int x, int y) { + Point point = new Point(reference); + point.translate((int) (x * Constants.PIXELS_PER_INCH * V1_GRID_SPACING.getValue()), + (int) (y * Constants.PIXELS_PER_INCH * V1_GRID_SPACING.getValue())); + return point; + } + + private Project parseV2File(Element root) { + Project project = new Project(); + String projectName = root.getAttribute("projectName"); + String credits = root.getAttribute("credits"); + String width = root.getAttribute("width"); + String height = root.getAttribute("height"); + NodeList childNodes = root.getChildNodes(); + for (int i = 0; i < childNodes.getLength(); i++) { + Node node = childNodes.item(i); + if (node.getNodeType() == Node.ELEMENT_NODE) { + if (node.getNodeName().equalsIgnoreCase("component")) { + LOG.debug(node.getAttributes().getNamedItem("name").getNodeValue()); + } else { + LOG.debug("Unrecognized node name found: " + node.getNodeName()); + } + } + } + return project; + } + + private Project parseV3File(String fileName) throws IOException { + Project project; + FileInputStream fis = new FileInputStream(fileName); + project = (Project) xStream.fromXML(fis); + fis.close(); + return project; + } + + public int roundToGrid(int x, Size gridSpacing) { + int grid = gridSpacing.convertToPixels(); + return (Math.round(1f * x / grid) * grid); + } +} \ No newline at end of file