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;
+ }
}
}