From 58a4ff987f203c2a9bad2eed508d504191c540b0 Mon Sep 17 00:00:00 2001 From: Branislav Stojkovic Date: Sun, 16 Dec 2018 00:52:15 +0100 Subject: [PATCH] Highlight connected areas through copper traces, leads, jumpers, etc... --- .../src/org/diylc/common/ComponentType.java | 284 ++-- .../src/org/diylc/common/IPlugInPort.java | 3 +- .../components/AbstractCurvedComponent.java | 4 +- .../components/AbstractLeadedComponent.java | 20 +- .../src/org/diylc/core/IDrawingObserver.java | 6 +- .../core/annotations/ComponentDescriptor.java | 9 +- .../org/diylc/presenter/ComponentArea.java | 51 + .../diylc/presenter/ComponentProcessor.java | 11 +- .../org/diylc/presenter/DrawingManager.java | 980 ++++++----- .../src/org/diylc/presenter/G2DWrapper.java | 1451 +++++++++-------- .../diylc/presenter/InstantiationManager.java | 2 +- .../src/org/diylc/presenter/Presenter.java | 151 +- diylc/diylc-library/lib/diylc-core.jar | Bin 242638 -> 246131 bytes .../components/boards/TerminalStrip.java | 6 +- .../diylc/components/boards/TriPadBoard.java | 12 +- .../diylc/components/boards/VeroBoard.java | 12 +- .../components/connectivity/CurvedTrace.java | 11 +- .../components/connectivity/HookupWire.java | 7 +- .../diylc/components/connectivity/Jumper.java | 2 +- .../components/connectivity/TraceCut.java | 16 +- diylc/diylc-swing/DIYLCStarter.launch | 2 +- diylc/diylc-swing/lib/diylc-core.jar | Bin 242638 -> 246131 bytes diylc/diylc-swing/library/main.jar | Bin 434003 -> 434509 bytes .../swing/plugins/config/ConfigPlugin.java | 5 +- diylc/diylc-swing/update.xml | 4 + 25 files changed, 1685 insertions(+), 1364 deletions(-) create mode 100644 diylc/diylc-core/src/org/diylc/presenter/ComponentArea.java diff --git a/diylc/diylc-core/src/org/diylc/common/ComponentType.java b/diylc/diylc-core/src/org/diylc/common/ComponentType.java index 715526bb..8d66ade9 100644 --- a/diylc/diylc-core/src/org/diylc/common/ComponentType.java +++ b/diylc/diylc-core/src/org/diylc/common/ComponentType.java @@ -1,148 +1,150 @@ /* + * + * DIY Layout Creator (DIYLC). Copyright (c) 2009-2018 held jointly by the individual authors. + * + * This file is part of DIYLC. + * + * DIYLC is free software: you can redistribute it and/or modify it under the terms of the GNU + * General Public License as published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * DIYLC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + * Public License for more details. + * + * You should have received a copy of the GNU General Public License along with DIYLC. If not, see + * . + */ +package org.diylc.common; - DIY Layout Creator (DIYLC). - Copyright (c) 2009-2018 held jointly by the individual authors. +import javax.swing.Icon; - This file is part of DIYLC. +import org.diylc.core.CreationMethod; +import org.diylc.core.IDIYComponent; +import org.diylc.core.annotations.BomPolicy; +import org.diylc.core.annotations.KeywordPolicy; - DIYLC is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. +/** + * Entity class used to describe a component type. + * + * @author Branislav Stojkovic + * + * @see IDIYComponent + */ +public class ComponentType { - DIYLC is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + private String name; + private String description; + private CreationMethod creationMethod; + private String category; + private String namePrefix; + private String author; + private Icon icon; + private Class> instanceClass; + private double zOrder; + private boolean flexibleZOrder; + private boolean stretchable; + private BomPolicy bomPolicy; + private boolean autoEdit; + private IComponentTransformer transformer; + private KeywordPolicy keywordPolicy; + private String keywordTag; + private boolean continuity; - You should have received a copy of the GNU General Public License - along with DIYLC. If not, see . + public ComponentType(String name, String description, CreationMethod creationMethod, String category, + String namePrefix, String author, Icon icon, Class> instanceClass, double zOrder, + boolean flexibleZOrder, boolean stretchable, BomPolicy bomPolicy, boolean autoEdit, + IComponentTransformer transformer, KeywordPolicy keywordPolicy, String keywordTag, boolean continuity) { + super(); + this.name = name; + this.description = description; + this.creationMethod = creationMethod; + this.category = category; + this.namePrefix = namePrefix; + this.author = author; + this.icon = icon; + this.instanceClass = instanceClass; + this.zOrder = zOrder; + this.flexibleZOrder = flexibleZOrder; + this.stretchable = stretchable; + this.bomPolicy = bomPolicy; + this.autoEdit = autoEdit; + this.transformer = transformer; + this.keywordPolicy = keywordPolicy; + this.keywordTag = keywordTag; + this.continuity = continuity; + } -*/ -package org.diylc.common; - -import javax.swing.Icon; - -import org.diylc.core.CreationMethod; -import org.diylc.core.IDIYComponent; -import org.diylc.core.annotations.BomPolicy; -import org.diylc.core.annotations.KeywordPolicy; - -/** - * Entity class used to describe a component type. - * - * @author Branislav Stojkovic - * - * @see IDIYComponent - */ -public class ComponentType { - - private String name; - private String description; - private CreationMethod creationMethod; - private String category; - private String namePrefix; - private String author; - private Icon icon; - private Class> instanceClass; - private double zOrder; - private boolean flexibleZOrder; - private boolean stretchable; - private BomPolicy bomPolicy; - private boolean autoEdit; - private IComponentTransformer transformer; - private KeywordPolicy keywordPolicy; - private String keywordTag; - - public ComponentType(String name, String description, CreationMethod creationMethod, String category, - String namePrefix, String author, Icon icon, Class> instanceClass, double zOrder, - boolean flexibleZOrder, boolean stretchable, BomPolicy bomPolicy, boolean autoEdit, IComponentTransformer transformer, - KeywordPolicy keywordPolicy, String keywordTag) { - super(); - this.name = name; - this.description = description; - this.creationMethod = creationMethod; - this.category = category; - this.namePrefix = namePrefix; - this.author = author; - this.icon = icon; - this.instanceClass = instanceClass; - this.zOrder = zOrder; - this.flexibleZOrder = flexibleZOrder; - this.stretchable = stretchable; - this.bomPolicy = bomPolicy; - this.autoEdit = autoEdit; - this.transformer = transformer; - this.keywordPolicy = keywordPolicy; - this.keywordTag = keywordTag; - } - - public String getName() { - return name; - } - - public String getDescription() { - return description; - } - - public CreationMethod getCreationMethod() { - return creationMethod; - } - - public String getCategory() { - return category; - } - - public String getNamePrefix() { - return namePrefix; - } - - public String getAuthor() { - return author; - } - - public Icon getIcon() { - return icon; - } - - public Class> getInstanceClass() { - return instanceClass; - } - - public double getZOrder() { - return zOrder; - } - - public boolean isFlexibleZOrder() { - return flexibleZOrder; - } - - public boolean isStretchable() { - return stretchable; - } - - public BomPolicy getBomPolicy() { - return bomPolicy; - } - - public boolean isAutoEdit() { - return autoEdit; - } - - public IComponentTransformer getTransformer() { - return transformer; - } - - public KeywordPolicy getKeywordPolicy() { - return keywordPolicy; - } - - public String getKeywordTag() { - return keywordTag; - } - - @Override - public String toString() { - return name; - } -} + public String getName() { + return name; + } + + public String getDescription() { + return description; + } + + public CreationMethod getCreationMethod() { + return creationMethod; + } + + public String getCategory() { + return category; + } + + public String getNamePrefix() { + return namePrefix; + } + + public String getAuthor() { + return author; + } + + public Icon getIcon() { + return icon; + } + + public Class> getInstanceClass() { + return instanceClass; + } + + public double getZOrder() { + return zOrder; + } + + public boolean isFlexibleZOrder() { + return flexibleZOrder; + } + + public boolean isStretchable() { + return stretchable; + } + + public BomPolicy getBomPolicy() { + return bomPolicy; + } + + public boolean isAutoEdit() { + return autoEdit; + } + + public IComponentTransformer getTransformer() { + return transformer; + } + + public KeywordPolicy getKeywordPolicy() { + return keywordPolicy; + } + + public String getKeywordTag() { + return keywordTag; + } + + public boolean isContinuity() { + return continuity; + } + + @Override + public String toString() { + return name; + } +} diff --git a/diylc/diylc-core/src/org/diylc/common/IPlugInPort.java b/diylc/diylc-core/src/org/diylc/common/IPlugInPort.java index dc51c980..f25c8d5d 100644 --- a/diylc/diylc-core/src/org/diylc/common/IPlugInPort.java +++ b/diylc/diylc-core/src/org/diylc/common/IPlugInPort.java @@ -70,7 +70,8 @@ public interface IPlugInPort extends ISelectionProcessor, IMouseProcessor, IKeyP public static final String RECENT_COMPONENTS_KEY = "recentComponents"; public static final String RECENT_FILES_KEY = "recentFiles"; public static final String SHOW_RULERS_KEY = "showRulers"; - public static final String SHOW_GRID_KEY = "showGrid"; + public static final String SHOW_GRID_KEY = "showGrid"; + public static final String HIGHLIGHT_CONTINUITY_AREA = "highlightContinuityArea"; public static final int DND_TOGGLE_STICKY = 0x1; public static final int DND_TOGGLE_SNAP = 0x40000000; diff --git a/diylc/diylc-core/src/org/diylc/components/AbstractCurvedComponent.java b/diylc/diylc-core/src/org/diylc/components/AbstractCurvedComponent.java index abe220e6..1d5b040f 100644 --- a/diylc/diylc-core/src/org/diylc/components/AbstractCurvedComponent.java +++ b/diylc/diylc-core/src/org/diylc/components/AbstractCurvedComponent.java @@ -61,7 +61,7 @@ public abstract class AbstractCurvedComponent extends AbstractTransparentComp * @param componentState * @param theme */ - protected abstract void drawCurve(CubicCurve2D curve, Graphics2D g2d, ComponentState componentState); + protected abstract void drawCurve(CubicCurve2D curve, Graphics2D g2d, ComponentState componentState, IDrawingObserver drawingObserver); /** * @return default color. @@ -110,7 +110,7 @@ public abstract class AbstractCurvedComponent extends AbstractTransparentComp // g2d.setColor(color); // g2d.setStroke(new BasicStroke(thickness - 2)); // g2d.draw(path); - drawCurve(curve, g2d, componentState); + drawCurve(curve, g2d, componentState, drawingObserver); g2d.setComposite(oldComposite); } diff --git a/diylc/diylc-core/src/org/diylc/components/AbstractLeadedComponent.java b/diylc/diylc-core/src/org/diylc/components/AbstractLeadedComponent.java index 42c10cd9..8805dfa2 100644 --- a/diylc/diylc-core/src/org/diylc/components/AbstractLeadedComponent.java +++ b/diylc/diylc-core/src/org/diylc/components/AbstractLeadedComponent.java @@ -32,7 +32,8 @@ import java.awt.Shape; import java.awt.geom.AffineTransform; import java.awt.geom.Ellipse2D; import java.awt.geom.Rectangle2D; - +import java.util.Observable; + import org.diylc.appframework.miscutils.ConfigurationManager; import org.diylc.common.Display; import org.diylc.common.IPlugInPort; @@ -84,6 +85,10 @@ public abstract class AbstractLeadedComponent extends AbstractTransparentComp } catch (NullPointerException e) { // This will happen if components do not have any shape. } + } + + protected boolean IsCopperArea() { + return false; } @Override @@ -93,7 +98,7 @@ public abstract class AbstractLeadedComponent extends AbstractTransparentComp Shape shape = getBodyShape(); // If there's no body, just draw the line connecting the ending points. if (shape == null) { - drawLead(g2d, componentState); + drawLead(g2d, componentState, drawingObserver, IsCopperArea()); } else if (supportsStandingMode() && length.convertToPixels() > points[0].distance(points[1])) { // When ending points are too close draw the component in standing // mode. @@ -124,7 +129,7 @@ public abstract class AbstractLeadedComponent extends AbstractTransparentComp g2d.setColor(finalBorderColor); g2d.draw(body); if (!outlineMode) { - drawLead(g2d, componentState); + drawLead(g2d, componentState, drawingObserver, false); } } else { // Normal mode with component body in the center and two lead parts. @@ -293,12 +298,17 @@ public abstract class AbstractLeadedComponent extends AbstractTransparentComp g2d.drawLine(points[1].x, points[1].y, endX, endY); } - private void drawLead(Graphics2D g2d, ComponentState componentState) { + private void drawLead(Graphics2D g2d, ComponentState componentState, IDrawingObserver observer, boolean isCopperArea) { + if (isCopperArea) + observer.startTrackingContinuityArea(true); g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(getLeadThickness())); Color leadColor = shouldShadeLeads() ? getLeadColorForPainting(componentState).darker() : getLeadColorForPainting(componentState); g2d.setColor(leadColor); - g2d.drawLine(points[0].x, points[0].y, points[1].x, points[1].y); + g2d.drawLine(points[0].x, points[0].y, points[1].x, points[1].y); + + if (isCopperArea) + observer.stopTrackingContinuityArea(); if (shouldShadeLeads()) { g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(getLeadThickness() - 2)); diff --git a/diylc/diylc-core/src/org/diylc/core/IDrawingObserver.java b/diylc/diylc-core/src/org/diylc/core/IDrawingObserver.java index 4a476b7d..0ee8ac6a 100644 --- a/diylc/diylc-core/src/org/diylc/core/IDrawingObserver.java +++ b/diylc/diylc-core/src/org/diylc/core/IDrawingObserver.java @@ -31,5 +31,9 @@ public interface IDrawingObserver { void stopTracking(); - void startTracking(); + void startTracking(); + + void stopTrackingContinuityArea(); + + void startTrackingContinuityArea(boolean positive); } 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 4ba7121d..53b0b567 100644 --- a/diylc/diylc-core/src/org/diylc/core/annotations/ComponentDescriptor.java +++ b/diylc/diylc-core/src/org/diylc/core/annotations/ComponentDescriptor.java @@ -116,6 +116,13 @@ public @interface ComponentDescriptor { * * @return */ - String keywordTag() default ""; + String keywordTag() default ""; + + /** + * For components that show continuity between the two ending points, e.d. wires, jumpers, etc. + * + * @return + */ + boolean continuity() default false; } diff --git a/diylc/diylc-core/src/org/diylc/presenter/ComponentArea.java b/diylc/diylc-core/src/org/diylc/presenter/ComponentArea.java new file mode 100644 index 00000000..56297194 --- /dev/null +++ b/diylc/diylc-core/src/org/diylc/presenter/ComponentArea.java @@ -0,0 +1,51 @@ +/* + + DIY Layout Creator (DIYLC). + Copyright (c) 2009-2018 held jointly by the individual authors. + + This file is part of DIYLC. + + DIYLC is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DIYLC is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DIYLC. If not, see . + +*/ +package org.diylc.presenter; + +import java.awt.geom.Area; +import java.util.List; + +public class ComponentArea { + + private Area outlineArea; + private List continuityPositiveAreas; + private List continuityNegativeAreas; + + public ComponentArea(Area outlineArea, List continuityPositiveAreas, List continuityNegativeAreas) { + super(); + this.outlineArea = outlineArea; + this.continuityPositiveAreas = continuityPositiveAreas; + this.continuityNegativeAreas = continuityNegativeAreas; + } + + public Area getOutlineArea() { + return outlineArea; + } + + public List getContinuityPositiveAreas() { + return continuityPositiveAreas; + } + + public List getContinuityNegativeAreas() { + return continuityNegativeAreas; + } +} diff --git a/diylc/diylc-core/src/org/diylc/presenter/ComponentProcessor.java b/diylc/diylc-core/src/org/diylc/presenter/ComponentProcessor.java index 383192ff..e241c18d 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/ComponentProcessor.java +++ b/diylc/diylc-core/src/org/diylc/presenter/ComponentProcessor.java @@ -97,7 +97,8 @@ public class ComponentProcessor { boolean autoEdit; IComponentTransformer transformer; KeywordPolicy keywordPolicy; - String keywordTag; + String keywordTag; + boolean continuity; if (clazz.isAnnotationPresent(ComponentDescriptor.class)) { ComponentDescriptor annotation = clazz.getAnnotation(ComponentDescriptor.class); name = annotation.name(); @@ -113,7 +114,8 @@ public class ComponentProcessor { autoEdit = annotation.autoEdit(); transformer = getComponentTransformer(annotation.transformer()); keywordPolicy = annotation.keywordPolicy(); - keywordTag = annotation.keywordTag(); + keywordTag = annotation.keywordTag(); + continuity = annotation.continuity(); } else { // default name = clazz.getSimpleName(); description = ""; @@ -128,7 +130,8 @@ public class ComponentProcessor { autoEdit = true; transformer = null; keywordPolicy = KeywordPolicy.NEVER_SHOW; - keywordTag = null; + keywordTag = null; + continuity = false; } icon = null; // Draw component icon. @@ -148,7 +151,7 @@ public class ComponentProcessor { } ComponentType componentType = new ComponentType(name, description, creationMethod, category, namePrefix, author, icon, clazz, zOrder, - flexibleZOrder, stretchable, bomPolicy, autoEdit, transformer, keywordPolicy, keywordTag); + flexibleZOrder, stretchable, bomPolicy, autoEdit, transformer, keywordPolicy, keywordTag, continuity); componentTypeMap.put(clazz.getName(), componentType); return componentType; } diff --git a/diylc/diylc-core/src/org/diylc/presenter/DrawingManager.java b/diylc/diylc-core/src/org/diylc/presenter/DrawingManager.java index 526bd5fb..e4d3ef3d 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/DrawingManager.java +++ b/diylc/diylc-core/src/org/diylc/presenter/DrawingManager.java @@ -1,403 +1,591 @@ /* + * + * DIY Layout Creator (DIYLC). Copyright (c) 2009-2018 held jointly by the individual authors. + * + * This file is part of DIYLC. + * + * DIYLC is free software: you can redistribute it and/or modify it under the terms of the GNU + * General Public License as published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * DIYLC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + * Public License for more details. + * + * You should have received a copy of the GNU General Public License along with DIYLC. If not, see + * . + */ +package org.diylc.presenter; - DIY Layout Creator (DIYLC). - Copyright (c) 2009-2018 held jointly by the individual authors. +import java.awt.AlphaComposite; +import java.awt.BasicStroke; +import java.awt.Color; +import java.awt.Composite; +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.RenderingHints; +import java.awt.geom.Area; +import java.awt.geom.Path2D; +import java.awt.geom.PathIterator; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; - This file is part of DIYLC. +import org.apache.log4j.Logger; +import org.diylc.appframework.miscutils.ConfigurationManager; +import org.diylc.appframework.simplemq.MessageDispatcher; +import org.diylc.common.ComponentType; +import org.diylc.common.DrawOption; +import org.diylc.common.EventType; +import org.diylc.common.GridType; +import org.diylc.common.IComponentFiler; +import org.diylc.common.IPlugInPort; +import org.diylc.common.ObjectCache; +import org.diylc.core.ComponentState; +import org.diylc.core.IDIYComponent; +import org.diylc.core.Project; +import org.diylc.core.Theme; +import org.diylc.core.VisibilityPolicy; +import org.diylc.utils.Constants; - DIYLC is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. +/** + * Utility that deals with painting {@link Project} on the {@link Graphics2D} and keeps areas taken + * by each drawn component. + * + * @author Branislav Stojkovic + */ +public class DrawingManager { - DIYLC is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + private static final Logger LOG = Logger.getLogger(DrawingManager.class); - You should have received a copy of the GNU General Public License - along with DIYLC. If not, see . + public static int CONTROL_POINT_SIZE = 7; -*/ -package org.diylc.presenter; - -import java.awt.AlphaComposite; -import java.awt.BasicStroke; -import java.awt.Color; -import java.awt.Composite; -import java.awt.Dimension; -import java.awt.Graphics2D; -import java.awt.Point; -import java.awt.Rectangle; -import java.awt.RenderingHints; -import java.awt.geom.Area; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.apache.log4j.Logger; -import org.diylc.appframework.miscutils.ConfigurationManager; -import org.diylc.appframework.simplemq.MessageDispatcher; -import org.diylc.common.DrawOption; -import org.diylc.common.EventType; -import org.diylc.common.GridType; -import org.diylc.common.IComponentFiler; -import org.diylc.common.IPlugInPort; -import org.diylc.common.ObjectCache; -import org.diylc.core.ComponentState; -import org.diylc.core.IDIYComponent; -import org.diylc.core.Project; -import org.diylc.core.Theme; -import org.diylc.core.VisibilityPolicy; -import org.diylc.utils.Constants; - -/** - * Utility that deals with painting {@link Project} on the {@link Graphics2D} and keeps areas taken - * by each drawn component. - * - * @author Branislav Stojkovic - */ -public class DrawingManager { - - private static final Logger LOG = Logger.getLogger(DrawingManager.class); - - public static int CONTROL_POINT_SIZE = 7; - - public static final String ZOOM_KEY = "zoom"; - - public static String DEBUG_COMPONENT_AREAS = "org.diylc.debugComponentAreas"; - - public static Color CONTROL_POINT_COLOR = Color.blue; - public static Color SELECTED_CONTROL_POINT_COLOR = Color.green; - - private Theme theme = (Theme) ConfigurationManager.getInstance().readObject(IPlugInPort.THEME_KEY, - Constants.DEFAULT_THEME); - - // Keeps Area object of each drawn component. - private Map, Area> componentAreaMap; - // Maps components to the last state they are drawn in. Also, used to - // determine which components are invalidated when they are not in the map. - private Map, ComponentState> lastDrawnStateMap; - - private Composite slotComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f); - private Composite lockedComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f); - private List> failedComponents = new ArrayList>(); - - private double zoomLevel = 1d;// ConfigurationManager.getInstance().readDouble(ZOOM_KEY, - // 1d); - - private MessageDispatcher messageDispatcher; - - private boolean debugComponentAreas; - - public DrawingManager(MessageDispatcher messageDispatcher) { - super(); - this.messageDispatcher = messageDispatcher; - componentAreaMap = new HashMap, Area>(); - lastDrawnStateMap = new HashMap, ComponentState>(); - String debugComponentAreasStr = System.getProperty(DEBUG_COMPONENT_AREAS); - debugComponentAreas = debugComponentAreasStr != null && debugComponentAreasStr.equalsIgnoreCase("true"); - } - - /** - * Paints the project onto the canvas and returns the list of components that failed to draw. - * - * @param g2d - * @param project - * @param drawOptions - * @param filter - * @param selectionRect - * @param selectedComponents - * @param lockedComponents - * @param groupedComponents - * @param controlPointSlot - * @param componentSlot - * @param dragInProgress - * @return - */ - public List> drawProject(Graphics2D g2d, Project project, Set drawOptions, - IComponentFiler filter, Rectangle selectionRect, Collection> selectedComponents, - Set> lockedComponents, Set> groupedComponents, List controlPointSlot, - List> componentSlot, boolean dragInProgress) { - failedComponents.clear(); - if (project == null) { - return failedComponents; - } - - double zoom = 1d; - if (drawOptions.contains(DrawOption.ZOOM)) { - zoom = zoomLevel; - } else { - zoom = 1 / Constants.PIXEL_SIZE; - } - - G2DWrapper g2dWrapper = new G2DWrapper(g2d, zoom); - - if (drawOptions.contains(DrawOption.ANTIALIASING)) { - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); - } else { - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); - g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF); - } - if (ConfigurationManager.getInstance().readBoolean(IPlugInPort.HI_QUALITY_RENDER_KEY, false)) { - g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); - g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); - g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); - g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE); - g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); - // g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, - // RenderingHints.VALUE_STROKE_PURE); - } else { - g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_SPEED); - g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_SPEED); - g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED); - g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_DISABLE); - g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR); - } - - // AffineTransform initialTx = g2d.getTransform(); - Dimension d = getCanvasDimensions(project, zoom, true); - - g2dWrapper.setColor(theme.getBgColor()); - g2dWrapper.fillRect(0, 0, d.width, d.height); - g2d.clip(new Rectangle(new Point(0, 0), d)); - - GridType gridType = GridType.LINES; - if (drawOptions.contains(DrawOption.GRID) && gridType != GridType.NONE) { - double zoomStep = project.getGridSpacing().convertToPixels() * zoom; - if (gridType == GridType.CROSSHAIR) { - g2d.setStroke(new BasicStroke(1f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10f, new float[] { - (float) zoomStep / 2, (float) zoomStep / 2}, (float) zoomStep / 4)); - } else if (gridType == GridType.DOT) { - g2d.setStroke(new BasicStroke(1f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10f, new float[] {1f, - (float) zoomStep - 1}, 0f)); - } - - g2dWrapper.setColor(theme.getGridColor()); - for (double i = zoomStep; i < d.width; i += zoomStep) { - g2dWrapper.drawLine((int) i, 0, (int) i, d.height - 1); - } - for (double j = zoomStep; j < d.height; j += zoomStep) { - g2dWrapper.drawLine(0, (int) j, d.width - 1, (int) j); - } - } - - if (Math.abs(1.0 - zoom) > 1e-4) { - g2dWrapper.scale(zoom, zoom); - } - - // Composite mainComposite = g2d.getComposite(); - // Composite alphaComposite = - // AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f); - - // g2dWrapper.resetTx(); - - // componentAreaMap.clear(); - for (IDIYComponent component : project.getComponents()) { - // Do not draw the component if it's filtered out. - if (filter != null && !filter.testComponent(component)) { - continue; - } - ComponentState state = ComponentState.NORMAL; - if (drawOptions.contains(DrawOption.SELECTION) && selectedComponents.contains(component)) { - if (dragInProgress) { - state = ComponentState.DRAGGING; - } else { - state = ComponentState.SELECTED; - } - } - // Do not track the area if component is not invalidated and was - // drawn in the same state. - boolean trackArea = lastDrawnStateMap.get(component) != state; - - synchronized (g2d) { - g2dWrapper.startedDrawingComponent(); - if (!trackArea) { - g2dWrapper.stopTracking(); - } - // Draw locked components in a new composite. - if (lockedComponents.contains(component)) { - g2d.setComposite(lockedComposite); - } - // Draw the component through the g2dWrapper. - try { - component.draw(g2dWrapper, state, drawOptions.contains(DrawOption.OUTLINE_MODE), project, g2dWrapper); - } catch (Exception e) { - LOG.error("Error drawing " + component.getName(), e); - failedComponents.add(component); - } - Area area = g2dWrapper.finishedDrawingComponent(); - if (trackArea && area != null && !area.isEmpty()) { - componentAreaMap.put(component, area); - lastDrawnStateMap.put(component, state); - } - } - } - - // Draw control points. - if (drawOptions.contains(DrawOption.CONTROL_POINTS)) { - // Draw unselected points first to make sure they are below. - if (dragInProgress || drawOptions.contains(DrawOption.OUTLINE_MODE)) { - for (IDIYComponent component : project.getComponents()) { - for (int i = 0; i < component.getControlPointCount(); i++) { - VisibilityPolicy visibilityPolicy = component.getControlPointVisibilityPolicy(i); - if ((groupedComponents.contains(component) - && (visibilityPolicy == VisibilityPolicy.ALWAYS || (selectedComponents.contains(component) && visibilityPolicy == VisibilityPolicy.WHEN_SELECTED)) || (!groupedComponents - .contains(component) && !selectedComponents.contains(component) && component - .getControlPointVisibilityPolicy(i) == VisibilityPolicy.ALWAYS))) { - g2dWrapper.setColor(CONTROL_POINT_COLOR); - Point controlPoint = component.getControlPoint(i); - int pointSize = CONTROL_POINT_SIZE - 2; - g2dWrapper.fillOval(controlPoint.x - pointSize / 2, controlPoint.y - pointSize / 2, pointSize, pointSize); - } - } - } - } - // Then draw the selected ones. - for (IDIYComponent component : selectedComponents) { - for (int i = 0; i < component.getControlPointCount(); i++) { - if (!groupedComponents.contains(component) - && (component.getControlPointVisibilityPolicy(i) == VisibilityPolicy.WHEN_SELECTED || component - .getControlPointVisibilityPolicy(i) == VisibilityPolicy.ALWAYS)) { - - Point controlPoint = component.getControlPoint(i); - int pointSize = CONTROL_POINT_SIZE; - - g2dWrapper.setColor(SELECTED_CONTROL_POINT_COLOR.darker()); - g2dWrapper.fillOval(controlPoint.x - pointSize / 2, controlPoint.y - pointSize / 2, pointSize, pointSize); - g2dWrapper.setColor(SELECTED_CONTROL_POINT_COLOR); - g2dWrapper.fillOval(controlPoint.x - CONTROL_POINT_SIZE / 2 + 1, controlPoint.y - CONTROL_POINT_SIZE / 2 - + 1, CONTROL_POINT_SIZE - 2, CONTROL_POINT_SIZE - 2); - } - } - } - } - - // Draw component slot in a separate composite. - if (componentSlot != null) { - g2dWrapper.startedDrawingComponent(); - g2dWrapper.setComposite(slotComposite); - for (IDIYComponent component : componentSlot) { - try { - - component.draw(g2dWrapper, ComponentState.NORMAL, drawOptions.contains(DrawOption.OUTLINE_MODE), project, - g2dWrapper); - - } catch (Exception e) { - LOG.error("Error drawing " + component.getName(), e); - failedComponents.add(component); - } - } - g2dWrapper.finishedDrawingComponent(); - } - - // Draw control points of the component in the slot. - if (controlPointSlot != null) { - for (Point point : controlPointSlot) { - if (point != null) { - g2dWrapper.setColor(SELECTED_CONTROL_POINT_COLOR.darker()); - g2dWrapper.fillOval(point.x - CONTROL_POINT_SIZE / 2, point.y - CONTROL_POINT_SIZE / 2, CONTROL_POINT_SIZE, - CONTROL_POINT_SIZE); - g2dWrapper.setColor(SELECTED_CONTROL_POINT_COLOR); - g2dWrapper.fillOval(point.x - CONTROL_POINT_SIZE / 2 + 1, point.y - CONTROL_POINT_SIZE / 2 + 1, - CONTROL_POINT_SIZE - 2, CONTROL_POINT_SIZE - 2); - } - } - } - - // Go back to the original transformation and zoom in to draw the - // selection rectangle and other similar elements. - // g2d.setTransform(initialTx); - // if ((drawOptions.contains(DrawOption.ZOOM)) && (Math.abs(1.0 - - // zoomLevel) > 1e-4)) { - // g2d.scale(zoomLevel, zoomLevel); - // } - - // At the end draw selection rectangle if needed. - if (drawOptions.contains(DrawOption.SELECTION) && (selectionRect != null)) { - g2d.setColor(Color.white); - g2d.draw(selectionRect); - g2d.setColor(Color.black); - g2d.setStroke(Constants.DASHED_STROKE); - g2d.draw(selectionRect); - } - - // Draw component area for test - if (debugComponentAreas) { - g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1)); - g2d.setColor(Color.red); - for (Area area : componentAreaMap.values()) { - g2d.draw(area); - } - } - - return failedComponents; - } - - public double getZoomLevel() { - return zoomLevel; - } - - public void setZoomLevel(double zoomLevel) { - this.zoomLevel = zoomLevel; - fireZoomChanged(); - // ConfigurationManager.getInstance().writeValue(ZOOM_KEY, zoomLevel); - } - - public void invalidateComponent(IDIYComponent component) { - componentAreaMap.remove(component); - lastDrawnStateMap.remove(component); - } - - public Area getComponentArea(IDIYComponent component) { - return componentAreaMap.get(component); - } - - public void clearComponentAreaMap() { - componentAreaMap.clear(); - lastDrawnStateMap.clear(); - } - - public List> findComponentsAt(Point point, Project project) { - List> components = new ArrayList>(); - for (int i = 0; i < project.getComponents().size(); i++) { - Area area = componentAreaMap.get(project.getComponents().get(i)); - if (area != null && area.contains(point)) { - components.add(0, project.getComponents().get(i)); - } - } - return components; - } - - public Dimension getCanvasDimensions(Project project, Double zoomLevel, boolean useZoom) { - double width = project.getWidth().convertToPixels(); - double height = project.getHeight().convertToPixels(); - if (useZoom) { - width *= zoomLevel; - height *= zoomLevel; - } else { - width /= Constants.PIXEL_SIZE; - height /= Constants.PIXEL_SIZE; - } - return new Dimension((int) width, (int) height); - } - - public void fireZoomChanged() { - messageDispatcher.dispatchMessage(EventType.ZOOM_CHANGED, zoomLevel); - messageDispatcher.dispatchMessage(EventType.REPAINT); - } - - public Theme getTheme() { - return theme; - } - - public void setTheme(Theme theme) { - this.theme = theme; - ConfigurationManager.getInstance().writeValue(IPlugInPort.THEME_KEY, theme); - messageDispatcher.dispatchMessage(EventType.REPAINT); - } -} + public static final String ZOOM_KEY = "zoom"; + + public static String DEBUG_COMPONENT_AREAS = "org.diylc.debugComponentAreas"; + public static String DEBUG_CONTINUITY_AREAS = "org.diylc.debugContinuityAreas"; + + public static Color CONTROL_POINT_COLOR = Color.blue; + public static Color SELECTED_CONTROL_POINT_COLOR = Color.green; + + private Theme theme = (Theme) ConfigurationManager.getInstance().readObject(IPlugInPort.THEME_KEY, + Constants.DEFAULT_THEME); + + // Keeps Area object of each drawn component. + private Map, ComponentArea> componentAreaMap; + // Maps components to the last state they are drawn in. Also, used to + // determine which components are invalidated when they are not in the map. + private Map, ComponentState> lastDrawnStateMap; + + private Area continuityArea; + + private Composite slotComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f); + private Composite lockedComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f); + private List> failedComponents = new ArrayList>(); + + private double zoomLevel = 1d;// ConfigurationManager.getInstance().readDouble(ZOOM_KEY, + // 1d); + + private MessageDispatcher messageDispatcher; + + private boolean debugComponentAreas; + private boolean debugContinuityAreas; + + public DrawingManager(MessageDispatcher messageDispatcher) { + super(); + this.messageDispatcher = messageDispatcher; + componentAreaMap = new HashMap, ComponentArea>(); + lastDrawnStateMap = new HashMap, ComponentState>(); + String debugComponentAreasStr = System.getProperty(DEBUG_COMPONENT_AREAS); + debugComponentAreas = debugComponentAreasStr != null && debugComponentAreasStr.equalsIgnoreCase("true"); + + String debugContinuityAreasStr = System.getProperty(DEBUG_CONTINUITY_AREAS); + debugContinuityAreas = debugContinuityAreasStr != null && debugContinuityAreasStr.equalsIgnoreCase("true"); + } + + /** + * Paints the project onto the canvas and returns the list of components that failed to draw. + * + * @param g2d + * @param project + * @param drawOptions + * @param filter + * @param selectionRect + * @param selectedComponents + * @param lockedComponents + * @param groupedComponents + * @param controlPointSlot + * @param componentSlot + * @param dragInProgress + * @return + */ + public List> drawProject(Graphics2D g2d, Project project, Set drawOptions, + IComponentFiler filter, Rectangle selectionRect, Collection> selectedComponents, + Set> lockedComponents, Set> groupedComponents, List controlPointSlot, + List> componentSlot, boolean dragInProgress) { + failedComponents.clear(); + if (project == null) { + return failedComponents; + } + + double zoom = 1d; + if (drawOptions.contains(DrawOption.ZOOM)) { + zoom = zoomLevel; + } else { + zoom = 1 / Constants.PIXEL_SIZE; + } + + G2DWrapper g2dWrapper = new G2DWrapper(g2d, zoom); + + if (drawOptions.contains(DrawOption.ANTIALIASING)) { + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + } else { + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); + g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF); + } + if (ConfigurationManager.getInstance().readBoolean(IPlugInPort.HI_QUALITY_RENDER_KEY, false)) { + g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); + g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); + g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); + g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE); + g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); + // g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, + // RenderingHints.VALUE_STROKE_PURE); + } else { + g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_SPEED); + g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_SPEED); + g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED); + g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_DISABLE); + g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR); + } + + // AffineTransform initialTx = g2d.getTransform(); + Dimension d = getCanvasDimensions(project, zoom, true); + + g2dWrapper.setColor(theme.getBgColor()); + g2dWrapper.fillRect(0, 0, d.width, d.height); + g2d.clip(new Rectangle(new Point(0, 0), d)); + + GridType gridType = GridType.LINES; + if (drawOptions.contains(DrawOption.GRID) && gridType != GridType.NONE) { + double zoomStep = project.getGridSpacing().convertToPixels() * zoom; + if (gridType == GridType.CROSSHAIR) { + g2d.setStroke(new BasicStroke(1f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10f, new float[] { + (float) zoomStep / 2, (float) zoomStep / 2}, (float) zoomStep / 4)); + } else if (gridType == GridType.DOT) { + g2d.setStroke(new BasicStroke(1f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10f, new float[] {1f, + (float) zoomStep - 1}, 0f)); + } + + g2dWrapper.setColor(theme.getGridColor()); + for (double i = zoomStep; i < d.width; i += zoomStep) { + g2dWrapper.drawLine((int) i, 0, (int) i, d.height - 1); + } + for (double j = zoomStep; j < d.height; j += zoomStep) { + g2dWrapper.drawLine(0, (int) j, d.width - 1, (int) j); + } + } + + if (Math.abs(1.0 - zoom) > 1e-4) { + g2dWrapper.scale(zoom, zoom); + } + + // Composite mainComposite = g2d.getComposite(); + // Composite alphaComposite = + // AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f); + + // g2dWrapper.resetTx(); + + // componentAreaMap.clear(); + for (IDIYComponent component : project.getComponents()) { + // Do not draw the component if it's filtered out. + if (filter != null && !filter.testComponent(component)) { + continue; + } + ComponentState state = ComponentState.NORMAL; + if (drawOptions.contains(DrawOption.SELECTION) && selectedComponents.contains(component)) { + if (dragInProgress) { + state = ComponentState.DRAGGING; + } else { + state = ComponentState.SELECTED; + } + } + // Do not track the area if component is not invalidated and was + // drawn in the same state. + boolean trackArea = lastDrawnStateMap.get(component) != state; + + synchronized (g2d) { + g2dWrapper.startedDrawingComponent(); + if (!trackArea) { + g2dWrapper.stopTracking(); + } + // Draw locked components in a new composite. + if (lockedComponents.contains(component)) { + g2d.setComposite(lockedComposite); + } + // Draw the component through the g2dWrapper. + try { + component.draw(g2dWrapper, state, drawOptions.contains(DrawOption.OUTLINE_MODE), project, g2dWrapper); + } catch (Exception e) { + LOG.error("Error drawing " + component.getName(), e); + failedComponents.add(component); + } + ComponentArea area = g2dWrapper.finishedDrawingComponent(); + if (trackArea && area != null && !area.getOutlineArea().isEmpty()) { + componentAreaMap.put(component, area); + lastDrawnStateMap.put(component, state); + } + } + } + + // Draw control points. + if (drawOptions.contains(DrawOption.CONTROL_POINTS)) { + // Draw unselected points first to make sure they are below. + if (dragInProgress || drawOptions.contains(DrawOption.OUTLINE_MODE)) { + for (IDIYComponent component : project.getComponents()) { + for (int i = 0; i < component.getControlPointCount(); i++) { + VisibilityPolicy visibilityPolicy = component.getControlPointVisibilityPolicy(i); + if ((groupedComponents.contains(component) + && (visibilityPolicy == VisibilityPolicy.ALWAYS || (selectedComponents.contains(component) && visibilityPolicy == VisibilityPolicy.WHEN_SELECTED)) || (!groupedComponents + .contains(component) && !selectedComponents.contains(component) && component + .getControlPointVisibilityPolicy(i) == VisibilityPolicy.ALWAYS))) { + g2dWrapper.setColor(CONTROL_POINT_COLOR); + Point controlPoint = component.getControlPoint(i); + int pointSize = CONTROL_POINT_SIZE - 2; + g2dWrapper.fillOval(controlPoint.x - pointSize / 2, controlPoint.y - pointSize / 2, pointSize, pointSize); + } + } + } + } + // Then draw the selected ones. + for (IDIYComponent component : selectedComponents) { + for (int i = 0; i < component.getControlPointCount(); i++) { + if (!groupedComponents.contains(component) + && (component.getControlPointVisibilityPolicy(i) == VisibilityPolicy.WHEN_SELECTED || component + .getControlPointVisibilityPolicy(i) == VisibilityPolicy.ALWAYS)) { + + Point controlPoint = component.getControlPoint(i); + int pointSize = CONTROL_POINT_SIZE; + + g2dWrapper.setColor(SELECTED_CONTROL_POINT_COLOR.darker()); + g2dWrapper.fillOval(controlPoint.x - pointSize / 2, controlPoint.y - pointSize / 2, pointSize, pointSize); + g2dWrapper.setColor(SELECTED_CONTROL_POINT_COLOR); + g2dWrapper.fillOval(controlPoint.x - CONTROL_POINT_SIZE / 2 + 1, controlPoint.y - CONTROL_POINT_SIZE / 2 + + 1, CONTROL_POINT_SIZE - 2, CONTROL_POINT_SIZE - 2); + } + } + } + } + + // Draw component slot in a separate composite. + if (componentSlot != null) { + g2dWrapper.startedDrawingComponent(); + g2dWrapper.setComposite(slotComposite); + for (IDIYComponent component : componentSlot) { + try { + + component.draw(g2dWrapper, ComponentState.NORMAL, drawOptions.contains(DrawOption.OUTLINE_MODE), project, + g2dWrapper); + + } catch (Exception e) { + LOG.error("Error drawing " + component.getName(), e); + failedComponents.add(component); + } + } + g2dWrapper.finishedDrawingComponent(); + } + + // Draw control points of the component in the slot. + if (controlPointSlot != null) { + for (Point point : controlPointSlot) { + if (point != null) { + g2dWrapper.setColor(SELECTED_CONTROL_POINT_COLOR.darker()); + g2dWrapper.fillOval(point.x - CONTROL_POINT_SIZE / 2, point.y - CONTROL_POINT_SIZE / 2, CONTROL_POINT_SIZE, + CONTROL_POINT_SIZE); + g2dWrapper.setColor(SELECTED_CONTROL_POINT_COLOR); + g2dWrapper.fillOval(point.x - CONTROL_POINT_SIZE / 2 + 1, point.y - CONTROL_POINT_SIZE / 2 + 1, + CONTROL_POINT_SIZE - 2, CONTROL_POINT_SIZE - 2); + } + } + } + + // Go back to the original transformation and zoom in to draw the + // selection rectangle and other similar elements. + // g2d.setTransform(initialTx); + // if ((drawOptions.contains(DrawOption.ZOOM)) && (Math.abs(1.0 - + // zoomLevel) > 1e-4)) { + // g2d.scale(zoomLevel, zoomLevel); + // } + + // At the end draw selection rectangle if needed. + if (drawOptions.contains(DrawOption.SELECTION) && (selectionRect != null)) { + g2d.setColor(Color.white); + g2d.draw(selectionRect); + g2d.setColor(Color.black); + g2d.setStroke(Constants.DASHED_STROKE); + g2d.draw(selectionRect); + } + + // Draw component area for test + if (debugComponentAreas) { + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1)); + g2d.setColor(Color.red); + for (ComponentArea area : componentAreaMap.values()) { + g2d.draw(area.getOutlineArea()); + } + } + + // Draw continuity area for test + if (debugContinuityAreas) { + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1)); + g2d.setColor(Color.green); + for (ComponentArea area : componentAreaMap.values()) { + for (Area a : area.getContinuityPositiveAreas()) + g2d.draw(a); + } + g2d.setColor(Color.blue); + for (ComponentArea area : componentAreaMap.values()) { + for (Area a : area.getContinuityNegativeAreas()) + g2d.draw(a); + } + } + + if (continuityArea != null && (ConfigurationManager.getInstance().readBoolean(IPlugInPort.HIGHLIGHT_CONTINUITY_AREA, false))) + { + Composite oldComposite = g2d.getComposite(); + g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f)); + g2d.setColor(Color.green); + g2d.fill(continuityArea); + g2d.setComposite(oldComposite); + } + + return failedComponents; + } + + public double getZoomLevel() { + return zoomLevel; + } + + public void setZoomLevel(double zoomLevel) { + this.zoomLevel = zoomLevel; + fireZoomChanged(); + // ConfigurationManager.getInstance().writeValue(ZOOM_KEY, zoomLevel); + } + + public void invalidateComponent(IDIYComponent component) { + componentAreaMap.remove(component); + lastDrawnStateMap.remove(component); + } + + public ComponentArea getComponentArea(IDIYComponent component) { + return componentAreaMap.get(component); + } + + public void clearComponentAreaMap() { + componentAreaMap.clear(); + lastDrawnStateMap.clear(); + } + + public List> findComponentsAt(Point point, Project project) { + List> components = new ArrayList>(); + for (int i = 0; i < project.getComponents().size(); i++) { + ComponentArea area = componentAreaMap.get(project.getComponents().get(i)); + if (area != null && area.getOutlineArea().contains(point)) { + components.add(0, project.getComponents().get(i)); + } + } + return components; + } + + public Dimension getCanvasDimensions(Project project, Double zoomLevel, boolean useZoom) { + double width = project.getWidth().convertToPixels(); + double height = project.getHeight().convertToPixels(); + if (useZoom) { + width *= zoomLevel; + height *= zoomLevel; + } else { + width /= Constants.PIXEL_SIZE; + height /= Constants.PIXEL_SIZE; + } + return new Dimension((int) width, (int) height); + } + + public void fireZoomChanged() { + messageDispatcher.dispatchMessage(EventType.ZOOM_CHANGED, zoomLevel); + messageDispatcher.dispatchMessage(EventType.REPAINT); + } + + public Theme getTheme() { + return theme; + } + + public void setTheme(Theme theme) { + this.theme = theme; + ConfigurationManager.getInstance().writeValue(IPlugInPort.THEME_KEY, theme); + messageDispatcher.dispatchMessage(EventType.REPAINT); + } + + @SuppressWarnings("unchecked") + public void findContinuityAreaAtPoint(Project project, Point p) { + // Find all individual continuity areas for all components + List preliminaryAreas = new ArrayList(); + List checkBreakout = new ArrayList(); + List connections = new ArrayList(); + for (IDIYComponent c : project.getComponents()) { + ComponentArea a = getComponentArea(c); + + ComponentType type = + ComponentProcessor.getInstance().extractComponentTypeFrom((Class>) c.getClass()); + if (type.isContinuity()) { + connections.add(new Connection(c.getControlPoint(0), c.getControlPoint(c.getControlPointCount() - 1))); + } + + if (a == null || a.getOutlineArea() == null) + continue; + if (a.getContinuityPositiveAreas() != null) + for (Area a1 : a.getContinuityPositiveAreas()) { + preliminaryAreas.add(a1); + checkBreakout.add(false); + } + if (a.getContinuityNegativeAreas() != null) { + for (Area na : a.getContinuityNegativeAreas()) + for (int i = 0; i < preliminaryAreas.size(); i++) { + Area a1 = preliminaryAreas.get(i); + if (a1.intersects(na.getBounds2D())) { + a1.subtract(na); + checkBreakout.set(i, true); + } + } + } + } + + // Check if we need to break some areas out in case they are interrupted + List areas = new ArrayList(); + for (int i = 0; i < preliminaryAreas.size(); i++) { + Area a = preliminaryAreas.get(i); + if (checkBreakout.get(i)) + areas.addAll(tryBreakout(a)); + else + areas.add(a); + } + + crunchAreas(areas, connections); + + for (Area a : areas) { + if (a.contains(p)) { + continuityArea = a; + return; + } + } + + continuityArea = null; + } + + private boolean crunchAreas(List areas, List connections) { + boolean isChanged = false; + + List newAreas = new ArrayList(); + List consumed = new ArrayList(); + for (int i = 0; i < areas.size(); i++) { + consumed.add(false); + } + for (int i = 0; i < areas.size(); i++) { + for (int j = i + 1; j < areas.size(); j++) { + if (consumed.get(j)) + continue; + Area a1 = areas.get(i); + Area a2 = areas.get(j); + Area intersection = new Area(a1); + intersection.intersect(a2); + // if the two areas intersect, make a union and consume the second area + if (!intersection.isEmpty()) { + a1.add(a2); + consumed.set(j, true); + } else { // maybe there's a connection between them + for (Connection p : connections) { + if ((a1.contains(p.pointA) && a2.contains(p.pointB)) || (a1.contains(p.pointB) && a2.contains(p.pointA))) { + a1.add(a2); + consumed.set(j, true); + break; + } + } + } + } + } + for (int i = 0; i < areas.size(); i++) + if (!consumed.get(i)) + newAreas.add(areas.get(i)); + else + isChanged = true; + + if (isChanged) { + areas.clear(); + areas.addAll(newAreas); + crunchAreas(areas, connections); + } + + return isChanged; + } + + private List tryBreakout(Area a) { + List toReturn = new ArrayList(); + Path2D p = null; + PathIterator pathIterator = a.getPathIterator(null); + while (!pathIterator.isDone()) { + double[] coord = new double[6]; + int type = pathIterator.currentSegment(coord); + switch (type) { + case PathIterator.SEG_MOVETO: + if (p != null) { + Area partArea = new Area(p); + toReturn.add(partArea); + } + p = new Path2D.Double(); + p.moveTo(coord[0], coord[1]); + break; + case PathIterator.SEG_LINETO: + p.lineTo(coord[0], coord[1]); + break; + case PathIterator.SEG_CUBICTO: + p.curveTo(coord[0], coord[1], coord[2], coord[3], coord[4], coord[5]); + break; + case PathIterator.SEG_QUADTO: + p.quadTo(coord[0], coord[1], coord[2], coord[3]); + break; + } + pathIterator.next(); + } + if (p != null) { + Area partArea = new Area(p); + toReturn.add(partArea); + } + + return toReturn; + } + + class Connection { + + private Point pointA; + private Point pointB; + + public Connection(Point pointA, Point pointB) { + super(); + this.pointA = pointA; + this.pointB = pointB; + } + + public Point getPointA() { + return pointA; + } + + public Point getPointB() { + return pointB; + } + } +} diff --git a/diylc/diylc-core/src/org/diylc/presenter/G2DWrapper.java b/diylc/diylc-core/src/org/diylc/presenter/G2DWrapper.java index 5697efbf..0d127147 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/G2DWrapper.java +++ b/diylc/diylc-core/src/org/diylc/presenter/G2DWrapper.java @@ -1,719 +1,746 @@ /* + * + * DIY Layout Creator (DIYLC). Copyright (c) 2009-2018 held jointly by the individual authors. + * + * This file is part of DIYLC. + * + * DIYLC is free software: you can redistribute it and/or modify it under the terms of the GNU + * General Public License as published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * DIYLC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + * Public License for more details. + * + * You should have received a copy of the GNU General Public License along with DIYLC. If not, see + * . + */ +package org.diylc.presenter; - DIY Layout Creator (DIYLC). - Copyright (c) 2009-2018 held jointly by the individual authors. +import java.awt.BasicStroke; +import java.awt.Color; +import java.awt.Composite; +import java.awt.Font; +import java.awt.FontMetrics; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.GraphicsConfiguration; +import java.awt.Image; +import java.awt.Paint; +import java.awt.Polygon; +import java.awt.Rectangle; +import java.awt.RenderingHints; +import java.awt.Shape; +import java.awt.Stroke; +import java.awt.RenderingHints.Key; +import java.awt.font.FontRenderContext; +import java.awt.font.GlyphVector; +import java.awt.geom.AffineTransform; +import java.awt.geom.Arc2D; +import java.awt.geom.Area; +import java.awt.geom.CubicCurve2D; +import java.awt.geom.Ellipse2D; +import java.awt.geom.Line2D; +import java.awt.geom.NoninvertibleTransformException; +import java.awt.geom.PathIterator; +import java.awt.geom.Point2D; +import java.awt.geom.QuadCurve2D; +import java.awt.geom.Rectangle2D; +import java.awt.geom.RoundRectangle2D; +import java.awt.image.BufferedImage; +import java.awt.image.BufferedImageOp; +import java.awt.image.ImageObserver; +import java.awt.image.RenderedImage; +import java.awt.image.renderable.RenderableImage; +import java.text.AttributedCharacterIterator; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; - This file is part of DIYLC. +import org.diylc.common.ObjectCache; +import org.diylc.core.IDrawingObserver; - DIYLC is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. +/** + * {@link Graphics2D} wrapper that keeps track of all drawing actions and creates an {@link Area} + * that corresponds to drawn objects. Before each component is drawn, + * {@link #startedDrawingComponent()} should be called. After the component is drawn, area may be + * retrieved using {@link #finishedDrawingComponent()}. Graphics configuration (color, font, etc) is + * reset between each two components. + * + * @author Branislav Stojkovic + */ +class G2DWrapper extends Graphics2D implements IDrawingObserver { - DIYLC is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + public static int LINE_SENSITIVITY_MARGIN = 2; + public static int CURVE_SENSITIVITY = 6; - You should have received a copy of the GNU General Public License - along with DIYLC. If not, see . + private boolean drawingComponent = false; + private boolean trackingAllowed = true; + private boolean trackingContinuityAllowed = false; + private boolean trackingContinuityPositive = true; -*/ -package org.diylc.presenter; - -import java.awt.BasicStroke; -import java.awt.Color; -import java.awt.Composite; -import java.awt.Font; -import java.awt.FontMetrics; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.GraphicsConfiguration; -import java.awt.Image; -import java.awt.Paint; -import java.awt.Polygon; -import java.awt.Rectangle; -import java.awt.RenderingHints; -import java.awt.Shape; -import java.awt.Stroke; -import java.awt.RenderingHints.Key; -import java.awt.font.FontRenderContext; -import java.awt.font.GlyphVector; -import java.awt.geom.AffineTransform; -import java.awt.geom.Arc2D; -import java.awt.geom.Area; -import java.awt.geom.CubicCurve2D; -import java.awt.geom.Ellipse2D; -import java.awt.geom.Line2D; -import java.awt.geom.NoninvertibleTransformException; -import java.awt.geom.PathIterator; -import java.awt.geom.Point2D; -import java.awt.geom.QuadCurve2D; -import java.awt.geom.Rectangle2D; -import java.awt.geom.RoundRectangle2D; -import java.awt.image.BufferedImage; -import java.awt.image.BufferedImageOp; -import java.awt.image.ImageObserver; -import java.awt.image.RenderedImage; -import java.awt.image.renderable.RenderableImage; -import java.text.AttributedCharacterIterator; -import java.util.Map; - -import org.diylc.common.ObjectCache; -import org.diylc.core.IDrawingObserver; - -/** - * {@link Graphics2D} wrapper that keeps track of all drawing actions and creates an {@link Area} - * that corresponds to drawn objects. Before each component is drawn, - * {@link #startedDrawingComponent()} should be called. After the component is drawn, area may be - * retrieved using {@link #finishedDrawingComponent()}. Graphics configuration (color, font, etc) is - * reset between each two components. - * - * @author Branislav Stojkovic - */ -class G2DWrapper extends Graphics2D implements IDrawingObserver { - - public static int LINE_SENSITIVITY_MARGIN = 2; - public static int CURVE_SENSITIVITY = 6; - - private boolean drawingComponent = false; - private boolean trackingAllowed = true; - - private Graphics2D canvasGraphics; - private Stroke originalStroke; - private Color originalColor; - private Composite originalComposite; - private AffineTransform originalTx; - private Font originalFont; - private AffineTransform currentTx; - private AffineTransform initialTx; - private Area currentArea; - private Shape lastShape; - - private double zoom; - - /** - * Creates a wrapper around specified {@link Graphics2D} object. - * - * @param canvasGraphics - */ - public G2DWrapper(Graphics2D canvasGraphics, double zoom) { - super(); - this.canvasGraphics = canvasGraphics; - this.zoom = zoom; - currentArea = new Area(); - currentTx = new AffineTransform(); - } - - /** - * Clears out the current area and caches canvas settings. - */ - public void startedDrawingComponent() { - drawingComponent = true; - currentArea = new Area(); - originalStroke = canvasGraphics.getStroke(); - originalColor = canvasGraphics.getColor(); - originalTx = canvasGraphics.getTransform(); - originalComposite = canvasGraphics.getComposite(); - originalFont = canvasGraphics.getFont(); - currentTx = new AffineTransform(); - initialTx = canvasGraphics.getTransform(); - lastShape = null; - startTracking(); - } - - /** - * Reverts {@link Graphics2D} settings and returns area drawn by component in the meantime. - * - * @return - */ - public Area finishedDrawingComponent() { - drawingComponent = false; - canvasGraphics.setStroke(originalStroke); - canvasGraphics.setColor(originalColor); - canvasGraphics.setTransform(originalTx); - canvasGraphics.setComposite(originalComposite); - canvasGraphics.setFont(originalFont); - return currentArea; - } - - @Override - public void startTracking() { - this.trackingAllowed = true; - } - - @Override - public void stopTracking() { - this.trackingAllowed = false; - } - - /** - * Appends shape interior to the current component area. - * - * @param s - */ - private void appendShape(Shape s) { - if (!drawingComponent || !trackingAllowed) { - return; - } - Rectangle2D bounds = s.getBounds2D(); - // Only cache the shape if it's not 1D. - if (bounds.getWidth() > 1 && bounds.getHeight() > 1) { - Area area = new Area(s); - area.transform(currentTx); - currentArea.add(area); - lastShape = s; - } - } - - /** - * Appends shape outline to the current component area. - * - * @param s - */ - private void appendShapeOutline(Shape s) { - // Do not add shape outline if the same shape has been filled recently. - if (!drawingComponent || !trackingAllowed || s.equals(lastShape)) { - return; - } - lastShape = s; - PathIterator pathIterator = s.getPathIterator(null); - double thickness; - if (getStroke() instanceof BasicStroke) { - thickness = ((BasicStroke) getStroke()).getLineWidth() + 2 * LINE_SENSITIVITY_MARGIN; - } else { - thickness = 2 * LINE_SENSITIVITY_MARGIN; - } - Point2D prevPoint = null; - while (!pathIterator.isDone()) { - double[] coord = new double[6]; - int type = pathIterator.currentSegment(coord); - switch (type) { - case PathIterator.SEG_MOVETO: - prevPoint = new Point2D.Double(coord[0], coord[1]); - break; - case PathIterator.SEG_LINETO: - // Represent straight line with a rectangle. - Point2D nextPoint = new Point2D.Double(coord[0], coord[1]); - Double theta = Math.atan2(nextPoint.getY() - prevPoint.getY(), nextPoint.getX() - prevPoint.getX()); - double width = - Math.sqrt(Math.pow(nextPoint.getX() - prevPoint.getX(), 2) - + Math.pow(nextPoint.getY() - prevPoint.getY(), 2)); - double midX = (prevPoint.getX() + nextPoint.getX()) / 2; - double midY = (prevPoint.getY() + nextPoint.getY()) / 2; - Rectangle2D rect = new Rectangle2D.Double(midX - width / 2, midY - thickness / 2, width, thickness); - Area area = new Area(rect); - area.transform(AffineTransform.getRotateInstance(theta, midX, midY)); - // area.transform(currentTx); - appendShape(area); - // Set the prev point to line end - prevPoint = nextPoint; - break; - case PathIterator.SEG_CUBICTO: - CubicCurve2D cubicCurve = - new CubicCurve2D.Double(prevPoint.getX(), prevPoint.getY(), coord[0], coord[1], coord[2], coord[3], - coord[4], coord[5]); - addCubicCurveArea(cubicCurve); - prevPoint = new Point2D.Double(coord[4], coord[5]); - break; - case PathIterator.SEG_QUADTO: - QuadCurve2D quadCurve = - new QuadCurve2D.Double(prevPoint.getX(), prevPoint.getY(), coord[0], coord[1], coord[2], coord[3]); - addQuadCurveArea(quadCurve); - prevPoint = new Point2D.Double(coord[3], coord[3]); - break; - } - pathIterator.next(); - } - } - - /** - * Adds a cubic curve to the component area. It uses subdivision to approximate the curve with a - * series of straight lines. - * - * @param curve - */ - private void addCubicCurveArea(CubicCurve2D curve) { - // When end points are close enough, approximate the curve with a - // straight line. - if (curve.getFlatness() < CURVE_SENSITIVITY) { - appendShapeOutline(new Line2D.Double(curve.getP1(), curve.getP2())); - } else { - CubicCurve2D leftSubcurve = new CubicCurve2D.Double(); - CubicCurve2D rightSubcurve = new CubicCurve2D.Double(); - curve.subdivide(leftSubcurve, rightSubcurve); - addCubicCurveArea(leftSubcurve); - addCubicCurveArea(rightSubcurve); - } - } - - /** - * Adds a quad curve to the component area. It uses subdivision to approximate the curve with a - * series of straight lines. - * - * @param curve - */ - private void addQuadCurveArea(QuadCurve2D curve) { - // When end points are close enough, approximate the curve with a - // straight line. - if (curve.getFlatness() < CURVE_SENSITIVITY) { - appendShapeOutline(new Line2D.Double(curve.getP1(), curve.getP2())); - } else { - QuadCurve2D leftSubcurve = new QuadCurve2D.Double(); - QuadCurve2D rightSubcurve = new QuadCurve2D.Double(); - curve.subdivide(leftSubcurve, rightSubcurve); - addQuadCurveArea(leftSubcurve); - addQuadCurveArea(rightSubcurve); - } - } - - @Override - public void addRenderingHints(Map hints) { - canvasGraphics.addRenderingHints(hints); - } - - @Override - public void clip(Shape s) { - canvasGraphics.clip(s); - } - - @Override - public void draw(Shape s) { - canvasGraphics.draw(s); - if (drawingComponent && trackingAllowed) { - appendShapeOutline(s); - } - } - - @Override - public void drawGlyphVector(GlyphVector g, float x, float y) { - canvasGraphics.drawGlyphVector(g, x, y); - } - - @Override - public boolean drawImage(Image img, AffineTransform xform, ImageObserver obs) { - // FIXME: process map - return canvasGraphics.drawImage(img, xform, obs); - } - - @Override - public void drawImage(BufferedImage img, BufferedImageOp op, int x, int y) { - canvasGraphics.drawImage(img, op, x, y); - // FIXME: process map - } - - @Override - public void drawRenderableImage(RenderableImage img, AffineTransform xform) { - canvasGraphics.drawRenderableImage(img, xform); - // FIXME: process map - } - - @Override - public void drawRenderedImage(RenderedImage img, AffineTransform xform) { - canvasGraphics.drawRenderedImage(img, xform); - // FIXME: process map - } - - @Override - public void drawString(String str, int x, int y) { - canvasGraphics.drawString(str, x, y); - if (drawingComponent && trackingAllowed) { - FontMetrics fontMetrics = canvasGraphics.getFontMetrics(); - Rectangle2D rect = fontMetrics.getStringBounds(str, canvasGraphics); - Point2D point = new Point2D.Double(x, y); - // currentTx.transform(point, point); - Rectangle2D finalRec = - new Rectangle2D.Double(rect.getX() + point.getX(), rect.getY() + point.getY(), rect.getWidth(), - rect.getHeight()); - appendShape(finalRec); - } - } - - @Override - public void drawString(String str, float x, float y) { - canvasGraphics.drawString(str, x, y); - if (drawingComponent && trackingAllowed) { - FontMetrics fontMetrics = canvasGraphics.getFontMetrics(); - Rectangle2D rect = fontMetrics.getStringBounds(str, canvasGraphics); - appendShape(new Rectangle2D.Double(rect.getX() + x, rect.getY() + y, rect.getWidth(), rect.getHeight())); - } - } - - @Override - public void drawString(AttributedCharacterIterator iterator, int x, int y) { - canvasGraphics.drawString(iterator, x, y); - // FIXME: process map - } - - @Override - public void drawString(AttributedCharacterIterator iterator, float x, float y) { - canvasGraphics.drawString(iterator, x, y); - // FIXME: process map - } - - @Override - public void fill(Shape s) { - canvasGraphics.fill(s); - appendShape(s); - } - - @Override - public Color getBackground() { - return canvasGraphics.getBackground(); - } - - @Override - public Composite getComposite() { - return canvasGraphics.getComposite(); - } - - @Override - public GraphicsConfiguration getDeviceConfiguration() { - return canvasGraphics.getDeviceConfiguration(); - } - - @Override - public FontRenderContext getFontRenderContext() { - return canvasGraphics.getFontRenderContext(); - } - - @Override - public Paint getPaint() { - return canvasGraphics.getPaint(); - } - - @Override - public Object getRenderingHint(Key hintKey) { - return canvasGraphics.getRenderingHint(hintKey); - } - - @Override - public RenderingHints getRenderingHints() { - return canvasGraphics.getRenderingHints(); - } - - @Override - public Stroke getStroke() { - return canvasGraphics.getStroke(); - } - - @Override - public AffineTransform getTransform() { - return canvasGraphics.getTransform(); - } - - @Override - public boolean hit(Rectangle rect, Shape s, boolean onStroke) { - return canvasGraphics.hit(rect, s, onStroke); - } - - @Override - public void rotate(double theta) { - canvasGraphics.rotate(theta); - currentTx.rotate(theta); - } - - @Override - public void rotate(double theta, double x, double y) { - canvasGraphics.rotate(theta, x, y); - currentTx.rotate(theta, x, y); - } - - @Override - public void scale(double sx, double sy) { - canvasGraphics.scale(sx, sy); - currentTx.scale(sx, sy); - } - - @Override - public void setBackground(Color color) { - canvasGraphics.setBackground(color); - // FIXME: fix map - } - - @Override - public void setComposite(Composite comp) { - canvasGraphics.setComposite(comp); - // FIXME: check this. - } - - @Override - public void setPaint(Paint paint) { - canvasGraphics.setPaint(paint); - // FIXME: check this - } - - @Override - public void setRenderingHint(Key hintKey, Object hintValue) { - canvasGraphics.setRenderingHint(hintKey, hintValue); - // FIXME: check this - } - - @Override - public void setRenderingHints(Map hints) { - canvasGraphics.setRenderingHints(hints); - // FIXME: check this - } - - @Override - public void setStroke(Stroke s) { - if (this.zoom > 1 && s.getClass() == BasicStroke.class) { - BasicStroke bs = (BasicStroke) s; - // make thin lines even thinner to compensate for zoom factor - if (bs.getLineWidth() <= 2) - s = ObjectCache.getInstance().fetchBasicStroke((float) (bs.getLineWidth() / zoom)); - } - canvasGraphics.setStroke(s); - } - - @Override - public void setTransform(AffineTransform Tx) { - canvasGraphics.setTransform(Tx); - currentTx = new AffineTransform(Tx); - try { - // Invert the tx that was set before we started drawing the component. - // We're left only component tx. - AffineTransform inverseInitialTx = initialTx.createInverse(); - Point2D p = new Point2D.Double(currentTx.getTranslateX(), currentTx.getTranslateY()); - inverseInitialTx.transform(p, p); - currentTx.concatenate(inverseInitialTx); - double[] matrix = new double[6]; - currentTx.getMatrix(matrix); - currentTx.setTransform(matrix[0], matrix[1], matrix[2], matrix[3], p.getX(), p.getY()); - } catch (NoninvertibleTransformException e) { - } - } - - @Override - public void shear(double shx, double shy) { - canvasGraphics.shear(shx, shy); - currentTx.shear(shx, shy); - } - - @Override - public void transform(AffineTransform Tx) { - canvasGraphics.transform(Tx); - currentTx.concatenate(Tx); - } - - @Override - public void translate(int x, int y) { - canvasGraphics.translate(x, y); - currentTx.translate(x, y); - } - - @Override - public void translate(double tx, double ty) { - canvasGraphics.translate(tx, ty); - currentTx.translate(tx, ty); - } - - @Override - public void clearRect(int x, int y, int width, int height) { - canvasGraphics.clearRect(x, y, width, height); - } - - @Override - public void clipRect(int x, int y, int width, int height) { - canvasGraphics.clipRect(x, y, width, height); - } - - @Override - public void copyArea(int x, int y, int width, int height, int dx, int dy) { - canvasGraphics.copyArea(x, y, width, height, dx, dy); - } - - @Override - public Graphics create() { - return canvasGraphics.create(); - } - - @Override - public void dispose() { - canvasGraphics.dispose(); - } - - @Override - public void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) { - canvasGraphics.drawArc(x, y, width, height, startAngle, arcAngle); - } - - @Override - public boolean drawImage(Image img, int x, int y, ImageObserver observer) { - boolean result = canvasGraphics.drawImage(img, x, y, observer); - appendShape(new Rectangle2D.Double(x, y, img.getWidth(observer), img.getHeight(observer))); - return result; - } - - @Override - public boolean drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer) { - // FIXME: map - return canvasGraphics.drawImage(img, x, y, bgcolor, observer); - } - - @Override - public boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer) { - // FIXME: map - return canvasGraphics.drawImage(img, x, y, width, height, observer); - } - - @Override - public boolean drawImage(Image img, int x, int y, int width, int height, Color bgcolor, ImageObserver observer) { - // FIXME: map - return canvasGraphics.drawImage(img, x, y, width, height, bgcolor, observer); - } - - @Override - public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, - ImageObserver observer) { - // FIXME: map - return canvasGraphics.drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, observer); - } - - @Override - public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, - Color bgcolor, ImageObserver observer) { - // FIXME: map - return drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, bgcolor, observer); - } - - @Override - public void drawLine(int x1, int y1, int x2, int y2) { - canvasGraphics.drawLine(x1, y1, x2, y2); - if (drawingComponent && trackingAllowed) { - appendShapeOutline(new Line2D.Double(x1, y1, x2, y2)); - } - } - - @Override - public void drawOval(int x, int y, int width, int height) { - canvasGraphics.drawOval(x, y, width, height); - if (drawingComponent && trackingAllowed) { - appendShapeOutline(new Ellipse2D.Double(x, y, width, height)); - } - } - - @Override - public void drawPolygon(int[] points, int[] points2, int points3) { - canvasGraphics.drawPolygon(points, points2, points3); - if (drawingComponent && trackingAllowed) { - appendShapeOutline(new Polygon(points, points2, points3)); - } - } - - @Override - public void drawPolyline(int[] points, int[] points2, int points3) { - canvasGraphics.drawPolyline(points, points2, points3); - } - - @Override - public void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) { - canvasGraphics.drawRoundRect(x, y, width, height, arcWidth, arcHeight); - if (drawingComponent && trackingAllowed) { - appendShapeOutline(new RoundRectangle2D.Double(x, y, width, height, arcWidth, arcHeight)); - } - } - - @Override - public void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle) { - canvasGraphics.fillArc(x, y, width, height, startAngle, arcAngle); - if (drawingComponent && trackingAllowed) { - appendShape(new Arc2D.Double(x, y, width, height, startAngle, arcAngle, Arc2D.PIE)); - } - } - - @Override - public void fillOval(int x, int y, int width, int height) { - canvasGraphics.fillOval(x, y, width, height); - if (drawingComponent && trackingAllowed) { - appendShape(new Ellipse2D.Double(x, y, width, height)); - } - } - - @Override - public void fillPolygon(int[] points, int[] points2, int points3) { - canvasGraphics.fillPolygon(points, points2, points3); - if (drawingComponent && trackingAllowed) { - appendShape(new Polygon(points, points2, points3)); - } - } - - @Override - public void drawRect(int x, int y, int width, int height) { - canvasGraphics.drawRect(x, y, width, height); - if (drawingComponent && trackingAllowed) { - appendShapeOutline(new Rectangle(x, y, width, height)); - } - } - - @Override - public void fillRect(int x, int y, int width, int height) { - canvasGraphics.fillRect(x, y, width, height); - if (drawingComponent && trackingAllowed) { - appendShape(new Rectangle(x, y, width, height)); - } - } - - @Override - public void fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) { - canvasGraphics.fillRoundRect(x, y, width, height, arcWidth, arcHeight); - if (drawingComponent && trackingAllowed) { - appendShape(new RoundRectangle2D.Double(x, y, width, height, arcWidth, arcHeight)); - } - } - - @Override - public Shape getClip() { - return canvasGraphics.getClip(); - } - - @Override - public Rectangle getClipBounds() { - return canvasGraphics.getClipBounds(); - } - - @Override - public Color getColor() { - return canvasGraphics.getColor(); - } - - @Override - public Font getFont() { - return canvasGraphics.getFont(); - } - - @Override - public FontMetrics getFontMetrics(Font f) { - return canvasGraphics.getFontMetrics(f); - } - - @Override - public void setClip(Shape clip) { - canvasGraphics.setClip(clip); - } - - @Override - public void setClip(int x, int y, int width, int height) { - canvasGraphics.setClip(x, y, width, height); - } - - @Override - public void setColor(Color c) { - canvasGraphics.setColor(c); - } - - @Override - public void setFont(Font font) { - canvasGraphics.setFont(font); - } - - @Override - public void setPaintMode() { - canvasGraphics.setPaintMode(); - } - - @Override - public void setXORMode(Color c1) { - canvasGraphics.setXORMode(c1); - } -} + private Graphics2D canvasGraphics; + private Stroke originalStroke; + private Color originalColor; + private Composite originalComposite; + private AffineTransform originalTx; + private Font originalFont; + private AffineTransform currentTx; + private AffineTransform initialTx; + private Area currentArea; + private List currentContinuityPositiveAreas; + private List currentContinuityNegativeAreas; + private Shape lastShape; + + private double zoom; + + /** + * Creates a wrapper around specified {@link Graphics2D} object. + * + * @param canvasGraphics + */ + public G2DWrapper(Graphics2D canvasGraphics, double zoom) { + super(); + this.canvasGraphics = canvasGraphics; + this.zoom = zoom; + currentArea = new Area(); + currentContinuityPositiveAreas = new ArrayList(); + currentContinuityNegativeAreas = new ArrayList(); + currentTx = new AffineTransform(); + } + + /** + * Clears out the current area and caches canvas settings. + */ + public void startedDrawingComponent() { + drawingComponent = true; + currentArea = new Area(); + currentContinuityPositiveAreas = new ArrayList(); + currentContinuityNegativeAreas = new ArrayList(); + originalStroke = canvasGraphics.getStroke(); + originalColor = canvasGraphics.getColor(); + originalTx = canvasGraphics.getTransform(); + originalComposite = canvasGraphics.getComposite(); + originalFont = canvasGraphics.getFont(); + currentTx = new AffineTransform(); + initialTx = canvasGraphics.getTransform(); + lastShape = null; + startTracking(); + } + + /** + * Reverts {@link Graphics2D} settings and returns area drawn by component in the meantime. + * + * @return + */ + public ComponentArea finishedDrawingComponent() { + drawingComponent = false; + canvasGraphics.setStroke(originalStroke); + canvasGraphics.setColor(originalColor); + canvasGraphics.setTransform(originalTx); + canvasGraphics.setComposite(originalComposite); + canvasGraphics.setFont(originalFont); + return new ComponentArea(currentArea, currentContinuityPositiveAreas, currentContinuityNegativeAreas); + } + + @Override + public void startTracking() { + this.trackingAllowed = true; + } + + @Override + public void stopTracking() { + this.trackingAllowed = false; + } + + @Override + public void startTrackingContinuityArea(boolean positive) { + this.trackingContinuityAllowed = true; + this.trackingContinuityPositive = positive; + } + + @Override + public void stopTrackingContinuityArea() { + this.trackingContinuityAllowed = false; + } + + + /** + * Appends shape interior to the current component area. + * + * @param s + */ + private void appendShape(Shape s) { + if (!drawingComponent || (!trackingAllowed && !trackingContinuityAllowed)) { + return; + } + Rectangle2D bounds = s.getBounds2D(); + // Only cache the shape if it's not 1D. + if (bounds.getWidth() > 1 && bounds.getHeight() > 1) { + Area area = new Area(s); + area.transform(currentTx); + + if (trackingAllowed) + currentArea.add(area); + + if (trackingContinuityAllowed) { + if (trackingContinuityPositive) + currentContinuityPositiveAreas.add(area); + else + currentContinuityNegativeAreas.add(area); + } + lastShape = s; + } + } + + /** + * Appends shape outline to the current component area. + * + * @param s + */ + private void appendShapeOutline(Shape s) { + // Do not add shape outline if the same shape has been filled recently. + if (!drawingComponent || !trackingAllowed || s.equals(lastShape)) { + return; + } + lastShape = s; + PathIterator pathIterator = s.getPathIterator(null); + double thickness; + if (getStroke() instanceof BasicStroke) { + thickness = ((BasicStroke) getStroke()).getLineWidth() + 2 * LINE_SENSITIVITY_MARGIN; + } else { + thickness = 2 * LINE_SENSITIVITY_MARGIN; + } + Point2D prevPoint = null; + while (!pathIterator.isDone()) { + double[] coord = new double[6]; + int type = pathIterator.currentSegment(coord); + switch (type) { + case PathIterator.SEG_MOVETO: + prevPoint = new Point2D.Double(coord[0], coord[1]); + break; + case PathIterator.SEG_LINETO: + // Represent straight line with a rectangle. + Point2D nextPoint = new Point2D.Double(coord[0], coord[1]); + Double theta = Math.atan2(nextPoint.getY() - prevPoint.getY(), nextPoint.getX() - prevPoint.getX()); + double width = + Math.sqrt(Math.pow(nextPoint.getX() - prevPoint.getX(), 2) + + Math.pow(nextPoint.getY() - prevPoint.getY(), 2)); + double midX = (prevPoint.getX() + nextPoint.getX()) / 2; + double midY = (prevPoint.getY() + nextPoint.getY()) / 2; + Rectangle2D rect = new Rectangle2D.Double(midX - width / 2, midY - thickness / 2, width, thickness); + Area area = new Area(rect); + area.transform(AffineTransform.getRotateInstance(theta, midX, midY)); + // area.transform(currentTx); + appendShape(area); + // Set the prev point to line end + prevPoint = nextPoint; + break; + case PathIterator.SEG_CUBICTO: + CubicCurve2D cubicCurve = + new CubicCurve2D.Double(prevPoint.getX(), prevPoint.getY(), coord[0], coord[1], coord[2], coord[3], + coord[4], coord[5]); + addCubicCurveArea(cubicCurve); + prevPoint = new Point2D.Double(coord[4], coord[5]); + break; + case PathIterator.SEG_QUADTO: + QuadCurve2D quadCurve = + new QuadCurve2D.Double(prevPoint.getX(), prevPoint.getY(), coord[0], coord[1], coord[2], coord[3]); + addQuadCurveArea(quadCurve); + prevPoint = new Point2D.Double(coord[3], coord[3]); + break; + } + pathIterator.next(); + } + } + + /** + * Adds a cubic curve to the component area. It uses subdivision to approximate the curve with a + * series of straight lines. + * + * @param curve + */ + private void addCubicCurveArea(CubicCurve2D curve) { + // When end points are close enough, approximate the curve with a + // straight line. + if (curve.getFlatness() < CURVE_SENSITIVITY) { + appendShapeOutline(new Line2D.Double(curve.getP1(), curve.getP2())); + } else { + CubicCurve2D leftSubcurve = new CubicCurve2D.Double(); + CubicCurve2D rightSubcurve = new CubicCurve2D.Double(); + curve.subdivide(leftSubcurve, rightSubcurve); + addCubicCurveArea(leftSubcurve); + addCubicCurveArea(rightSubcurve); + } + } + + /** + * Adds a quad curve to the component area. It uses subdivision to approximate the curve with a + * series of straight lines. + * + * @param curve + */ + private void addQuadCurveArea(QuadCurve2D curve) { + // When end points are close enough, approximate the curve with a + // straight line. + if (curve.getFlatness() < CURVE_SENSITIVITY) { + appendShapeOutline(new Line2D.Double(curve.getP1(), curve.getP2())); + } else { + QuadCurve2D leftSubcurve = new QuadCurve2D.Double(); + QuadCurve2D rightSubcurve = new QuadCurve2D.Double(); + curve.subdivide(leftSubcurve, rightSubcurve); + addQuadCurveArea(leftSubcurve); + addQuadCurveArea(rightSubcurve); + } + } + + @Override + public void addRenderingHints(Map hints) { + canvasGraphics.addRenderingHints(hints); + } + + @Override + public void clip(Shape s) { + canvasGraphics.clip(s); + } + + @Override + public void draw(Shape s) { + canvasGraphics.draw(s); + if (drawingComponent && trackingAllowed) { + appendShapeOutline(s); + } + } + + @Override + public void drawGlyphVector(GlyphVector g, float x, float y) { + canvasGraphics.drawGlyphVector(g, x, y); + } + + @Override + public boolean drawImage(Image img, AffineTransform xform, ImageObserver obs) { + // FIXME: process map + return canvasGraphics.drawImage(img, xform, obs); + } + + @Override + public void drawImage(BufferedImage img, BufferedImageOp op, int x, int y) { + canvasGraphics.drawImage(img, op, x, y); + // FIXME: process map + } + + @Override + public void drawRenderableImage(RenderableImage img, AffineTransform xform) { + canvasGraphics.drawRenderableImage(img, xform); + // FIXME: process map + } + + @Override + public void drawRenderedImage(RenderedImage img, AffineTransform xform) { + canvasGraphics.drawRenderedImage(img, xform); + // FIXME: process map + } + + @Override + public void drawString(String str, int x, int y) { + canvasGraphics.drawString(str, x, y); + if (drawingComponent && trackingAllowed) { + FontMetrics fontMetrics = canvasGraphics.getFontMetrics(); + Rectangle2D rect = fontMetrics.getStringBounds(str, canvasGraphics); + Point2D point = new Point2D.Double(x, y); + // currentTx.transform(point, point); + Rectangle2D finalRec = + new Rectangle2D.Double(rect.getX() + point.getX(), rect.getY() + point.getY(), rect.getWidth(), + rect.getHeight()); + appendShape(finalRec); + } + } + + @Override + public void drawString(String str, float x, float y) { + canvasGraphics.drawString(str, x, y); + if (drawingComponent && trackingAllowed) { + FontMetrics fontMetrics = canvasGraphics.getFontMetrics(); + Rectangle2D rect = fontMetrics.getStringBounds(str, canvasGraphics); + appendShape(new Rectangle2D.Double(rect.getX() + x, rect.getY() + y, rect.getWidth(), rect.getHeight())); + } + } + + @Override + public void drawString(AttributedCharacterIterator iterator, int x, int y) { + canvasGraphics.drawString(iterator, x, y); + // FIXME: process map + } + + @Override + public void drawString(AttributedCharacterIterator iterator, float x, float y) { + canvasGraphics.drawString(iterator, x, y); + // FIXME: process map + } + + @Override + public void fill(Shape s) { + canvasGraphics.fill(s); + appendShape(s); + } + + @Override + public Color getBackground() { + return canvasGraphics.getBackground(); + } + + @Override + public Composite getComposite() { + return canvasGraphics.getComposite(); + } + + @Override + public GraphicsConfiguration getDeviceConfiguration() { + return canvasGraphics.getDeviceConfiguration(); + } + + @Override + public FontRenderContext getFontRenderContext() { + return canvasGraphics.getFontRenderContext(); + } + + @Override + public Paint getPaint() { + return canvasGraphics.getPaint(); + } + + @Override + public Object getRenderingHint(Key hintKey) { + return canvasGraphics.getRenderingHint(hintKey); + } + + @Override + public RenderingHints getRenderingHints() { + return canvasGraphics.getRenderingHints(); + } + + @Override + public Stroke getStroke() { + return canvasGraphics.getStroke(); + } + + @Override + public AffineTransform getTransform() { + return canvasGraphics.getTransform(); + } + + @Override + public boolean hit(Rectangle rect, Shape s, boolean onStroke) { + return canvasGraphics.hit(rect, s, onStroke); + } + + @Override + public void rotate(double theta) { + canvasGraphics.rotate(theta); + currentTx.rotate(theta); + } + + @Override + public void rotate(double theta, double x, double y) { + canvasGraphics.rotate(theta, x, y); + currentTx.rotate(theta, x, y); + } + + @Override + public void scale(double sx, double sy) { + canvasGraphics.scale(sx, sy); + currentTx.scale(sx, sy); + } + + @Override + public void setBackground(Color color) { + canvasGraphics.setBackground(color); + // FIXME: fix map + } + + @Override + public void setComposite(Composite comp) { + canvasGraphics.setComposite(comp); + // FIXME: check this. + } + + @Override + public void setPaint(Paint paint) { + canvasGraphics.setPaint(paint); + // FIXME: check this + } + + @Override + public void setRenderingHint(Key hintKey, Object hintValue) { + canvasGraphics.setRenderingHint(hintKey, hintValue); + // FIXME: check this + } + + @Override + public void setRenderingHints(Map hints) { + canvasGraphics.setRenderingHints(hints); + // FIXME: check this + } + + @Override + public void setStroke(Stroke s) { + if (this.zoom > 1 && s.getClass() == BasicStroke.class) { + BasicStroke bs = (BasicStroke) s; + // make thin lines even thinner to compensate for zoom factor + if (bs.getLineWidth() <= 2) + s = ObjectCache.getInstance().fetchBasicStroke((float) (bs.getLineWidth() / zoom)); + } + canvasGraphics.setStroke(s); + } + + @Override + public void setTransform(AffineTransform Tx) { + canvasGraphics.setTransform(Tx); + currentTx = new AffineTransform(Tx); + try { + // Invert the tx that was set before we started drawing the component. + // We're left only component tx. + AffineTransform inverseInitialTx = initialTx.createInverse(); + Point2D p = new Point2D.Double(currentTx.getTranslateX(), currentTx.getTranslateY()); + inverseInitialTx.transform(p, p); + currentTx.concatenate(inverseInitialTx); + double[] matrix = new double[6]; + currentTx.getMatrix(matrix); + currentTx.setTransform(matrix[0], matrix[1], matrix[2], matrix[3], p.getX(), p.getY()); + } catch (NoninvertibleTransformException e) { + } + } + + @Override + public void shear(double shx, double shy) { + canvasGraphics.shear(shx, shy); + currentTx.shear(shx, shy); + } + + @Override + public void transform(AffineTransform Tx) { + canvasGraphics.transform(Tx); + currentTx.concatenate(Tx); + } + + @Override + public void translate(int x, int y) { + canvasGraphics.translate(x, y); + currentTx.translate(x, y); + } + + @Override + public void translate(double tx, double ty) { + canvasGraphics.translate(tx, ty); + currentTx.translate(tx, ty); + } + + @Override + public void clearRect(int x, int y, int width, int height) { + canvasGraphics.clearRect(x, y, width, height); + } + + @Override + public void clipRect(int x, int y, int width, int height) { + canvasGraphics.clipRect(x, y, width, height); + } + + @Override + public void copyArea(int x, int y, int width, int height, int dx, int dy) { + canvasGraphics.copyArea(x, y, width, height, dx, dy); + } + + @Override + public Graphics create() { + return canvasGraphics.create(); + } + + @Override + public void dispose() { + canvasGraphics.dispose(); + } + + @Override + public void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) { + canvasGraphics.drawArc(x, y, width, height, startAngle, arcAngle); + } + + @Override + public boolean drawImage(Image img, int x, int y, ImageObserver observer) { + boolean result = canvasGraphics.drawImage(img, x, y, observer); + appendShape(new Rectangle2D.Double(x, y, img.getWidth(observer), img.getHeight(observer))); + return result; + } + + @Override + public boolean drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer) { + // FIXME: map + return canvasGraphics.drawImage(img, x, y, bgcolor, observer); + } + + @Override + public boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer) { + // FIXME: map + return canvasGraphics.drawImage(img, x, y, width, height, observer); + } + + @Override + public boolean drawImage(Image img, int x, int y, int width, int height, Color bgcolor, ImageObserver observer) { + // FIXME: map + return canvasGraphics.drawImage(img, x, y, width, height, bgcolor, observer); + } + + @Override + public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, + ImageObserver observer) { + // FIXME: map + return canvasGraphics.drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, observer); + } + + @Override + public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, + Color bgcolor, ImageObserver observer) { + // FIXME: map + return drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, bgcolor, observer); + } + + @Override + public void drawLine(int x1, int y1, int x2, int y2) { + canvasGraphics.drawLine(x1, y1, x2, y2); + if (drawingComponent && (trackingAllowed || trackingContinuityAllowed)) { + appendShapeOutline(new Line2D.Double(x1, y1, x2, y2)); + } + } + + @Override + public void drawOval(int x, int y, int width, int height) { + canvasGraphics.drawOval(x, y, width, height); + if (drawingComponent && (trackingAllowed || trackingContinuityAllowed)) { + appendShapeOutline(new Ellipse2D.Double(x, y, width, height)); + } + } + + @Override + public void drawPolygon(int[] points, int[] points2, int points3) { + canvasGraphics.drawPolygon(points, points2, points3); + if (drawingComponent && (trackingAllowed || trackingContinuityAllowed)) { + appendShapeOutline(new Polygon(points, points2, points3)); + } + } + + @Override + public void drawPolyline(int[] points, int[] points2, int points3) { + canvasGraphics.drawPolyline(points, points2, points3); + } + + @Override + public void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) { + canvasGraphics.drawRoundRect(x, y, width, height, arcWidth, arcHeight); + if (drawingComponent && (trackingAllowed || trackingContinuityAllowed)) { + appendShapeOutline(new RoundRectangle2D.Double(x, y, width, height, arcWidth, arcHeight)); + } + } + + @Override + public void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle) { + canvasGraphics.fillArc(x, y, width, height, startAngle, arcAngle); + if (drawingComponent && (trackingAllowed || trackingContinuityAllowed)) { + appendShape(new Arc2D.Double(x, y, width, height, startAngle, arcAngle, Arc2D.PIE)); + } + } + + @Override + public void fillOval(int x, int y, int width, int height) { + canvasGraphics.fillOval(x, y, width, height); + if (drawingComponent && (trackingAllowed || trackingContinuityAllowed)) { + appendShape(new Ellipse2D.Double(x, y, width, height)); + } + } + + @Override + public void fillPolygon(int[] points, int[] points2, int points3) { + canvasGraphics.fillPolygon(points, points2, points3); + if (drawingComponent && (trackingAllowed || trackingContinuityAllowed)) { + appendShape(new Polygon(points, points2, points3)); + } + } + + @Override + public void drawRect(int x, int y, int width, int height) { + canvasGraphics.drawRect(x, y, width, height); + if (drawingComponent && (trackingAllowed || trackingContinuityAllowed)) { + appendShapeOutline(new Rectangle(x, y, width, height)); + } + } + + @Override + public void fillRect(int x, int y, int width, int height) { + canvasGraphics.fillRect(x, y, width, height); + if (drawingComponent && (trackingAllowed || trackingContinuityAllowed)) { + appendShape(new Rectangle(x, y, width, height)); + } + } + + @Override + public void fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) { + canvasGraphics.fillRoundRect(x, y, width, height, arcWidth, arcHeight); + if (drawingComponent && (trackingAllowed || trackingContinuityAllowed)) { + appendShape(new RoundRectangle2D.Double(x, y, width, height, arcWidth, arcHeight)); + } + } + + @Override + public Shape getClip() { + return canvasGraphics.getClip(); + } + + @Override + public Rectangle getClipBounds() { + return canvasGraphics.getClipBounds(); + } + + @Override + public Color getColor() { + return canvasGraphics.getColor(); + } + + @Override + public Font getFont() { + return canvasGraphics.getFont(); + } + + @Override + public FontMetrics getFontMetrics(Font f) { + return canvasGraphics.getFontMetrics(f); + } + + @Override + public void setClip(Shape clip) { + canvasGraphics.setClip(clip); + } + + @Override + public void setClip(int x, int y, int width, int height) { + canvasGraphics.setClip(x, y, width, height); + } + + @Override + public void setColor(Color c) { + canvasGraphics.setColor(c); + } + + @Override + public void setFont(Font font) { + canvasGraphics.setFont(font); + } + + @Override + public void setPaintMode() { + canvasGraphics.setPaintMode(); + } + + @Override + public void setXORMode(Color c1) { + canvasGraphics.setXORMode(c1); + } +} diff --git a/diylc/diylc-core/src/org/diylc/presenter/InstantiationManager.java b/diylc/diylc-core/src/org/diylc/presenter/InstantiationManager.java index 6b44885a..7ef31690 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/InstantiationManager.java +++ b/diylc/diylc-core/src/org/diylc/presenter/InstantiationManager.java @@ -63,7 +63,7 @@ public class InstantiationManager { private static final ComponentType clipboardType = new ComponentType("Clipboard contents", "Components from the clipboard", CreationMethod.SINGLE_CLICK, "Multi", "", "", null, null, 0, false, false, null, - false, null, KeywordPolicy.NEVER_SHOW, null); + false, null, KeywordPolicy.NEVER_SHOW, null, false); public InstantiationManager() {} diff --git a/diylc/diylc-core/src/org/diylc/presenter/Presenter.java b/diylc/diylc-core/src/org/diylc/presenter/Presenter.java index eba2a4d8..d53ea4fc 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/Presenter.java +++ b/diylc/diylc-core/src/org/diylc/presenter/Presenter.java @@ -21,63 +21,63 @@ */ package org.diylc.presenter; -import java.awt.Cursor; -import java.awt.Dimension; -import java.awt.Graphics2D; -import java.awt.Point; -import java.awt.Rectangle; -import java.awt.dnd.DnDConstants; -import java.awt.geom.AffineTransform; -import java.awt.geom.Area; -import java.awt.geom.Point2D; -import java.awt.geom.Rectangle2D; -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.lang.reflect.Modifier; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.swing.JOptionPane; - -import org.apache.log4j.Logger; -import org.diylc.appframework.miscutils.ConfigurationManager; -import org.diylc.appframework.miscutils.Utils; -import org.diylc.appframework.simplemq.MessageDispatcher; -import org.diylc.appframework.update.Version; -import org.diylc.appframework.update.VersionNumber; -import org.diylc.common.ComponentType; -import org.diylc.common.DrawOption; -import org.diylc.common.EventType; -import org.diylc.common.IComponentFiler; -import org.diylc.common.IComponentTransformer; -import org.diylc.common.IKeyProcessor; -import org.diylc.common.IPlugIn; -import org.diylc.common.IPlugInPort; -import org.diylc.common.PropertyWrapper; -import org.diylc.core.ExpansionMode; -import org.diylc.core.IDIYComponent; -import org.diylc.core.IView; -import org.diylc.core.Project; -import org.diylc.core.Template; -import org.diylc.core.Theme; -import org.diylc.core.annotations.IAutoCreator; -import org.diylc.core.measures.Size; -import org.diylc.core.measures.SizeUnit; -import org.diylc.utils.Constants; - -import com.thoughtworks.xstream.XStream; -import com.thoughtworks.xstream.io.xml.DomDriver; +import java.awt.Cursor; +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.dnd.DnDConstants; +import java.awt.geom.AffineTransform; +import java.awt.geom.Area; +import java.awt.geom.Point2D; +import java.awt.geom.Rectangle2D; +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.swing.JOptionPane; + +import org.apache.log4j.Logger; +import org.diylc.appframework.miscutils.ConfigurationManager; +import org.diylc.appframework.miscutils.Utils; +import org.diylc.appframework.simplemq.MessageDispatcher; +import org.diylc.appframework.update.Version; +import org.diylc.appframework.update.VersionNumber; +import org.diylc.common.ComponentType; +import org.diylc.common.DrawOption; +import org.diylc.common.EventType; +import org.diylc.common.IComponentFiler; +import org.diylc.common.IComponentTransformer; +import org.diylc.common.IKeyProcessor; +import org.diylc.common.IPlugIn; +import org.diylc.common.IPlugInPort; +import org.diylc.common.PropertyWrapper; +import org.diylc.core.ExpansionMode; +import org.diylc.core.IDIYComponent; +import org.diylc.core.IView; +import org.diylc.core.Project; +import org.diylc.core.Template; +import org.diylc.core.Theme; +import org.diylc.core.annotations.IAutoCreator; +import org.diylc.core.measures.Size; +import org.diylc.core.measures.SizeUnit; +import org.diylc.utils.Constants; + +import com.thoughtworks.xstream.XStream; +import com.thoughtworks.xstream.io.xml.DomDriver; /** * The main presenter class, contains core app logic and drawing routines. @@ -132,7 +132,7 @@ public class Presenter implements IPlugInPort { private ProjectFileManager projectFileManager; private InstantiationManager instantiationManager; - private Rectangle selectionRect; + private Rectangle selectionRect; private final IView view; @@ -148,7 +148,7 @@ public class Presenter implements IPlugInPort { private Point previousDragPoint = null; private Project preDragProject = null; private int dragAction; - private Point previousScaledPoint; + private Point previousScaledPoint; public Presenter(IView view) { super(); @@ -212,8 +212,8 @@ public class Presenter implements IPlugInPort { } for (IDIYComponent component : currentProject.getComponents()) { if (!isComponentLocked(component) && isComponentVisible(component)) { - Area area = drawingManager.getComponentArea(component); - if (area != null && area.contains(scaledPoint)) { + ComponentArea area = drawingManager.getComponentArea(component); + if (area != null && area.getOutlineArea() != null && area.getOutlineArea().contains(scaledPoint)) { return Cursor.getPredefinedCursor(Cursor.HAND_CURSOR); } } @@ -599,7 +599,10 @@ public class Presenter implements IPlugInPort { messageDispatcher.dispatchMessage(EventType.PROJECT_MODIFIED, oldProject, currentProject.clone(), "Add " + componentTypeSlot.getName()); projectFileManager.notifyFileChange(); - } + } + } else if (ConfigurationManager.getInstance().readBoolean(HIGHLIGHT_CONTINUITY_AREA, false)) { + drawingManager.findContinuityAreaAtPoint(currentProject, scaledPoint); + messageDispatcher.dispatchMessage(EventType.REPAINT); } else { List> newSelection = new ArrayList>(selectedComponents); List> components = findComponentsAtScaled(scaledPoint); @@ -867,11 +870,11 @@ public class Presenter implements IPlugInPort { Area totalArea = new Area(); for (IDIYComponent c : selectedComponents) { - Area compArea = drawingManager.getComponentArea(c); - if (compArea != null) - totalArea.add(compArea); + ComponentArea compArea = drawingManager.getComponentArea(c); + if (compArea != null && compArea.getOutlineArea() != null) + totalArea.add(compArea.getOutlineArea()); else - LOG.info("Area is null"); + LOG.debug("Area is null"); } if (drawingManager.getZoomLevel() != 1 && applyZoom) { totalArea @@ -1397,8 +1400,8 @@ public class Presenter implements IPlugInPort { List> newSelection = new ArrayList>(); for (IDIYComponent component : currentProject.getComponents()) { if (!isComponentLocked(component) && isComponentVisible(component)) { - Area area = drawingManager.getComponentArea(component); - if ((area != null) && (selectionRect != null) && area.intersects(selectionRect)) { + ComponentArea area = drawingManager.getComponentArea(component); + if ((area != null && area.getOutlineArea() != null) && (selectionRect != null) && area.getOutlineArea().intersects(selectionRect)) { newSelection.addAll(findAllGroupedComponents(component)); } } @@ -1801,16 +1804,16 @@ public class Presenter implements IPlugInPort { for (IDIYComponent component : getCurrentProject().getComponents()) { // Skip already selected components or ones that cannot be stuck to // other components. - Area area = drawingManager.getComponentArea(component); - if (newSelection.contains(component) || !component.isControlPointSticky(0) || area == null) + ComponentArea area = drawingManager.getComponentArea(component); + if (newSelection.contains(component) || !component.isControlPointSticky(0) || area == null || area.getOutlineArea() == null) continue; boolean matches = false; for (IDIYComponent selectedComponent : this.selectedComponents) { - Area selectedArea = drawingManager.getComponentArea(selectedComponent); - if (selectedArea == null) + ComponentArea selectedArea = drawingManager.getComponentArea(selectedComponent); + if (selectedArea == null || selectedArea.getOutlineArea() == null) continue; - Area intersection = new Area(area); - intersection.intersect(selectedArea); + Area intersection = new Area(area.getOutlineArea()); + intersection.intersect(selectedArea.getOutlineArea()); if (!intersection.isEmpty()) { matches = true; break; diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar index a5a4c34f7d55399acec85d7cce49610f49cb41f4..493dad85877681b2c9f554592af526865c6a38f4 100644 GIT binary patch delta 60022 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 delta 56646 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

uakKZG-cA1l`8ZpU6gB!JKM{VVsCk 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 diff --git a/diylc/diylc-library/src/org/diylc/components/boards/TerminalStrip.java b/diylc/diylc-library/src/org/diylc/components/boards/TerminalStrip.java index ea6e6f97..d1f64211 100644 --- a/diylc/diylc-library/src/org/diylc/components/boards/TerminalStrip.java +++ b/diylc/diylc-library/src/org/diylc/components/boards/TerminalStrip.java @@ -376,8 +376,10 @@ public class TerminalStrip extends AbstractTransparentComponent { g2d.setColor(finalBorderColor); g2d.draw(mainArea); - g2d.setColor(outlineMode ? Constants.TRANSPARENT_COLOR : TERMINAL_COLOR); - g2d.fill(terminalArea); + g2d.setColor(outlineMode ? Constants.TRANSPARENT_COLOR : TERMINAL_COLOR); + drawingObserver.startTrackingContinuityArea(true); + g2d.fill(terminalArea); + drawingObserver.stopTrackingContinuityArea(); Color finalTerminalBorderColor; if (outlineMode) { diff --git a/diylc/diylc-library/src/org/diylc/components/boards/TriPadBoard.java b/diylc/diylc-library/src/org/diylc/components/boards/TriPadBoard.java index 3fee6f1b..ab77cd15 100644 --- a/diylc/diylc-library/src/org/diylc/components/boards/TriPadBoard.java +++ b/diylc/diylc-library/src/org/diylc/components/boards/TriPadBoard.java @@ -94,9 +94,11 @@ public class TriPadBoard extends AbstractBoard { spacesToDraw = (remainingSpace - stripSize) / spacing; } - g2d.setColor(stripColor); + g2d.setColor(stripColor); + drawingObserver.startTrackingContinuityArea(true); g2d.fillRect(p.x + spacing - stripSize / 2, p.y - stripSize / 2, spacing * (spacesToDraw - 1) + stripSize, - stripSize); + stripSize); + drawingObserver.stopTrackingContinuityArea(); g2d.setColor(stripColor.darker()); g2d.drawRect(p.x + spacing - stripSize / 2, p.y - stripSize / 2, spacing * (spacesToDraw - 1) + stripSize, @@ -130,9 +132,11 @@ public class TriPadBoard extends AbstractBoard { spacesToDraw = (remainingSpace - stripSize) / spacing; } - g2d.setColor(stripColor); + g2d.setColor(stripColor); + drawingObserver.startTrackingContinuityArea(true); g2d.fillRect(p.x - stripSize / 2, p.y + spacing - stripSize / 2, stripSize, spacing * (spacesToDraw - 1) - + stripSize); + + stripSize); + drawingObserver.stopTrackingContinuityArea(); g2d.setColor(stripColor.darker()); g2d.drawRect(p.x - stripSize / 2, p.y + spacing - stripSize / 2, stripSize, spacing * (spacesToDraw - 1) + stripSize); diff --git a/diylc/diylc-library/src/org/diylc/components/boards/VeroBoard.java b/diylc/diylc-library/src/org/diylc/components/boards/VeroBoard.java index 392a34c5..18e32707 100644 --- a/diylc/diylc-library/src/org/diylc/components/boards/VeroBoard.java +++ b/diylc/diylc-library/src/org/diylc/components/boards/VeroBoard.java @@ -84,8 +84,10 @@ public class VeroBoard extends AbstractBoard { while (p.y < secondPoint.y - spacing) { p.x = firstPoint.x; p.y += spacing; - g2d.setColor(stripColor); - g2d.fillRect(p.x + spacing / 2, p.y - stripSize / 2, secondPoint.x - spacing - p.x, stripSize); + g2d.setColor(stripColor); + drawingObserver.startTrackingContinuityArea(true); + g2d.fillRect(p.x + spacing / 2, p.y - stripSize / 2, secondPoint.x - spacing - p.x, stripSize); + drawingObserver.stopTrackingContinuityArea(); g2d.setColor(stripColor.darker()); g2d.drawRect(p.x + spacing / 2, p.y - stripSize / 2, secondPoint.x - spacing - p.x, stripSize); while (p.x < secondPoint.x - spacing - holeSize) { @@ -100,8 +102,10 @@ public class VeroBoard extends AbstractBoard { while (p.x < secondPoint.x - spacing) { p.x += spacing; p.y = firstPoint.y; - g2d.setColor(stripColor); - g2d.fillRect(p.x - stripSize / 2, p.y + spacing / 2, stripSize, secondPoint.y - spacing - p.y); + g2d.setColor(stripColor); + drawingObserver.startTrackingContinuityArea(true); + g2d.fillRect(p.x - stripSize / 2, p.y + spacing / 2, stripSize, secondPoint.y - spacing - p.y); + drawingObserver.stopTrackingContinuityArea(); g2d.setColor(stripColor.darker()); g2d.drawRect(p.x - stripSize / 2, p.y + spacing / 2, stripSize, secondPoint.y - spacing - p.y); while (p.y < secondPoint.y - spacing - holeSize) { diff --git a/diylc/diylc-library/src/org/diylc/components/connectivity/CurvedTrace.java b/diylc/diylc-library/src/org/diylc/components/connectivity/CurvedTrace.java index 9337c90e..9d5f8388 100644 --- a/diylc/diylc-library/src/org/diylc/components/connectivity/CurvedTrace.java +++ b/diylc/diylc-library/src/org/diylc/components/connectivity/CurvedTrace.java @@ -24,13 +24,14 @@ package org.diylc.components.connectivity; import java.awt.Color; import java.awt.Graphics2D; import java.awt.geom.CubicCurve2D; - + import org.diylc.common.SimpleComponentTransformer; import org.diylc.common.ObjectCache; import org.diylc.common.PCBLayer; import org.diylc.components.AbstractCurvedComponent; import org.diylc.core.ComponentState; import org.diylc.core.IDIYComponent; +import org.diylc.core.IDrawingObserver; import org.diylc.core.annotations.BomPolicy; import org.diylc.core.annotations.ComponentDescriptor; import org.diylc.core.annotations.EditableProperty; @@ -58,14 +59,16 @@ public class CurvedTrace extends AbstractCurvedComponent { } @Override - protected void drawCurve(CubicCurve2D curve, Graphics2D g2d, ComponentState componentState) { + protected void drawCurve(CubicCurve2D curve, Graphics2D g2d, ComponentState componentState, IDrawingObserver drawingObserver) { float thickness = (float) size.convertToPixels(); g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(thickness)); Color curveColor = componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR : color; - g2d.setColor(curveColor); - g2d.draw(curve); + g2d.setColor(curveColor); + drawingObserver.startTrackingContinuityArea(true); + g2d.draw(curve); + drawingObserver.stopTrackingContinuityArea(); } @EditableProperty(name = "Width") 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 972e9322..b1d6dd9c 100644 --- a/diylc/diylc-library/src/org/diylc/components/connectivity/HookupWire.java +++ b/diylc/diylc-library/src/org/diylc/components/connectivity/HookupWire.java @@ -24,12 +24,13 @@ package org.diylc.components.connectivity; import java.awt.Color; import java.awt.Graphics2D; import java.awt.geom.CubicCurve2D; - + import org.diylc.common.ObjectCache; import org.diylc.common.SimpleComponentTransformer; import org.diylc.components.AbstractCurvedComponent; import org.diylc.core.ComponentState; import org.diylc.core.IDIYComponent; +import org.diylc.core.IDrawingObserver; import org.diylc.core.annotations.BomPolicy; import org.diylc.core.annotations.ComponentDescriptor; import org.diylc.core.annotations.EditableProperty; @@ -38,7 +39,7 @@ import org.diylc.utils.Constants; @ComponentDescriptor(name = "Hookup Wire", author = "Branislav Stojkovic", category = "Connectivity", instanceNamePrefix = "W", description = "Flexible wire with two control points", zOrder = IDIYComponent.COMPONENT, flexibleZOrder = true, bomPolicy = BomPolicy.NEVER_SHOW, autoEdit = false, - transformer = SimpleComponentTransformer.class) + transformer = SimpleComponentTransformer.class, continuity = true) public class HookupWire extends AbstractCurvedComponent { private static final long serialVersionUID = 1L; @@ -54,7 +55,7 @@ public class HookupWire extends AbstractCurvedComponent { } @Override - protected void drawCurve(CubicCurve2D curve, Graphics2D g2d, ComponentState componentState) { + protected void drawCurve(CubicCurve2D curve, Graphics2D g2d, ComponentState componentState, IDrawingObserver drawingObserver) { int thickness = (int) (Math.pow(Math.E, -1.12436 - 0.11594 * gauge.getValue()) * Constants.PIXELS_PER_INCH * (1 + 2 * INSULATION_THICKNESS_PCT)); Color curveColor = diff --git a/diylc/diylc-library/src/org/diylc/components/connectivity/Jumper.java b/diylc/diylc-library/src/org/diylc/components/connectivity/Jumper.java index 8e59b0a8..95670911 100644 --- a/diylc/diylc-library/src/org/diylc/components/connectivity/Jumper.java +++ b/diylc/diylc-library/src/org/diylc/components/connectivity/Jumper.java @@ -40,7 +40,7 @@ import org.diylc.core.measures.Size; @ComponentDescriptor(name = "Jumper", author = "Branislav Stojkovic", category = "Connectivity", creationMethod = CreationMethod.POINT_BY_POINT, instanceNamePrefix = "J", description = "", zOrder = IDIYComponent.COMPONENT, bomPolicy = BomPolicy.NEVER_SHOW, autoEdit = false, - transformer = SimpleComponentTransformer.class) + transformer = SimpleComponentTransformer.class, continuity = true) public class Jumper extends AbstractLeadedComponent { private static final long serialVersionUID = 1L; 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 9222254f..415533f3 100644 --- a/diylc/diylc-library/src/org/diylc/components/connectivity/TraceCut.java +++ b/diylc/diylc-library/src/org/diylc/components/connectivity/TraceCut.java @@ -77,16 +77,20 @@ public class TraceCut extends AbstractComponent { if (getCutBetweenHoles()) { int holeSpacing = getClosestOdd(getHoleSpacing().convertToPixels()); g2d.setColor(componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR - : boardColor); - g2d.fillRect(point.x - holeSpacing / 2 - cutWidth / 2, point.y - size / 2 - 1, cutWidth, size + 2); + : boardColor); + drawingObserver.startTrackingContinuityArea(false); + g2d.fillRect(point.x - holeSpacing / 2 - cutWidth / 2, point.y - size / 2 - 1, cutWidth, size + 2); + drawingObserver.stopTrackingContinuityArea(); } else { g2d.setColor(componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR - : boardColor); - g2d.fillRoundRect(point.x - size / 2, point.y - size / 2, size, size, size, size); + : boardColor); + drawingObserver.startTrackingContinuityArea(false); + g2d.fillRoundRect(point.x - size / 2, point.y - size / 2, size, size, size, size); + drawingObserver.stopTrackingContinuityArea(); g2d.setColor(Constants.CANVAS_COLOR); - int holeSize = getClosestOdd((int) HOLE_SIZE.convertToPixels()); - g2d.fillOval(point.x - holeSize / 2, point.y - holeSize / 2, holeSize, holeSize); + int holeSize = getClosestOdd((int) HOLE_SIZE.convertToPixels()); + g2d.fillOval(point.x - holeSize / 2, point.y - holeSize / 2, holeSize, holeSize); g2d.setColor(boardColor.darker()); g2d.drawOval(point.x - holeSize / 2, point.y - holeSize / 2, holeSize, holeSize); } diff --git a/diylc/diylc-swing/DIYLCStarter.launch b/diylc/diylc-swing/DIYLCStarter.launch index 6d1af050..e44ede70 100644 --- a/diylc/diylc-swing/DIYLCStarter.launch +++ b/diylc/diylc-swing/DIYLCStarter.launch @@ -11,5 +11,5 @@ - + diff --git a/diylc/diylc-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar index a5a4c34f7d55399acec85d7cce49610f49cb41f4..493dad85877681b2c9f554592af526865c6a38f4 100644 GIT binary patch delta 60022 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 delta 56646 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

uakKZG-cA1l`8ZpU6gB!JKM{VVsCk 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 diff --git a/diylc/diylc-swing/library/main.jar b/diylc/diylc-swing/library/main.jar index 52047902e820229ec0444f409f2b33a5ddbc2e6d..a2e31ed0fc9a9bda65999bbffd81f133002f98a2 100644 GIT binary patch delta 29320 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 J1!x1@{{dJSy&?br 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 70f44385..d939a0cf 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 @@ -99,7 +99,10 @@ public class ConfigPlugin implements IPlugIn { CONFIG_MENU); swingUI.injectMenuAction( ActionFactory.getInstance() - .createConfigAction(plugInPort, "Sticky Points", IPlugInPort.STICKY_POINTS_KEY, true), CONFIG_MENU); + .createConfigAction(plugInPort, "Sticky Points", IPlugInPort.STICKY_POINTS_KEY, true), CONFIG_MENU); + swingUI.injectMenuAction( + ActionFactory.getInstance() + .createConfigAction(plugInPort, "Highlighted Connected Areas", IPlugInPort.HIGHLIGHT_CONTINUITY_AREA, false), CONFIG_MENU); File themeDir = new File("themes"); if (themeDir.exists()) { diff --git a/diylc/diylc-swing/update.xml b/diylc/diylc-swing/update.xml index 36ce7f7f..dc43667b 100644 --- a/diylc/diylc-swing/update.xml +++ b/diylc/diylc-swing/update.xml @@ -1874,6 +1874,10 @@ 2018-12-11 00:00:00.000 CET + + NEW_FEATURE + Highlight connected areas through copper traces, leads, jumpers, etc... + NEW_FEATURE Holding "shift" key switches mouse wheel scrolling function from vertical to horizontal