diff --git a/diylc/diylc-core/src/org/diylc/common/IVariantProcessor.java b/diylc/diylc-core/src/org/diylc/common/IVariantProcessor.java index 78d12863..bdf3f312 100644 --- a/diylc/diylc-core/src/org/diylc/common/IVariantProcessor.java +++ b/diylc/diylc-core/src/org/diylc/common/IVariantProcessor.java @@ -29,7 +29,7 @@ public interface IVariantProcessor { public static final String TEMPLATES_KEY = "templates"; public static final String DEFAULT_TEMPLATES_KEY = "defaultTemplates"; - public static final String DEFAULT_TEMPLATES_IMPORTED_KEY = "defaultTemplatesImported"; + public static final String DEFAULT_TEMPLATES_IMPORT_DATE_KEY = "defaultTemplatesImportDate"; void saveSelectedComponentAsVariant(String variantName); diff --git a/diylc/diylc-core/src/org/diylc/core/Angle.java b/diylc/diylc-core/src/org/diylc/core/Angle.java index be885213..b5b2a1c0 100644 --- a/diylc/diylc-core/src/org/diylc/core/Angle.java +++ b/diylc/diylc-core/src/org/diylc/core/Angle.java @@ -55,8 +55,7 @@ public class Angle { newValue += 360; while (newValue >= 360) newValue -= 360; - valueCache.computeIfAbsent(newValue, (value) -> new Angle(value)); - return valueCache.get(newValue); + return valueCache.computeIfAbsent(newValue, (value) -> new Angle(value)); } public Angle rotate(int direction) { diff --git a/diylc/diylc-core/src/org/diylc/core/Template.java b/diylc/diylc-core/src/org/diylc/core/Template.java index 1ce520ac..798191dc 100644 --- a/diylc/diylc-core/src/org/diylc/core/Template.java +++ b/diylc/diylc-core/src/org/diylc/core/Template.java @@ -22,6 +22,7 @@ package org.diylc.core; import java.awt.geom.Point2D; +import java.time.LocalDateTime; import java.util.List; import java.util.Map; @@ -33,14 +34,20 @@ public class Template { @SuppressWarnings("unused") @Deprecated private boolean defaultFlag; + private LocalDateTime createdOn; public Template() { + } + + public Template(String name, Map values, List points) { + this(name, values, points, LocalDateTime.now()); } - public Template(String name, Map values, List points) { + public Template(String name, Map values, List points, LocalDateTime createdOn) { this.name = name; this.values = values; - this.points = points; + this.points = points; + this.createdOn = createdOn; } public String getName() { @@ -65,45 +72,59 @@ public class Template { public void setPoints(List points) { this.points = points; + } + + public LocalDateTime getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(LocalDateTime createdOn) { + this.createdOn = createdOn; } - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((name == null) ? 0 : name.hashCode()); - result = prime * result + ((points == null) ? 0 : points.hashCode()); - result = prime * result + ((values == null) ? 0 : values.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - Template other = (Template) obj; - if (name == null) { - if (other.name != null) - return false; - } else if (!name.equals(other.name)) - return false; - if (points == null) { - if (other.points != null) - return false; - } else if (!points.equals(other.points)) - return false; - if (values == null) { - if (other.values != null) - return false; - } else if (!values.equals(other.values)) - return false; - return true; - } - + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((createdOn == null) ? 0 : createdOn.hashCode()); + result = prime * result + ((name == null) ? 0 : name.hashCode()); + result = prime * result + ((points == null) ? 0 : points.hashCode()); + result = prime * result + ((values == null) ? 0 : values.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Template other = (Template) obj; + if (createdOn == null) { + if (other.createdOn != null) + return false; + } else if (!createdOn.equals(other.createdOn)) + return false; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + if (points == null) { + if (other.points != null) + return false; + } else if (!points.equals(other.points)) + return false; + if (values == null) { + if (other.values != null) + return false; + } else if (!values.equals(other.values)) + return false; + return true; + } + @Override public String toString() { return name; diff --git a/diylc/diylc-core/src/org/diylc/core/annotations/ComponentDescriptor.java b/diylc/diylc-core/src/org/diylc/core/annotations/ComponentDescriptor.java index f98ec0cf..c21501d4 100644 --- a/diylc/diylc-core/src/org/diylc/core/annotations/ComponentDescriptor.java +++ b/diylc/diylc-core/src/org/diylc/core/annotations/ComponentDescriptor.java @@ -112,8 +112,6 @@ public @interface ComponentDescriptor { String keywordTag() default ""; /** - * Only to be used for components that span in its eternity in the rectangle defined by the two outside control points. - * * @return true if the component drawing should be cached */ boolean enableCache() default false; diff --git a/diylc/diylc-core/src/org/diylc/presenter/VariantManager.java b/diylc/diylc-core/src/org/diylc/presenter/VariantManager.java index 6d3aaa5a..a87c9b8b 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/VariantManager.java +++ b/diylc/diylc-core/src/org/diylc/presenter/VariantManager.java @@ -1,6 +1,6 @@ /* * -l * DIY Layout Creator (DIYLC). Copyright (c) 2009-2018 held jointly by the individual authors. + * l * DIY Layout Creator (DIYLC). Copyright (c) 2009-2018 held jointly by the individual authors. * * This file is part of DIYLC. * @@ -21,6 +21,7 @@ import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.IOException; import java.net.URL; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -28,7 +29,9 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.TreeMap; +import java.util.stream.Collectors; import org.apache.log4j.Logger; import org.diylc.appframework.miscutils.IConfigurationManager; import org.diylc.common.ComponentType; @@ -39,11 +42,11 @@ import org.diylc.serialization.ProjectFileManager; import com.thoughtworks.xstream.XStream; public class VariantManager { - + private static final String VARIANTS_FILE_NAME = "variants.xml"; private static final Logger LOG = Logger.getLogger(VariantManager.class); - + private IConfigurationManager configManager; private XStream xStream; @@ -56,43 +59,53 @@ public class VariantManager { @SuppressWarnings("unchecked") public void importDefaultVariants() { // import default templates from variants.xml file only if we didn't do it already - if (!configManager.readBoolean(IPlugInPort.DEFAULT_TEMPLATES_IMPORTED_KEY, false)) { - try { - URL resource = Presenter.class.getResource(VARIANTS_FILE_NAME); - if (resource != null) { - BufferedInputStream in = new BufferedInputStream(resource.openStream()); - Map> defaults = (Map>) ProjectFileManager.xStreamSerializer.fromXML(in); - in.close(); - - Map> variantMap = - (Map>) configManager.readObject(IPlugInPort.TEMPLATES_KEY, null); - if (variantMap == null) - variantMap = new HashMap>(); + LocalDateTime importDate = (LocalDateTime) configManager + .readObject(IPlugInPort.DEFAULT_TEMPLATES_IMPORT_DATE_KEY, LocalDateTime.MIN); + + int importCount = 0; + + try { + URL resource = Presenter.class.getResource(VARIANTS_FILE_NAME); + if (resource != null) { + BufferedInputStream in = new BufferedInputStream(resource.openStream()); + Map> defaults = + (Map>) ProjectFileManager.xStreamSerializer.fromXML(in); + in.close(); + + Map> variantMap = + (Map>) configManager.readObject(IPlugInPort.TEMPLATES_KEY, null); + if (variantMap == null) + variantMap = new HashMap>(); + + // merge default variants with user's + for (Map.Entry> entry : defaults.entrySet()) { + List