diff --git a/diylc/diylc-core/src/org/diylc/presenter/Counter.java b/diylc/diylc-core/src/org/diylc/presenter/Counter.java index f4a6fd46..8e3fe693 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/Counter.java +++ b/diylc/diylc-core/src/org/diylc/presenter/Counter.java @@ -41,4 +41,8 @@ public class Counter { public String toString() { return String.format("%dx %dms", count, TimeUnit.MILLISECONDS.convert(nanotime, TimeUnit.NANOSECONDS)); } + + public String toAvgString() { + return String.format("%dx %dms avg", count, TimeUnit.MILLISECONDS.convert(nanotime / count, TimeUnit.NANOSECONDS)); + } } diff --git a/diylc/diylc-core/src/org/diylc/presenter/DrawingCache.java b/diylc/diylc-core/src/org/diylc/presenter/DrawingCache.java index ad1ae80e..8d52b743 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/DrawingCache.java +++ b/diylc/diylc-core/src/org/diylc/presenter/DrawingCache.java @@ -53,7 +53,7 @@ public class DrawingCache { @SuppressWarnings("unchecked") public void draw(IDIYComponent component, G2DWrapper g2d, ComponentState componentState, - boolean outlineMode, Project project, double zoom, boolean trackArea) { + boolean outlineMode, Project project, double zoom) { ComponentType type = ComponentProcessor.getInstance() .extractComponentTypeFrom((Class>) component.getClass()); @@ -69,7 +69,7 @@ public class DrawingCache { // only honor the cache if the component hasn't changed in the meantime if (value == null || !value.getComponent().equalsTo(component) || value.getState() != componentState || value.getZoom() != zoom) { - LOG.trace("Rendering " + component.getName() + " for cache."); + // figure out size and placement of buffer image Rectangle2D rect = component.getCachingBounds(); int width = (int)Math.round(rect.getWidth() * zoom); int height = (int)Math.round(rect.getHeight() * zoom); @@ -100,9 +100,6 @@ public class DrawingCache { // initialize wrapper wrapper.startedDrawingComponent(); - if (!trackArea) { - wrapper.stopTracking(); - } long componentStart = System.nanoTime(); @@ -135,6 +132,10 @@ public class DrawingCache { // e.printStackTrace(); // } + if (wrapper.getCurrentArea() == null || wrapper.getCurrentArea().isEmpty()) { + LOG.warn("Empty outline area detected for " + component.getName()); + } + // add to the cache value = new CacheValue(component, image, wrapper.getCurrentArea(), wrapper.getContinuityPositiveAreas(), wrapper.getContinuityNegativeAreas(), componentState, zoom, dx, dy); @@ -170,11 +171,13 @@ public class DrawingCache { stats.getSecond().add(componentEnd - componentStart); // copy over tracking area from the cache - g2d.merge(value.getCurrentArea(), value.getContinuityPositiveAreas(), value.getContinuityNegativeAreas()); + g2d.merge(value.getCurrentArea(), value.getContinuityPositiveAreas(), value.getContinuityNegativeAreas()); } else { // no caching, just draw as usual component.draw(g2d, componentState, outlineMode, project, g2d); } + g2d.stopTracking(); + g2d.stopTrackingContinuityArea(); } public void logStats() { diff --git a/diylc/diylc-core/src/org/diylc/presenter/DrawingManager.java b/diylc/diylc-core/src/org/diylc/presenter/DrawingManager.java index fc5c3f91..49653247 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/DrawingManager.java +++ b/diylc/diylc-core/src/org/diylc/presenter/DrawingManager.java @@ -39,7 +39,6 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import org.apache.log4j.Logger; @@ -111,6 +110,7 @@ public class DrawingManager { private Map renderStatsByType = new HashMap(); private long lastStatsReportedTime = System.currentTimeMillis(); private long statReportFrequencyMs = 1000 * 60; + private Counter totalStats = new Counter(); public DrawingManager(MessageDispatcher messageDispatcher) { super(); @@ -145,7 +145,7 @@ public class DrawingManager { IComponentFiler filter, Rectangle selectionRect, Collection> selectedComponents, Set> lockedComponents, Set> groupedComponents, List controlPointSlot, List> componentSlot, boolean dragInProgress, Double externalZoom) { - long start = System.nanoTime(); + long totalStartTime = System.nanoTime(); failedComponents.clear(); if (project == null) { return failedComponents; @@ -287,7 +287,7 @@ public class DrawingManager { try { if (drawOptions.contains(DrawOption.ENABLE_CACHING)) // go through the DrawingCache - DrawingCache.Instance.draw(component, g2dWrapper, state, drawOptions.contains(DrawOption.OUTLINE_MODE), project, zoom, trackArea); + DrawingCache.Instance.draw(component, g2dWrapper, state, drawOptions.contains(DrawOption.OUTLINE_MODE), project, zoom); else // go stragiht to the wrapper component.draw(g2dWrapper, state, drawOptions.contains(DrawOption.OUTLINE_MODE), project, g2dWrapper); @@ -453,10 +453,9 @@ public class DrawingManager { g2d.fill(extraSpaceArea); } - long end = System.nanoTime(); + long totalEndTime = System.nanoTime(); - long ms = TimeUnit.MILLISECONDS.convert(end - start, TimeUnit.NANOSECONDS); - LOG.trace(String.format("Render time = %d ms", ms)); + totalStats.add(totalEndTime - totalStartTime); logStats(); @@ -471,6 +470,7 @@ public class DrawingManager { .map(e -> e.toString()) .collect(Collectors.joining("; ", "{", "}")); LOG.debug("Render stats: " + mapAsString); + LOG.debug("Page stats: " + totalStats.toAvgString()); DrawingCache.Instance.logStats(); } } diff --git a/diylc/diylc-core/src/org/diylc/presenter/update.xml b/diylc/diylc-core/src/org/diylc/presenter/update.xml index 5aabf304..73e3fb25 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/update.xml +++ b/diylc/diylc-core/src/org/diylc/presenter/update.xml @@ -2884,6 +2884,26 @@ https://github.com/bancika/diy-layout-creator/releases + + + + 4 + 3 + 0 + + 2020-04-05 00:00:00.000 CET + + + + NEW_FEATURE + Added component-level caching that should speed up rendering dramatically. While in experimental phase, it will be exposed as "Enable Cache Boost" item in the "Config" menu so it can be turned off if it causes any issues + + + BUG_FIX + Switched terminal on the "Open Jack 1/4" does not stick to other components + + + https://github.com/bancika/diy-layout-creator/releases diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar index c342b2f3..15a5b88c 100644 Binary files a/diylc/diylc-library/lib/diylc-core.jar and b/diylc/diylc-library/lib/diylc-core.jar differ diff --git a/diylc/diylc-library/src/org/diylc/components/AbstractLeadedComponent.java b/diylc/diylc-library/src/org/diylc/components/AbstractLeadedComponent.java index 207d2a77..a936e99f 100644 --- a/diylc/diylc-library/src/org/diylc/components/AbstractLeadedComponent.java +++ b/diylc/diylc-library/src/org/diylc/components/AbstractLeadedComponent.java @@ -251,6 +251,8 @@ public abstract class AbstractLeadedComponent extends AbstractTransparentComp if (bodyColor != null) { g2d.setColor(outlineMode ? Constants.TRANSPARENT_COLOR : bodyColor); + drawingObserver.startTracking(); + if (!outlineMode && ConfigurationManager.getInstance().readBoolean(IPlugInPort.HI_QUALITY_RENDER_KEY, false)) { Point p1 = new Point((int) (length / 2), 0); Point p2 = new Point((int) (length / 2), (int) width); @@ -262,6 +264,8 @@ public abstract class AbstractLeadedComponent extends AbstractTransparentComp } else { g2d.fill(shape); } + + drawingObserver.stopTracking(); } drawingObserver.stopTracking(); @@ -287,8 +291,16 @@ public abstract class AbstractLeadedComponent extends AbstractTransparentComp : borderColor; } g2d.setColor(finalBorderColor); + + // if we are not filling the shape with color we need to ensure that we track the outline (e.g. with schematic symbols) + if (bodyColor == null) + drawingObserver.startTracking(); + g2d.draw(shape); + if (bodyColor == null) + drawingObserver.stopTracking(); + if (decorateAboveBorder()) { g2d.setComposite(newComposite); decorateComponentBody(g2d, outlineMode); diff --git a/diylc/diylc-library/src/org/diylc/components/connectivity/Eyelet.java b/diylc/diylc-library/src/org/diylc/components/connectivity/Eyelet.java index 850647c4..61b505b8 100644 --- a/diylc/diylc-library/src/org/diylc/components/connectivity/Eyelet.java +++ b/diylc/diylc-library/src/org/diylc/components/connectivity/Eyelet.java @@ -24,6 +24,7 @@ package org.diylc.components.connectivity; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Point; +import java.awt.geom.Rectangle2D; import org.diylc.common.ObjectCache; import org.diylc.common.SimpleComponentTransformer; @@ -46,7 +47,8 @@ import org.diylc.utils.Constants; @ComponentDescriptor(name = "Eyelet", category = "Connectivity", author = "Branislav Stojkovic", description = "Eyelet or turret terminal", instanceNamePrefix = "Eyelet", zOrder = IDIYComponent.TRACE + 0.1, bomPolicy = BomPolicy.SHOW_ONLY_TYPE_NAME, autoEdit = false, - keywordPolicy = KeywordPolicy.SHOW_TYPE_NAME, transformer = SimpleComponentTransformer.class) + keywordPolicy = KeywordPolicy.SHOW_TYPE_NAME, transformer = SimpleComponentTransformer.class, + enableCache = true) public class Eyelet extends AbstractComponent { private static final long serialVersionUID = 1L; @@ -169,5 +171,11 @@ public class Eyelet extends AbstractComponent { @Override public String getControlPointNodeName(int index) { return null; + } + + @Override + public Rectangle2D getCachingBounds() { + double size = getSize().convertToPixels(); + return new Rectangle2D.Double(point.getX() - size, point.getY() - size, size * 2, size * 2); } } diff --git a/diylc/diylc-library/src/org/diylc/components/connectivity/HookupWire.java b/diylc/diylc-library/src/org/diylc/components/connectivity/HookupWire.java index 90274022..bb2d52c5 100644 --- a/diylc/diylc-library/src/org/diylc/components/connectivity/HookupWire.java +++ b/diylc/diylc-library/src/org/diylc/components/connectivity/HookupWire.java @@ -78,16 +78,16 @@ public class HookupWire extends AbstractCurvedComponent implements IContin stroke = ObjectCache.getInstance().fetchStroke(thickness, new float[] {thickness / 4, thickness * 3}, 0, BasicStroke.CAP_ROUND); break; } - Shape s = stroke.createStrokedShape(curve); + Shape s = stroke.createStrokedShape(curve); + drawingObserver.startTracking(); g2d.fill(s); + drawingObserver.stopTracking(); if (getStriped()) { stroke = ObjectCache.getInstance().fetchStroke(thickness, new float[] { thickness / 2, thickness * 2 }, thickness * 10, BasicStroke.CAP_BUTT); Shape stripe = stroke.createStrokedShape(curve); - g2d.setColor(getStripeColor()); - drawingObserver.stopTracking(); - g2d.fill(stripe); - drawingObserver.startTracking(); + g2d.setColor(getStripeColor()); + g2d.fill(stripe); } drawingObserver.stopTracking(); diff --git a/diylc/diylc-library/src/org/diylc/components/connectivity/SolderPad.java b/diylc/diylc-library/src/org/diylc/components/connectivity/SolderPad.java index 2102450c..2d38158f 100644 --- a/diylc/diylc-library/src/org/diylc/components/connectivity/SolderPad.java +++ b/diylc/diylc-library/src/org/diylc/components/connectivity/SolderPad.java @@ -44,7 +44,7 @@ import org.diylc.utils.Constants; @ComponentDescriptor(name = "Solder Pad", category = "Connectivity", author = "Branislav Stojkovic", description = "Copper solder pad, round or square", instanceNamePrefix = "Pad", zOrder = IDIYComponent.TRACE + 0.1, bomPolicy = BomPolicy.NEVER_SHOW, autoEdit = false, - keywordPolicy = KeywordPolicy.SHOW_TAG, keywordTag = "PCB", transformer = SimpleComponentTransformer.class) + keywordPolicy = KeywordPolicy.SHOW_TAG, keywordTag = "PCB", transformer = SimpleComponentTransformer.class, enableCache = true) public class SolderPad extends AbstractComponent { private static final long serialVersionUID = 1L; @@ -190,6 +190,12 @@ public class SolderPad extends AbstractComponent { @Override public void setValue(Void value) {} + + @Override + public Rectangle2D getCachingBounds() { + double size = getSize().convertToPixels(); + return new Rectangle2D.Double(point.getX() - size, point.getY() - size, size * 2, size * 2); + } public static enum Type { ROUND, SQUARE, OVAL_HORIZONTAL, OVAL_VERTICAL; diff --git a/diylc/diylc-library/src/org/diylc/components/connectivity/TraceCut.java b/diylc/diylc-library/src/org/diylc/components/connectivity/TraceCut.java index b66b1ddb..95e85e41 100644 --- a/diylc/diylc-library/src/org/diylc/components/connectivity/TraceCut.java +++ b/diylc/diylc-library/src/org/diylc/components/connectivity/TraceCut.java @@ -24,6 +24,7 @@ package org.diylc.components.connectivity; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Point; +import java.awt.geom.Rectangle2D; import org.diylc.common.ObjectCache; import org.diylc.common.SimpleComponentTransformer; @@ -45,7 +46,7 @@ import org.diylc.utils.Constants; @ComponentDescriptor(name = "Trace Cut", category = "Connectivity", author = "Branislav Stojkovic", description = "Designates the place where a trace on the vero board needs to be cut", instanceNamePrefix = "Cut", zOrder = IDIYComponent.BOARD + 1, bomPolicy = BomPolicy.NEVER_SHOW, autoEdit = false, - transformer = SimpleComponentTransformer.class) + transformer = SimpleComponentTransformer.class, enableCache = true) public class TraceCut extends AbstractComponent { private static final long serialVersionUID = 1L; @@ -237,5 +238,11 @@ public class TraceCut extends AbstractComponent { @Override public String getControlPointNodeName(int index) { return null; + } + + @Override + public Rectangle2D getCachingBounds() { + double size = getSize().convertToPixels(); + return new Rectangle2D.Double(point.getX() - size, point.getY() - size, size * 2, size * 2); } } diff --git a/diylc/diylc-library/src/org/diylc/components/connectivity/Turret.java b/diylc/diylc-library/src/org/diylc/components/connectivity/Turret.java index b9d6ad70..af1f6c6b 100644 --- a/diylc/diylc-library/src/org/diylc/components/connectivity/Turret.java +++ b/diylc/diylc-library/src/org/diylc/components/connectivity/Turret.java @@ -24,6 +24,7 @@ package org.diylc.components.connectivity; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Point; +import java.awt.geom.Rectangle2D; import org.diylc.common.ObjectCache; import org.diylc.common.SimpleComponentTransformer; @@ -44,7 +45,8 @@ import org.diylc.utils.Constants; @ComponentDescriptor(name = "Turret Lug", category = "Connectivity", author = "Branislav Stojkovic", description = "Turret terminal lug", instanceNamePrefix = "Turret", zOrder = IDIYComponent.TRACE + 0.1, bomPolicy = BomPolicy.SHOW_ONLY_TYPE_NAME, autoEdit = false, - keywordPolicy = KeywordPolicy.SHOW_TYPE_NAME, transformer = SimpleComponentTransformer.class) + keywordPolicy = KeywordPolicy.SHOW_TYPE_NAME, transformer = SimpleComponentTransformer.class, + enableCache = true) public class Turret extends AbstractComponent { private static final long serialVersionUID = 1L; @@ -167,5 +169,11 @@ public class Turret extends AbstractComponent { @Override public String getControlPointNodeName(int index) { return null; + } + + @Override + public Rectangle2D getCachingBounds() { + double size = getSize().convertToPixels(); + return new Rectangle2D.Double(point.getX() - size, point.getY() - size, size * 2, size * 2); } } diff --git a/diylc/diylc-library/src/org/diylc/components/electromechanical/CliffJack1_4.java b/diylc/diylc-library/src/org/diylc/components/electromechanical/CliffJack1_4.java index 4014118a..e44b0a47 100644 --- a/diylc/diylc-library/src/org/diylc/components/electromechanical/CliffJack1_4.java +++ b/diylc/diylc-library/src/org/diylc/components/electromechanical/CliffJack1_4.java @@ -31,6 +31,7 @@ import java.awt.Shape; import java.awt.geom.AffineTransform; import java.awt.geom.Area; import java.awt.geom.Ellipse2D; +import java.awt.geom.Rectangle2D; import java.awt.geom.RoundRectangle2D; import org.diylc.appframework.miscutils.ConfigurationManager; @@ -56,7 +57,8 @@ import org.diylc.utils.Constants; @ComponentDescriptor(name = "Cliff 1/4\" Jack", category = "Electro-Mechanical", author = "Branislav Stojkovic", description = "Cliff-style closed panel mount 1/4\" phono jack", - zOrder = IDIYComponent.COMPONENT, instanceNamePrefix = "J", autoEdit = false, transformer = CliffJackTransformer.class) + zOrder = IDIYComponent.COMPONENT, instanceNamePrefix = "J", autoEdit = false, transformer = CliffJackTransformer.class, + enableCache = true) public class CliffJack1_4 extends AbstractMultiPartComponent { private static final long serialVersionUID = 1L; @@ -345,5 +347,17 @@ public class CliffJack1_4 extends AbstractMultiPartComponent { @Override public boolean canPointMoveFreely(int pointIndex) { return false; + } + + @Override + public Rectangle2D getCachingBounds() { + Area area = new Area(); + Area[] body = getBody(); + int margin = 20; + for (Area a : body) + if (a != null) + area.add(a); + Rectangle2D bounds = area.getBounds2D(); + return new Rectangle2D.Double(bounds.getX() - margin, bounds.getY() - margin, bounds.getWidth() + 2 * margin, bounds.getHeight() + 2 * margin); } } diff --git a/diylc/diylc-library/src/org/diylc/components/electromechanical/ClosedJack1_4.java b/diylc/diylc-library/src/org/diylc/components/electromechanical/ClosedJack1_4.java index 9ad98fc9..21a1374e 100644 --- a/diylc/diylc-library/src/org/diylc/components/electromechanical/ClosedJack1_4.java +++ b/diylc/diylc-library/src/org/diylc/components/electromechanical/ClosedJack1_4.java @@ -32,6 +32,7 @@ import java.awt.geom.AffineTransform; import java.awt.geom.Area; import java.awt.geom.Ellipse2D; import java.awt.geom.GeneralPath; +import java.awt.geom.Rectangle2D; import org.diylc.appframework.miscutils.ConfigurationManager; import org.diylc.awt.StringUtils; @@ -56,7 +57,7 @@ import org.diylc.utils.Constants; @ComponentDescriptor(name = "Closed 1/4\" Jack", category = "Electro-Mechanical", author = "Branislav Stojkovic", description = "Enclosed panel mount 1/4\" phono jack", zOrder = IDIYComponent.COMPONENT, - instanceNamePrefix = "J", autoEdit = false, transformer = ClosedJackTransformer.class) + instanceNamePrefix = "J", autoEdit = false, transformer = ClosedJackTransformer.class, enableCache = true) public class ClosedJack1_4 extends AbstractMultiPartComponent { private static final long serialVersionUID = 1L; @@ -369,5 +370,17 @@ public class ClosedJack1_4 extends AbstractMultiPartComponent { @Override public boolean canPointMoveFreely(int pointIndex) { return false; + } + + @Override + public Rectangle2D getCachingBounds() { + Area area = new Area(); + Shape[] body = getBody(); + int margin = 20; + for (Shape a : body) + if (a != null) + area.add(new Area(a)); + Rectangle2D bounds = area.getBounds2D(); + return new Rectangle2D.Double(bounds.getX() - margin, bounds.getY() - margin, bounds.getWidth() + 2 * margin, bounds.getHeight() + 2 * margin); } } diff --git a/diylc/diylc-library/src/org/diylc/components/electromechanical/DIPSwitch.java b/diylc/diylc-library/src/org/diylc/components/electromechanical/DIPSwitch.java index 48cdc34c..87e5295e 100644 --- a/diylc/diylc-library/src/org/diylc/components/electromechanical/DIPSwitch.java +++ b/diylc/diylc-library/src/org/diylc/components/electromechanical/DIPSwitch.java @@ -57,7 +57,8 @@ import org.diylc.utils.Constants; @ComponentDescriptor(name = "DIP Switch", author = "Branislav Stojkovic", category = "Electro-Mechanical", instanceNamePrefix = "SW", description = "Dual-in-line package switch", - zOrder = IDIYComponent.COMPONENT, keywordPolicy = KeywordPolicy.SHOW_VALUE, transformer = DIL_ICTransformer.class) + zOrder = IDIYComponent.COMPONENT, keywordPolicy = KeywordPolicy.SHOW_VALUE, transformer = DIL_ICTransformer.class, + enableCache = true) public class DIPSwitch extends AbstractTransparentComponent implements ISwitch { private static final long serialVersionUID = 1L; @@ -544,6 +545,13 @@ public class DIPSwitch extends AbstractTransparentComponent implements I return false; } + @Override + public Rectangle2D getCachingBounds() { + int margin = 20; + Rectangle2D bounds = getBody()[0].getBounds2D(); + return new Rectangle2D.Double(bounds.getX() - margin, bounds.getY() - margin, bounds.getWidth() + 2 * margin, bounds.getHeight() + 2 * margin); + } + private String toBinary(int n) { StringBuilder builder = new StringBuilder(); do { diff --git a/diylc/diylc-library/src/org/diylc/components/electromechanical/FuseHolderPanel.java b/diylc/diylc-library/src/org/diylc/components/electromechanical/FuseHolderPanel.java index 9f812354..999a8091 100644 --- a/diylc/diylc-library/src/org/diylc/components/electromechanical/FuseHolderPanel.java +++ b/diylc/diylc-library/src/org/diylc/components/electromechanical/FuseHolderPanel.java @@ -53,7 +53,7 @@ import org.diylc.utils.Constants; @ComponentDescriptor(name = "Fuse Holder (Panel)", category = "Electro-Mechanical", author = "Branislav Stojkovic", description = "Panel mounted fuse holder", zOrder = IDIYComponent.COMPONENT, - instanceNamePrefix = "FH", autoEdit = false) + instanceNamePrefix = "FH", autoEdit = false, enableCache = true) public class FuseHolderPanel extends AbstractMultiPartComponent { private static final long serialVersionUID = 1L; @@ -337,5 +337,12 @@ public class FuseHolderPanel extends AbstractMultiPartComponent { @Override public boolean canPointMoveFreely(int pointIndex) { return false; + } + + @Override + public Rectangle2D getCachingBounds() { + int margin = 20; + Rectangle2D bounds = getBody()[0].getBounds2D(); + return new Rectangle2D.Double(bounds.getX() - margin, bounds.getY() - margin, bounds.getWidth() + 2 * margin, bounds.getHeight() + 2 * margin); } } diff --git a/diylc/diylc-library/src/org/diylc/components/electromechanical/IECSocket.java b/diylc/diylc-library/src/org/diylc/components/electromechanical/IECSocket.java index d633159e..6006cab5 100644 --- a/diylc/diylc-library/src/org/diylc/components/electromechanical/IECSocket.java +++ b/diylc/diylc-library/src/org/diylc/components/electromechanical/IECSocket.java @@ -29,6 +29,7 @@ import java.awt.Point; import java.awt.geom.AffineTransform; import java.awt.geom.Area; import java.awt.geom.Ellipse2D; +import java.awt.geom.Rectangle2D; import java.awt.geom.RoundRectangle2D; import org.diylc.appframework.miscutils.ConfigurationManager; @@ -51,7 +52,7 @@ import org.diylc.utils.Constants; @ComponentDescriptor(name = "IEC Socket", category = "Electro-Mechanical", author = "Branislav Stojkovic", description = "Panel mounted IEC power socket", zOrder = IDIYComponent.COMPONENT, - instanceNamePrefix = "IEC", autoEdit = false) + instanceNamePrefix = "IEC", autoEdit = false, enableCache = true) public class IECSocket extends AbstractMultiPartComponent { private static final long serialVersionUID = 1L; @@ -391,5 +392,12 @@ public class IECSocket extends AbstractMultiPartComponent { @Override public boolean canPointMoveFreely(int pointIndex) { return false; + } + + @Override + public Rectangle2D getCachingBounds() { + int margin = 20; + Rectangle2D bounds = getBody()[0].getBounds2D(); + return new Rectangle2D.Double(bounds.getX() - margin, bounds.getY() - margin, bounds.getWidth() + 2 * margin, bounds.getHeight() + 2 * margin); } } diff --git a/diylc/diylc-library/src/org/diylc/components/electromechanical/MiniRelay.java b/diylc/diylc-library/src/org/diylc/components/electromechanical/MiniRelay.java index f2c9cae5..8523a383 100644 --- a/diylc/diylc-library/src/org/diylc/components/electromechanical/MiniRelay.java +++ b/diylc/diylc-library/src/org/diylc/components/electromechanical/MiniRelay.java @@ -54,7 +54,7 @@ import org.diylc.utils.Constants; @ComponentDescriptor(name = "Mini Relay", author = "Branislav Stojkovic", category = "Electro-Mechanical", instanceNamePrefix = "RY", description = "Miniature PCB mount relay, like Omron G5V-1 or G5V-2", - zOrder = IDIYComponent.COMPONENT) + zOrder = IDIYComponent.COMPONENT, enableCache = true) public class MiniRelay extends AbstractTransparentComponent { private static final long serialVersionUID = 1L; @@ -430,6 +430,28 @@ public class MiniRelay extends AbstractTransparentComponent { @Override public boolean canPointMoveFreely(int pointIndex) { return false; + } + + @Override + public Rectangle2D getCachingBounds() { + int minX = Integer.MAX_VALUE; + int maxX = Integer.MIN_VALUE; + int minY = Integer.MAX_VALUE; + int maxY = Integer.MIN_VALUE; + int margin = 50; + for (int i = 0; i < getControlPointCount(); i++) { + Point p = getControlPoint(i); + if (p.x < minX) + minX = p.x; + if (p.x > maxX) + maxX = p.x; + if (p.y < minY) + minY = p.y; + if (p.y > maxY) + maxY = p.y; + } + + return new Rectangle2D.Double(minX - margin, minY - margin, maxX - minX + 2 * margin, maxY - minY + 2 * margin); } public static enum RelayType { diff --git a/diylc/diylc-library/src/org/diylc/components/electromechanical/MiniToggleSwitch.java b/diylc/diylc-library/src/org/diylc/components/electromechanical/MiniToggleSwitch.java index 397801d4..a19191e4 100644 --- a/diylc/diylc-library/src/org/diylc/components/electromechanical/MiniToggleSwitch.java +++ b/diylc/diylc-library/src/org/diylc/components/electromechanical/MiniToggleSwitch.java @@ -29,6 +29,7 @@ import java.awt.Point; import java.awt.Shape; import java.awt.geom.AffineTransform; import java.awt.geom.Area; +import java.awt.geom.Rectangle2D; import java.awt.geom.RoundRectangle2D; import org.diylc.appframework.miscutils.ConfigurationManager; @@ -52,7 +53,7 @@ import org.diylc.utils.Constants; @ComponentDescriptor(name = "Mini Toggle Switch", category = "Electro-Mechanical", author = "Branislav Stojkovic", description = "Panel mounted mini toggle switch", zOrder = IDIYComponent.COMPONENT, - instanceNamePrefix = "SW", autoEdit = false) + instanceNamePrefix = "SW", autoEdit = false, enableCache = true) public class MiniToggleSwitch extends AbstractTransparentComponent implements ISwitch { private static final long serialVersionUID = 1L; @@ -454,5 +455,12 @@ public class MiniToggleSwitch extends AbstractTransparentComponent { private static final double RING_THETA = Math.PI * 0.795; @@ -323,7 +324,7 @@ public class OpenJack1_4 extends AbstractMultiPartComponent { @Override public boolean isControlPointSticky(int index) { - return index < 2 || getType() == OpenJackType.STEREO; + return index < 2 || (getType() == OpenJackType.STEREO || getType() == OpenJackType.SWITCHED); } @Override @@ -409,6 +410,18 @@ public class OpenJack1_4 extends AbstractMultiPartComponent { return false; } + @Override + public Rectangle2D getCachingBounds() { + Area area = new Area(); + Area[] body = getBody(); + int margin = 20; + for (Area a : body) + if (a != null) + area.add(a); + Rectangle2D bounds = area.getBounds2D(); + return new Rectangle2D.Double(bounds.getX() - margin, bounds.getY() - margin, bounds.getWidth() + 2 * margin, bounds.getHeight() + 2 * margin); + } + public enum OpenJackType { MONO, STEREO, SWITCHED; diff --git a/diylc/diylc-library/src/org/diylc/components/electromechanical/PilotLampHolder.java b/diylc/diylc-library/src/org/diylc/components/electromechanical/PilotLampHolder.java index 12c48e3f..67b42e2d 100644 --- a/diylc/diylc-library/src/org/diylc/components/electromechanical/PilotLampHolder.java +++ b/diylc/diylc-library/src/org/diylc/components/electromechanical/PilotLampHolder.java @@ -53,7 +53,7 @@ import org.diylc.utils.Constants; @ComponentDescriptor(name = "Pilot Lamp Holder", category = "Electro-Mechanical", author = "Branislav Stojkovic", description = "Fender-style pilot bulb holder for T2 and T-3 ¼ miniature bayonet lamps", - zOrder = IDIYComponent.COMPONENT, instanceNamePrefix = "PL") + zOrder = IDIYComponent.COMPONENT, instanceNamePrefix = "PL", enableCache = true) public class PilotLampHolder extends AbstractMultiPartComponent { private static final long serialVersionUID = 1L; @@ -411,5 +411,17 @@ public class PilotLampHolder extends AbstractMultiPartComponent { protected double getTheta() { return Math.toRadians(getAngle()); + } + + @Override + public Rectangle2D getCachingBounds() { + Area area = new Area(); + Area[] body = getBody(); + int margin = 20; + for (Area a : body) + if (a != null) + area.add(a); + Rectangle2D bounds = area.getBounds2D(); + return new Rectangle2D.Double(bounds.getX() - margin, bounds.getY() - margin, bounds.getWidth() + 2 * margin, bounds.getHeight() + 2 * margin); } } diff --git a/diylc/diylc-library/src/org/diylc/components/electromechanical/PinHeader.java b/diylc/diylc-library/src/org/diylc/components/electromechanical/PinHeader.java index 8e8c619f..bab9bb5b 100644 --- a/diylc/diylc-library/src/org/diylc/components/electromechanical/PinHeader.java +++ b/diylc/diylc-library/src/org/diylc/components/electromechanical/PinHeader.java @@ -50,7 +50,7 @@ import org.diylc.utils.Constants; @ComponentDescriptor(name = "Pin Header", author = "Branislav Stojkovic", category = "Electro-Mechanical", instanceNamePrefix = "PH", description = "PCB mount male pin header with editable number or pins and pin spacing", - zOrder = IDIYComponent.COMPONENT) + zOrder = IDIYComponent.COMPONENT, enableCache = true) public class PinHeader extends AbstractTransparentComponent { private static final long serialVersionUID = 1L; @@ -354,5 +354,27 @@ public class PinHeader extends AbstractTransparentComponent { @Deprecated public void setValue(Void value) { + } + + @Override + public Rectangle2D getCachingBounds() { + int minX = Integer.MAX_VALUE; + int maxX = Integer.MIN_VALUE; + int minY = Integer.MAX_VALUE; + int maxY = Integer.MIN_VALUE; + int margin = 50; + for (int i = 0; i < getControlPointCount(); i++) { + Point p = getControlPoint(i); + if (p.x < minX) + minX = p.x; + if (p.x > maxX) + maxX = p.x; + if (p.y < minY) + minY = p.y; + if (p.y > maxY) + maxY = p.y; + } + + return new Rectangle2D.Double(minX - margin, minY - margin, maxX - minX + 2 * margin, maxY - minY + 2 * margin); } } diff --git a/diylc/diylc-library/src/org/diylc/components/electromechanical/PlasticDCJack.java b/diylc/diylc-library/src/org/diylc/components/electromechanical/PlasticDCJack.java index 95e0575d..f593d4e2 100644 --- a/diylc/diylc-library/src/org/diylc/components/electromechanical/PlasticDCJack.java +++ b/diylc/diylc-library/src/org/diylc/components/electromechanical/PlasticDCJack.java @@ -30,6 +30,7 @@ import java.awt.Rectangle; import java.awt.Shape; import java.awt.geom.Area; import java.awt.geom.Ellipse2D; +import java.awt.geom.Rectangle2D; import org.diylc.appframework.miscutils.ConfigurationManager; import org.diylc.awt.StringUtils; @@ -52,7 +53,7 @@ import org.diylc.utils.Constants; @ComponentDescriptor(name = "Plastic DC Jack", category = "Electro-Mechanical", author = "Branislav Stojkovic", description = "Panel mount plastic DC jack", zOrder = IDIYComponent.COMPONENT, - instanceNamePrefix = "J", autoEdit = false) + instanceNamePrefix = "J", autoEdit = false, enableCache = true) public class PlasticDCJack extends AbstractMultiPartComponent { private static final long serialVersionUID = 1L; @@ -267,5 +268,12 @@ public class PlasticDCJack extends AbstractMultiPartComponent { @Override public boolean canPointMoveFreely(int pointIndex) { return false; + } + + @Override + public Rectangle2D getCachingBounds() { + int margin = 20; + Rectangle2D bounds = getBody()[0].getBounds2D(); + return new Rectangle2D.Double(bounds.getX() - margin, bounds.getY() - margin, bounds.getWidth() + 2 * margin, bounds.getHeight() + 2 * margin); } } diff --git a/diylc/diylc-library/src/org/diylc/components/electromechanical/RCAJack.java b/diylc/diylc-library/src/org/diylc/components/electromechanical/RCAJack.java index aa9e4c6a..68ae0876 100644 --- a/diylc/diylc-library/src/org/diylc/components/electromechanical/RCAJack.java +++ b/diylc/diylc-library/src/org/diylc/components/electromechanical/RCAJack.java @@ -32,6 +32,7 @@ import java.awt.geom.Area; import java.awt.geom.Ellipse2D; import java.awt.geom.Path2D; import java.awt.geom.Point2D; +import java.awt.geom.Rectangle2D; import org.diylc.appframework.miscutils.ConfigurationManager; import org.diylc.awt.TwoCircleTangent; @@ -52,7 +53,8 @@ import org.diylc.core.measures.SizeUnit; import org.diylc.utils.Constants; @ComponentDescriptor(name = "RCA Jack", category = "Electro-Mechanical", author = "Branislav Stojkovic", - description = "Panel mount RCA phono jack socket", zOrder = IDIYComponent.COMPONENT, instanceNamePrefix = "J") + description = "Panel mount RCA phono jack socket", zOrder = IDIYComponent.COMPONENT, instanceNamePrefix = "J", + enableCache = true) public class RCAJack extends AbstractMultiPartComponent { private static final long serialVersionUID = 1L; @@ -323,5 +325,12 @@ public class RCAJack extends AbstractMultiPartComponent { @Override public boolean canPointMoveFreely(int pointIndex) { return false; + } + + @Override + public Rectangle2D getCachingBounds() { + int margin = 20; + Rectangle2D bounds = getBody()[1].getBounds2D(); + return new Rectangle2D.Double(bounds.getX() - margin, bounds.getY() - margin, bounds.getWidth() + 2 * margin, bounds.getHeight() + 2 * margin); } } diff --git a/diylc/diylc-library/src/org/diylc/components/passive/MultiSectionCapacitor.java b/diylc/diylc-library/src/org/diylc/components/passive/MultiSectionCapacitor.java index eb13cee2..bbc1fc48 100644 --- a/diylc/diylc-library/src/org/diylc/components/passive/MultiSectionCapacitor.java +++ b/diylc/diylc-library/src/org/diylc/components/passive/MultiSectionCapacitor.java @@ -29,6 +29,7 @@ import java.awt.Point; import java.awt.Rectangle; import java.awt.geom.Area; import java.awt.geom.Ellipse2D; +import java.awt.geom.Rectangle2D; import java.text.DecimalFormat; import java.text.Format; @@ -57,7 +58,7 @@ import org.diylc.utils.Constants; @ComponentDescriptor(name = "Multi-Section Capacitor", author = "Branislav Stojkovic", category = "Passive", instanceNamePrefix = "C", description = "Multi-section vertically mounted electrolytic capacitor, similar to JJ, CE and others", - zOrder = IDIYComponent.COMPONENT, keywordPolicy = KeywordPolicy.SHOW_VALUE) + zOrder = IDIYComponent.COMPONENT, keywordPolicy = KeywordPolicy.SHOW_VALUE, enableCache = true) public class MultiSectionCapacitor extends AbstractTransparentComponent { private static final long serialVersionUID = 1L; @@ -521,5 +522,12 @@ public class MultiSectionCapacitor extends AbstractTransparentComponent { private static final long serialVersionUID = 1L; @@ -667,6 +668,13 @@ public class BridgeRectifier extends AbstractTransparentComponent { @Override public boolean canPointMoveFreely(int pointIndex) { return false; + } + + @Override + public Rectangle2D getCachingBounds() { + int margin = 20; + Rectangle2D bounds = getBody()[0].getBounds2D(); + return new Rectangle2D.Double(bounds.getX() - margin, bounds.getY() - margin, bounds.getWidth() + 2 * margin, bounds.getHeight() + 2 * margin); } public static enum RectifierType { diff --git a/diylc/diylc-library/src/org/diylc/components/semiconductors/DiodeGlass.java b/diylc/diylc-library/src/org/diylc/components/semiconductors/DiodeGlass.java index 7bb3bb13..9335f39d 100644 --- a/diylc/diylc-library/src/org/diylc/components/semiconductors/DiodeGlass.java +++ b/diylc/diylc-library/src/org/diylc/components/semiconductors/DiodeGlass.java @@ -42,7 +42,7 @@ import org.diylc.utils.Constants; @ComponentDescriptor(name = "Diode (glass)", author = "Branislav Stojkovic", category = "Semiconductors", creationMethod = CreationMethod.POINT_BY_POINT, instanceNamePrefix = "D", description = "Glass diode, like most small signal diodes.", zOrder = IDIYComponent.COMPONENT, - transformer = SimpleComponentTransformer.class) + transformer = SimpleComponentTransformer.class, enableCache = true) public class DiodeGlass extends AbstractLeadedComponent { private static final long serialVersionUID = 1L; diff --git a/diylc/diylc-library/src/org/diylc/components/semiconductors/DiodePlastic.java b/diylc/diylc-library/src/org/diylc/components/semiconductors/DiodePlastic.java index 58ded5f5..8d06ed73 100644 --- a/diylc/diylc-library/src/org/diylc/components/semiconductors/DiodePlastic.java +++ b/diylc/diylc-library/src/org/diylc/components/semiconductors/DiodePlastic.java @@ -42,7 +42,7 @@ import org.diylc.utils.Constants; @ComponentDescriptor(name = "Diode (plastic)", author = "Branislav Stojkovic", category = "Semiconductors", creationMethod = CreationMethod.POINT_BY_POINT, instanceNamePrefix = "D", description = "Plastic diode, like most rectifier, zener, schottky, etc.", zOrder = IDIYComponent.COMPONENT, - transformer = SimpleComponentTransformer.class) + transformer = SimpleComponentTransformer.class, enableCache = true) public class DiodePlastic extends AbstractLeadedComponent { private static final long serialVersionUID = 1L; diff --git a/diylc/diylc-library/src/org/diylc/components/semiconductors/TransistorTO1.java b/diylc/diylc-library/src/org/diylc/components/semiconductors/TransistorTO1.java index 3b3f4150..1996e81b 100644 --- a/diylc/diylc-library/src/org/diylc/components/semiconductors/TransistorTO1.java +++ b/diylc/diylc-library/src/org/diylc/components/semiconductors/TransistorTO1.java @@ -52,7 +52,8 @@ import org.diylc.utils.Constants; @ComponentDescriptor(name = "Transistor (TO-1)", author = "Branislav Stojkovic", category = "Semiconductors", instanceNamePrefix = "Q", description = "Transistor with small metal body", - zOrder = IDIYComponent.COMPONENT, keywordPolicy = KeywordPolicy.SHOW_VALUE, transformer = TO1Transformer.class) + zOrder = IDIYComponent.COMPONENT, keywordPolicy = KeywordPolicy.SHOW_VALUE, transformer = TO1Transformer.class, + enableCache = true) public class TransistorTO1 extends AbstractTransistorPackage { private static final long serialVersionUID = 1L; diff --git a/diylc/diylc-library/src/org/diylc/components/semiconductors/TransistorTO126.java b/diylc/diylc-library/src/org/diylc/components/semiconductors/TransistorTO126.java index 24c138e1..360bf1a4 100644 --- a/diylc/diylc-library/src/org/diylc/components/semiconductors/TransistorTO126.java +++ b/diylc/diylc-library/src/org/diylc/components/semiconductors/TransistorTO126.java @@ -52,7 +52,8 @@ import org.diylc.utils.Constants; @ComponentDescriptor(name = "Transistor (TO-126)", author = "Branislav Stojkovic", category = "Semiconductors", instanceNamePrefix = "Q", description = "Transistors with a hole for heat sink mounting", - zOrder = IDIYComponent.COMPONENT, keywordPolicy = KeywordPolicy.SHOW_VALUE, transformer = TO220Transformer.class) + zOrder = IDIYComponent.COMPONENT, keywordPolicy = KeywordPolicy.SHOW_VALUE, transformer = TO220Transformer.class, + enableCache = true) public class TransistorTO126 extends AbstractTransistorPackage { private static final long serialVersionUID = 1L; diff --git a/diylc/diylc-library/src/org/diylc/components/semiconductors/TransistorTO220.java b/diylc/diylc-library/src/org/diylc/components/semiconductors/TransistorTO220.java index f99e7d53..e6f16562 100644 --- a/diylc/diylc-library/src/org/diylc/components/semiconductors/TransistorTO220.java +++ b/diylc/diylc-library/src/org/diylc/components/semiconductors/TransistorTO220.java @@ -52,7 +52,8 @@ import org.diylc.utils.Constants; @ComponentDescriptor(name = "Transistor (TO-220)", author = "Branislav Stojkovic", category = "Semiconductors", instanceNamePrefix = "Q", description = "Transistors with metal tab for heat sink mounting", - zOrder = IDIYComponent.COMPONENT, keywordPolicy = KeywordPolicy.SHOW_VALUE, transformer = TO220Transformer.class) + zOrder = IDIYComponent.COMPONENT, keywordPolicy = KeywordPolicy.SHOW_VALUE, transformer = TO220Transformer.class, + enableCache = true) public class TransistorTO220 extends AbstractTransistorPackage { private static final long serialVersionUID = 1L; diff --git a/diylc/diylc-library/src/org/diylc/components/semiconductors/TransistorTO3.java b/diylc/diylc-library/src/org/diylc/components/semiconductors/TransistorTO3.java index cc7fb610..b37d4f50 100644 --- a/diylc/diylc-library/src/org/diylc/components/semiconductors/TransistorTO3.java +++ b/diylc/diylc-library/src/org/diylc/components/semiconductors/TransistorTO3.java @@ -57,7 +57,7 @@ import org.diylc.utils.Constants; @ComponentDescriptor(name = "Transistor (TO-3)", author = "Branislav Stojkovic", category = "Semiconductors", instanceNamePrefix = "Q", description = "Transistor with large metal body", - zOrder = IDIYComponent.COMPONENT, keywordPolicy = KeywordPolicy.SHOW_VALUE) + zOrder = IDIYComponent.COMPONENT, keywordPolicy = KeywordPolicy.SHOW_VALUE, enableCache = true) public class TransistorTO3 extends AbstractTransparentComponent { private static final long serialVersionUID = 1L; @@ -359,5 +359,17 @@ public class TransistorTO3 extends AbstractTransparentComponent { public void setDisplay(Display display) { this.display = display; + } + + @Override + public Rectangle2D getCachingBounds() { + Area area = new Area(); + Area[] body = getBody(); + int margin = 20; + for (Area a : body) + if (a != null) + area.add(a); + Rectangle2D bounds = area.getBounds2D(); + return new Rectangle2D.Double(bounds.getX() - margin, bounds.getY() - margin, bounds.getWidth() + 2 * margin, bounds.getHeight() + 2 * margin); } } diff --git a/diylc/diylc-library/src/org/diylc/components/semiconductors/TransistorTO92.java b/diylc/diylc-library/src/org/diylc/components/semiconductors/TransistorTO92.java index 7a2b47b3..03a16b65 100644 --- a/diylc/diylc-library/src/org/diylc/components/semiconductors/TransistorTO92.java +++ b/diylc/diylc-library/src/org/diylc/components/semiconductors/TransistorTO92.java @@ -52,7 +52,8 @@ import org.diylc.utils.Constants; @ComponentDescriptor(name = "Transistor (TO-92)", author = "Branislav Stojkovic", category = "Semiconductors", instanceNamePrefix = "Q", description = "Transistor with small plastic or epoxy body", - zOrder = IDIYComponent.COMPONENT, keywordPolicy = KeywordPolicy.SHOW_VALUE, transformer = TO92Transformer.class) + zOrder = IDIYComponent.COMPONENT, keywordPolicy = KeywordPolicy.SHOW_VALUE, transformer = TO92Transformer.class, + enableCache = true) public class TransistorTO92 extends AbstractTransistorPackage { private static final long serialVersionUID = 1L; diff --git a/diylc/diylc-library/src/org/diylc/components/tube/TubeSocket.java b/diylc/diylc-library/src/org/diylc/components/tube/TubeSocket.java index 83d0a709..8540e62b 100644 --- a/diylc/diylc-library/src/org/diylc/components/tube/TubeSocket.java +++ b/diylc/diylc-library/src/org/diylc/components/tube/TubeSocket.java @@ -55,7 +55,7 @@ import org.diylc.utils.Constants; @ComponentDescriptor(name = "Tube Socket", author = "Branislav Stojkovic", category = "Tubes", instanceNamePrefix = "V", description = "Various types of tube/valve sockets", - zOrder = IDIYComponent.COMPONENT, keywordPolicy = KeywordPolicy.SHOW_VALUE) + zOrder = IDIYComponent.COMPONENT, keywordPolicy = KeywordPolicy.SHOW_VALUE, enableCache = true) public class TubeSocket extends AbstractTransparentComponent { private static final Size B9A_PIN_SPACING_CHASSIS = new Size(12.5d, SizeUnit.mm); @@ -437,6 +437,13 @@ public class TubeSocket extends AbstractTransparentComponent { updateControlPoints(); // Reset body shape body = null; + } + + @Override + public Rectangle2D getCachingBounds() { + Rectangle2D rect = getBody().getBounds2D(); + int margin = 40; // to catch the pins that are outside the body, if needed + return new Rectangle2D.Double(rect.getX() - margin, rect.getY() - margin, rect.getWidth() + 2 * margin, rect.getHeight() + 2 * margin); } public static enum Base { diff --git a/diylc/diylc-swing/DIYLCStarter.launch b/diylc/diylc-swing/DIYLCStarter.launch index d336f52d..b38acedd 100644 --- a/diylc/diylc-swing/DIYLCStarter.launch +++ b/diylc/diylc-swing/DIYLCStarter.launch @@ -10,6 +10,7 @@ + - + diff --git a/diylc/diylc-swing/build.xml b/diylc/diylc-swing/build.xml index 599056fb..a8335a73 100644 --- a/diylc/diylc-swing/build.xml +++ b/diylc/diylc-swing/build.xml @@ -10,7 +10,7 @@ - + diff --git a/diylc/diylc-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar index c342b2f3..15a5b88c 100644 Binary files a/diylc/diylc-swing/lib/diylc-core.jar and b/diylc/diylc-swing/lib/diylc-core.jar differ diff --git a/diylc/diylc-swing/library/main.jar b/diylc/diylc-swing/library/main.jar index e69de29b..7a3873ef 100644 Binary files a/diylc/diylc-swing/library/main.jar and b/diylc/diylc-swing/library/main.jar differ diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/config/ConfigPlugin.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/config/ConfigPlugin.java index 2c33c3d9..4ee311c5 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/config/ConfigPlugin.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/config/ConfigPlugin.java @@ -75,7 +75,7 @@ public class ConfigPlugin implements IPlugIn { ActionFactory.getInstance().createConfigAction(plugInPort, "Continuous Creation", IPlugInPort.CONTINUOUS_CREATION_KEY, false), CONFIG_MENU); swingUI.injectMenuAction( - ActionFactory.getInstance().createConfigAction(plugInPort, "Enable Caching (Beta)", + ActionFactory.getInstance().createConfigAction(plugInPort, "Enable Cache Boost", IPlugInPort.CACHING_ENABLED_KEY, true), CONFIG_MENU); swingUI.injectMenuAction( ActionFactory.getInstance().createConfigAction(plugInPort, "Export Grid", IPlugInPort.EXPORT_GRID_KEY, false),