diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml b/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml index ebd21fe3..b4120b55 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml @@ -59,7 +59,7 @@ default.org.diylc.components.misc.Label:Font Bold - true + false autoCreatePads 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 ef827e76..cc3ff610 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/core/Project.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/Project.java index 942bd1ee..a4c3bd9f 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/Project.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/Project.java @@ -11,6 +11,8 @@ import org.diylc.core.annotations.PositiveMeasureValidator; import org.diylc.core.measures.Size; import org.diylc.core.measures.SizeUnit; +import com.diyfever.gui.update.VersionNumber; + /** * Entity class that defines a project. Contains project properties and a * collection of components.This class is serialized to file. Some filed getters @@ -27,6 +29,8 @@ public class Project implements Serializable { public static Size DEFAULT_HEIGHT = new Size(21d, SizeUnit.cm); public static Size DEFAULT_GRID_SPACING = new Size(0.1d, SizeUnit.in); + private VersionNumber fileVersion; + private String title; private String author; private String description; @@ -123,6 +127,14 @@ public class Project implements Serializable { public Set getLockedLayers() { return lockedLayers; } + + public VersionNumber getFileVersion() { + return fileVersion; + } + + public void setFileVersion(VersionNumber fileVersion) { + this.fileVersion = fileVersion; + } @Override public int hashCode() { diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/PointConverter.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/PointConverter.java new file mode 100644 index 00000000..d7e79d32 --- /dev/null +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/PointConverter.java @@ -0,0 +1,41 @@ +package org.diylc.presenter; + +import java.awt.Point; + +import org.diylc.utils.Constants; + +import com.thoughtworks.xstream.converters.Converter; +import com.thoughtworks.xstream.converters.MarshallingContext; +import com.thoughtworks.xstream.converters.UnmarshallingContext; +import com.thoughtworks.xstream.io.HierarchicalStreamReader; +import com.thoughtworks.xstream.io.HierarchicalStreamWriter; + +/** + * Serializes {@link Point} objects by converting coordinates from pixels to + * inches, thus avoiding the resolution to affect point placement. + * + * @author Branislav Stojkovic + */ +public class PointConverter implements Converter { + + @Override + public void marshal(Object object, HierarchicalStreamWriter writer, MarshallingContext context) { + Point point = (Point) object; + writer.addAttribute("x", Double.toString(1d * point.x / Constants.PIXELS_PER_INCH)); + writer.addAttribute("y", Double.toString(1d * point.y / Constants.PIXELS_PER_INCH)); + } + + @Override + public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { + double x = Double.parseDouble(reader.getAttribute("x")); + double y = Double.parseDouble(reader.getAttribute("y")); + return new Point((int) Math.round(x * Constants.PIXELS_PER_INCH), (int) Math.round(y + * Constants.PIXELS_PER_INCH)); + } + + @SuppressWarnings("unchecked") + @Override + public boolean canConvert(Class clazz) { + return Point.class.isAssignableFrom(clazz); + } +} 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 0ad3aec6..995d5546 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 @@ -245,6 +245,7 @@ public class Presenter implements IPlugInPort { public void saveProjectToFile(String fileName, boolean isBackup) { LOG.info(String.format("saveProjectToFile(%s)", fileName)); try { + currentProject.setFileVersion(CURRENT_VERSION); projectFileManager.serializeProjectToFile(currentProject, fileName, isBackup); } catch (Exception ex) { LOG.error("Could not save file", ex); 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 964ed95a..bf55eb83 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 @@ -68,6 +68,9 @@ public class ProjectFileManager { } private XStream xStream; + // Legacy deserializer for 3.0.1 through 3.0.7, loads Points referenced in + // pixels. + private XStream xStreamOld; private String currentFileName = null; private boolean modified = false; @@ -78,6 +81,9 @@ public class ProjectFileManager { super(); this.xStream = new XStream(new DomDriver()); xStream.autodetectAnnotations(true); + xStream.registerConverter(new PointConverter()); + this.xStreamOld = new XStream(new DomDriver()); + xStreamOld.autodetectAnnotations(true); this.messageDispatcher = messageDispatcher; } @@ -436,7 +442,14 @@ public class ProjectFileManager { private Project parseV3File(String fileName) throws IOException { Project project; FileInputStream fis = new FileInputStream(fileName); - project = (Project) xStream.fromXML(fis); + try { + project = (Project) xStream.fromXML(fis); + } catch (Exception e) { + LOG.warn("Could not open with the new xStream, trying the old one"); + fis.close(); + fis = new FileInputStream(fileName); + project = (Project) xStreamOld.fromXML(fis); + } fis.close(); return project; } diff --git a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/misc/IconImageConverter.java b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/misc/IconImageConverter.java index dabb1971..e36377b0 100644 --- a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/misc/IconImageConverter.java +++ b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/misc/IconImageConverter.java @@ -48,9 +48,14 @@ public class IconImageConverter implements Converter { writer.addAttribute("width", Integer.toString(width)); writer.addAttribute("height", Integer.toString(height)); StringBuilder dataBuilder = new StringBuilder(); + int n = 0; for (int pixel : pixels) { dataBuilder.append(Integer.toString(pixel, 16)); dataBuilder.append(","); + n++; + if (n % 16 == 0) { + dataBuilder.append("\n"); + } } writer.addAttribute("data", dataBuilder.toString()); } @@ -61,11 +66,15 @@ public class IconImageConverter implements Converter { int height = Integer.parseInt(reader.getAttribute("height")); LOG.debug("Reading image from file: " + width + "x" + height); int[] pixels = new int[width * height]; - String data = reader.getAttribute("data"); + String data = reader.getAttribute("data").replace("\n", ""); String[] splitData = data.split(","); - for (int i = 0; i < splitData.length; i++) { + for (int i = 0; i < Math.min(splitData.length, pixels.length); i++) { if (!splitData[i].isEmpty()) { - pixels[i] = Integer.parseInt(splitData[i], 16); + try { + pixels[i] = Integer.parseInt(splitData[i].trim(), 16); + } catch (Exception e) { + pixels[i] = 0; + } } }