diff --git a/diylc/diylc-core/src/org/diylc/presenter/update.xml b/diylc/diylc-core/src/org/diylc/presenter/update.xml index 79547f52..d576c503 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/update.xml +++ b/diylc/diylc-core/src/org/diylc/presenter/update.xml @@ -3045,6 +3045,10 @@ NEW_FEATURE Internationalization - added support for translating UI of the app to other languages. Get in touch if you wish to translate DIYLC to your language + + + NEW_FEATURE + Added "Sizing Mode" to Image component that allows stretching the image freely using two control points IMPROVEMENT diff --git a/diylc/diylc-library/src/org/diylc/components/misc/Image.java b/diylc/diylc-library/src/org/diylc/components/misc/Image.java index 85230e4b..bf2ce398 100644 --- a/diylc/diylc-library/src/org/diylc/components/misc/Image.java +++ b/diylc/diylc-library/src/org/diylc/components/misc/Image.java @@ -72,6 +72,7 @@ public class Image extends AbstractTransparentComponent { } private Point point = new Point(0, 0); + private Point secondPoint = null; @XStreamConverter(IconImageConverter.class) @Deprecated @@ -79,6 +80,7 @@ public class Image extends AbstractTransparentComponent { private byte[] data; private Byte scale; private byte newScale = DEFAULT_SCALE; + private ImageSizingMode sizingMode = ImageSizingMode.Scale; public Image() { try { @@ -91,25 +93,47 @@ public class Image extends AbstractTransparentComponent { @Override public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, Project project, IDrawingObserver drawingObserver) { - double s = 1d * getScale() / DEFAULT_SCALE; + double scaleX; + double scaleY; + ImageIcon imageIcon = getImage(); + if (getSizingMode() == ImageSizingMode.Scale) { + scaleX = scaleY = 1d * getScale() / DEFAULT_SCALE; + } else { + Point secondPoint = getControlPoint(1); + scaleX = 1d * Math.abs(point.x - secondPoint.x) / imageIcon.getIconWidth(); + scaleY = 1d * Math.abs(point.y - secondPoint.y) / imageIcon.getIconHeight(); + } + Shape clip = g2d.getClip().getBounds(); - if (!clip.intersects(new Rectangle2D.Double(point.getX(), point.getY(), getImage().getIconWidth() * s, getImage() - .getIconHeight() * s))) { + if (!clip.intersects(new Rectangle2D.Double(point.getX(), point.getY(), imageIcon.getIconWidth() * scaleX, imageIcon + .getIconHeight() * scaleY))) { return; } Composite oldComposite = g2d.getComposite(); if (alpha < MAX_ALPHA) { g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f * alpha / MAX_ALPHA)); } + + int x; + int y; + if (getSizingMode() == ImageSizingMode.Scale) + { + x = point.x; + y = point.y; + } else { + Point secondPoint = getControlPoint(1); + x = Math.min(point.x, secondPoint.x); + y = Math.min(point.y, secondPoint.y); + } - g2d.scale(s, s); - g2d.drawImage(getImage().getImage(), (int) (point.x / s), (int) (point.y / s), null); + g2d.scale(scaleX, scaleY); + g2d.drawImage(imageIcon.getImage(), (int) (x / scaleX), (int) (y / scaleY), null); if (componentState == ComponentState.SELECTED) { g2d.setComposite(oldComposite); - g2d.scale(1 / s, 1 / s); + g2d.scale(1 / scaleX, 1 / scaleY); g2d.setColor(SELECTION_COLOR); g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1f)); - g2d.drawRect(point.x, point.y, (int) (getImage().getIconWidth() * s), (int) (getImage().getIconHeight() * s)); + g2d.drawRect(x, y, (int) (imageIcon.getIconWidth() * scaleX), (int) (imageIcon.getIconHeight() * scaleY)); } } @@ -120,12 +144,18 @@ public class Image extends AbstractTransparentComponent { @Override public int getControlPointCount() { - return 1; + return getSizingMode() == ImageSizingMode.Scale ? 1 : 2; } @Override public Point getControlPoint(int index) { - return point; + if (index == 0) + return point; + if (secondPoint == null) { + ImageIcon imageIcon = getImage(); + secondPoint = new Point(point.x + imageIcon.getIconWidth(), point.y + imageIcon.getIconHeight()); + } + return secondPoint; } @Override @@ -135,12 +165,19 @@ public class Image extends AbstractTransparentComponent { @Override public VisibilityPolicy getControlPointVisibilityPolicy(int index) { - return VisibilityPolicy.NEVER; + return getSizingMode() == ImageSizingMode.Scale ? VisibilityPolicy.NEVER : VisibilityPolicy.WHEN_SELECTED; } @Override public void setControlPoint(Point point, int index) { - this.point.setLocation(point); + if (index == 0) { + this.point.setLocation(point); + } else { + if (secondPoint == null) + secondPoint = new Point(point); + else + secondPoint.setLocation(point); + } } public ImageIcon getImage() { @@ -169,6 +206,10 @@ public class Image extends AbstractTransparentComponent { public void setData(byte[] data) { this.data = data; this.image = null; + if (getSizingMode() == ImageSizingMode.TwoPoints) { + ImageIcon imageIcon = getImage(); + setControlPoint(new Point(point.x + imageIcon.getIconWidth(), point.y + imageIcon.getIconHeight()), 1); + } } @PercentEditor(_100PercentValue = 25) @@ -194,7 +235,33 @@ public class Image extends AbstractTransparentComponent { public Void getValue() { return null; } + + @EditableProperty(name = "Sizing Mode") + public ImageSizingMode getSizingMode() { + if (sizingMode == null) + sizingMode = ImageSizingMode.Scale; + return sizingMode; + } + + public void setSizingMode(ImageSizingMode sizingMode) { + this.sizingMode = sizingMode; + } @Override public void setValue(Void value) {} + + public static enum ImageSizingMode { + TwoPoints("Opposing Points"), Scale("Scale"); + + private String label; + + private ImageSizingMode(String label) { + this.label = label; + } + + @Override + public String toString() { + return label; + } + } } diff --git a/diylc/diylc-swing/dict.txt b/diylc/diylc-swing/dict.txt index ed712e92..16dfd2d2 100644 --- a/diylc/diylc-swing/dict.txt +++ b/diylc/diylc-swing/dict.txt @@ -36,7 +36,6 @@ DP3T DP5T DPDT DPDT (Center OFF) -Deutsch E-B-C BJT English Espaņol @@ -45,12 +44,10 @@ G-D-S JFET G-D-S MOSFET G-S-D JFET G-S-D MOSFET -Italiano Lin Log NPN Nand -Nederlands Nor Not Or