diff --git a/diylc/diylc-core/src/main/resources/update.xml b/diylc/diylc-core/src/main/resources/update.xml
index 2cda6e38..ec5a45f7 100644
--- a/diylc/diylc-core/src/main/resources/update.xml
+++ b/diylc/diylc-core/src/main/resources/update.xml
@@ -253,6 +253,10 @@
NEW_FEATURE
'Virtual Multimeter' from 'Analyze' menu traces the circuit finding all possible paths of electricity between two points designated by the probe symbol.
+
+ NEW_FEATURE
+ Added ability to highlight connected switch lugs in selected position in order to illustrate how it works internally.
+
IMPROVEMENT
Upgraded source code structure to modern standards and introduced Maven
diff --git a/diylc/diylc-library/src/main/java/org/diylc/components/guitar/Freeway3x3_03.java b/diylc/diylc-library/src/main/java/org/diylc/components/guitar/Freeway3x3_03.java
index b8d5b180..c91c7d39 100644
--- a/diylc/diylc-library/src/main/java/org/diylc/components/guitar/Freeway3x3_03.java
+++ b/diylc/diylc-library/src/main/java/org/diylc/components/guitar/Freeway3x3_03.java
@@ -33,6 +33,9 @@ import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
+import java.util.Set;
+import java.util.stream.IntStream;
+
import org.apache.log4j.Logger;
import org.apache.poi.util.IOUtils;
import org.diylc.appframework.miscutils.ConfigurationManager;
@@ -47,26 +50,24 @@ import org.diylc.common.ObjectCache;
import org.diylc.common.Orientation;
import org.diylc.components.AbstractTransparentComponent;
import org.diylc.components.transform.Freeway3x3_03Transformer;
-import org.diylc.core.ComponentState;
-import org.diylc.core.IDIYComponent;
-import org.diylc.core.IDrawingObserver;
-import org.diylc.core.ISwitch;
-import org.diylc.core.Project;
-import org.diylc.core.Theme;
-import org.diylc.core.VisibilityPolicy;
+import org.diylc.core.*;
import org.diylc.core.annotations.ComponentDescriptor;
+import org.diylc.core.annotations.DynamicEditableProperty;
import org.diylc.core.annotations.EditableProperty;
import org.diylc.core.annotations.KeywordPolicy;
import org.diylc.core.measures.Size;
import org.diylc.core.measures.SizeUnit;
import org.diylc.utils.Constants;
+import static org.diylc.utils.SwitchUtils.getConnectedTerminals;
+
@ComponentDescriptor(name = "Freeway 3X3-03 Toggle", category = "Guitar",
author = "Branislav Stojkovic", description = "Freeway 3X3-03 Toggle Switch",
zOrder = IDIYComponent.COMPONENT, instanceNamePrefix = "SW",
keywordPolicy = KeywordPolicy.SHOW_TAG, keywordTag = "Guitar Wiring Diagram",
transformer = Freeway3x3_03Transformer.class, enableCache = true)
-public class Freeway3x3_03 extends AbstractTransparentComponent implements ISwitch {
+public class Freeway3x3_03 extends AbstractTransparentComponent implements ISwitch,
+ IContinuity {
private static final Logger LOG = Logger.getLogger(Freeway3x3_03.class);
@@ -91,6 +92,9 @@ public class Freeway3x3_03 extends AbstractTransparentComponent implements
private Orientation orientation = Orientation.DEFAULT;
+ private Integer selectedPosition;
+ private Boolean highlightConnectedTerminals;
+
private transient SVGDiagram svgDiagram;
private transient List pads;
private transient List labels;
@@ -180,16 +184,34 @@ public class Freeway3x3_03 extends AbstractTransparentComponent implements
g2d.setColor(finalBorderColor);
g2d.draw(base);
+ List> connectedTerminals = getConnectedTerminals(this, controlPoints.length);
+
drawingObserver.startTrackingContinuityArea(true);
- g2d.setColor(PAD_COLOR);
- for (Shape pad : pads) {
- g2d.fill(pad);
+ for (int i = 0; i < pads.size(); i++) {
+ int finalI = i;
+ int groupIndex = IntStream.range(0, connectedTerminals.size())
+ .filter(j -> connectedTerminals.get(j).contains(finalI))
+ .findFirst().orElse(-1);
+ if (groupIndex < 0) {
+ g2d.setColor(PAD_COLOR);
+ } else {
+ g2d.setColor(ISwitch.POLE_COLORS[groupIndex]);
+ }
+ g2d.fill(pads.get(i));
}
drawingObserver.stopTrackingContinuityArea();
- g2d.setColor(PAD_COLOR.darker());
- for (Shape pad : pads) {
- g2d.draw(pad);
+ for (int i = 0; i < pads.size(); i++) {
+ int finalI = i;
+ int groupIndex = IntStream.range(0, connectedTerminals.size())
+ .filter(j -> connectedTerminals.get(j).contains(finalI))
+ .findFirst().orElse(-1);
+ if (groupIndex < 0) {
+ g2d.setColor(PAD_COLOR.darker());
+ } else {
+ g2d.setColor(ISwitch.POLE_COLORS[groupIndex].darker());
+ }
+ g2d.draw(pads.get(i));
}
g2d.setColor(LABEL_COLOR);
@@ -419,6 +441,30 @@ public class Freeway3x3_03 extends AbstractTransparentComponent implements
return Integer.toString(position + 1);
}
+ @DynamicEditableProperty(source = Freeway3x4_03SwitchPositionPropertyValueSource.class)
+ @EditableProperty(name = "Selected Position")
+ @Override
+ public Integer getSelectedPosition() {
+ return selectedPosition;
+ }
+
+ public void setSelectedPosition(Integer selectedPosition) {
+ this.selectedPosition = selectedPosition;
+ }
+
+ @EditableProperty(name = "Highlight Connected")
+ @Override
+ public Boolean getHighlightConnectedTerminals() {
+ if (highlightConnectedTerminals == null) {
+ highlightConnectedTerminals = false;
+ }
+ return highlightConnectedTerminals;
+ }
+
+ public void setHighlightConnectedTerminals(Boolean highlightConnectedTerminals) {
+ this.highlightConnectedTerminals = highlightConnectedTerminals;
+ }
+
@Override
public boolean arePointsConnected(int index1, int index2, int position) {
if (position == 0 && ((index1 == 0 && index2 == 9) || (index1 == 1 && index2 == 7))) {
@@ -445,4 +491,12 @@ public class Freeway3x3_03 extends AbstractTransparentComponent implements
}
return false;
}
+
+ @Override
+ public boolean arePointsConnected(int index1, int index2) {
+ if (this.selectedPosition == null) {
+ return false;
+ }
+ return arePointsConnected(index1, index2, this.selectedPosition);
+ }
}
diff --git a/diylc/diylc-library/src/main/java/org/diylc/components/guitar/Freeway3x4_03SwitchPositionPropertyValueSource.java b/diylc/diylc-library/src/main/java/org/diylc/components/guitar/Freeway3x4_03SwitchPositionPropertyValueSource.java
new file mode 100644
index 00000000..5efd2866
--- /dev/null
+++ b/diylc/diylc-library/src/main/java/org/diylc/components/guitar/Freeway3x4_03SwitchPositionPropertyValueSource.java
@@ -0,0 +1,48 @@
+package org.diylc.components.guitar;
+
+import org.diylc.common.PropertyWrapper;
+import org.diylc.core.IDIYComponent;
+import org.diylc.core.IDynamicPropertySource;
+import org.diylc.core.ISwitch;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+public class Freeway3x4_03SwitchPositionPropertyValueSource implements IDynamicPropertySource {
+
+ private List properties;
+ private IDIYComponent> component;
+
+ @Override
+ public void setProperties(List properties) {
+ this.properties = properties;
+ }
+
+ @Override
+ public void setComponent(IDIYComponent> component) {
+ this.component = component;
+ }
+
+ @Override
+ public List