diff --git a/diylc/diylc-core/src/org/diylc/presenter/update.xml b/diylc/diylc-core/src/org/diylc/presenter/update.xml
index 54ae581a..2449c319 100644
--- a/diylc/diylc-core/src/org/diylc/presenter/update.xml
+++ b/diylc/diylc-core/src/org/diylc/presenter/update.xml
@@ -2934,10 +2934,18 @@
2020-04-09 00:00:00.000 CET
+
+ NEW_FEATURE
+ Added "Tag Strip" component for point-to-point layouts
+
IMPROVEMENT
Prevent the app from closing while running background operations, like saving and exporting files
+
+ IMPROVEMENT
+ Automatically determine border color of board components
+
BUG_FIX
Fixed the issue with "Highlight Connected Areas" not recognizing some conductive areas
diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar
index 9803f9fc..5ee6e9a9 100644
Binary files a/diylc/diylc-library/lib/diylc-core.jar and b/diylc/diylc-library/lib/diylc-core.jar differ
diff --git a/diylc/diylc-library/src/org/diylc/components/boards/AbstractBoard.java b/diylc/diylc-library/src/org/diylc/components/boards/AbstractBoard.java
index c328f71f..248808b4 100644
--- a/diylc/diylc-library/src/org/diylc/components/boards/AbstractBoard.java
+++ b/diylc/diylc-library/src/org/diylc/components/boards/AbstractBoard.java
@@ -46,7 +46,6 @@ public abstract class AbstractBoard extends AbstractTransparentComponent
private static final long serialVersionUID = 1L;
public static Color BOARD_COLOR = Color.decode("#F8EBB3");
- public static Color BORDER_COLOR = BOARD_COLOR.darker();
public static Color COORDINATE_COLOR = Color.gray.brighter();
public static float COORDINATE_FONT_SIZE = 9f;
public static Size DEFAULT_WIDTH = new Size(1.5d, SizeUnit.in);
@@ -59,7 +58,8 @@ public abstract class AbstractBoard extends AbstractTransparentComponent
protected Point secondPoint = new Point();
protected Color boardColor = BOARD_COLOR;
- protected Color borderColor = BORDER_COLOR;
+ @Deprecated
+ protected Color borderColor;
protected Color coordinateColor = COORDINATE_COLOR;
protected Boolean drawCoordinates = null;
protected CoordinateType xType = CoordinateType.Numbers;
@@ -92,7 +92,7 @@ public abstract class AbstractBoard extends AbstractTransparentComponent
// tracked so far.
drawingObserver.stopTracking();
g2d.setColor(componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR
- : borderColor);
+ : getBoardColor().darker());
g2d.drawRect(firstPoint.x, firstPoint.y, finalSecondPoint.x - firstPoint.x, finalSecondPoint.y - firstPoint.y);
}
@@ -211,15 +211,6 @@ public abstract class AbstractBoard extends AbstractTransparentComponent
public void setCoordinateColor(Color coordinateColor) {
this.coordinateColor = coordinateColor;
}
-
- @EditableProperty(name = "Border")
- public Color getBorderColor() {
- return borderColor;
- }
-
- public void setBorderColor(Color borderColor) {
- this.borderColor = borderColor;
- }
@EditableProperty(name = "X")
public CoordinateType getxType() {
diff --git a/diylc/diylc-library/src/org/diylc/components/boards/BlankBoard.java b/diylc/diylc-library/src/org/diylc/components/boards/BlankBoard.java
index 300a21ed..e7bd90bc 100644
--- a/diylc/diylc-library/src/org/diylc/components/boards/BlankBoard.java
+++ b/diylc/diylc-library/src/org/diylc/components/boards/BlankBoard.java
@@ -52,7 +52,7 @@ public class BlankBoard extends AbstractBoard {
int factor = 32 / width;
g2d.setColor(BOARD_COLOR);
g2d.fillRect(2 / factor, 2 / factor, width - 4 / factor, height - 4 / factor);
- g2d.setColor(BORDER_COLOR);
+ g2d.setColor(BOARD_COLOR.darker());
g2d.drawRect(2 / factor, 2 / factor, width - 4 / factor, height - 4 / factor);
}
@@ -84,7 +84,7 @@ public class BlankBoard extends AbstractBoard {
// tracked so far.
drawingObserver.stopTracking();
g2d.setColor(componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR
- : borderColor);
+ : getBoardColor().darker());
if (getType() == Type.SQUARE)
g2d.drawRect(firstPoint.x, firstPoint.y, finalSecondPoint.x - firstPoint.x, finalSecondPoint.y - firstPoint.y);
else
diff --git a/diylc/diylc-library/src/org/diylc/components/boards/EyeletBoard.java b/diylc/diylc-library/src/org/diylc/components/boards/EyeletBoard.java
index 61723414..f0e46737 100644
--- a/diylc/diylc-library/src/org/diylc/components/boards/EyeletBoard.java
+++ b/diylc/diylc-library/src/org/diylc/components/boards/EyeletBoard.java
@@ -49,7 +49,6 @@ public class EyeletBoard extends AbstractBoard {
private static final long serialVersionUID = 1L;
public static Color BOARD_COLOR = Color.decode("#E3EAB4");
- public static Color BORDER_COLOR = BOARD_COLOR.darker();
public static Color EYELET_COLOR = Color.decode("#C3E4ED");
public static Size SPACING = new Size(0.5d, SizeUnit.in);
@@ -63,7 +62,6 @@ public class EyeletBoard extends AbstractBoard {
public EyeletBoard() {
super();
this.boardColor = BOARD_COLOR;
- this.borderColor = BORDER_COLOR;
}
@Override
@@ -133,7 +131,7 @@ public class EyeletBoard extends AbstractBoard {
int factor = 32 / width;
g2d.setColor(BOARD_COLOR);
g2d.fillRect(2 / factor, 2 / factor, width - 4 / factor, height - 4 / factor);
- g2d.setColor(BORDER_COLOR);
+ g2d.setColor(BOARD_COLOR.darker());
g2d.drawRect(2 / factor, 2 / factor, width - 4 / factor, height - 4 / factor);
g2d.setColor(EYELET_COLOR);
g2d.fillOval(width / 4, width / 4, width / 2, width / 2);
diff --git a/diylc/diylc-library/src/org/diylc/components/boards/MarshallPerfBoard.java b/diylc/diylc-library/src/org/diylc/components/boards/MarshallPerfBoard.java
index fed20b27..79e1ed7b 100644
--- a/diylc/diylc-library/src/org/diylc/components/boards/MarshallPerfBoard.java
+++ b/diylc/diylc-library/src/org/diylc/components/boards/MarshallPerfBoard.java
@@ -51,7 +51,6 @@ public class MarshallPerfBoard extends AbstractBoard {
private static final long serialVersionUID = 1L;
public static Color BOARD_COLOR = Color.decode("#CD8500");
- public static Color BORDER_COLOR = BOARD_COLOR.darker();
public static Size SPACING = new Size(3 / 8d, SizeUnit.in);
public static Size HOLE_SIZE = new Size(1 / 8d, SizeUnit.in);
@@ -61,7 +60,6 @@ public class MarshallPerfBoard extends AbstractBoard {
public MarshallPerfBoard() {
super();
this.boardColor = BOARD_COLOR;
- this.borderColor = BORDER_COLOR;
}
@Override
@@ -90,7 +88,7 @@ public class MarshallPerfBoard extends AbstractBoard {
p.x += spacing;
g2d.setColor(Constants.CANVAS_COLOR);
g2d.fillOval(p.x - holeDiameter / 2, p.y - holeDiameter / 2, holeDiameter, holeDiameter);
- g2d.setColor(borderColor);
+ g2d.setColor(getBoardColor().darker());
g2d.drawOval(p.x - holeDiameter / 2, p.y - holeDiameter / 2, holeDiameter, holeDiameter);
}
}
@@ -117,34 +115,34 @@ public class MarshallPerfBoard extends AbstractBoard {
int factor = 32 / width;
g2d.setColor(BOARD_COLOR);
g2d.fillRect(2 / factor, 2 / factor, width - 4 / factor, height - 4 / factor);
- g2d.setColor(BORDER_COLOR);
+ g2d.setColor(BOARD_COLOR.darker());
g2d.drawRect(2 / factor, 2 / factor, width - 4 / factor, height - 4 / factor);
g2d.setColor(Constants.CANVAS_COLOR);
g2d.fillOval(width / 3 - 2 / factor, width / 3 - 2 / factor, getClosestOdd(5.0 / factor),
getClosestOdd(5.0 / factor));
- g2d.setColor(BORDER_COLOR);
+ g2d.setColor(BOARD_COLOR.darker());
g2d.drawOval(width / 3 - 2 / factor, width / 3 - 2 / factor, getClosestOdd(5.0 / factor),
getClosestOdd(5.0 / factor));
g2d.setColor(Constants.CANVAS_COLOR);
g2d.fillOval(2 * width / 3 - 2 / factor, width / 3 - 2 / factor, getClosestOdd(5.0 / factor),
getClosestOdd(5.0 / factor));
- g2d.setColor(BORDER_COLOR);
+ g2d.setColor(BOARD_COLOR.darker());
g2d.drawOval(2 * width / 3 - 2 / factor, width / 3 - 2 / factor, getClosestOdd(5.0 / factor),
getClosestOdd(5.0 / factor));
g2d.setColor(Constants.CANVAS_COLOR);
g2d.fillOval(width / 3 - 2 / factor, 2 * width / 3 - 2 / factor, getClosestOdd(5.0 / factor),
getClosestOdd(5.0 / factor));
- g2d.setColor(BORDER_COLOR);
+ g2d.setColor(BOARD_COLOR.darker());
g2d.drawOval(width / 3 - 2 / factor, 2 * width / 3 - 2 / factor, getClosestOdd(5.0 / factor),
getClosestOdd(5.0 / factor));
g2d.setColor(Constants.CANVAS_COLOR);
g2d.fillOval(2 * width / 3 - 2 / factor, 2 * width / 3 - 2 / factor, getClosestOdd(5.0 / factor),
getClosestOdd(5.0 / factor));
- g2d.setColor(BORDER_COLOR);
+ g2d.setColor(BOARD_COLOR.darker());
g2d.drawOval(2 * width / 3 - 2 / factor, 2 * width / 3 - 2 / factor, getClosestOdd(5.0 / factor),
getClosestOdd(5.0 / factor));
}
diff --git a/diylc/diylc-library/src/org/diylc/components/boards/PerfBoard.java b/diylc/diylc-library/src/org/diylc/components/boards/PerfBoard.java
index 85e9d34b..ac27df5b 100644
--- a/diylc/diylc-library/src/org/diylc/components/boards/PerfBoard.java
+++ b/diylc/diylc-library/src/org/diylc/components/boards/PerfBoard.java
@@ -126,7 +126,7 @@ public class PerfBoard extends AbstractBoard {
int factor = 32 / width;
g2d.setColor(BOARD_COLOR);
g2d.fillRect(2 / factor, 2 / factor, width - 4 / factor, height - 4 / factor);
- g2d.setColor(BORDER_COLOR);
+ g2d.setColor(BOARD_COLOR.darker());
g2d.drawRect(2 / factor, 2 / factor, width - 4 / factor, height - 4 / factor);
g2d.setColor(COPPER_COLOR);
g2d.fillOval(width / 4, width / 4, width / 2, width / 2);
diff --git a/diylc/diylc-library/src/org/diylc/components/boards/TagStrip.java b/diylc/diylc-library/src/org/diylc/components/boards/TagStrip.java
new file mode 100644
index 00000000..32b1af9a
--- /dev/null
+++ b/diylc/diylc-library/src/org/diylc/components/boards/TagStrip.java
@@ -0,0 +1,412 @@
+/*
+
+ 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.components.boards;
+
+import java.awt.AlphaComposite;
+import java.awt.Color;
+import java.awt.Composite;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.geom.Area;
+import java.awt.geom.Ellipse2D;
+import java.awt.geom.Rectangle2D;
+
+import org.diylc.appframework.miscutils.ConfigurationManager;
+import org.diylc.common.IPlugInPort;
+import org.diylc.common.ObjectCache;
+import org.diylc.common.Orientation;
+import org.diylc.components.AbstractTransparentComponent;
+import org.diylc.components.transform.TerminalStripTransformer;
+import org.diylc.core.ComponentState;
+import org.diylc.core.IContinuity;
+import org.diylc.core.IDIYComponent;
+import org.diylc.core.IDrawingObserver;
+import org.diylc.core.Project;
+import org.diylc.core.Theme;
+import org.diylc.core.VisibilityPolicy;
+import org.diylc.core.annotations.ComponentDescriptor;
+import org.diylc.core.annotations.EditableProperty;
+import org.diylc.core.annotations.KeywordPolicy;
+import org.diylc.core.annotations.PositiveNonZeroMeasureValidator;
+import org.diylc.core.measures.Size;
+import org.diylc.core.measures.SizeUnit;
+import org.diylc.utils.Constants;
+
+@ComponentDescriptor(name = "Tag Strip", author = "Branislav Stojkovic", category = "Boards",
+ instanceNamePrefix = "TS", description = "Row of terminals for point-to-point construction",
+ zOrder = IDIYComponent.BOARD, keywordPolicy = KeywordPolicy.SHOW_TYPE_NAME, transformer = TerminalStripTransformer.class)
+public class TagStrip extends AbstractTransparentComponent implements IContinuity {
+
+ private static final long serialVersionUID = 1L;
+
+ public static Color BOARD_COLOR = Color.decode("#CD8500");
+ public static Color TERMINAL_COLOR = Color.lightGray;
+ public static Color TERMINAL_BORDER_COLOR = TERMINAL_COLOR.darker();
+ public static int EDGE_RADIUS = 2;
+ public static Size MOUNTING_HOLE_SIZE = new Size(0.07d, SizeUnit.in);
+ public static Size MOUNTING_HOLE_DISTANCE = new Size(0.25d, SizeUnit.in);
+ public static Size TERMINAL_THICKNESS = new Size(0.04d, SizeUnit.in);
+
+ private String value = "";
+ private Orientation orientation = Orientation.DEFAULT;
+ private int terminalCount = 7;
+ private static Size BOARD_THICKNESS = new Size(0.05d, SizeUnit.in);
+ private Size terminalSpacing = new Size(0.375d, SizeUnit.in);
+ private Point[] controlPoints = new Point[] {new Point(0, 0)};
+ private Color boardColor = BOARD_COLOR;
+
+ private TagStripMount mount = TagStripMount.Central;
+
+ transient private Area[] body;
+
+ public TagStrip() {
+ super();
+ updateControlPoints();
+ }
+
+ @EditableProperty
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ @EditableProperty
+ public Orientation getOrientation() {
+ return orientation;
+ }
+
+ public void setOrientation(Orientation orientation) {
+ this.orientation = orientation;
+ updateControlPoints();
+ // Reset body shape.
+ body = null;
+ }
+
+ @EditableProperty(name = "Terminals")
+ public int getTerminalCount() {
+ return terminalCount;
+ }
+
+ public void setTerminalCount(int terminalCount) {
+ this.terminalCount = terminalCount;
+ updateControlPoints();
+ // Reset body shape;
+ body = null;
+ }
+
+ @EditableProperty(name = "Terminal Spacing", validatorClass = PositiveNonZeroMeasureValidator.class)
+ public Size getTerminalSpacing() {
+ return terminalSpacing;
+ }
+
+ public void setTerminalSpacing(Size pinSpacing) {
+ this.terminalSpacing = pinSpacing;
+ updateControlPoints();
+ // Reset body shape;
+ body = null;
+ }
+
+ @Override
+ public int getControlPointCount() {
+ return controlPoints.length;
+ }
+
+ @Override
+ public Point getControlPoint(int index) {
+ return controlPoints[index];
+ }
+
+ @Override
+ public boolean isControlPointSticky(int index) {
+ return true;
+ }
+
+ @Override
+ public VisibilityPolicy getControlPointVisibilityPolicy(int index) {
+ return VisibilityPolicy.NEVER;
+ }
+
+ @Override
+ public void setControlPoint(Point point, int index) {
+ controlPoints[index].setLocation(point);
+ body = null;
+ }
+
+ private void updateControlPoints() {
+ Point firstPoint = controlPoints[0];
+ controlPoints = new Point[getTerminalCount()];
+ controlPoints[0] = firstPoint;
+ int pinSpacing = (int) this.terminalSpacing.convertToPixels();
+ // Update control points.
+ int dx1;
+ int dy1;
+ for (int i = 0; i < getTerminalCount(); i++) {
+ switch (orientation) {
+ case DEFAULT:
+ dx1 = 0;
+ dy1 = i * pinSpacing;
+ break;
+ case _90:
+ dx1 = -i * pinSpacing;
+ dy1 = 0;
+ break;
+ case _180:
+ dx1 = 0;
+ dy1 = -i * pinSpacing;
+ break;
+ case _270:
+ dx1 = i * pinSpacing;
+ dy1 = 0;
+ break;
+ default:
+ throw new RuntimeException("Unexpected orientation: " + orientation);
+ }
+ controlPoints[i] = new Point(firstPoint.x + dx1, firstPoint.y + dy1);
+ }
+ }
+
+ public Area[] getBody() {
+ if (body == null) {
+ body = new Area[1 + getTerminalCount()];
+ int x = controlPoints[0].x;
+ int y = controlPoints[0].y;
+ int width;
+ int height;
+ int terminalSpacing = (int) getTerminalSpacing().convertToPixels();
+ int boardThickness = getClosestOdd(BOARD_THICKNESS.convertToPixels());
+ int boardLength = (int) ((getTerminalCount() - 0.5) * terminalSpacing + 2 * boardThickness);
+ int holeSize = getClosestOdd(MOUNTING_HOLE_SIZE.convertToPixels());
+ int terminalThickness = (int) TERMINAL_THICKNESS.convertToPixels();
+ int terminalSize = terminalSpacing / 2;
+ int holeDistance = terminalSize / 2 + terminalThickness / 2 + 1;
+ int terminalWidth;
+ int terminalHeight;
+ int holeDx;
+ int holeDy;
+ switch (orientation) {
+ case DEFAULT:
+ width = boardThickness;
+ height = boardLength;
+ terminalWidth = terminalThickness;
+ terminalHeight = terminalSize;
+ x -= boardThickness + terminalThickness / 2;
+ y -= terminalSize / 2 + boardThickness;
+ holeDx = holeDistance;
+ holeDy = 0;
+ break;
+ case _90:
+ width = boardLength;
+ height = boardThickness;
+ terminalWidth = terminalSize;
+ terminalHeight = terminalThickness;
+ x += boardThickness - boardLength + terminalSize / 2;
+ y -= boardThickness + terminalThickness / 2;
+ holeDx = 0;
+ holeDy = holeDistance;
+ break;
+ case _180:
+ width = boardThickness;
+ height = boardLength;
+ terminalWidth = terminalThickness;
+ terminalHeight = terminalSize;
+ x += terminalThickness / 2;
+ y += boardThickness - boardLength + terminalSize / 2;
+ holeDx = -holeDistance;
+ holeDy = 0;
+ break;
+ case _270:
+ width = boardLength;
+ height = boardThickness;
+ terminalWidth = terminalSize;
+ terminalHeight = terminalThickness;
+ x -= terminalSize / 2 + boardThickness;
+ y -= -terminalThickness / 2;
+ holeDx = 0;
+ holeDy = -holeDistance;
+ break;
+ default:
+ throw new RuntimeException("Unexpected orientation: " + orientation);
+ }
+ Area bodyArea = new Area(new Rectangle2D.Double(x, y, width, height));
+ body[0] = bodyArea;
+
+ for (int i = 0; i < getTerminalCount(); i++) {
+ Point p1 = getControlPoint(i);
+ Area terminal =
+ new Area(new Rectangle2D.Double(p1.x - terminalWidth/ 2, p1.y - terminalHeight / 2, terminalWidth, terminalHeight));
+
+ body[1 + i] = terminal;
+
+ if ((getMount() == TagStripMount.Central && i == getTerminalCount() / 2) || (getMount() == TagStripMount.Outside && (i == 0 || i == getTerminalCount() - 1))) {
+ Area mount = new Area(new Rectangle2D.Double(p1.getX() + holeDx - terminalSize / 2, p1.getY() + holeDy - terminalSize / 2, terminalSize, terminalSize));
+ mount.subtract(new Area(new Ellipse2D.Double(p1.getX() + holeDx - holeSize / 2, p1.getY() + holeDy - holeSize / 2, holeSize, holeSize)));
+ body[1 + i].add(mount);
+ }
+ }
+ }
+ return body;
+ }
+
+ @Override
+ public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, Project project,
+ IDrawingObserver drawingObserver) {
+ if (checkPointsClipped(g2d.getClip())) {
+ return;
+ }
+ Area[] area = getBody();
+ Area mainArea = area[0];
+
+ Composite oldComposite = g2d.getComposite();
+ if (alpha < MAX_ALPHA) {
+ g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f * alpha / MAX_ALPHA));
+ }
+ g2d.setColor(outlineMode ? Constants.TRANSPARENT_COLOR : getBoardColor());
+ g2d.fill(mainArea);
+
+ Color finalBorderColor;
+ if (outlineMode) {
+ Theme theme =
+ (Theme) ConfigurationManager.getInstance().readObject(IPlugInPort.THEME_KEY, Constants.DEFAULT_THEME);
+ finalBorderColor =
+ componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR
+ : theme.getOutlineColor();
+ } else {
+ finalBorderColor =
+ componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR
+ : getBoardColor().darker();
+ }
+ g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1));
+
+ g2d.setColor(finalBorderColor);
+ g2d.draw(mainArea);
+
+ g2d.setColor(outlineMode ? Constants.TRANSPARENT_COLOR : TERMINAL_COLOR);
+ drawingObserver.startTrackingContinuityArea(true);
+ for (int i = 1; i < body.length; i++)
+ g2d.fill(body[i]);
+ drawingObserver.stopTrackingContinuityArea();
+
+ Color finalTerminalBorderColor;
+ if (outlineMode) {
+ Theme theme =
+ (Theme) ConfigurationManager.getInstance().readObject(IPlugInPort.THEME_KEY, Constants.DEFAULT_THEME);
+ finalTerminalBorderColor =
+ componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR
+ : theme.getOutlineColor();
+ } else {
+ finalTerminalBorderColor =
+ componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR
+ : TERMINAL_BORDER_COLOR;
+ }
+
+ g2d.setColor(finalTerminalBorderColor);
+ for (int i = 1; i < body.length; i++)
+ g2d.draw(body[i]);
+
+ g2d.setComposite(oldComposite);
+ }
+
+ @Override
+ public void drawIcon(Graphics2D g2d, int width, int height) {
+ g2d.rotate(-Math.PI / 4, width / 2, height / 2);
+ g2d.setColor(BOARD_COLOR);
+ int thickness = 2 * width / 32;
+ g2d.fillRect(0, height / 2 - thickness / 2, width, thickness);
+ g2d.setColor(TERMINAL_COLOR.darker());
+ int terminalWidth = 7 * width / 32;
+ g2d.fillRect(2, height / 2 + thickness / 2, terminalWidth, thickness);
+ g2d.fillRect((int) (2 + terminalWidth * 1.5), height / 2 + thickness / 2, terminalWidth, thickness);
+ g2d.fillRect((int) (2 + terminalWidth * 3), height / 2 + thickness / 2, terminalWidth, thickness);
+ g2d.setColor(TERMINAL_COLOR);
+ g2d.fillRect((int) (2 + terminalWidth * 1.5), height / 2 + thickness / 2 + 1, terminalWidth, terminalWidth);
+ g2d.setColor(Color.white);
+ g2d.fillOval((int) (2 + terminalWidth * 1.75), height / 2 + thickness / 2 + 1 + terminalWidth / 2, terminalWidth / 2, terminalWidth / 2);
+// int radius = 6 * width / 32;
+// int holeSize = 3 * width / 32;
+// g2d.setColor(BOARD_COLOR);
+// g2d.fillRect(width / 4, 1, width / 2, height - 4);
+// g2d.setColor(BORDER_COLOR);
+// g2d.drawRect(width / 4, 1, width / 2, height - 4);
+// int terminalSize = getClosestOdd(height / 5);
+// Area terminal =
+// new Area(new RoundRectangle2D.Double(2 * width / 32, height / 5, width - 4 * width / 32, terminalSize, radius,
+// radius));
+// terminal.subtract(new Area(new Ellipse2D.Double(2 * width / 32 + holeSize, height * 3 / 10 - holeSize / 2, holeSize, holeSize)));
+// terminal.subtract(new Area(new Ellipse2D.Double(width - 2 * width / 32 - holeSize * 2, height * 3 / 10 - holeSize / 2, holeSize, holeSize)));
+//
+// g2d.setColor(TERMINAL_COLOR);
+// g2d.fill(terminal);
+// g2d.setColor(TERMINAL_BORDER_COLOR);
+// g2d.draw(terminal);
+// g2d.translate(0, height * 2 / 5);
+// g2d.setColor(TERMINAL_COLOR);
+// g2d.fill(terminal);
+// g2d.setColor(TERMINAL_BORDER_COLOR);
+// g2d.draw(terminal);
+ }
+
+ @EditableProperty(name = "Board")
+ public Color getBoardColor() {
+ if (boardColor == null) {
+ boardColor = BOARD_COLOR;
+ }
+ return boardColor;
+ }
+
+ public void setBoardColor(Color bodyColor) {
+ this.boardColor = bodyColor;
+ }
+
+ @Override
+ public String getControlPointNodeName(int index) {
+ return "TerminalStrip" + index;
+ }
+
+ @EditableProperty(name = "Mounting Lugs")
+ public TagStripMount getMount() {
+ return mount;
+ }
+
+ public void setMount(TagStripMount mount) {
+ this.mount = mount;
+ updateControlPoints();
+ // Reset body shape;
+ body = null;
+ }
+
+ @Override
+ public boolean arePointsConnected(int index1, int index2) {
+ return false;
+ }
+
+ @Override
+ public boolean canPointMoveFreely(int pointIndex) {
+ return false;
+ }
+
+ public enum TagStripMount {
+ Central, Outside;
+ }
+}
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 1efe33d3..8e5dac54 100644
--- a/diylc/diylc-library/src/org/diylc/components/boards/TerminalStrip.java
+++ b/diylc/diylc-library/src/org/diylc/components/boards/TerminalStrip.java
@@ -59,7 +59,6 @@ public class TerminalStrip extends AbstractTransparentComponent implemen
private static final long serialVersionUID = 1L;
public static Color BOARD_COLOR = Color.decode("#CD8500");
- public static Color BORDER_COLOR = BOARD_COLOR.darker();
public static Color TERMINAL_COLOR = Color.lightGray;
public static Color TERMINAL_BORDER_COLOR = TERMINAL_COLOR.darker();
public static int EDGE_RADIUS = 2;
@@ -73,8 +72,10 @@ public class TerminalStrip extends AbstractTransparentComponent implemen
private Size terminalSpacing = new Size(0.25d, SizeUnit.in);
private Size holeSpacing = new Size(0.5d, SizeUnit.in);
private Point[] controlPoints = new Point[] {new Point(0, 0)};
- private Color boardColor = BOARD_COLOR;
- private Color borderColor = BORDER_COLOR;
+ private Color boardColor = BOARD_COLOR;
+ @SuppressWarnings("unused")
+ @Deprecated
+ private transient Color borderColor;
private boolean centerHole = false;
transient private Area[] body;
@@ -249,7 +250,7 @@ public class TerminalStrip extends AbstractTransparentComponent implemen
public Area[] getBody() {
if (body == null) {
- body = new Area[2];
+ body = new Area[1 + getTerminalCount()];
int x = controlPoints[0].x;
int y = controlPoints[0].y;
int width;
@@ -260,7 +261,7 @@ public class TerminalStrip extends AbstractTransparentComponent implemen
int boardWidth = (int) getBoardWidth().convertToPixels();
int boardLength = (getTerminalCount() - 1) * terminalSpacing + 2 * boardWidth;
Area indentation = null;
- Area terminals = null;
+
int mountingHoleSize = getClosestOdd(MOUNTING_HOLE_SIZE.convertToPixels());
switch (orientation) {
case DEFAULT:
@@ -314,7 +315,7 @@ public class TerminalStrip extends AbstractTransparentComponent implemen
bodyArea.subtract(indentation);
body[0] = bodyArea;
- terminals = new Area();
+
for (int i = 0; i < getTerminalCount(); i++) {
Point p1 = getControlPoint(i);
Point p2 = getControlPoint(i + getTerminalCount());
@@ -338,9 +339,9 @@ public class TerminalStrip extends AbstractTransparentComponent implemen
bodyArea.subtract(centerHole);
}
- terminals.add(terminal);
+ body[1 + i] = terminal;
}
- body[1] = terminals;
+
}
return body;
}
@@ -350,9 +351,9 @@ public class TerminalStrip extends AbstractTransparentComponent implemen
IDrawingObserver drawingObserver) {
if (checkPointsClipped(g2d.getClip())) {
return;
- }
+ }
+ Area[] body = getBody();
Area mainArea = getBody()[0];
- Area terminalArea = getBody()[1];
Composite oldComposite = g2d.getComposite();
if (alpha < MAX_ALPHA) {
@@ -371,7 +372,7 @@ public class TerminalStrip extends AbstractTransparentComponent implemen
} else {
finalBorderColor =
componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR
- : getBorderColor();
+ : getBoardColor().darker();
}
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1));
@@ -379,8 +380,9 @@ public class TerminalStrip extends AbstractTransparentComponent implemen
g2d.draw(mainArea);
g2d.setColor(outlineMode ? Constants.TRANSPARENT_COLOR : TERMINAL_COLOR);
- drawingObserver.startTrackingContinuityArea(true);
- g2d.fill(terminalArea);
+ drawingObserver.startTrackingContinuityArea(true);
+ for (int i = 1; i < body.length; i++)
+ g2d.fill(body[i]);
drawingObserver.stopTrackingContinuityArea();
Color finalTerminalBorderColor;
@@ -396,8 +398,9 @@ public class TerminalStrip extends AbstractTransparentComponent implemen
: TERMINAL_BORDER_COLOR;
}
- g2d.setColor(finalTerminalBorderColor);
- g2d.draw(terminalArea);
+ g2d.setColor(finalTerminalBorderColor);
+ for (int i = 1; i < body.length; i++)
+ g2d.draw(body[i]);
g2d.setComposite(oldComposite);
}
@@ -408,7 +411,7 @@ public class TerminalStrip extends AbstractTransparentComponent implemen
int holeSize = 3 * width / 32;
g2d.setColor(BOARD_COLOR);
g2d.fillRect(width / 4, 1, width / 2, height - 4);
- g2d.setColor(BORDER_COLOR);
+ g2d.setColor(BOARD_COLOR.darker());
g2d.drawRect(width / 4, 1, width / 2, height - 4);
int terminalSize = getClosestOdd(height / 5);
Area terminal =
@@ -438,18 +441,6 @@ public class TerminalStrip extends AbstractTransparentComponent implemen
public void setBoardColor(Color bodyColor) {
this.boardColor = bodyColor;
- }
-
- @EditableProperty(name = "Border")
- public Color getBorderColor() {
- if (borderColor == null) {
- borderColor = BORDER_COLOR;
- }
- return borderColor;
- }
-
- public void setBorderColor(Color borderColor) {
- this.borderColor = borderColor;
}
@Override
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 95e85e41..fc26715c 100644
--- a/diylc/diylc-library/src/org/diylc/components/connectivity/TraceCut.java
+++ b/diylc/diylc-library/src/org/diylc/components/connectivity/TraceCut.java
@@ -104,7 +104,7 @@ public class TraceCut extends AbstractComponent {
int factor = 32 / width;
g2d.setColor(AbstractBoard.BOARD_COLOR);
g2d.fillRect(0, 2 / factor, width - 1, height - 4 / factor);
- g2d.setColor(AbstractBoard.BORDER_COLOR);
+ g2d.setColor(AbstractBoard.BOARD_COLOR.darker());
g2d.drawRect(0, 2 / factor, width - 1, height - 4 / factor);
g2d.setColor(COPPER_COLOR);
g2d.fillRect(1 / factor, width / 3, width - 2 / factor, getClosestOdd(width / 3) + 1);
diff --git a/diylc/diylc-library/src/org/diylc/parsing/V1FileParser.java b/diylc/diylc-library/src/org/diylc/parsing/V1FileParser.java
index 4871ce32..f00c1fdd 100644
--- a/diylc/diylc-library/src/org/diylc/parsing/V1FileParser.java
+++ b/diylc/diylc-library/src/org/diylc/parsing/V1FileParser.java
@@ -117,7 +117,6 @@ public class V1FileParser implements IOldFileParser {
if (type.equalsIgnoreCase("pcb")) {
board = new BlankBoard();
board.setBoardColor(Color.white);
- board.setBorderColor(Color.black);
} else if (type.equalsIgnoreCase("perfboard")) {
board = new PerfBoard();
} else if (type.equalsIgnoreCase("stripboard")) {
diff --git a/diylc/diylc-library/src/org/diylc/parsing/V2FileParser.java b/diylc/diylc-library/src/org/diylc/parsing/V2FileParser.java
index 520d14b2..a08a4bd1 100644
--- a/diylc/diylc-library/src/org/diylc/parsing/V2FileParser.java
+++ b/diylc/diylc-library/src/org/diylc/parsing/V2FileParser.java
@@ -285,7 +285,6 @@ public class V2FileParser implements IOldFileParser {
if (cl != null) {
board.setBoardColor(cl);
}
- board.setBorderColor(Color.black);
if (com_name != "") {
board.setName(com_name);
} else {
@@ -297,7 +296,6 @@ public class V2FileParser implements IOldFileParser {
} else if (node.getAttributes().getNamedItem("name").getNodeValue().equalsIgnoreCase("Perfboard")) {
PerfBoard board = new PerfBoard();
board.setBoardColor(Color.white);
- board.setBorderColor(Color.black);
if (com_name != "") {
board.setName(com_name);
} else {
diff --git a/diylc/diylc-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar
index 9803f9fc..5ee6e9a9 100644
Binary files a/diylc/diylc-swing/lib/diylc-core.jar and b/diylc/diylc-swing/lib/diylc-core.jar differ
diff --git a/diylc/diylc-swing/library/main.jar b/diylc/diylc-swing/library/main.jar
index 33ab2867..8e6cccfb 100644
Binary files a/diylc/diylc-swing/library/main.jar and b/diylc/diylc-swing/library/main.jar differ