diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/plugins/help/HelpMenuPlugin.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/plugins/help/HelpMenuPlugin.java index 3fb764c9..0df387dd 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/plugins/help/HelpMenuPlugin.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/plugins/help/HelpMenuPlugin.java @@ -74,7 +74,7 @@ public class HelpMenuPlugin implements IPlugIn { aboutDialog = DialogFactory.getInstance().createAboutDialog("DIY Layout Creator", IconLoader.IconLarge.getIcon(), plugInPort.getCurrentVersionNumber().toString(), "Branislav Stojkovic", - "diylc.org", "bancika@gmail.com", ""); + "https://github.com/bancika/diy-layout-creator", "bancika@gmail.com", ""); } return aboutDialog; } diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-core/.classpath b/ diy-layout-creator --username bancika@gmail.com/diylc-core/.classpath index 6c90a9c8..1d2aca0d 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-core/.classpath +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-core/.classpath @@ -2,12 +2,12 @@ - + diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-core/library/main.jar b/ diy-layout-creator --username bancika@gmail.com/diylc-core/library/main.jar index ad37f99a..7c39bd34 100644 Binary files a/ diy-layout-creator --username bancika@gmail.com/diylc-core/library/main.jar and b/ diy-layout-creator --username bancika@gmail.com/diylc-core/library/main.jar differ diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/common/Display.java b/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/common/Display.java index ed3404ac..ff1459d6 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/common/Display.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/common/Display.java @@ -2,7 +2,7 @@ package org.diylc.common; public enum Display { - NAME, VALUE; + NAME, VALUE, NONE, BOTH; @Override public String toString() { diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/components/AbstractLeadedComponent.java b/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/components/AbstractLeadedComponent.java index df01ae57..26d8874f 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/components/AbstractLeadedComponent.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/components/AbstractLeadedComponent.java @@ -33,8 +33,7 @@ import org.diylc.utils.Constants; * * @author Branislav Stojkovic */ -public abstract class AbstractLeadedComponent extends - AbstractTransparentComponent { +public abstract class AbstractLeadedComponent extends AbstractTransparentComponent { private static final long serialVersionUID = 1L; @@ -45,8 +44,7 @@ public abstract class AbstractLeadedComponent extends protected Size length; protected Size width; - protected Point[] points = new Point[] { - new Point((int) (-DEFAULT_SIZE.convertToPixels() / 2), 0), + protected Point[] points = new Point[] { new Point((int) (-DEFAULT_SIZE.convertToPixels() / 2), 0), new Point((int) (DEFAULT_SIZE.convertToPixels() / 2), 0) }; protected Color bodyColor = Color.white; protected Color borderColor = Color.black; @@ -68,44 +66,35 @@ public abstract class AbstractLeadedComponent extends } @Override - public void draw(Graphics2D g2d, ComponentState componentState, - boolean outlineMode, Project project, + public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, Project project, IDrawingObserver drawingObserver) { double distance = points[0].distance(points[1]); Shape shape = getBodyShape(); // If there's no body, just draw the line connecting the ending points. if (shape == null) { drawLead(g2d, componentState); - } else if (supportsStandingMode() - && length.convertToPixels() > points[0].distance(points[1])) { + } else if (supportsStandingMode() && length.convertToPixels() > points[0].distance(points[1])) { // When ending points are too close draw the component in standing // mode. int width = getClosestOdd(this.width.convertToPixels()); - Shape body = new Ellipse2D.Double((getFlipStanding() ? points[1] - : points[0]).x - - width / 2, (getFlipStanding() ? points[1] : points[0]).y - - width / 2, width, width); + Shape body = new Ellipse2D.Double((getFlipStanding() ? points[1] : points[0]).x - width / 2, + (getFlipStanding() ? points[1] : points[0]).y - width / 2, width, width); Composite oldComposite = g2d.getComposite(); if (alpha < MAX_ALPHA) { - g2d.setComposite(AlphaComposite.getInstance( - AlphaComposite.SRC_OVER, 1f * alpha / MAX_ALPHA)); + g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f * alpha / MAX_ALPHA)); } - g2d.setColor(outlineMode ? Constants.TRANSPARENT_COLOR - : getStandingBodyColor()); + g2d.setColor(outlineMode ? Constants.TRANSPARENT_COLOR : getStandingBodyColor()); g2d.fill(body); g2d.setComposite(oldComposite); Color finalBorderColor; if (outlineMode) { - Theme theme = (Theme) ConfigurationManager.getInstance() - .readObject(IPlugInPort.THEME_KEY, - Constants.DEFAULT_THEME); + Theme theme = (Theme) ConfigurationManager.getInstance().readObject(IPlugInPort.THEME_KEY, + Constants.DEFAULT_THEME); finalBorderColor = componentState == ComponentState.SELECTED - || componentState == ComponentState.DRAGGING ? SELECTION_COLOR - : theme.getOutlineColor(); + || componentState == ComponentState.DRAGGING ? SELECTION_COLOR : theme.getOutlineColor(); } else { finalBorderColor = componentState == ComponentState.SELECTED - || componentState == ComponentState.DRAGGING ? SELECTION_COLOR - : borderColor; + || componentState == ComponentState.DRAGGING ? SELECTION_COLOR : borderColor; } g2d.setColor(finalBorderColor); @@ -116,8 +105,7 @@ public abstract class AbstractLeadedComponent extends } else { // Normal mode with component body in the center and two lead parts. Rectangle shapeRect = shape.getBounds(); - Double theta = Math.atan2(points[1].y - points[0].y, points[1].x - - points[0].x); + Double theta = Math.atan2(points[1].y - points[0].y, points[1].x - points[0].x); // Go back to the original transformation to draw leads. if (!outlineMode) { AffineTransform textTransform = g2d.getTransform(); @@ -127,36 +115,25 @@ public abstract class AbstractLeadedComponent extends // 0.5f)); // } int leadThickness = getClosestOdd(getLeadThickness()); - double leadLength = (distance - calculatePinSpacing(shapeRect)) - / 2 - leadThickness / 2; - g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke( - leadThickness)); - Color leadColor = shouldShadeLeads() ? getLeadColorForPainting( - componentState).darker() + double leadLength = (distance - calculatePinSpacing(shapeRect)) / 2 - leadThickness / 2; + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness)); + Color leadColor = shouldShadeLeads() ? getLeadColorForPainting(componentState).darker() : getLeadColorForPainting(componentState); g2d.setColor(leadColor); int endX = (int) (points[0].x + Math.cos(theta) * leadLength); - int endY = (int) Math.round(points[0].y + Math.sin(theta) - * leadLength); + int endY = (int) Math.round(points[0].y + Math.sin(theta) * leadLength); g2d.drawLine(points[0].x, points[0].y, endX, endY); - endX = (int) (points[1].x + Math.cos(theta - Math.PI) - * leadLength); - endY = (int) Math.round(points[1].y + Math.sin(theta - Math.PI) - * leadLength); + endX = (int) (points[1].x + Math.cos(theta - Math.PI) * leadLength); + endY = (int) Math.round(points[1].y + Math.sin(theta - Math.PI) * leadLength); g2d.drawLine(points[1].x, points[1].y, endX, endY); if (shouldShadeLeads()) { - g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke( - leadThickness - 2)); + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness - 2)); leadColor = getLeadColorForPainting(componentState); g2d.setColor(leadColor); - g2d.drawLine(points[0].x, points[0].y, - (int) (points[0].x + Math.cos(theta) * leadLength), + g2d.drawLine(points[0].x, points[0].y, (int) (points[0].x + Math.cos(theta) * leadLength), (int) (points[0].y + Math.sin(theta) * leadLength)); - g2d.drawLine(points[1].x, points[1].y, - (int) (points[1].x + Math.cos(theta - Math.PI) - * leadLength), (int) (points[1].y + Math - .sin(theta - Math.PI) - * leadLength)); + g2d.drawLine(points[1].x, points[1].y, (int) (points[1].x + Math.cos(theta - Math.PI) * leadLength), + (int) (points[1].y + Math.sin(theta - Math.PI) * leadLength)); } g2d.setTransform(textTransform); } @@ -173,19 +150,16 @@ public abstract class AbstractLeadedComponent extends length = getLength().convertToPixels(); } oldTransform = g2d.getTransform(); - g2d.translate((points[0].x + points[1].x - length) / 2, - (points[0].y + points[1].y - width) / 2); + g2d.translate((points[0].x + points[1].x - length) / 2, (points[0].y + points[1].y - width) / 2); g2d.rotate(theta, length / 2, width / 2); // Draw body. Composite oldComposite = g2d.getComposite(); if (alpha < MAX_ALPHA) { - g2d.setComposite(AlphaComposite.getInstance( - AlphaComposite.SRC_OVER, 1f * alpha / MAX_ALPHA)); + g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f * alpha / MAX_ALPHA)); } if (bodyColor != null) { if (bodyColor != null) { - g2d.setColor(outlineMode ? Constants.TRANSPARENT_COLOR - : bodyColor); + g2d.setColor(outlineMode ? Constants.TRANSPARENT_COLOR : bodyColor); g2d.fill(shape); } } @@ -194,16 +168,13 @@ public abstract class AbstractLeadedComponent extends g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1)); Color finalBorderColor; if (outlineMode) { - Theme theme = (Theme) ConfigurationManager.getInstance() - .readObject(IPlugInPort.THEME_KEY, - Constants.DEFAULT_THEME); + Theme theme = (Theme) ConfigurationManager.getInstance().readObject(IPlugInPort.THEME_KEY, + Constants.DEFAULT_THEME); finalBorderColor = componentState == ComponentState.SELECTED - || componentState == ComponentState.DRAGGING ? SELECTION_COLOR - : theme.getOutlineColor(); + || componentState == ComponentState.DRAGGING ? SELECTION_COLOR : theme.getOutlineColor(); } else { finalBorderColor = componentState == ComponentState.SELECTED - || componentState == ComponentState.DRAGGING ? SELECTION_COLOR - : borderColor; + || componentState == ComponentState.DRAGGING ? SELECTION_COLOR : borderColor; } g2d.setColor(finalBorderColor); g2d.draw(shape); @@ -259,49 +230,46 @@ public abstract class AbstractLeadedComponent extends } 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(); + 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 - : labelColor; + finalLabelColor = componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING + ? LABEL_COLOR_SELECTED : labelColor; } g2d.setColor(finalLabelColor); FontMetrics fontMetrics = g2d.getFontMetrics(); - String label = display == Display.NAME ? getName() - : (getValue() == null ? "" : getValue().toString()); + String label = ""; + label = display == Display.NAME ? getName() : (getValue() == null ? "" : getValue().toString()); + if (display == Display.NONE) { + label = ""; + } + if (display == Display.BOTH) { + label = getName() + " " + (getValue() == null ? "" : getValue().toString()); + } Rectangle2D textRect = fontMetrics.getStringBounds(label, g2d); // Don't offset in outline mode. - int offset = outlineMode ? 0 : getLabelOffset((int) length, - (int) width); + int offset = outlineMode ? 0 : getLabelOffset((int) length, (int) width); // Adjust label angle if needed to make sure that it's readable. - if ((theta >= Math.PI / 2 && theta <= Math.PI) - || (theta < -Math.PI / 2 && theta > -Math.PI)) { + if ((theta >= Math.PI / 2 && theta <= Math.PI) || (theta < -Math.PI / 2 && theta > -Math.PI)) { g2d.rotate(Math.PI, length / 2, width / 2); offset = -offset; } - g2d.drawString(label, (int) (length - textRect.getWidth()) / 2 - + offset, calculateLabelYCoordinate(shapeRect, textRect, - fontMetrics)); + g2d.drawString(label, (int) (length - textRect.getWidth()) / 2 + offset, + calculateLabelYCoordinate(shapeRect, textRect, fontMetrics)); g2d.setTransform(oldTransform); } } private void drawLead(Graphics2D g2d, ComponentState componentState) { - g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke( - getLeadThickness())); - Color leadColor = shouldShadeLeads() ? getLeadColorForPainting( - componentState).darker() + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(getLeadThickness())); + Color leadColor = shouldShadeLeads() ? getLeadColorForPainting(componentState).darker() : getLeadColorForPainting(componentState); g2d.setColor(leadColor); g2d.drawLine(points[0].x, points[0].y, points[1].x, points[1].y); if (shouldShadeLeads()) { - g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke( - getLeadThickness() - 2)); + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(getLeadThickness() - 2)); leadColor = getLeadColorForPainting(componentState); g2d.setColor(leadColor); g2d.drawLine(points[0].x, points[0].y, points[1].x, points[1].y); @@ -312,10 +280,8 @@ public abstract class AbstractLeadedComponent extends // Do nothing. } - protected int calculateLabelYCoordinate(Rectangle2D shapeRect, - Rectangle2D textRect, FontMetrics fontMetrics) { - return (int) (shapeRect.getHeight() - textRect.getHeight()) / 2 - + fontMetrics.getAscent(); + protected int calculateLabelYCoordinate(Rectangle2D shapeRect, Rectangle2D textRect, FontMetrics fontMetrics) { + return (int) (shapeRect.getHeight() - textRect.getHeight()) / 2 + fontMetrics.getAscent(); } protected boolean shouldShadeLeads() { @@ -352,8 +318,7 @@ public abstract class AbstractLeadedComponent extends * Controls how component shape should be placed relative to start and end * point. * - * @return - * true if shape rect should be used to center the component or false + * @return true if shape rect should be used to center the component or false * to place the component relative to length and * width values. */ @@ -372,8 +337,7 @@ public abstract class AbstractLeadedComponent extends * @return default lead color. Override this method to change it. */ protected Color getLeadColorForPainting(ComponentState componentState) { - return componentState == ComponentState.SELECTED - || componentState == ComponentState.DRAGGING ? SELECTION_COLOR + return componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR : getLeadColor(); } 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 28811558..c9df7aa8 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 @@ -591,7 +591,7 @@ public class Presenter implements IPlugInPort { } } else { // Otherwise just select that one component. - if (button == BUTTON1 + if (button == BUTTON1 || (button == BUTTON3 && newSelection.size() == 1) || !newSelection.contains(topComponent)) { newSelection.clear(); } diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-library/.classpath b/ diy-layout-creator --username bancika@gmail.com/diylc-library/.classpath index 0e74bfcf..dc0adbd6 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-library/.classpath +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-library/.classpath @@ -1,10 +1,10 @@ - + 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 a8367b9a..6e445fa1 100644 Binary files a/ diy-layout-creator --username bancika@gmail.com/diylc-library/lib/diylc-core.jar and b/ diy-layout-creator --username bancika@gmail.com/diylc-library/lib/diylc-core.jar differ diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/electromechanical/MiniRelay.java b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/electromechanical/MiniRelay.java index 0457be55..9d8dffa8 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/electromechanical/MiniRelay.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/electromechanical/MiniRelay.java @@ -346,7 +346,14 @@ public class MiniRelay extends AbstractTransparentComponent { } g2d.setColor(finalLabelColor); FontMetrics fontMetrics = g2d.getFontMetrics(g2d.getFont()); - String label = display == Display.NAME ? getName() : getValue(); + String label=""; + label = display == Display.VALUE ? getValue() : getName(); + if (display==Display.NONE) { + label=""; + } + if (display==Display.BOTH) { + label=getName()+" "+(getValue() == null ? "" : getValue().toString()); + } Rectangle2D rect = fontMetrics.getStringBounds(label, g2d); int textHeight = (int) (rect.getHeight()); int textWidth = (int) (rect.getWidth()); diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/passive/TrimmerPotentiometer.java b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/passive/TrimmerPotentiometer.java index 20dccb70..39fad24c 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/passive/TrimmerPotentiometer.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/passive/TrimmerPotentiometer.java @@ -13,6 +13,7 @@ import java.awt.geom.Ellipse2D; import java.awt.geom.Rectangle2D; 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; @@ -45,9 +46,11 @@ public class TrimmerPotentiometer extends AbstractPotentiometer { public static Color PIN_COLOR = Color.decode("#00B2EE"); public static Color PIN_BORDER_COLOR = PIN_COLOR.darker(); public static Size PIN_SIZE = new Size(0.03d, SizeUnit.in); + protected static Display DISPLAY = Display.NAME; protected Color bodyColor = BODY_COLOR; protected Color borderColor = BORDER_COLOR; + protected static Display display = DISPLAY; // Array of 7 elements: 3 lug connectors, 1 pot body and 3 lugs transient protected Shape[] body = null; @@ -333,7 +336,16 @@ public class TrimmerPotentiometer extends AbstractPotentiometer { int x = (panelWidth - textWidth) / 2; int y = (panelHeight - textHeight) / 2 + fontMetrics.getAscent(); - g2d.drawString(getName(), (int) (bodyRect.getX() + x), (int) (bodyRect + String label=""; + label = (getDisplay() == Display.NAME) ? getName() : getValue().toString(); + if (getDisplay() ==Display.NONE) { + label=""; + } + if (getDisplay() ==Display.BOTH) { + label=getName()+" "+(getValue() == null ? "" : getValue().toString()); + } + + g2d.drawString(label, (int) (bodyRect.getX() + x), (int) (bodyRect .getY() + y)); } @@ -386,6 +398,18 @@ public class TrimmerPotentiometer extends AbstractPotentiometer { public void setBodyColor(Color bodyColor) { this.bodyColor = bodyColor; } + + @EditableProperty + public Display getDisplay() { + if (display == null) { + display = Display.VALUE; + } + return display; + } + + public void setDisplay(Display display) { + this.display = display; + } @EditableProperty(name = "Border") public Color getBorderColor() { diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/AbstractTransistorSymbol.java b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/AbstractTransistorSymbol.java index d556e8ec..f7d718e4 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/AbstractTransistorSymbol.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/AbstractTransistorSymbol.java @@ -4,6 +4,7 @@ import java.awt.Color; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Shape; +import java.awt.geom.AffineTransform; import org.diylc.appframework.miscutils.ConfigurationManager; import org.diylc.common.Display; @@ -28,11 +29,13 @@ public abstract class AbstractTransistorSymbol extends AbstractComponent public static Size PIN_SPACING = new Size(0.1d, SizeUnit.in); public static Color COLOR = Color.black; - + + public static SymbolFlipping FLIPPING = SymbolFlipping.NONE; protected String value = ""; protected Point[] controlPoints = new Point[] { new Point(0, 0), new Point(0, 0), new Point(0, 0) }; protected Color color = COLOR; + protected SymbolFlipping flipping = FLIPPING; protected Display display = Display.NAME; transient protected Shape[] body; @@ -67,6 +70,32 @@ public abstract class AbstractTransistorSymbol extends AbstractComponent Shape[] body = getBody(); + int rotation=0; + //determine rotation using control points + if (controlPoints[1].x==controlPoints[2].x) + { + if (controlPoints[0].x>controlPoints[1].x) + { + rotation=180; + } + } + if (controlPoints[1].y==controlPoints[2].y) + { + rotation=90; + if (controlPoints[0].y>controlPoints[1].y) + { + rotation=270; + } + } + AffineTransform old = g2d.getTransform(); + g2d.rotate(Math.toRadians(rotation),controlPoints[0].x,controlPoints[0].y); + + if (this.flipping==SymbolFlipping.Y){ + g2d.translate(0,controlPoints[0].y); + g2d.scale(1, -1); + g2d.translate(0, -1*controlPoints[0].y); + } + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(2)); g2d.draw(body[0]); @@ -74,6 +103,7 @@ public abstract class AbstractTransistorSymbol extends AbstractComponent g2d.draw(body[1]); g2d.fill(body[2]); + g2d.setTransform(old); // Draw label g2d.setFont(LABEL_FONT); @@ -90,7 +120,16 @@ public abstract class AbstractTransistorSymbol extends AbstractComponent : LABEL_COLOR; } g2d.setColor(finalLabelColor); - drawCenteredText(g2d, display == Display.VALUE ? getValue() : getName(), + String label=""; + label = display == Display.NAME ? getName() + : (getValue() == null ? "" : getValue().toString()); + if (display==Display.NONE) { + label=""; + } + if (display==Display.BOTH) { + label=getName()+" "+(getValue() == null ? "" : getValue().toString()); + } + drawCenteredText(g2d, label, x + pinSpacing * 2, y, HorizontalAlignment.LEFT, VerticalAlignment.CENTER); } @@ -144,6 +183,15 @@ public abstract class AbstractTransistorSymbol extends AbstractComponent // Invalidate body body = null; } + + @EditableProperty + public SymbolFlipping getFlipping() { + return flipping; + } + + public void setFlipping(SymbolFlipping flipping) { + this.flipping = flipping; + } @EditableProperty public Color getColor() { diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/BJTSymbol.java b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/BJTSymbol.java index 1e897985..9dc21c0a 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/BJTSymbol.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/BJTSymbol.java @@ -12,7 +12,7 @@ import org.diylc.core.IDIYComponent; import org.diylc.core.annotations.ComponentDescriptor; import org.diylc.core.annotations.EditableProperty; -@ComponentDescriptor(name = "BJT Symbol", author = "Branislav Stojkovic", category = "Schematics", instanceNamePrefix = "Q", description = "Bipolar junction transistor schematic symbol", stretchable = false, zOrder = IDIYComponent.COMPONENT, rotatable = false) +@ComponentDescriptor(name = "BJT Symbol", author = "Branislav Stojkovic", category = "Schematics", instanceNamePrefix = "Q", description = "Bipolar junction transistor schematic symbol", stretchable = false, zOrder = IDIYComponent.COMPONENT, rotatable = true) public class BJTSymbol extends AbstractTransistorSymbol { private static final long serialVersionUID = 1L; diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/DIL_IC.java b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/DIL_IC.java index 6636e971..23755e5f 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/DIL_IC.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/DIL_IC.java @@ -18,6 +18,7 @@ import org.diylc.common.IPlugInPort; import org.diylc.common.ObjectCache; import org.diylc.common.Orientation; import org.diylc.components.AbstractTransparentComponent; +import org.diylc.components.misc.Label; import org.diylc.core.ComponentState; import org.diylc.core.IDIYComponent; import org.diylc.core.IDrawingObserver; @@ -44,6 +45,7 @@ public class DIL_IC extends AbstractTransparentComponent { 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.07d, SizeUnit.in); + public static DisplayNumbers DISPLAY_NUMBERS = DisplayNumbers.NO; private String value = ""; private Orientation orientation = Orientation.DEFAULT; @@ -56,6 +58,7 @@ public class DIL_IC extends AbstractTransparentComponent { private Color borderColor = BORDER_COLOR; private Color labelColor = LABEL_COLOR; private Color indentColor = INDENT_COLOR; + private DisplayNumbers displayNumbers = DISPLAY_NUMBERS; // new Point(0, pinSpacing.convertToPixels()), // new Point(0, 2 * pinSpacing.convertToPixels()), // new Point(0, 3 * pinSpacing.convertToPixels()), @@ -334,7 +337,14 @@ public class DIL_IC extends AbstractTransparentComponent { } g2d.setColor(finalLabelColor); FontMetrics fontMetrics = g2d.getFontMetrics(g2d.getFont()); - String label = display == Display.NAME ? getName() : getValue(); + 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()); @@ -343,6 +353,60 @@ public class DIL_IC extends AbstractTransparentComponent { int x = bounds.x + (bounds.width - textWidth) / 2; int y = bounds.y + (bounds.height - textHeight) / 2 + fontMetrics.getAscent(); g2d.drawString(label, x, y); + + //draw pin numbers + int pinNo=0; + int j=0; + int k=0; + int pinSize=(int)PIN_SIZE.convertToPixels(); + for (Point point : controlPoints) { + pinNo++; + + //determine points relative to rotation + int textX1=point.x-2*pinSize; + int textY1=point.y+pinSize/2; + int textX2=point.x+pinSize; + int textY2=point.y+pinSize/2; + if (orientation==Orientation._90) { + textX2=textX2-pinSize-pinSize/2; + textY2=textY2+pinSize; + textX1=textX1+2*pinSize-pinSize/2; + textY1=textY1-pinSize; + } + if (orientation==Orientation._180) { + textX1=textX1+3*pinSize; + textX2=textX2-3*pinSize; + } + if (orientation==Orientation._270) { + textX1 = textX1+pinSize+pinSize/2; + textY1 = textY1+pinSize; + textX2 = textX2-pinSize-pinSize/2; + textY2 = textY2-pinSize; + } + + g2d.setFont(LABEL_FONT.deriveFont((float)(Label.LABEL_FONT.getSize2D()*0.66))); + if (displayNumbers==DisplayNumbers.DIP){ + if (pinNo>pinCount.getValue()/2) { + g2d.drawString(Integer.toString(pinCount.getValue()-j), textX1, textY1); + j++; + } + else + { + g2d.drawString(Integer.toString(pinNo), textX2, textY2); + } + } + if (displayNumbers==DisplayNumbers.CONNECTOR){ + if (pinNo>pinCount.getValue()/2) { + k++; + g2d.drawString(Integer.toString(pinNo-(pinCount.getValue()/2)+k), textX1, textY1); + } + else + { + g2d.drawString(Integer.toString(pinNo+j), textX2, textY2); + j++; + } + } + } } @Override @@ -407,6 +471,15 @@ public class DIL_IC extends AbstractTransparentComponent { public void setIndentColor(Color indentColor) { this.indentColor = indentColor; } + + @EditableProperty(name = "Display pin numbers") + public DisplayNumbers getDisplayNumbers() { + return displayNumbers; + } + + public void setDisplayNumbers(DisplayNumbers numbers) { + this.displayNumbers=numbers; + } public static enum PinCount { @@ -421,4 +494,14 @@ public class DIL_IC extends AbstractTransparentComponent { return Integer.parseInt(toString()); } } + + public enum DisplayNumbers { + + NO, DIP, CONNECTOR; + + @Override + public String toString() { + return name(); + } + } } diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/ICSymbol.java b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/ICSymbol.java index cbd4f3f7..5e83e2f9 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/ICSymbol.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/ICSymbol.java @@ -102,7 +102,15 @@ public class ICSymbol extends AbstractTransparentComponent { } g2d.setColor(finalLabelColor); int x = (controlPoints[0].x + controlPoints[2].x) / 2; - drawCenteredText(g2d, display == Display.VALUE ? getValue() : getName(), x, + String label=""; + label = display == Display.VALUE ? getValue() : getName(); + if (display==Display.NONE) { + label=""; + } + if (display==Display.BOTH) { + label=getName()+" "+(getValue() == null ? "" : getValue().toString()); + } + drawCenteredText(g2d, label, x, controlPoints[0].y + pinSpacing, HorizontalAlignment.CENTER, VerticalAlignment.CENTER); // Draw +/- markers diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/JFETSymbol.java b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/JFETSymbol.java index 6f76a28c..e4ef88c3 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/JFETSymbol.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/JFETSymbol.java @@ -10,7 +10,7 @@ import org.diylc.core.IDIYComponent; import org.diylc.core.annotations.ComponentDescriptor; import org.diylc.core.annotations.EditableProperty; -@ComponentDescriptor(name = "JFET Symbol", author = "Branislav Stojkovic", category = "Schematics", instanceNamePrefix = "Q", description = "JFET transistor schematic symbol", stretchable = false, zOrder = IDIYComponent.COMPONENT, rotatable = false) +@ComponentDescriptor(name = "JFET Symbol", author = "Branislav Stojkovic", category = "Schematics", instanceNamePrefix = "Q", description = "JFET transistor schematic symbol", stretchable = false, zOrder = IDIYComponent.COMPONENT, rotatable = true) public class JFETSymbol extends AbstractTransistorSymbol { private static final long serialVersionUID = 1L; diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/MOSFETSymbol.java b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/MOSFETSymbol.java index c5ca68b1..b6dce844 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/MOSFETSymbol.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/MOSFETSymbol.java @@ -10,7 +10,7 @@ import org.diylc.core.IDIYComponent; import org.diylc.core.annotations.ComponentDescriptor; import org.diylc.core.annotations.EditableProperty; -@ComponentDescriptor(name = "MOSFET Symbol", author = "Branislav Stojkovic", category = "Schematics", instanceNamePrefix = "Q", description = "MOSFET transistor schematic symbol", stretchable = false, zOrder = IDIYComponent.COMPONENT, rotatable = false) +@ComponentDescriptor(name = "MOSFET Symbol", author = "Branislav Stojkovic", category = "Schematics", instanceNamePrefix = "Q", description = "MOSFET transistor schematic symbol", stretchable = false, zOrder = IDIYComponent.COMPONENT, rotatable = true) public class MOSFETSymbol extends AbstractTransistorSymbol { private static final long serialVersionUID = 1L; diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/SIL_IC.java b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/SIL_IC.java index cf4df5ce..31de4c5c 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/SIL_IC.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/SIL_IC.java @@ -320,7 +320,14 @@ public class SIL_IC extends AbstractTransparentComponent { } g2d.setColor(finalLabelColor); FontMetrics fontMetrics = g2d.getFontMetrics(g2d.getFont()); - String label = display == Display.NAME ? getName() : getValue(); + 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()); diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/TransistorTO1.java b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/TransistorTO1.java index 68d5302b..3feaa36f 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/TransistorTO1.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/TransistorTO1.java @@ -252,7 +252,14 @@ public class TransistorTO1 extends AbstractTransparentComponent { : getLabelColor(); } g2d.setColor(finalLabelColor); - String label = (getDisplay() == Display.NAME) ? getName() : getValue(); + String label=""; + label = (getDisplay() == Display.NAME) ? getName() : getValue(); + if (getDisplay() ==Display.NONE) { + label=""; + } + if (getDisplay() ==Display.BOTH) { + label=getName()+" "+(getValue() == null ? "" : getValue().toString()); + } FontMetrics fontMetrics = g2d.getFontMetrics(g2d.getFont()); Rectangle2D rect = fontMetrics.getStringBounds(label, g2d); int textHeight = (int) (rect.getHeight()); diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/TransistorTO220.java b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/TransistorTO220.java index a3732a58..d1ec4956 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/TransistorTO220.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/TransistorTO220.java @@ -398,7 +398,14 @@ public class TransistorTO220 extends AbstractTransparentComponent { : LABEL_COLOR; } g2d.setColor(finalLabelColor); - String label = (getDisplay() == Display.NAME) ? getName() : getValue(); + String label=""; + label = (getDisplay() == Display.NAME) ? getName() : getValue(); + if (getDisplay() ==Display.NONE) { + label=""; + } + if (getDisplay() ==Display.BOTH) { + label=getName()+" "+(getValue() == null ? "" : getValue().toString()); + } FontMetrics fontMetrics = g2d.getFontMetrics(g2d.getFont()); Rectangle2D rect = fontMetrics.getStringBounds(label, g2d); int textHeight = (int) (rect.getHeight()); diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/TransistorTO3.java b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/TransistorTO3.java index e2fd7773..e698b7c4 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/TransistorTO3.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/TransistorTO3.java @@ -291,7 +291,14 @@ public class TransistorTO3 extends AbstractTransparentComponent { : getLabelColor(); } g2d.setColor(finalLabelColor); - String label = (getDisplay() == Display.NAME) ? getName() : getValue(); + String label=""; + label = (getDisplay() == Display.NAME) ? getName() : getValue(); + if (getDisplay() ==Display.NONE) { + label=""; + } + if (getDisplay() ==Display.BOTH) { + label=getName()+" "+(getValue() == null ? "" : getValue().toString()); + } FontMetrics fontMetrics = g2d.getFontMetrics(g2d.getFont()); Rectangle2D rect = fontMetrics.getStringBounds(label, g2d); int textHeight = (int) (rect.getHeight()); diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/TransistorTO92.java b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/TransistorTO92.java index 727481e4..236f8074 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/TransistorTO92.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/semiconductors/TransistorTO92.java @@ -288,7 +288,14 @@ public class TransistorTO92 extends AbstractTransparentComponent { : getLabelColor(); } g2d.setColor(finalLabelColor); - String label = (getDisplay() == Display.NAME) ? getName() : getValue(); + String label=""; + label = (getDisplay() == Display.NAME) ? getName() : getValue(); + if (display==Display.NONE) { + label=""; + } + if (display==Display.BOTH) { + label=getName()+" "+getValue(); + } FontMetrics fontMetrics = g2d.getFontMetrics(g2d.getFont()); Rectangle2D rect = fontMetrics.getStringBounds(label, g2d); int textHeight = (int) (rect.getHeight()); diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/tube/AbstractTubeSymbol.java b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/tube/AbstractTubeSymbol.java index 04941b56..31e4cb82 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/tube/AbstractTubeSymbol.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/tube/AbstractTubeSymbol.java @@ -85,8 +85,16 @@ public abstract class AbstractTubeSymbol extends AbstractComponent { } g2d.setColor(finalLabelColor); Point p = getTextLocation(); + String label=""; + label = display == Display.VALUE ? getValue() : getName(); + if (display==Display.NONE) { + label=""; + } + if (display==Display.BOTH) { + label=getName()+" "+(getValue() == null ? "" : getValue().toString()); + } drawCenteredText(g2d, - display == Display.VALUE ? getValue() : getName(), p.x, p.y, + label, p.x, p.y, HorizontalAlignment.LEFT, VerticalAlignment.TOP); } diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/.classpath b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/.classpath index 6b78366d..46ccb2bb 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/.classpath +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/.classpath @@ -2,7 +2,6 @@ - @@ -16,5 +15,6 @@ + diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/diylc.l4j.ini b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/diylc.l4j.ini index 92012be2..1ae2d02e 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/diylc.l4j.ini +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/diylc.l4j.ini @@ -1 +1 @@ --Xms512m -Xmx1024m -Dorg.diylc.scriptRun=true \ No newline at end of file +-Xms512m -Xmx1024m -Dorg.diylc.scriptRun=true -Dfile.encoding=UTF-8 \ No newline at end of file diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/lib/diylc-core.jar b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/lib/diylc-core.jar index 16bbc049..6e445fa1 100644 Binary files a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/lib/diylc-core.jar and b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/lib/diylc-core.jar differ diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/library/main.jar b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/library/main.jar index ad37f99a..7c39bd34 100644 Binary files a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/library/main.jar and b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/library/main.jar differ diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/edit/EditMenuPlugin.java b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/edit/EditMenuPlugin.java index b70ba2b2..904eeea3 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/edit/EditMenuPlugin.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/edit/EditMenuPlugin.java @@ -261,7 +261,7 @@ public class EditMenuPlugin implements IPlugIn, ClipboardOwner { @Override public EnumSet getSubscribedEventTypes() { return EnumSet.of(EventType.SELECTION_CHANGED, - EventType.PROJECT_MODIFIED); + EventType.PROJECT_MODIFIED, EventType.PROJECT_LOADED); } @Override @@ -274,6 +274,9 @@ public class EditMenuPlugin implements IPlugIn, ClipboardOwner { undoHandler.stateChanged((Project) params[0], (Project) params[1], (String) params[2]); break; + case PROJECT_LOADED: + undoHandler.reset(); + break; } } diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/help/HelpMenuPlugin.java b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/help/HelpMenuPlugin.java index 3f203299..11e215de 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/help/HelpMenuPlugin.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/help/HelpMenuPlugin.java @@ -72,7 +72,7 @@ public class HelpMenuPlugin implements IPlugIn { aboutDialog = DialogFactory.getInstance().createAboutDialog("DIY Layout Creator", IconLoader.IconLarge.getIcon(), plugInPort.getCurrentVersionNumber().toString(), "Branislav Stojkovic", - "diylc.org", "bancika@gmail.com", ""); + "https://github.com/bancika/diy-layout-creator", "bancika@gmail.com", ""); } return aboutDialog; } diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/update.xml b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/update.xml index 3211e4d0..eef1fd35 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/update.xml +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/update.xml @@ -1256,6 +1256,46 @@ http://code.google.com/p/diy-layout-creator/downloads/list + + + + 3 + 29 + 0 + + 2016-04-20 20:00:00.000 CET + + + + BUG_FIX + Issue with losing saved user configuration + + + BUG_FIX + Issue with disabled "Save as Template" context menu item problem, as well as issue with strange rotation and probably few more + + + BUG_FIX + Undo steps kept after opening a new file + + + NEW_FEATURE + Transistors can be rotated and flipped vertically + + + NEW_FEATURE + DIL ICs can show pin numbers + + + NEW_FEATURE + Display both component value and name or neither of them + + + NEW_FEATURE + Potentiometer schematic symbol added + + + http://code.google.com/p/diy-layout-creator/downloads/list \ No newline at end of file