From 38b057888f96bf1bf1665b5a81ab4a36c7ff79ae Mon Sep 17 00:00:00 2001 From: bancika Date: Tue, 27 Dec 2016 17:08:16 +0100 Subject: [PATCH] tree improvements LP switch added --- diylc/diylc-library/lib/diylc-core.jar | Bin 230151 -> 230151 bytes .../org/diylc/components/guitar/LPSwitch.java | 623 +++++++++--------- diylc/diylc-swing/lib/diylc-core.jar | Bin 230151 -> 230151 bytes diylc/diylc-swing/library/main.jar | Bin 351640 -> 357176 bytes .../diylc/swing/plugins/tree/TreePanel.java | 57 +- diylc/diylc-swing/update.xml | 10 +- 6 files changed, 346 insertions(+), 344 deletions(-) diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar index b935a0b094003cdced737e91e0c19526ca81baba..348025242eb9fc3a6d1cc75bc1a3beb58261ba6d 100644 GIT binary patch delta 4078 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 diff --git a/diylc/diylc-library/src/org/diylc/components/guitar/LPSwitch.java b/diylc/diylc-library/src/org/diylc/components/guitar/LPSwitch.java index 22ab11e3..cd6cb49a 100644 --- a/diylc/diylc-library/src/org/diylc/components/guitar/LPSwitch.java +++ b/diylc/diylc-library/src/org/diylc/components/guitar/LPSwitch.java @@ -1,322 +1,301 @@ -// package org.diylc.components.guitar; -// -// import java.awt.AlphaComposite; -// import java.awt.Color; -// import java.awt.Composite; -// import java.awt.Graphics2D; -// import java.awt.Point; -// import java.awt.Shape; -// 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.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.measures.Size; -// import org.diylc.core.measures.SizeUnit; -// import org.diylc.utils.Constants; -// -// //@ComponentDescriptor(name = "Les Paul Switch", category = "Guitar", author = -// "Branislav Stojkovic", description = "Les Paul-style 3 position switch", stretchable = false, -// zOrder = IDIYComponent.COMPONENT, instanceNamePrefix = "SW") -// public class LPSwitch extends AbstractTransparentComponent { -// -// private static final long serialVersionUID = 1L; -// -// private static Color BASE_COLOR = Color.lightGray; -// private static Color WAFER_COLOR = Color.decode("#CD8500"); -// -// private static Size BASE_WIDTH = new Size(0.5d, SizeUnit.in); -// private static Size BASE_LENGTH = new Size(47.5d, SizeUnit.mm); -// private static Size WAFER_LENGTH = new Size(40d, SizeUnit.mm); -// private static Size WAFER_SPACING = new Size(7.62d, SizeUnit.mm); -// private static Size WAFER_THICKNESS = new Size(0.05d, SizeUnit.in); -// private static Size HOLE_SIZE = new Size(2d, SizeUnit.mm); -// private static Size HOLE_SPACING = new Size(41.2d, SizeUnit.mm); -// private static Size TERMINAL_LENGTH = new Size(3d, SizeUnit.mm); -// private static Size TERMINAL_SPACING = new Size(0.1d, SizeUnit.in); -// private static Size TERMINAL_THICKNESS = new Size(0.02d, SizeUnit.in); -// -// private String value = ""; -// private Point[] controlPoints = new Point[] { new Point(0, 0), new Point(0, 0), -// new Point(0, 0), new Point(0, 0) }; -// transient Shape[] body; -// private Orientation orientation = Orientation.DEFAULT; -// -// public LPSwitch() { -// super(); -// updateControlPoints(); -// } -// -// @Override -// public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, -// Project project, IDrawingObserver drawingObserver) { -// Shape[] body = getBody(); -// -// 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 : BASE_COLOR); -// g2d.fill(body[0]); -// g2d.setColor(outlineMode ? Constants.TRANSPARENT_COLOR : WAFER_COLOR); -// g2d.fill(body[1]); -// 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 : BASE_COLOR -// .darker(); -// } -// -// g2d.setColor(finalBorderColor); -// g2d.draw(body[0]); -// -// 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 : WAFER_COLOR -// .darker(); -// } -// -// g2d.draw(body[1]); -// -// g2d.setColor(METAL_COLOR); -// g2d.fill(body[2]); -// g2d.setColor(METAL_COLOR.darker()); -// g2d.draw(body[2]); -// } -// -// public Shape[] getBody() { -// if (body == null) { -// body = new Shape[3]; -// -// int x = controlPoints[0].x; -// int y = controlPoints[0].y; -// int baseWidth = (int) BASE_WIDTH.convertToPixels(); -// int baseLength = (int) BASE_LENGTH.convertToPixels(); -// int holeSize = getClosestOdd(HOLE_SIZE.convertToPixels()); -// int holeSpacing = (int) HOLE_SPACING.convertToPixels(); -// int waferLength = (int) WAFER_LENGTH.convertToPixels(); -// int waferSpacing = (int) WAFER_SPACING.convertToPixels(); -// int waferThickness = (int) WAFER_THICKNESS.convertToPixels(); -// int terminalSpacing = (int) TERMINAL_SPACING.convertToPixels(); -// int terminalLength = getClosestOdd(TERMINAL_LENGTH.convertToPixels()); -// int terminalWidth = getClosestOdd(TERMINAL_WIDTH.convertToPixels()); -// -// int baseX = x - terminalLength / 2 - waferSpacing; -// int baseY = y -// - (baseLength - terminalSpacing * (type == LeverSwitchType.DP3T ? 7 : 12)) / 2; -// Area baseArea = new Area(new Rectangle2D.Double(baseX, baseY, baseWidth, baseLength)); -// baseArea.subtract(new Area(new Ellipse2D.Double(baseX + baseWidth / 2 - holeSize / 2, -// baseY + (baseLength - holeSpacing) / 2 - holeSize / 2, holeSize, holeSize))); -// baseArea.subtract(new Area(new Ellipse2D.Double(baseX + baseWidth / 2 - holeSize / 2, -// baseY + (baseLength - holeSpacing) / 2 - holeSize / 2 + holeSpacing, holeSize, -// holeSize))); -// body[0] = baseArea; -// -// Area waferArea = new Area(new Rectangle2D.Double(x - terminalLength / 2 -// - waferThickness / 2, -// y - (waferLength - terminalSpacing * (type == LeverSwitchType.DP3T ? 7 : 12)) -// / 2, waferThickness, waferLength)); -// -// if (type == LeverSwitchType._4P5T) { -// waferArea.add(new Area(new Rectangle2D.Double(x - terminalLength / 2 -// - waferThickness / 2 + waferSpacing, y -// - (waferLength - terminalSpacing * (type == LeverSwitchType.DP3T ? 7 : 12)) -// / 2, waferThickness, waferLength))); -// } -// body[1] = waferArea; -// -// double theta = 0; -// // Rotate if needed -// if (orientation != Orientation.DEFAULT) { -// switch (orientation) { -// case _90: -// theta = Math.PI / 2; -// break; -// case _180: -// theta = Math.PI; -// break; -// case _270: -// theta = Math.PI * 3 / 2; -// break; -// } -// } -// -// Area terminalArea = new Area(); -// for (Point point : controlPoints) { -// Area terminal = new Area(new RoundRectangle2D.Double(point.x - terminalLength / 2, -// point.y - terminalWidth / 2, terminalLength, terminalWidth, -// terminalWidth / 2, terminalWidth / 2)); -// terminal.subtract(new Area( -// new RoundRectangle2D.Double(point.x - terminalLength / 4, point.y -// - terminalWidth / 4, terminalLength / 2, terminalWidth / 2, -// terminalWidth / 2, terminalWidth / 2))); -// // Rotate the terminal if needed -// if (theta != 0) { -// AffineTransform rotation = AffineTransform.getRotateInstance(theta, point.x, -// point.y); -// terminal.transform(rotation); -// } -// terminalArea.add(terminal); -// } -// body[2] = terminalArea; -// -// // Rotate if needed -// if (theta != 0) { -// AffineTransform rotation = AffineTransform.getRotateInstance(theta, x, y); -// // Skip the last one because it's already rotated -// for (int i = 0; i < body.length - 1; i++) { -// Shape shape = body[i]; -// Area area = (Area) shape; -// area.transform(rotation); -// } -// } -// } -// return body; -// } -// -// private void updateControlPoints() { -// int x = controlPoints[0].x; -// int y = controlPoints[0].y; -// int terminalSpacing = (int) TERMINAL_SPACING.convertToPixels(); -// int baseLength = (int) BASE_LENGTH.convertToPixels(); -// -// controlPoints[1].setLocation(x - terminalSpacing * 2 - baseLength, y - terminalSpacing); -// controlPoints[2].setLocation(x - terminalSpacing * 2 - baseLength, y); -// controlPoints[3].setLocation(x - terminalSpacing * 2 - baseLength, y); -// -// // Rotate if needed -// if (orientation != Orientation.DEFAULT) { -// double theta = 0; -// switch (orientation) { -// case _90: -// theta = Math.PI / 2; -// break; -// case _180: -// theta = Math.PI; -// break; -// case _270: -// theta = Math.PI * 3 / 2; -// break; -// } -// AffineTransform rotation = AffineTransform.getRotateInstance(theta, x, y); -// for (Point point : controlPoints) { -// rotation.transform(point, point); -// } -// } -// } -// -// @Override -// public void drawIcon(Graphics2D g2d, int width, int height) { -// g2d.setClip(width / 32, width / 32, width, height); -// g2d.setColor(BASE_COLOR); -// g2d.fillRect(0, 0, width * 2 / 3, height); -// g2d.setColor(BASE_COLOR.darker()); -// g2d.drawRect(0, 0, width * 2 / 3, height); -// g2d.setColor(WAFER_COLOR); -// g2d.fillRect(width / 8 * 3, 0, width / 8, height); -// g2d.setColor(WAFER_COLOR.darker()); -// g2d.drawRect(width / 8 * 3, 0, width / 8, height); -// Area terminals = new Area(); -// int terminalLength = getClosestOdd(11 * width / 32); -// int terminalWidth = getClosestOdd(7 * width / 32); -// Area terminal = new Area(new RoundRectangle2D.Double(width / 16 * 7, 4 * width / 32, -// terminalLength, terminalWidth, terminalWidth / 2, terminalWidth / 2)); -// terminal.subtract(new Area(new RoundRectangle2D.Double(width / 16 * 7 + terminalLength / 4 -// + 1, 4 * width / 32 + terminalWidth / 4 + 1, terminalLength / 2, terminalWidth / 2, -// terminalWidth / 4, terminalWidth / 4))); -// terminals.add(terminal); -// terminal = new Area(terminal); -// terminal.transform(AffineTransform.getTranslateInstance(-terminalLength, terminalWidth + 2 -// * width / 32)); -// terminals.add(terminal); -// terminal = new Area(terminal); -// terminal.transform(AffineTransform.getTranslateInstance(terminalLength, terminalWidth + 2 -// * width / 32)); -// terminals.add(terminal); -// g2d.setColor(METAL_COLOR); -// g2d.fill(terminals); -// g2d.setColor(METAL_COLOR.darker()); -// g2d.draw(terminals); -// } -// -// @Override -// public int getControlPointCount() { -// return controlPoints.length; -// } -// -// @Override -// public VisibilityPolicy getControlPointVisibilityPolicy(int index) { -// return VisibilityPolicy.NEVER; -// } -// -// @Override -// public boolean isControlPointSticky(int index) { -// return true; -// } -// -// @Override -// public Point getControlPoint(int index) { -// return controlPoints[index]; -// } -// -// @Override -// public void setControlPoint(Point point, int index) { -// this.controlPoints[index].setLocation(point); -// // Invalidate the body -// body = null; -// } -// -// @Override -// public String getValue() { -// return value; -// } -// -// @Override -// public void setValue(String value) { -// this.value = value; -// } -// -// @EditableProperty -// public Orientation getOrientation() { -// return orientation; -// } -// -// public void setOrientation(Orientation orientation) { -// this.orientation = orientation; -// updateControlPoints(); -// // Invalidate the body -// body = null; -// } -// } +package org.diylc.components.guitar; + +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.Composite; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.Shape; +import java.awt.geom.AffineTransform; +import java.awt.geom.Area; +import java.awt.geom.GeneralPath; +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.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 = "LP Switch", category = "Guitar", author = "Branislav Stojkovic", + description = "Les Paul style 3 position toggle switch", stretchable = false, zOrder = IDIYComponent.COMPONENT, + instanceNamePrefix = "SW") +public class LPSwitch extends AbstractTransparentComponent { + + private static final long serialVersionUID = 1L; + + private static Color BASE_COLOR = Color.lightGray; + private static Color WAFER_COLOR = Color.decode("#CD8500"); + + private static Size LENGTH = new Size(1.3d, SizeUnit.in); + private static Size BASE_LENGTH = new Size(18d, SizeUnit.mm); + private static Size WAFER_THICKNESS = new Size(0.05d, SizeUnit.in); + private static Size TERMINAL_SPACING = new Size(0.2d, SizeUnit.in); + + private String value = ""; + private Point[] controlPoints = new Point[] {new Point(0, 0), new Point(0, 0), new Point(0, 0), new Point(0, 0)}; + transient Shape[] body; + private Orientation orientation = Orientation.DEFAULT; + + public LPSwitch() { + super(); + updateControlPoints(); + } + + @Override + public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, Project project, + IDrawingObserver drawingObserver) { + Shape[] body = getBody(); + + 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 : WAFER_COLOR); + g2d.fill(body[1]); + g2d.setColor(outlineMode ? Constants.TRANSPARENT_COLOR : BASE_COLOR); + g2d.fill(body[0]); + 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 + : WAFER_COLOR.darker(); + } + + g2d.setColor(finalBorderColor); + g2d.draw(body[0]); + + 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 + : BASE_COLOR.darker(); + } + + g2d.setColor(finalBorderColor); + g2d.draw(body[1]); + + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(2)); + g2d.setColor(METAL_COLOR); + g2d.draw(body[2]); + } + + @SuppressWarnings("incomplete-switch") + public Shape[] getBody() { + if (body == null) { + body = new Shape[3]; + + int x = controlPoints[0].x; + int y = controlPoints[0].y; + int baseLength = (int) BASE_LENGTH.convertToPixels(); + int length = (int) LENGTH.convertToPixels(); + int waferThickness = getClosestOdd(WAFER_THICKNESS.convertToPixels()); + + Rectangle2D ground = + new Rectangle2D.Double(x - waferThickness / 2, y, waferThickness, baseLength + (length - baseLength) / 2); + body[0] = new Area(ground); + + int bodyY = y + (length - baseLength) / 2; + + Area waferArea = new Area(new Rectangle2D.Double(x - waferThickness * 3 / 2, bodyY, waferThickness, baseLength)); + waferArea.add(new Area(new Rectangle2D.Double(x + waferThickness / 2, bodyY, waferThickness, baseLength))); + + waferArea.add(new Area(new Rectangle2D.Double(x - waferThickness * 5 / 2, bodyY, waferThickness, baseLength))); + waferArea.add(new Area(new Rectangle2D.Double(x + waferThickness * 3 / 2, bodyY, waferThickness, baseLength))); + + waferArea.add(new Area(new Rectangle2D.Double(x - waferThickness * 7 / 2, bodyY, waferThickness, baseLength))); + waferArea.add(new Area(new Rectangle2D.Double(x + waferThickness * 5 / 2, bodyY, waferThickness, baseLength))); + + body[1] = waferArea; + + double theta = 0; + // Rotate if needed + if (orientation != Orientation.DEFAULT) { + switch (orientation) { + case _90: + theta = Math.PI / 2; + break; + case _180: + theta = Math.PI; + break; + case _270: + theta = Math.PI * 3 / 2; + break; + } + } + + int terminalSpacing = (int) TERMINAL_SPACING.convertToPixels(); + + GeneralPath terminalPath = new GeneralPath(GeneralPath.WIND_EVEN_ODD); + terminalPath.moveTo(x - waferThickness * 3 / 2, bodyY); + terminalPath.lineTo(x - waferThickness * 3 / 2, bodyY + baseLength); + terminalPath.lineTo(x, y + length); + + terminalPath.moveTo(x + waferThickness * 3 / 2, bodyY); + terminalPath.lineTo(x + waferThickness * 3 / 2, bodyY + baseLength); + terminalPath.lineTo(x, y + length); + + terminalPath.moveTo(x - waferThickness * 5 / 2, bodyY); + terminalPath.lineTo(x - waferThickness * 5 / 2, bodyY + baseLength); + terminalPath.lineTo(x - terminalSpacing, y + length); + + terminalPath.moveTo(x + waferThickness * 5 / 2, bodyY); + terminalPath.lineTo(x + waferThickness * 5 / 2, bodyY + baseLength); + terminalPath.lineTo(x + terminalSpacing, y + length); + body[2] = terminalPath; + + // Rotate if needed + if (theta != 0) { + AffineTransform rotation = AffineTransform.getRotateInstance(theta, x, y); + // Skip the last one because it's already rotated + for (int i = 0; i < body.length; i++) { + Shape shape = body[i]; + if (shape instanceof Area) { + Area area = (Area) shape; + area.transform(rotation); + } else if (shape instanceof GeneralPath) { + GeneralPath path = (GeneralPath) shape; + path.transform(rotation); + } + } + } + } + return body; + } + + @SuppressWarnings("incomplete-switch") + private void updateControlPoints() { + int x = controlPoints[0].x; + int y = controlPoints[0].y; + int terminalSpacing = (int) TERMINAL_SPACING.convertToPixels(); + int length = (int) LENGTH.convertToPixels(); + + controlPoints[1].setLocation(x - terminalSpacing, y + length); + controlPoints[2].setLocation(x, y + length); + controlPoints[3].setLocation(x + terminalSpacing, y + length); + + // Rotate if needed + if (orientation != Orientation.DEFAULT) { + double theta = 0; + switch (orientation) { + case _90: + theta = Math.PI / 2; + break; + case _180: + theta = Math.PI; + break; + case _270: + theta = Math.PI * 3 / 2; + break; + } + AffineTransform rotation = AffineTransform.getRotateInstance(theta, x, y); + for (Point point : controlPoints) { + rotation.transform(point, point); + } + } + } + + @Override + public void drawIcon(Graphics2D g2d, int width, int height) { + g2d.rotate(Math.PI / 4, width / 2, height / 2); + int baseLength = 20 * width / 32; + + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(3f)); + g2d.setColor(BASE_COLOR); + g2d.drawLine(width / 2, 0, width / 2, baseLength + (width - baseLength) / 2); + g2d.setColor(WAFER_COLOR); + g2d.fillRect(8 * width / 32, (width - baseLength) / 2, 16 * width / 32, baseLength); + g2d.setColor(METAL_COLOR); + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1f)); + g2d.drawLine(width / 2 - 2, (width - baseLength) / 2, width / 2 - 2, baseLength + (width - baseLength) / 2); + g2d.drawLine(width / 2 + 2, (width - baseLength) / 2, width / 2 + 2, baseLength + (width - baseLength) / 2); + g2d.drawLine(width / 2 - 5, (width - baseLength) / 2, width / 2 - 5, baseLength + (width - baseLength) / 2); + g2d.drawLine(width / 2 + 5, (width - baseLength) / 2, width / 2 + 5, baseLength + (width - baseLength) / 2); + int dx = 2 * width / 32; + int dy = 4 * width / 32; + g2d.drawLine(width / 2 - 2, baseLength + (width - baseLength) / 2, width / 2 - 2 + dx, baseLength + + (width - baseLength) / 2 + dy); + g2d.drawLine(width / 2 + 2, baseLength + (width - baseLength) / 2, width / 2 + 2 - dx, baseLength + + (width - baseLength) / 2 + dy); + + g2d.drawLine(width / 2 - 5, baseLength + (width - baseLength) / 2, width / 2 - 5 - dx, baseLength + (width - baseLength) / 2 + dy); + g2d.drawLine(width / 2 + 5, baseLength + (width - baseLength) / 2, width / 2 + 5 + dx, baseLength + (width - baseLength) / 2 + dy); + } + + @Override + public int getControlPointCount() { + return controlPoints.length; + } + + @Override + public VisibilityPolicy getControlPointVisibilityPolicy(int index) { + return VisibilityPolicy.NEVER; + } + + @Override + public boolean isControlPointSticky(int index) { + return true; + } + + @Override + public Point getControlPoint(int index) { + return controlPoints[index]; + } + + @Override + public void setControlPoint(Point point, int index) { + this.controlPoints[index].setLocation(point); + // Invalidate the body + body = null; + } + + @Override + public String getValue() { + return value; + } + + @Override + public void setValue(String value) { + this.value = value; + } + + @EditableProperty + public Orientation getOrientation() { + return orientation; + } + + public void setOrientation(Orientation orientation) { + this.orientation = orientation; + updateControlPoints(); + // Invalidate the body + body = null; + } +} diff --git a/diylc/diylc-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar index b935a0b094003cdced737e91e0c19526ca81baba..348025242eb9fc3a6d1cc75bc1a3beb58261ba6d 100644 GIT binary patch delta 4078 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 diff --git a/diylc/diylc-swing/library/main.jar b/diylc/diylc-swing/library/main.jar index cb74991e41bd04f04a1ff681e4fefea35894c877..a5b3cc8d015ab05dae4403587a37b79b312bab1e 100644 GIT binary patch delta 10773 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 delta 5426 zcmZWtd0f?17XNJ*9`M*?mGyzK2`Z*2PY@7=KtUfa$fgMLKoAf#%`z8U(#%N0<~rlY z&_U5>iJ8mOzyd7N%(V&9G_6L<%p}Xkbf)H`{&m{fvEUhrI2G-|xkG*`n-9UTcFg&(MQT4^7T7N+^%y`FWuH zd{MU+W%H^Tb|}dv9|h&0%}pAVXSNnwJ4nWDsd=4=M~6Xe{^?xryeafh$&N&ZzqMDg zMc#pTqh*x0kJK|iE80J>!teM~_n3@4zsMTDcXvfG-qp*wjHkc(Jd1z$=R%g3=db6S zfoJ}ni20~6r)tD@HymjFdNma~vB;g}bn0;O4znZ(`v`T8Q@m-FMjT+)jutO6%jY`RUv! zW-!jcSH<-*%b+1P{d}04AiNqu1GY=vG~rdz-F$tssAnl_TEwrJ!JQN0Fy_LiU953O z?+xAJG>N%*X6(}up6-H>-{-=bp6wPL&BL#Vp^Ti{BW5x`hwh8fE@*z2NWJFnV=}$k zTm)fwDE;8R7-+82NH-W|s*iNT(H@s>dI==OWkAGp=b z+aF7-n8u&T$;`aOT3*4X^PR0+#x&FHW6LirtcIGM>=>8aWsFNEgxmYSXm&KGB-cW zm2a}a#bS9hb7NaBKla8@)*Ix9Y$e5d`A=T>$YZN7og{*=&6ZZ1V8d1w5?Axs?eb-2 z>Def|uo(?$k{>gtgH3V(TZQx%IfMmX(jl|^$-L~0+`_D)FUm#+HGCn@XI9!TXa=uM@AIehMj62vrb9#?GG zz;r@^I}$>?dqz3H*YBL5OMVDPE*o!4*fS>-Vt(zM;=&ifxAk?$YG^gJZuMU;>P0Vf zE46H`=6s_ZXUTZ~sPwQL?C&W~EKmRY%5~HneW1)?XS`5DT!&!frBTF$2ptqn^iW4S zJDMcG`J_9dNhHck(PR|rZS`av%5*(RL;f~BNkMs2PbQ;`8bhY_>V0U_7!rXW6Jv=F z?HNM`9@ z-@jcoKkpT3^a*&)@<;QkFG6I2}r`!bh@kFia99R~esj8hFalfT=(j^Zd<2G;$Lx+#(E1s~c#&(d!XaHSa#NCaX2JY;KaAesu z;=!D3YLr8qp??I!5`?In92m{1=cbW?Se4soPhz+-+#uP}q0_nNSeTpCnu^FEx_mlu zWu7y(e10X|Q4rb#pY-gSj?^eT_}`=H+C1(wa0bDL3DwU4Wzt+aJe&B_%B9c;e$VBR z8W8z(9!IXu;HTO)6O_8eT$#F2@}&8hoL+&5VFgF_Ws(5&eioJ98@SSTCefiXVkRhm zuR~=3>-2QlOun{th|J$&K?2$2uJ6-5dI~zA$zBjfsmiv$iBkeZzk~an%6LunzW0s47PCA>@xj&!yR5fAtuC z`_rau62a0tIM6D*H}HJ2ZrA1D>2t?M2Qv-;xGe z>bfllf;L{^$mU$4p*M2K02aCVYq#+uU{ki>qfZsN@m4>+K9_hh{;s9IHIGC=C{qL> zQpFGIvGDzIrU!E&XvKZ5{3*A0{~q!1it&OgWIgQRkt+MU4>&c)PqwESc?8=dEzJWb z*$?|6ui3+csU?rE#%Y9y+tBJh*sx4yofAtM3^n2qRRr+b{uHVRXox z-eqbYHB;ve4qt#WKdqv!OXIP1MUeDwM&iO;SGA??+z9*?Fv)lozh|5y6!5ZKM#O#*M^+XRLIVp4 zK5%JFAt2T(EQlW}8&Ij)U{MkZk4`PSI@xqSeK_*<4w%kGn2x%hezn|aa--}_Po?yp zr*cz6oeB6mfUmwDM$~b>X)a-rPtS$Okz2TOj!AZ~+}B}6fJ|%RNCkdCqOYKQaX(j{ zFCuO%y^y3&&Xz-{ui)UR7qaFkrw%p}Z${02w|%e+TwHVi@8XJU<VEL=V8{YpJg`Am z0$Z`dK@h@KfjVC3$2U|E{5eG{D!|ji)f}m)B<}Qh1uy1#L~g9@hj>>KFBZe_^1m{k zg+E`ch8?NCw~oJT;fFG6{jQ}cU%|qgASHD=%Xe^U!x6>J(gS-cA?U7M7Q~81Ea1l@ zWdR@u_9EhezpZ>NM|v+J$BtSMLg81J9lg7NKX09@04_bQhMg_eWeD%<=m*2EG8YE3 z2}HGfwN=9n;0H}y-B^mx_A~mkir+l`)!;6myC34Tkl4|pYTnkKN7&`clkof1#GOS8 z{kZjS^>9{Z!M&qC?m^eoMtmDi95`#d7d#4*f}!=PR@>@^nr};&F64)J(?WPx&-+E8 l2V;o~eSaZO{43P1&=Ib6T131Y8iWQRcMQBU2SGN%e*vW|*2(|? diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/tree/TreePanel.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/tree/TreePanel.java index 81bb5877..8c85db3c 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/tree/TreePanel.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/tree/TreePanel.java @@ -34,8 +34,6 @@ import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.event.PopupMenuEvent; import javax.swing.event.PopupMenuListener; -import javax.swing.event.TreeSelectionEvent; -import javax.swing.event.TreeSelectionListener; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.DefaultTreeModel; @@ -60,6 +58,7 @@ public class TreePanel extends JPanel { private DefaultTreeModel treeModel; private JTree tree; + private JScrollPane treeScroll; private JTextField searchField; private DefaultMutableTreeNode recentNode; private List recentComponents; @@ -77,17 +76,17 @@ public class TreePanel extends JPanel { gbc.gridy = 0; gbc.fill = GridBagConstraints.HORIZONTAL; gbc.weighty = 0; + gbc.gridwidth = 1; add(getSearchField(), gbc); gbc.gridy++; + gbc.fill = GridBagConstraints.BOTH; gbc.weighty = 1; gbc.weightx = 1; - JScrollPane scroll = new JScrollPane(getTree()); - scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); - add(scroll, gbc); + add(getTreeScroll(), gbc); setPreferredSize(new Dimension(240, 200)); @@ -109,6 +108,14 @@ public class TreePanel extends JPanel { getTree().expandRow(0); } + public JScrollPane getTreeScroll() { + if (treeScroll == null) { + treeScroll = new JScrollPane(getTree()); + treeScroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); + } + return treeScroll; + } + public DefaultMutableTreeNode getRecentNode() { if (this.recentNode == null) { this.recentNode = new DefaultMutableTreeNode(new Payload("(Recently Used)"), true); @@ -170,31 +177,39 @@ public class TreePanel extends JPanel { tree.setCellRenderer(new ComponentCellRenderer()); tree.setRowHeight(0); ToolTipManager.sharedInstance().registerComponent(tree); - tree.addTreeSelectionListener(new TreeSelectionListener() { - - @Override - public void valueChanged(TreeSelectionEvent e) { - Object c = e.getPath().getLastPathComponent(); - if (c != null && c.getClass().equals(DefaultMutableTreeNode.class)) { - DefaultMutableTreeNode node = (DefaultMutableTreeNode) c; - Object obj = node.getUserObject(); - if (obj != null && obj.getClass().equals(Payload.class)) { - Payload payload = (Payload) obj; - plugInPort.setNewComponentTypeSlot(payload.getComponentType(), null); - } - } - } - }); + // tree.addTreeSelectionListener(new TreeSelectionListener() { + // + // @Override + // public void valueChanged(TreeSelectionEvent e) { + // Object c = e.getPath().getLastPathComponent(); + // if (c != null && c.getClass().equals(DefaultMutableTreeNode.class)) { + // DefaultMutableTreeNode node = (DefaultMutableTreeNode) c; + // Object obj = node.getUserObject(); + // if (obj != null && obj.getClass().equals(Payload.class)) { + // Payload payload = (Payload) obj; + // plugInPort.setNewComponentTypeSlot(payload.getComponentType(), null); + // } + // } + // } + // }); tree.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { - if (SwingUtilities.isRightMouseButton(e)) { int row = tree.getClosestRowForLocation(e.getX(), e.getY()); tree.setSelectionRow(row); getPopup().show(e.getComponent(), e.getX(), e.getY()); + } else { + TreePath path = tree.getClosestPathForLocation(e.getX(), e.getY()); + DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent(); + if (node != null && node.getUserObject() != null) { + Payload payload = (Payload) node.getUserObject(); + if (payload.getComponentType() != null) { + plugInPort.setNewComponentTypeSlot(payload.getComponentType(), null); + } + } } } }); diff --git a/diylc/diylc-swing/update.xml b/diylc/diylc-swing/update.xml index 8879e5dd..e9d4e092 100644 --- a/diylc/diylc-swing/update.xml +++ b/diylc/diylc-swing/update.xml @@ -1458,14 +1458,22 @@ NEW_FEATURE Searchable toolbox tree instead of the old toolbar (can be changed from "Config" menu) + + NEW_FEATURE + LP-style switch added + NEW_FEATURE P-90 pickup in both "dog ear" and "soap bar" variations added NEW_FEATURE - Mini humbucker pickup added + Mini humbucker pickup added as a variation of Humbucker pickup + + IMPROVEMENT + Improved guitar pickup look + BUG_FIX Fixed broken links in the Help menu