From 53feb60b63d6d7082ceebb127f35afd8c02e6f93 Mon Sep 17 00:00:00 2001 From: bancika Date: Sat, 17 Mar 2012 00:17:22 +0000 Subject: [PATCH] added closed jack --- .../src/org/diylc/presenter/Presenter.java | 7 +- .../diylc-library/lib/diylc-core.jar | Bin 196216 -> 196216 bytes .../{CliffJack.java => CliffJack1_4.java} | 39 +- .../electromechanical/ClosedJack1_4.java | 352 ++++++++++++++++++ 4 files changed, 382 insertions(+), 16 deletions(-) rename diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/electromechanical/{CliffJack.java => CliffJack1_4.java} (87%) create mode 100644 diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/electromechanical/ClosedJack1_4.java diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/presenter/Presenter.java b/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/presenter/Presenter.java index dcc929a9..5e05bcbd 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/presenter/Presenter.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/presenter/Presenter.java @@ -56,7 +56,7 @@ public class Presenter implements IPlugInPort { private static final Logger LOG = Logger.getLogger(Presenter.class); - public static final VersionNumber CURRENT_VERSION = new VersionNumber(3, 4, 1); + public static final VersionNumber CURRENT_VERSION = new VersionNumber(3, 5, 0); public static final String DEFAULTS_KEY_PREFIX = "default."; public static final List> EMPTY_SELECTION = Collections.emptyList(); @@ -1204,10 +1204,11 @@ public class Presenter implements IPlugInPort { // Skip already selected components or ones that cannot be stuck to // other components. Area area = drawingManager.getComponentArea(component); - if (newSelection.contains(component) || !component.isControlPointSticky(0) || area == null) + if (newSelection.contains(component) || !component.isControlPointSticky(0) + || area == null) continue; boolean matches = false; - for (IDIYComponent selectedComponent : this.selectedComponents) { + for (IDIYComponent selectedComponent : this.selectedComponents) { Area selectedArea = drawingManager.getComponentArea(selectedComponent); if (selectedArea == null) continue; diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-library/lib/diylc-core.jar b/ diy-layout-creator --username bancika@gmail.com/diylc-library/lib/diylc-core.jar index f0005f9a32246b5a47f70f1da6276768de50497a..f13796cf834a689b4120e1d3923c0f60371df855 100644 GIT binary patch delta 3778 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 CVNvG* diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/electromechanical/CliffJack.java b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/electromechanical/CliffJack1_4.java similarity index 87% rename from diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/electromechanical/CliffJack.java rename to diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/electromechanical/CliffJack1_4.java index 231e3b02..61be8918 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/electromechanical/CliffJack.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/electromechanical/CliffJack1_4.java @@ -31,8 +31,8 @@ import org.diylc.core.measures.Size; import org.diylc.core.measures.SizeUnit; import org.diylc.utils.Constants; -@ComponentDescriptor(name = "Cliff 1/4\" Jack", category = "Electromechanical", author = "Branislav Stojkovic", description = "Cliff-style enclosed panel mount 1/4\" phono jack", stretchable = false, zOrder = IDIYComponent.COMPONENT, instanceNamePrefix = "J") -public class CliffJack extends AbstractTransparentComponent { +@ComponentDescriptor(name = "Cliff 1/4\" Jack", category = "Electromechanical", author = "Branislav Stojkovic", description = "Cliff-style closed panel mount 1/4\" phono jack", stretchable = false, zOrder = IDIYComponent.COMPONENT, instanceNamePrefix = "J") +public class CliffJack1_4 extends AbstractTransparentComponent { private static final long serialVersionUID = 1L; @@ -42,18 +42,18 @@ public class CliffJack extends AbstractTransparentComponent { private static Color BODY_COLOR = Color.decode("#666666"); private static Color NUT_COLOR = Color.decode("#999999"); private static Color BORDER_COLOR = Color.black; - private static Color LABEL_COLOR = Color.lightGray; - private static Size BODY_WIDTH = new Size(0.8d, SizeUnit.in); - private static Size BODY_LENGTH = new Size(1d, SizeUnit.in); + private static Color LABEL_COLOR = Color.white; + private static Size BODY_WIDTH = new Size(3/4d, SizeUnit.in); + private static Size BODY_LENGTH = new Size(0.9d, SizeUnit.in); private static Size TAIL_LENGTH = new Size(0.1d, SizeUnit.in); private Point[] controlPoints = new Point[] { new Point(0, 0) }; private JackType type = JackType.MONO; private Orientation orientation = Orientation.DEFAULT; - private Shape[] body; + transient private Shape[] body; private String value = ""; - public CliffJack() { + public CliffJack1_4() { super(); updateControlPoints(); } @@ -209,8 +209,21 @@ public class CliffJack extends AbstractTransparentComponent { // g2d.setPaint(oldPaint); g2d.setComposite(oldComposite); } - g2d.setColor(componentState == ComponentState.SELECTED - || componentState == ComponentState.DRAGGING ? SELECTION_COLOR : BORDER_COLOR); + + 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 + : BORDER_COLOR; + } + + g2d.setColor(finalBorderColor); for (int i = 0; i < body.length - 1; i++) { g2d.draw(body[i]); } @@ -249,17 +262,17 @@ public class CliffJack extends AbstractTransparentComponent { g2d.setColor(BODY_COLOR); g2d.fillRoundRect((width - tailWidth) / 2, height / 2, tailWidth, height / 2 - 2 * 32 - / height, 3 * 32 / width, 4 * 32 / width); + / height, 4 * 32 / width, 4 * 32 / width); g2d.setColor(BORDER_COLOR); g2d.drawRoundRect((width - tailWidth) / 2, height / 2, tailWidth, height / 2 - 2 * 32 - / height, 3 * 32 / width, 4 * 32 / width); + / height, 4 * 32 / width, 4 * 32 / width); g2d.setColor(NUT_COLOR); g2d.fillRoundRect((width - tailWidth) / 2, 2 * 32 / height, tailWidth, height / 2, - 3 * 32 / width, 4 * 32 / width); + 4 * 32 / width, 4 * 32 / width); g2d.setColor(BORDER_COLOR); g2d.drawRoundRect((width - tailWidth) / 2, 2 * 32 / height, tailWidth, height / 2, - 3 * 32 / width, 4 * 32 / width); + 4 * 32 / width, 4 * 32 / width); g2d.setColor(BODY_COLOR); g2d.fillRect((width - bodyWidth) / 2, height / 7 + 1, bodyWidth, height * 5 / 7); diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/electromechanical/ClosedJack1_4.java b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/electromechanical/ClosedJack1_4.java new file mode 100644 index 00000000..63f7c3d7 --- /dev/null +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/electromechanical/ClosedJack1_4.java @@ -0,0 +1,352 @@ +package org.diylc.components.electromechanical; + +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.Composite; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.Shape; +import java.awt.geom.AffineTransform; +import java.awt.geom.Area; +import java.awt.geom.Ellipse2D; +import java.awt.geom.GeneralPath; + +import org.diylc.appframework.miscutils.ConfigurationManager; +import org.diylc.common.HorizontalAlignment; +import org.diylc.common.IPlugInPort; +import org.diylc.common.ObjectCache; +import org.diylc.common.Orientation; +import org.diylc.common.VerticalAlignment; +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.measures.Size; +import org.diylc.core.measures.SizeUnit; +import org.diylc.utils.Constants; + +@ComponentDescriptor(name = "Closed 1/4\" Jack", category = "Electromechanical", author = "Branislav Stojkovic", description = "Enclosed panel mount 1/4\" phono jack", stretchable = false, zOrder = IDIYComponent.COMPONENT, instanceNamePrefix = "J") +public class ClosedJack1_4 extends AbstractTransparentComponent { + + private static final long serialVersionUID = 1L; + + private static Size SPACING = new Size(0.1d, SizeUnit.in); + private static Size LUG_WIDTH = new Size(0.1d, SizeUnit.in); + private static Size LUG_LENGTH = new Size(0.12d, SizeUnit.in); + private static Size LUG_HOLE_SIZE = new Size(1d, SizeUnit.mm); + private static Color BODY_COLOR = Color.decode("#666666"); + private static Color SHAFT_COLOR = Color.decode("#AAAAAA"); + private static Size SHAFT_LENGTH = new Size(0.25d, SizeUnit.in); + private static Size SHAFT_WIDTH = new Size(3d / 8, SizeUnit.in); + private static Color BORDER_COLOR = Color.black; + private static Color LABEL_COLOR = Color.white; + private static Size BODY_WIDTH = new Size(0.65d, SizeUnit.in); + private static Size BODY_LENGTH = new Size(0.8d, SizeUnit.in); + + private Point[] controlPoints = new Point[] { new Point(0, 0) }; + private JackType type = JackType.MONO; + private Orientation orientation = Orientation.DEFAULT; + transient private Shape[] body; + private String value = ""; + + public ClosedJack1_4() { + super(); + updateControlPoints(); + } + + private void updateControlPoints() { + // invalidate body shape + body = null; + int x = controlPoints[0].x; + int y = controlPoints[0].y; + int spacing = (int) SPACING.convertToPixels(); + int bodyLength = (int) BODY_LENGTH.convertToPixels(); + controlPoints = new Point[type == JackType.STEREO ? 3 : 2]; + + controlPoints[0] = new Point(x, y); + controlPoints[1] = new Point(x + bodyLength, y); + if (type == JackType.STEREO) { + controlPoints[2] = new Point(x, y + 2 * spacing); + } + + // Apply rotation if necessary + double angle = getAngle(); + if (angle != 0) { + AffineTransform rotation = AffineTransform.getRotateInstance(angle, x, y); + for (int i = 1; i < controlPoints.length; i++) { + rotation.transform(controlPoints[i], controlPoints[i]); + } + } + } + + private double getAngle() { + // Apply rotation if necessary + double angle; + switch (orientation) { + case _90: + angle = Math.PI / 2; + break; + case _180: + angle = Math.PI; + break; + case _270: + angle = Math.PI * 3 / 2; + break; + default: + angle = 0; + } + + return angle; + } + + public Shape[] getBody() { + if (body == null) { + body = new Shape[5]; + + // Create body. + int x = controlPoints[0].x; + int y = controlPoints[0].y; + int lugWidth = (int) LUG_WIDTH.convertToPixels(); + int lugLength = (int) LUG_LENGTH.convertToPixels(); + int lugHoleSize = (int) LUG_HOLE_SIZE.convertToPixels(); + int bodyLength = (int) BODY_LENGTH.convertToPixels(); + int bodyWidth = (int) BODY_WIDTH.convertToPixels(); + body[0] = new Area(new Rectangle(x + lugLength, y - bodyWidth / 2, bodyLength, + bodyWidth)); + + int shaftLength = (int) SHAFT_LENGTH.convertToPixels(); + int shaftWidth = (int) SHAFT_WIDTH.convertToPixels(); + Area shaft = new Area(new Rectangle(x + lugLength + bodyLength, y - shaftWidth / 2, + shaftLength, shaftWidth)); + body[1] = shaft; + + double angle = getAngle(); + AffineTransform rotation = null; + if (angle != 0) { + rotation = AffineTransform.getRotateInstance(angle, x, y); + } + + GeneralPath path = new GeneralPath(); + int step = 4; + for (int i = x + lugLength + bodyLength + step; i <= x + lugLength + bodyLength + + shaftLength; i += step) { + Point p = new Point(i, y - shaftWidth / 2 + 1); + if (rotation != null) { + rotation.transform(p, p); + } + path.moveTo(p.x, p.y); + p = new Point(i - step, y + shaftWidth / 2 - 1); + if (rotation != null) { + rotation.transform(p, p); + } + path.lineTo(p.x, p.y); + } + Area pathArea = new Area(path); + pathArea.intersect(shaft); + body[2] = path; + + // Create lugs. + Area lugs = new Area(); + + int spacing = (int) SPACING.convertToPixels(); + Point[] untransformedControlPoints = new Point[type == JackType.STEREO ? 3 : 2]; + + untransformedControlPoints[0] = new Point(x, y); + untransformedControlPoints[1] = new Point(x + bodyLength, y); + if (type == JackType.STEREO) { + untransformedControlPoints[2] = new Point(x, y + 2 * spacing); + } + + for (int i = 0; i < untransformedControlPoints.length; i++) { + Point point = untransformedControlPoints[i]; + Area lug = new Area(new Ellipse2D.Double(point.x - lugWidth / 2, point.y - lugWidth + / 2, lugWidth, lugWidth)); + lug.add(new Area( + new Rectangle(point.x, point.y - lugWidth / 2, lugLength, lugWidth))); + lug.subtract(new Area(new Ellipse2D.Double(point.x - lugHoleSize / 2, point.y + - lugHoleSize / 2, lugHoleSize, lugHoleSize))); + lugs.add(lug); + } + + body[3] = lugs; + + // Rotate everything that's of Area type, e.g. everything but lines. + if (rotation != null) { + for (Shape shape : body) { + if (shape instanceof Area) { + Area area = (Area) shape; + area.transform(rotation); + } + } + } + } + return body; + } + + @Override + public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, + Project project, IDrawingObserver drawingObserver) { + Shape[] body = getBody(); + + // Rectangle bounds = body.getBounds(); + + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1)); + if (componentState != ComponentState.DRAGGING) { + 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 : BODY_COLOR); + // GradientPaint gradient; + // if (orientation == Orientation.DEFAULT || orientation == + // Orientation._180) { + // gradient = new GradientPaint(bounds.x, bounds.y, BORDER_COLOR, + // bounds.x, bounds.y + // + bounds.height / 2, BODY_COLOR, true); + // } else { + // gradient = new GradientPaint(bounds.x, bounds.y, BORDER_COLOR, + // bounds.x + // + bounds.width / 2, bounds.y, BODY_COLOR, true); + // } + // Paint oldPaint = g2d.getPaint(); + // g2d.setPaint(gradient); + g2d.fill(body[0]); + g2d.setColor(outlineMode ? Constants.TRANSPARENT_COLOR : SHAFT_COLOR); + g2d.fill(body[1]); + g2d.setColor(outlineMode ? Constants.TRANSPARENT_COLOR : METAL_COLOR); + g2d.fill(body[3]); + // g2d.setPaint(oldPaint); + 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 : BORDER_COLOR; + } + + g2d.setColor(finalBorderColor); + g2d.draw(body[0]); + g2d.draw(body[1]); + if (!outlineMode) { + g2d.setColor(SHAFT_COLOR.darker()); + g2d.fill(body[2]); + g2d.draw(body[2]); + } + + // Pins are the last piece. + g2d.setColor(outlineMode ? finalBorderColor : METAL_COLOR.darker()); + g2d.draw(body[3]); + + 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 + : LABEL_COLOR; + } + g2d.setColor(finalLabelColor); + g2d.setFont(LABEL_FONT); + Rectangle bounds = body[0].getBounds(); + int centerX = bounds.x + bounds.width / 2; + int centerY = bounds.y + bounds.height / 2; + drawCenteredText(g2d, name, centerX, centerY, HorizontalAlignment.CENTER, + VerticalAlignment.CENTER); + } + + @Override + public void drawIcon(Graphics2D g2d, int width, int height) { + int bodyWidth = getClosestOdd(width * 3 / 5); + int tailWidth = getClosestOdd(width * 3 / 10); + + g2d.setColor(SHAFT_COLOR); + g2d.fillRect((width - tailWidth) / 2, 1, tailWidth, height / 2); + g2d.setColor(BORDER_COLOR); + g2d.drawRect((width - tailWidth) / 2, 1, tailWidth, height / 2); + + g2d.setColor(BODY_COLOR); + g2d.fillRect((width - bodyWidth) / 2, height / 7 + 1, bodyWidth, height * 5 / 7); + g2d.setColor(BORDER_COLOR); + g2d.drawRect((width - bodyWidth) / 2, height / 7 + 1, bodyWidth, height * 5 / 7); + + g2d.setColor(METAL_COLOR); + + g2d.fillRect(width * 7 / 16, height * 6 / 7 + 1, width / 8, height / 7 - 1); + g2d.fillRect(width * 7 / 16, height / 7 + 2, width / 8, height / 7 - 1); + } + + @Override + public int getControlPointCount() { + return controlPoints.length; + } + + @Override + public Point getControlPoint(int index) { + return controlPoints[index]; + } + + @Override + public void setControlPoint(Point point, int index) { + controlPoints[index] = point; + updateControlPoints(); + } + + @Override + public boolean isControlPointSticky(int index) { + return true; + } + + @Override + public VisibilityPolicy getControlPointVisibilityPolicy(int index) { + return VisibilityPolicy.NEVER; + } + + @EditableProperty + @Override + public String getValue() { + return value; + } + + @Override + public void setValue(String value) { + this.value = value; + } + + @EditableProperty + public JackType getType() { + return type; + } + + public void setType(JackType type) { + this.type = type; + updateControlPoints(); + } + + @EditableProperty + public Orientation getOrientation() { + return orientation; + } + + public void setOrientation(Orientation orientation) { + this.orientation = orientation; + updateControlPoints(); + } +}