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