From 842d056fd7aba5ae081ece74389ba3cdb5b1ae99 Mon Sep 17 00:00:00 2001 From: bancika Date: Fri, 23 Dec 2016 15:26:01 +0100 Subject: [PATCH] undo relay - was already there (doh!) --- .../SubminiatureDILRelay.java | 904 +++++++++--------- diylc/diylc-swing/library/main.jar | Bin 354287 -> 345810 bytes diylc/diylc-swing/update.xml | 6 +- 3 files changed, 453 insertions(+), 457 deletions(-) diff --git a/diylc/diylc-library/src/org/diylc/components/electromechanical/SubminiatureDILRelay.java b/diylc/diylc-library/src/org/diylc/components/electromechanical/SubminiatureDILRelay.java index 358e1387..5853fd3c 100644 --- a/diylc/diylc-library/src/org/diylc/components/electromechanical/SubminiatureDILRelay.java +++ b/diylc/diylc-library/src/org/diylc/components/electromechanical/SubminiatureDILRelay.java @@ -1,452 +1,452 @@ -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.Area; -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.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.measures.Size; -import org.diylc.core.measures.SizeUnit; -import org.diylc.utils.Constants; - -@ComponentDescriptor(name = "Subminiature DIL Relay", author = "Branislav Stojkovic", category = "Electromechanical", - instanceNamePrefix = "RY", description = "Subminiature DIL relay with one or two poles", stretchable = false, - zOrder = IDIYComponent.COMPONENT, keywordPolicy = KeywordPolicy.SHOW_VALUE) -public class SubminiatureDILRelay extends AbstractTransparentComponent { - - private static final long serialVersionUID = 1L; - - public static Color BODY_COLOR = Color.decode("#EDEDD5"); - 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 INDENT_COLOR = Color.gray.darker(); - public static Color LABEL_COLOR = Color.darkGray; - public static int EDGE_RADIUS = 6; - public static Size PIN_SIZE = new Size(0.04d, SizeUnit.in); - public static Size INDENT_SIZE = new Size(0.05d, SizeUnit.in); - - public static Size PIN_SPACING = new Size(0.2d, SizeUnit.in); - public static Size ROW_SPACING = new Size(0.3d, SizeUnit.in); - public static Size SECTION_SPACING = new Size(0.3d, SizeUnit.in); - - private String value = ""; - private Orientation orientation = Orientation.DEFAULT; - private PinCount pinCount = PinCount._4; - private Size pinSpacing = PIN_SPACING; - private Size rowSpacing = ROW_SPACING; - private Size sectionSpacing = SECTION_SPACING; - private Point[] controlPoints = new Point[] {new Point(0, 0)}; - protected Display display = Display.NAME; - private Color bodyColor = BODY_COLOR; - private Color borderColor = BORDER_COLOR; - private Color labelColor = LABEL_COLOR; - private Color indentColor = INDENT_COLOR; - transient private Area[] body; - - public SubminiatureDILRelay() { - 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 = "Contacts") - public PinCount getPinCount() { - return pinCount; - } - - public void setPinCount(PinCount pinCount) { - this.pinCount = pinCount; - updateControlPoints(); - // Reset body shape; - body = null; - } - - @EditableProperty(name = "Pin spacing") - public Size getPinSpacing() { - return pinSpacing; - } - - public void setPinSpacing(Size pinSpacing) { - this.pinSpacing = pinSpacing; - updateControlPoints(); - // Reset body shape; - body = null; - } - - @EditableProperty(name = "Row spacing") - public Size getRowSpacing() { - return rowSpacing; - } - - public void setRowSpacing(Size rowSpacing) { - this.rowSpacing = rowSpacing; - updateControlPoints(); - // Reset body shape; - body = null; - } - - @EditableProperty(name = "Section spacing") - public Size getSectionSpacing() { - return sectionSpacing; - } - - public void setSectionSpacing(Size sectionSpacing) { - this.sectionSpacing = sectionSpacing; - 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[pinCount.getValue() * 2]; - controlPoints[0] = firstPoint; - int pinSpacing = (int) this.pinSpacing.convertToPixels(); - int sectionSpacing = (int) this.sectionSpacing.convertToPixels(); - int rowSpacing = (int) this.rowSpacing.convertToPixels(); - // Update control points. - int dx1; - int dy1; - int dx2; - int dy2; - for (int i = 0; i < pinCount.getValue(); i++) { - int spacing = i == pinCount.getValue() - 1 ? sectionSpacing + (i - 1) * pinSpacing : i * pinSpacing; - switch (orientation) { - case DEFAULT: - dx1 = 0; - dy1 = spacing; - dx2 = rowSpacing; - dy2 = spacing; - break; - case _90: - dx1 = -spacing; - dy1 = 0; - dx2 = -spacing; - dy2 = rowSpacing; - break; - case _180: - dx1 = 0; - dy1 = -spacing; - dx2 = -rowSpacing; - dy2 = -spacing; - break; - case _270: - dx1 = spacing; - dy1 = 0; - dx2 = spacing; - dy2 = -rowSpacing; - break; - default: - throw new RuntimeException("Unexpected orientation: " + orientation); - } - controlPoints[i] = new Point(firstPoint.x + dx1, firstPoint.y + dy1); - controlPoints[i + pinCount.getValue()] = new Point(firstPoint.x + dx2, firstPoint.y + dy2); - } - } - - public Area[] getBody() { - if (body == null) { - body = new Area[2]; - - int pinSize = (int) PIN_SIZE.convertToPixels(); - - int minX = Integer.MAX_VALUE; - int maxX = Integer.MIN_VALUE; - int minY = Integer.MAX_VALUE; - int maxY = Integer.MIN_VALUE; - for (int i = 0; i < this.controlPoints.length; i++) { - if (this.controlPoints[i].x > maxX) - maxX = this.controlPoints[i].x; - if (this.controlPoints[i].x < minX) - minX = this.controlPoints[i].x; - if (this.controlPoints[i].y > maxY) - maxY = this.controlPoints[i].y; - if (this.controlPoints[i].y < minY) - minY = this.controlPoints[i].y; - } - int width = maxX - minX; - int height = maxY - minY; - - Area indentation = null; - int indentationSize = getClosestOdd(INDENT_SIZE.convertToPixels()); - switch (orientation) { - case DEFAULT: - indentation = - new Area(new Rectangle2D.Double(minX + width / 2 - indentationSize / 2, minY - indentationSize / 2 - - pinSize, indentationSize, indentationSize)); - break; - case _90: - indentation = - new Area(new Rectangle2D.Double(minX + width - indentationSize / 2 + pinSize, minY + height / 2 - - indentationSize / 2, indentationSize, indentationSize)); - break; - case _180: - indentation = - new Area(new Rectangle2D.Double(minX + width / 2 - indentationSize / 2, minY + height - indentationSize - / 2 + pinSize, indentationSize, indentationSize)); - break; - case _270: - indentation = - new Area(new Rectangle2D.Double(minX - indentationSize / 2 - pinSize, minY + height / 2 - indentationSize - / 2, indentationSize, indentationSize)); - break; - default: - throw new RuntimeException("Unexpected orientation: " + orientation); - } - - body[0] = - new Area(new RoundRectangle2D.Double(minX - pinSize, minY - pinSize, width + 2 * pinSize, height + 2 - * pinSize, EDGE_RADIUS, EDGE_RADIUS)); - body[1] = indentation; - if (indentation != null) { - indentation.intersect(body[0]); - } - } - 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]; - - 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); - } else { - g2d.draw(mainArea); - if (getBody()[1] != null) { - g2d.setColor(getIndentColor()); - g2d.fill(getBody()[1]); - } - } - - if (!outlineMode) { - int pinSize = (int) PIN_SIZE.convertToPixels() / 2 * 2; - for (Point point : controlPoints) { - g2d.setColor(PIN_COLOR); - g2d.fillOval(point.x - pinSize / 2, point.y - pinSize / 2, pinSize, pinSize); - g2d.setColor(PIN_BORDER_COLOR); - g2d.drawOval(point.x - pinSize / 2, point.y - pinSize / 2, pinSize, pinSize); - } - } - - // Draw label. - g2d.setFont(LABEL_FONT); - 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 = ""; - label = (getDisplay() == Display.NAME) ? getName() : getValue(); - if (getDisplay() == Display.NONE) { - label = ""; - } - if (getDisplay() == Display.BOTH) { - label = getName() + " " + (getValue() == null ? "" : getValue().toString()); - } - Rectangle2D rect = fontMetrics.getStringBounds(label, 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(); - g2d.drawString(label, x, y); - } - - @Override - public void drawIcon(Graphics2D g2d, int width, int height) { - int radius = 6 * width / 32; - g2d.setColor(BODY_COLOR); - g2d.fillRoundRect(width / 6, 1, 4 * width / 6, height - 4, radius, radius); - g2d.setColor(BORDER_COLOR); - g2d.drawRoundRect(width / 6, 1, 4 * width / 6, height - 4, radius, radius); - int pinSize = 2 * width / 32; - g2d.setColor(PIN_COLOR); - for (int i = 0; i < 4; i++) { - if (i == 1) - continue; - g2d.fillOval(width / 3 - pinSize, (height / 5) * (i + 1) - 1, pinSize, pinSize); - g2d.fillOval(2 * width / 3 + 1, (height / 5) * (i + 1) - 1, pinSize, pinSize); - } - } - - @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 = "Indent") - public Color getIndentColor() { - if (indentColor == null) { - indentColor = INDENT_COLOR; - } - return indentColor; - } - - public void setIndentColor(Color indentColor) { - this.indentColor = indentColor; - } - - public static enum PinCount { - - _3, _4, _5; - - @Override - public String toString() { - return name().replace("_", "").concat(" per side"); - } - - public int getValue() { - return Integer.parseInt(name().replace("_", "")); - } - } -} +//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.Area; +//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.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.measures.Size; +//import org.diylc.core.measures.SizeUnit; +//import org.diylc.utils.Constants; +// +//@ComponentDescriptor(name = "Subminiature DIL Relay", author = "Branislav Stojkovic", category = "Electromechanical", +// instanceNamePrefix = "RY", description = "Subminiature DIL relay with one or two poles", stretchable = false, +// zOrder = IDIYComponent.COMPONENT, keywordPolicy = KeywordPolicy.SHOW_VALUE) +//public class SubminiatureDILRelay extends AbstractTransparentComponent { +// +// private static final long serialVersionUID = 1L; +// +// public static Color BODY_COLOR = Color.decode("#EDEDD5"); +// 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 INDENT_COLOR = Color.gray.darker(); +// public static Color LABEL_COLOR = Color.darkGray; +// public static int EDGE_RADIUS = 6; +// public static Size PIN_SIZE = new Size(0.04d, SizeUnit.in); +// public static Size INDENT_SIZE = new Size(0.05d, SizeUnit.in); +// +// public static Size PIN_SPACING = new Size(0.2d, SizeUnit.in); +// public static Size ROW_SPACING = new Size(0.3d, SizeUnit.in); +// public static Size SECTION_SPACING = new Size(0.3d, SizeUnit.in); +// +// private String value = ""; +// private Orientation orientation = Orientation.DEFAULT; +// private PinCount pinCount = PinCount._4; +// private Size pinSpacing = PIN_SPACING; +// private Size rowSpacing = ROW_SPACING; +// private Size sectionSpacing = SECTION_SPACING; +// private Point[] controlPoints = new Point[] {new Point(0, 0)}; +// protected Display display = Display.NAME; +// private Color bodyColor = BODY_COLOR; +// private Color borderColor = BORDER_COLOR; +// private Color labelColor = LABEL_COLOR; +// private Color indentColor = INDENT_COLOR; +// transient private Area[] body; +// +// public SubminiatureDILRelay() { +// 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 = "Contacts") +// public PinCount getPinCount() { +// return pinCount; +// } +// +// public void setPinCount(PinCount pinCount) { +// this.pinCount = pinCount; +// updateControlPoints(); +// // Reset body shape; +// body = null; +// } +// +// @EditableProperty(name = "Pin spacing") +// public Size getPinSpacing() { +// return pinSpacing; +// } +// +// public void setPinSpacing(Size pinSpacing) { +// this.pinSpacing = pinSpacing; +// updateControlPoints(); +// // Reset body shape; +// body = null; +// } +// +// @EditableProperty(name = "Row spacing") +// public Size getRowSpacing() { +// return rowSpacing; +// } +// +// public void setRowSpacing(Size rowSpacing) { +// this.rowSpacing = rowSpacing; +// updateControlPoints(); +// // Reset body shape; +// body = null; +// } +// +// @EditableProperty(name = "Section spacing") +// public Size getSectionSpacing() { +// return sectionSpacing; +// } +// +// public void setSectionSpacing(Size sectionSpacing) { +// this.sectionSpacing = sectionSpacing; +// 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[pinCount.getValue() * 2]; +// controlPoints[0] = firstPoint; +// int pinSpacing = (int) this.pinSpacing.convertToPixels(); +// int sectionSpacing = (int) this.sectionSpacing.convertToPixels(); +// int rowSpacing = (int) this.rowSpacing.convertToPixels(); +// // Update control points. +// int dx1; +// int dy1; +// int dx2; +// int dy2; +// for (int i = 0; i < pinCount.getValue(); i++) { +// int spacing = i == pinCount.getValue() - 1 ? sectionSpacing + (i - 1) * pinSpacing : i * pinSpacing; +// switch (orientation) { +// case DEFAULT: +// dx1 = 0; +// dy1 = spacing; +// dx2 = rowSpacing; +// dy2 = spacing; +// break; +// case _90: +// dx1 = -spacing; +// dy1 = 0; +// dx2 = -spacing; +// dy2 = rowSpacing; +// break; +// case _180: +// dx1 = 0; +// dy1 = -spacing; +// dx2 = -rowSpacing; +// dy2 = -spacing; +// break; +// case _270: +// dx1 = spacing; +// dy1 = 0; +// dx2 = spacing; +// dy2 = -rowSpacing; +// break; +// default: +// throw new RuntimeException("Unexpected orientation: " + orientation); +// } +// controlPoints[i] = new Point(firstPoint.x + dx1, firstPoint.y + dy1); +// controlPoints[i + pinCount.getValue()] = new Point(firstPoint.x + dx2, firstPoint.y + dy2); +// } +// } +// +// public Area[] getBody() { +// if (body == null) { +// body = new Area[2]; +// +// int pinSize = (int) PIN_SIZE.convertToPixels(); +// +// int minX = Integer.MAX_VALUE; +// int maxX = Integer.MIN_VALUE; +// int minY = Integer.MAX_VALUE; +// int maxY = Integer.MIN_VALUE; +// for (int i = 0; i < this.controlPoints.length; i++) { +// if (this.controlPoints[i].x > maxX) +// maxX = this.controlPoints[i].x; +// if (this.controlPoints[i].x < minX) +// minX = this.controlPoints[i].x; +// if (this.controlPoints[i].y > maxY) +// maxY = this.controlPoints[i].y; +// if (this.controlPoints[i].y < minY) +// minY = this.controlPoints[i].y; +// } +// int width = maxX - minX; +// int height = maxY - minY; +// +// Area indentation = null; +// int indentationSize = getClosestOdd(INDENT_SIZE.convertToPixels()); +// switch (orientation) { +// case DEFAULT: +// indentation = +// new Area(new Rectangle2D.Double(minX + width / 2 - indentationSize / 2, minY - indentationSize / 2 +// - pinSize, indentationSize, indentationSize)); +// break; +// case _90: +// indentation = +// new Area(new Rectangle2D.Double(minX + width - indentationSize / 2 + pinSize, minY + height / 2 +// - indentationSize / 2, indentationSize, indentationSize)); +// break; +// case _180: +// indentation = +// new Area(new Rectangle2D.Double(minX + width / 2 - indentationSize / 2, minY + height - indentationSize +// / 2 + pinSize, indentationSize, indentationSize)); +// break; +// case _270: +// indentation = +// new Area(new Rectangle2D.Double(minX - indentationSize / 2 - pinSize, minY + height / 2 - indentationSize +// / 2, indentationSize, indentationSize)); +// break; +// default: +// throw new RuntimeException("Unexpected orientation: " + orientation); +// } +// +// body[0] = +// new Area(new RoundRectangle2D.Double(minX - pinSize, minY - pinSize, width + 2 * pinSize, height + 2 +// * pinSize, EDGE_RADIUS, EDGE_RADIUS)); +// body[1] = indentation; +// if (indentation != null) { +// indentation.intersect(body[0]); +// } +// } +// 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]; +// +// 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); +// } else { +// g2d.draw(mainArea); +// if (getBody()[1] != null) { +// g2d.setColor(getIndentColor()); +// g2d.fill(getBody()[1]); +// } +// } +// +// if (!outlineMode) { +// int pinSize = (int) PIN_SIZE.convertToPixels() / 2 * 2; +// for (Point point : controlPoints) { +// g2d.setColor(PIN_COLOR); +// g2d.fillOval(point.x - pinSize / 2, point.y - pinSize / 2, pinSize, pinSize); +// g2d.setColor(PIN_BORDER_COLOR); +// g2d.drawOval(point.x - pinSize / 2, point.y - pinSize / 2, pinSize, pinSize); +// } +// } +// +// // Draw label. +// g2d.setFont(LABEL_FONT); +// 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 = ""; +// label = (getDisplay() == Display.NAME) ? getName() : getValue(); +// if (getDisplay() == Display.NONE) { +// label = ""; +// } +// if (getDisplay() == Display.BOTH) { +// label = getName() + " " + (getValue() == null ? "" : getValue().toString()); +// } +// Rectangle2D rect = fontMetrics.getStringBounds(label, 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(); +// g2d.drawString(label, x, y); +// } +// +// @Override +// public void drawIcon(Graphics2D g2d, int width, int height) { +// int radius = 6 * width / 32; +// g2d.setColor(BODY_COLOR); +// g2d.fillRoundRect(width / 6, 1, 4 * width / 6, height - 4, radius, radius); +// g2d.setColor(BORDER_COLOR); +// g2d.drawRoundRect(width / 6, 1, 4 * width / 6, height - 4, radius, radius); +// int pinSize = 2 * width / 32; +// g2d.setColor(PIN_COLOR); +// for (int i = 0; i < 4; i++) { +// if (i == 1) +// continue; +// g2d.fillOval(width / 3 - pinSize, (height / 5) * (i + 1) - 1, pinSize, pinSize); +// g2d.fillOval(2 * width / 3 + 1, (height / 5) * (i + 1) - 1, pinSize, pinSize); +// } +// } +// +// @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 = "Indent") +// public Color getIndentColor() { +// if (indentColor == null) { +// indentColor = INDENT_COLOR; +// } +// return indentColor; +// } +// +// public void setIndentColor(Color indentColor) { +// this.indentColor = indentColor; +// } +// +// public static enum PinCount { +// +// _3, _4, _5; +// +// @Override +// public String toString() { +// return name().replace("_", "").concat(" per side"); +// } +// +// public int getValue() { +// return Integer.parseInt(name().replace("_", "")); +// } +// } +//} diff --git a/diylc/diylc-swing/library/main.jar b/diylc/diylc-swing/library/main.jar index 186a7e5ebd405775b8701dd8ddca44ed559bb851..7c4fd4ddbd71a22074864e412091404deadaab47 100644 GIT binary patch delta 5634 zcmZWt2V9j$693xLghwyZv4DlDB2`2MloABHAkBgS)NlbzEU`qBsIj2rST!0o*4Rii z`mBlAjYiKzMPotFcqV$b3zpL}-pnk&=le|j#rbyr|Cybc-JRX%gEOu_&2zQQN>?=- zNwSipfJqB&+bjN)7Dmm-zmNIj-@gYc0h4MR

l>ay*J2N)WG(WR^8w%QiUPCnuoz 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 diff --git a/diylc/diylc-swing/update.xml b/diylc/diylc-swing/update.xml index efc96b6f..1475b67a 100644 --- a/diylc/diylc-swing/update.xml +++ b/diylc/diylc-swing/update.xml @@ -1409,11 +1409,7 @@ NEW_FEATURE Terminal strip component added - - - NEW_FEATURE - Subminiature DIL relay added - + NEW_FEATURE Battery schematic symbol added