From a91e8dd062e55feb1f55a025c0c1d5c7969f83d2 Mon Sep 17 00:00:00 2001 From: Branislav Stojkovic Date: Sat, 12 Jan 2019 13:31:28 +0100 Subject: [PATCH] "DIP Switch" added --- .../electromechanical/DIPSwitch.java | 517 ++++++++++++++++++ diylc/diylc-swing/library/main.jar | Bin 489094 -> 498522 bytes diylc/diylc-swing/update.xml | 4 + 3 files changed, 521 insertions(+) create mode 100644 diylc/diylc-library/src/org/diylc/components/electromechanical/DIPSwitch.java diff --git a/diylc/diylc-library/src/org/diylc/components/electromechanical/DIPSwitch.java b/diylc/diylc-library/src/org/diylc/components/electromechanical/DIPSwitch.java new file mode 100644 index 00000000..7ac2d6e6 --- /dev/null +++ b/diylc/diylc-library/src/org/diylc/components/electromechanical/DIPSwitch.java @@ -0,0 +1,517 @@ +/* + + 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.electromechanical; + +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.Composite; +import java.awt.FontMetrics; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.geom.AffineTransform; +import java.awt.geom.Area; +import java.awt.geom.Ellipse2D; +import java.awt.geom.Rectangle2D; +import java.awt.geom.RoundRectangle2D; + +import org.diylc.appframework.miscutils.ConfigurationManager; +import org.diylc.common.Display; +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.DIL_ICTransformer; +import org.diylc.core.ComponentState; +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.PositiveMeasureValidator; +import org.diylc.core.measures.Size; +import org.diylc.core.measures.SizeUnit; +import org.diylc.utils.Constants; + +@ComponentDescriptor(name = "DIP Switch", author = "Branislav Stojkovic", category = "Electro-Mechanical", + instanceNamePrefix = "SW", description = "Dual-in-line package switch", stretchable = false, + zOrder = IDIYComponent.COMPONENT, keywordPolicy = KeywordPolicy.SHOW_VALUE, transformer = DIL_ICTransformer.class) +public class DIPSwitch extends AbstractTransparentComponent { + + private static final long serialVersionUID = 1L; + + public static Color BODY_COLOR = Color.decode("#E84E46"); + public static Color BORDER_COLOR = BODY_COLOR.darker(); + public static Color PIN_COLOR = Color.decode("#00B2EE"); + public static Color PIN_BORDER_COLOR = PIN_COLOR.darker(); + public static Color TICK_COLOR = Color.white; + public static Color LABEL_COLOR = Color.white; + public static int EDGE_RADIUS = 2; + public static Size PIN_SIZE = new Size(0.04d, SizeUnit.in); + public static Size DEFAULT_WIDTH = new Size(0.4d, SizeUnit.in); + public static Size INDENT_SIZE = new Size(0.07d, SizeUnit.in); + + private String value = ""; + private Orientation orientation = Orientation.DEFAULT; + private SwitchCount switchCount = SwitchCount._8; + private Size pinSpacing = new Size(0.1d, SizeUnit.in); + private Size rowSpacing = new Size(0.3d, SizeUnit.in); + private Point[] controlPoints = new Point[] {new Point(0, 0)}; + protected Display display = Display.NONE; + private Color bodyColor = BODY_COLOR; + private Color borderColor = BORDER_COLOR; + private Color labelColor = LABEL_COLOR; + private Color tickColor = TICK_COLOR; + private Size width = DEFAULT_WIDTH; + // new Point(0, pinSpacing.convertToPixels()), + // new Point(0, 2 * pinSpacing.convertToPixels()), + // new Point(0, 3 * pinSpacing.convertToPixels()), + // new Point(3 * pinSpacing.convertToPixels(), 0), + // new Point(3 * pinSpacing.convertToPixels(), + // pinSpacing.convertToPixels()), + // new Point(3 * pinSpacing.convertToPixels(), 2 * + // pinSpacing.convertToPixels()), + // new Point(3 * pinSpacing.convertToPixels(), 3 * + // pinSpacing.convertToPixels()) }; + transient private Area[] body; + + public DIPSwitch() { + super(); + updateControlPoints(); + alpha = (byte) 100; + } + + @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 = "Switches") + public SwitchCount getSwitchCount() { + return switchCount; + } + + public void setSwitchCount(SwitchCount switchCount) { + this.switchCount = switchCount; + updateControlPoints(); + // Reset body shape; + body = null; + } + + @EditableProperty(name = "Pin Spacing", validatorClass = PositiveMeasureValidator.class) + public Size getPinSpacing() { + return pinSpacing; + } + + public void setPinSpacing(Size pinSpacing) { + this.pinSpacing = pinSpacing; + updateControlPoints(); + // Reset body shape; + body = null; + } + + @EditableProperty(name = "Row Spacing", validatorClass = PositiveMeasureValidator.class) + public Size getRowSpacing() { + return rowSpacing; + } + + public void setRowSpacing(Size rowSpacing) { + this.rowSpacing = rowSpacing; + updateControlPoints(); + // Reset body shape; + body = null; + } + + @EditableProperty + public Display getDisplay() { + if (display == null) { + display = Display.VALUE; + } + return display; + } + + public void setDisplay(Display display) { + this.display = display; + } + + @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[switchCount.getValue() * 2]; + controlPoints[0] = firstPoint; + double pinSpacing = this.pinSpacing.convertToPixels(); + double rowSpacing = this.rowSpacing.convertToPixels(); + // Update control points. + double dx1; + double dy1; + double dx2; + double dy2; + for (int i = 0; i < switchCount.getValue(); i++) { + switch (orientation) { + case DEFAULT: + dx1 = 0; + dy1 = i * pinSpacing; + dx2 = rowSpacing; + dy2 = i * pinSpacing; + break; + case _90: + dx1 = -i * pinSpacing; + dy1 = 0; + dx2 = -i * pinSpacing; + dy2 = rowSpacing; + break; + case _180: + dx1 = 0; + dy1 = -i * pinSpacing; + dx2 = -rowSpacing; + dy2 = -i * pinSpacing; + break; + case _270: + dx1 = i * pinSpacing; + dy1 = 0; + dx2 = i * pinSpacing; + dy2 = -rowSpacing; + break; + default: + throw new RuntimeException("Unexpected orientation: " + orientation); + } + controlPoints[i] = new Point((int) (firstPoint.x + dx1), (int) (firstPoint.y + dy1)); + controlPoints[i + switchCount.getValue()] = new Point((int) (firstPoint.x + dx2), (int) (firstPoint.y + dy2)); + } + } + + public Area[] getBody() { + if (body == null) { + body = new Area[3]; + double x = controlPoints[0].x; + double y = controlPoints[0].y; + double width; + double height; + double pinSpacing = this.pinSpacing.convertToPixels(); + double rowSpacing = this.rowSpacing.convertToPixels(); + double bodyWidth = getClosestOdd(getWidth().convertToPixels()); + double tickHoleLength = rowSpacing * 2 / 3; + double tickSize = PIN_SIZE.convertToPixels(); + Area tickArea = new Area(); + Area tickHoleArea = new Area(); + switch (orientation) { + case DEFAULT: + width = bodyWidth; + height = switchCount.getValue() * pinSpacing; + x -= (bodyWidth - rowSpacing) / 2; + y -= pinSpacing / 2; + for (int i = 0; i < getSwitchCount().getValue(); i++) { + tickHoleArea.add(new Area(new Rectangle2D.Double(controlPoints[i].x + (rowSpacing - tickHoleLength) / 2, controlPoints[i].y - tickSize / 2, tickHoleLength, tickSize))); + tickArea.add(new Area(new Rectangle2D.Double(controlPoints[i].x + (rowSpacing - tickHoleLength) / 2, controlPoints[i].y - tickSize / 2, tickSize, tickSize))); + } + break; + case _90: + width = switchCount.getValue() * pinSpacing; + height = bodyWidth; + x -= (pinSpacing / 2) + width - pinSpacing; + y -= (bodyWidth - rowSpacing) / 2; + for (int i = 0; i < getSwitchCount().getValue(); i++) { + tickHoleArea.add(new Area(new Rectangle2D.Double(controlPoints[i].x - tickSize / 2, controlPoints[i].y + (rowSpacing - tickHoleLength) / 2, tickSize, tickHoleLength))); + tickArea.add(new Area(new Rectangle2D.Double(controlPoints[i].x - tickSize / 2, controlPoints[i].y + (rowSpacing - tickHoleLength) / 2, tickSize, tickSize))); + } + break; + case _180: + width = bodyWidth; + height = switchCount.getValue() * pinSpacing; + x -= rowSpacing + (bodyWidth - rowSpacing) / 2; + y -= (pinSpacing / 2) + height - pinSpacing; + for (int i = getSwitchCount().getValue(); i < controlPoints.length; i++) { + tickHoleArea.add(new Area(new Rectangle2D.Double(controlPoints[i].x + (rowSpacing - tickHoleLength) / 2, controlPoints[i].y - tickSize / 2, tickHoleLength, tickSize))); + tickArea.add(new Area(new Rectangle2D.Double(controlPoints[i].x + (rowSpacing + tickHoleLength) / 2 - tickSize, controlPoints[i].y - tickSize / 2, tickSize, tickSize))); + } + break; + case _270: + width = (switchCount.getValue()) * pinSpacing; + height = bodyWidth; + x -= pinSpacing / 2; + y -= rowSpacing + (bodyWidth - rowSpacing) / 2; + for (int i = getSwitchCount().getValue(); i < controlPoints.length; i++) { + tickHoleArea.add(new Area(new Rectangle2D.Double(controlPoints[i].x - tickSize / 2, controlPoints[i].y + (rowSpacing - tickHoleLength) / 2, tickSize, tickHoleLength))); + tickArea.add(new Area(new Rectangle2D.Double(controlPoints[i].x - tickSize / 2, controlPoints[i].y + (rowSpacing - tickHoleLength) / 2 + tickHoleLength - tickSize, tickSize, tickSize))); + } + break; + default: + throw new RuntimeException("Unexpected orientation: " + orientation); + } + body[0] = new Area(new RoundRectangle2D.Double(x, y, width, height, EDGE_RADIUS, EDGE_RADIUS)); + body[1] = tickHoleArea; + body[2] = tickArea; + } + return body; + } + + @Override + public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, Project project, + IDrawingObserver drawingObserver) { + if (checkPointsClipped(g2d.getClip())) { + return; + } + Area mainArea = getBody()[0]; + if (!outlineMode) { + int pinSize = (int) PIN_SIZE.convertToPixels() / 2 * 2; + for (Point point : controlPoints) { + g2d.setColor(PIN_COLOR); + int pinWidth = getClosestOdd(pinSize / (getOrientation() == Orientation.DEFAULT || getOrientation() == Orientation._180 ? 2f : 1f)); + int pinHeight = getClosestOdd(pinSize / (getOrientation() == Orientation.DEFAULT || getOrientation() == Orientation._180 ? 1f : 2f)); + g2d.fillRect(point.x - pinWidth / 2, point.y - pinHeight / 2, pinWidth, pinHeight); + g2d.setColor(PIN_BORDER_COLOR); + g2d.drawRect(point.x - pinWidth / 2, point.y - pinHeight / 2, pinWidth, pinHeight); + } + } + 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 : getBodyColor()); + g2d.fill(mainArea); + g2d.setComposite(oldComposite); + + 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 + : getBorderColor(); + } + g2d.setColor(finalBorderColor); + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1)); + if (outlineMode) { + Area area = new Area(mainArea); + area.subtract(getBody()[1]); + g2d.draw(area); + if (getBody()[1] != null) + g2d.draw(getBody()[1]); + if (getBody()[2] != null) + g2d.draw(getBody()[2]); + } else { + g2d.draw(mainArea); + if (getBody()[1] != null) { + g2d.setColor(getTickColor().darker()); + g2d.fill(getBody()[1]); + } + if (getBody()[2] != null) { + g2d.setColor(getTickColor()); + g2d.fill(getBody()[2]); + } + } + + drawingObserver.stopTracking(); + + // Draw label. + g2d.setFont(project.getFont()); + Color finalLabelColor; + if (outlineMode) { + Theme theme = + (Theme) ConfigurationManager.getInstance().readObject(IPlugInPort.THEME_KEY, Constants.DEFAULT_THEME); + finalLabelColor = + componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? LABEL_COLOR_SELECTED + : theme.getOutlineColor(); + } else { + finalLabelColor = + componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? LABEL_COLOR_SELECTED + : getLabelColor(); + } + g2d.setColor(finalLabelColor); + FontMetrics fontMetrics = g2d.getFontMetrics(g2d.getFont()); + String[] label = null; + + if (getDisplay() == Display.NAME) { + label = new String[] {getName()}; + } else if (getDisplay() == Display.VALUE) { + label = new String[] {getValue().toString()}; + } else if (getDisplay() == Display.BOTH) { + String value = getValue().toString(); + label = value.isEmpty() ? new String[] {getName()} : new String[] {getName(), value}; + } + + if (label != null) { + for (int i = 0; i < label.length; i++) { + String l = label[i]; + Rectangle2D rect = fontMetrics.getStringBounds(l, g2d); + int textHeight = (int) (rect.getHeight()); + int textWidth = (int) (rect.getWidth()); + // Center text horizontally and vertically + Rectangle bounds = mainArea.getBounds(); + int x = bounds.x + (bounds.width - textWidth) / 2; + int y = bounds.y + (bounds.height - textHeight) / 2 + fontMetrics.getAscent(); + + AffineTransform oldTransform = g2d.getTransform(); + + if (getOrientation() == Orientation.DEFAULT || getOrientation() == Orientation._180) { + int centerX = bounds.x + bounds.width / 2; + int centerY = bounds.y + bounds.height / 2; + g2d.rotate(-Math.PI / 2, centerX, centerY); + } + + if (label.length == 2) { + if (i == 0) + g2d.translate(0, -textHeight / 2); + else if (i == 1) + g2d.translate(0, textHeight / 2); + } + + g2d.drawString(l, x, y); + + g2d.setTransform(oldTransform); + } + } + } + + @Override + public void drawIcon(Graphics2D g2d, int width, int height) { + g2d.setColor(BODY_COLOR); + g2d.fillRect(width / 6, 1, 4 * width / 6, height - 4); + g2d.setColor(BORDER_COLOR); + g2d.drawRect(width / 6, 1, 4 * width / 6, height - 4); + int tickSize = (int) (2f * width / 32); + int tickHoleLength = (int) (width * 0.4); + for (int i = 0; i < 4; i++) { + g2d.setColor(TICK_COLOR.darker()); + g2d.fillRect((width - tickHoleLength) / 2, (height / 5) * (i + 1) - tickSize / 2, tickHoleLength, tickSize); + g2d.setColor(TICK_COLOR); + g2d.fillRect((width - tickHoleLength) / 2, (height / 5) * (i + 1) - tickSize / 2, tickSize, tickSize); + } + } + + @EditableProperty(name = "Body") + public Color getBodyColor() { + if (bodyColor == null) { + bodyColor = BODY_COLOR; + } + return bodyColor; + } + + public void setBodyColor(Color bodyColor) { + this.bodyColor = bodyColor; + } + + @EditableProperty(name = "Border") + public Color getBorderColor() { + if (borderColor == null) { + borderColor = BORDER_COLOR; + } + return borderColor; + } + + public void setBorderColor(Color borderColor) { + this.borderColor = borderColor; + } + + @EditableProperty(name = "Label") + public Color getLabelColor() { + if (labelColor == null) { + labelColor = LABEL_COLOR; + } + return labelColor; + } + + public void setLabelColor(Color labelColor) { + this.labelColor = labelColor; + } + + @EditableProperty(name = "Tick") + public Color getTickColor() { + return tickColor; + } + + public void setTickColor(Color tickColor) { + this.tickColor = tickColor; + } + + @EditableProperty(validatorClass = PositiveMeasureValidator.class) + public Size getWidth() { + return width; + } + + public void setWidth(Size width) { + this.width = width; + body = null; + } + + public static enum SwitchCount { + + _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16; + + @Override + public String toString() { + return name().replace("_", ""); + } + + public int getValue() { + return Integer.parseInt(toString()); + } + } +} diff --git a/diylc/diylc-swing/library/main.jar b/diylc/diylc-swing/library/main.jar index 55785800967a007ba656ea7b6ae126755232eb40..49440c3a4d329659def0b85b2ae2afcb100c888c 100644 GIT binary patch delta 17274 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 MgCwaT7>ZW<4+~(-jsO4v diff --git a/diylc/diylc-swing/update.xml b/diylc/diylc-swing/update.xml index ce4d9229..6fa9324c 100644 --- a/diylc/diylc-swing/update.xml +++ b/diylc/diylc-swing/update.xml @@ -2154,6 +2154,10 @@ NEW_FEATURE Filtertron pickup type added within "Humbucker Pickup" as well as screw pole pieces for all humbucker types + + NEW_FEATURE + "DIP Switch" added + NEW_FEATURE "Tantalum Capacitor" added