diff --git a/diylc/diylc-library/.classpath b/diylc/diylc-library/.classpath index 65cadc9a..490517cd 100644 --- a/diylc/diylc-library/.classpath +++ b/diylc/diylc-library/.classpath @@ -4,6 +4,7 @@ + diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar index 57a48d4c..abfef2aa 100644 Binary files a/diylc/diylc-library/lib/diylc-core.jar and b/diylc/diylc-library/lib/diylc-core.jar differ diff --git a/diylc/diylc-library/lib/poi-3.5-FINAL-20090928.jar b/diylc/diylc-library/lib/poi-3.5-FINAL-20090928.jar new file mode 100644 index 00000000..9ff92b02 Binary files /dev/null and b/diylc/diylc-library/lib/poi-3.5-FINAL-20090928.jar differ 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 c5958271..79bae3a5 100644 --- a/diylc/diylc-library/src/org/diylc/components/misc/Image.java +++ b/diylc/diylc-library/src/org/diylc/components/misc/Image.java @@ -1,160 +1,195 @@ /* + * + * DIY Layout Creator (DIYLC). Copyright (c) 2009-2018 held jointly by the individual authors. + * + * This file is part of DIYLC. + * + * DIYLC is free software: you can redistribute it and/or modify it under the terms of the GNU + * General Public License as published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * DIYLC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + * Public License for more details. + * + * You should have received a copy of the GNU General Public License along with DIYLC. If not, see + * . + */ +package org.diylc.components.misc; - DIY Layout Creator (DIYLC). - Copyright (c) 2009-2018 held jointly by the individual authors. +import java.awt.AlphaComposite; +import java.awt.Composite; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.Shape; +import java.awt.geom.Rectangle2D; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.IOException; - This file is part of DIYLC. +import javax.imageio.ImageIO; +import javax.swing.ImageIcon; - DIYLC is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. +import org.apache.poi.util.IOUtils; +import org.diylc.appframework.miscutils.IconImageConverter; +import org.diylc.common.ObjectCache; +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.VisibilityPolicy; +import org.diylc.core.annotations.BomPolicy; +import org.diylc.core.annotations.ComponentDescriptor; +import org.diylc.core.annotations.EditableProperty; +import org.diylc.core.annotations.PercentEditor; - DIYLC is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +import sun.awt.image.ToolkitImage; - You should have received a copy of the GNU General Public License - along with DIYLC. If not, see . +import com.thoughtworks.xstream.annotations.XStreamConverter; -*/ -package org.diylc.components.misc; - -import java.awt.AlphaComposite; -import java.awt.Composite; -import java.awt.Graphics2D; -import java.awt.Point; -import java.awt.Shape; -import java.awt.geom.Rectangle2D; -import javax.swing.ImageIcon; +@ComponentDescriptor(name = "Image", author = "Branislav Stojkovic", category = "Misc", + description = "User defined image", instanceNamePrefix = "Img", zOrder = IDIYComponent.COMPONENT, + flexibleZOrder = true, stretchable = false, bomPolicy = BomPolicy.NEVER_SHOW) +public class Image extends AbstractTransparentComponent { -import org.diylc.appframework.miscutils.IconImageConverter; -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.VisibilityPolicy; -import org.diylc.core.annotations.BomPolicy; -import org.diylc.core.annotations.ComponentDescriptor; -import org.diylc.core.annotations.EditableProperty; -import org.diylc.core.annotations.PercentEditor; + private static final long serialVersionUID = 1L; + public static String DEFAULT_TEXT = "Double click to edit text"; + private static ImageIcon ICON; + private static byte DEFAULT_SCALE = 50; -import com.thoughtworks.xstream.annotations.XStreamConverter; - -@ComponentDescriptor(name = "Image", author = "Branislav Stojkovic", category = "Misc", - description = "User defined image", instanceNamePrefix = "Img", zOrder = IDIYComponent.COMPONENT, - flexibleZOrder = true, stretchable = false, bomPolicy = BomPolicy.NEVER_SHOW) -public class Image extends AbstractTransparentComponent { - - private static final long serialVersionUID = 1L; - public static String DEFAULT_TEXT = "Double click to edit text"; - private static ImageIcon ICON; - private static byte DEFAULT_SCALE = 50; - - static { - String name = "image.png"; - java.net.URL imgURL = Image.class.getResource(name); - if (imgURL != null) { - ICON = new ImageIcon(imgURL, name); - } + static { + String name = "image.png"; + java.net.URL imgURL = Image.class.getResource(name); + if (imgURL != null) { + ICON = new ImageIcon(imgURL, name); + } } - + @Override public String getControlPointNodeName(int index) { return null; - } - - private Point point = new Point(0, 0); - @XStreamConverter(IconImageConverter.class) - private ImageIcon image = ICON; - private byte scale = DEFAULT_SCALE; - - @Override - public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, Project project, - IDrawingObserver drawingObserver) { - double s = 1d * scale / DEFAULT_SCALE; - Shape clip = g2d.getClip().getBounds(); - if (!clip.intersects(new Rectangle2D.Double(point.getX(), point.getY(), image.getIconWidth() * s, image - .getIconHeight() * s))) { - return; - } - Composite oldComposite = g2d.getComposite(); - if (alpha < MAX_ALPHA) { - g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f * alpha / MAX_ALPHA)); - } - - g2d.scale(s, s); - g2d.drawImage(image.getImage(), (int) (point.x / s), (int) (point.y / s), null); - if (componentState == ComponentState.SELECTED) { - g2d.setComposite(oldComposite); - g2d.scale(1 / s, 1 / s); - g2d.setColor(SELECTION_COLOR); - g2d.drawRect(point.x, point.y, (int) (image.getIconWidth() * s), (int) (image.getIconHeight() * s)); - } - } - - @Override - public void drawIcon(Graphics2D g2d, int width, int height) { - g2d.drawImage(ICON.getImage(), point.x, point.y, null); - } - - @Override - public int getControlPointCount() { - return 1; - } - - @Override - public Point getControlPoint(int index) { - return point; - } - - @Override - public boolean isControlPointSticky(int index) { - return false; - } - - @Override - public VisibilityPolicy getControlPointVisibilityPolicy(int index) { - return VisibilityPolicy.NEVER; - } - - @Override - public void setControlPoint(Point point, int index) { - this.point.setLocation(point); - } - - @EditableProperty(defaultable = false) - public ImageIcon getImage() { - return image; - } - - public void setImage(ImageIcon image) { - this.image = image; - } - - @PercentEditor(_100PercentValue = 50) - @EditableProperty(defaultable = false) - public byte getScale() { - return scale; - } - - public void setScale(byte scale) { - this.scale = scale; - } - - @Override - public String getName() { - return super.getName(); - } - - @Override - public Void getValue() { - return null; - } - - @Override - public void setValue(Void value) {} -} + } + + private Point point = new Point(0, 0); + + @XStreamConverter(IconImageConverter.class) + @Deprecated + private ImageIcon image; + private byte[] data; + private byte scale = DEFAULT_SCALE; + + public Image() { + try { + data = IOUtils.toByteArray(Image.class.getResourceAsStream("image.png")); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, Project project, + IDrawingObserver drawingObserver) { + double s = 1d * scale / DEFAULT_SCALE; + Shape clip = g2d.getClip().getBounds(); + if (!clip.intersects(new Rectangle2D.Double(point.getX(), point.getY(), getImage().getIconWidth() * s, getImage() + .getIconHeight() * s))) { + return; + } + Composite oldComposite = g2d.getComposite(); + if (alpha < MAX_ALPHA) { + g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f * alpha / MAX_ALPHA)); + } + + g2d.scale(s, s); + g2d.drawImage(getImage().getImage(), (int) (point.x / s), (int) (point.y / s), null); + if (componentState == ComponentState.SELECTED) { + g2d.setComposite(oldComposite); + g2d.scale(1 / s, 1 / s); + g2d.setColor(SELECTION_COLOR); + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1f)); + g2d.drawRect(point.x, point.y, (int) (getImage().getIconWidth() * s), (int) (getImage().getIconHeight() * s)); + } + } + + @Override + public void drawIcon(Graphics2D g2d, int width, int height) { + g2d.drawImage(ICON.getImage(), point.x, point.y, null); + } + + @Override + public int getControlPointCount() { + return 1; + } + + @Override + public Point getControlPoint(int index) { + return point; + } + + @Override + public boolean isControlPointSticky(int index) { + return false; + } + + @Override + public VisibilityPolicy getControlPointVisibilityPolicy(int index) { + return VisibilityPolicy.NEVER; + } + + @Override + public void setControlPoint(Point point, int index) { + this.point.setLocation(point); + } + + public ImageIcon getImage() { + if (image != null) { + BufferedImage bi = ((ToolkitImage) image.getImage()).getBufferedImage(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try { + ImageIO.write(bi, "png", baos); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + data = baos.toByteArray(); + image = null; + } + + return new ImageIcon(data); + } + + @EditableProperty(name = "Image") + public byte[] getData() { + return data; + } + + public void setData(byte[] data) { + this.data = data; + this.image = null; + } + + @PercentEditor(_100PercentValue = 50) + @EditableProperty(defaultable = false) + public byte getScale() { + return scale; + } + + public void setScale(byte scale) { + this.scale = scale; + } + + @Override + public String getName() { + return super.getName(); + } + + @Override + public Void getValue() { + return null; + } + + @Override + public void setValue(Void value) {} +} diff --git a/diylc/diylc-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar index 57a48d4c..abfef2aa 100644 Binary files a/diylc/diylc-swing/lib/diylc-core.jar and b/diylc/diylc-swing/lib/diylc-core.jar differ diff --git a/diylc/diylc-swing/library/main.jar b/diylc/diylc-swing/library/main.jar index c6e00727..63f2dc72 100644 Binary files a/diylc/diylc-swing/library/main.jar and b/diylc/diylc-swing/library/main.jar differ diff --git a/diylc/diylc-swing/src/org/diylc/swing/gui/editor/FieldEditorFactory.java b/diylc/diylc-swing/src/org/diylc/swing/gui/editor/FieldEditorFactory.java index 463288d3..8ace07f6 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/gui/editor/FieldEditorFactory.java +++ b/diylc/diylc-swing/src/org/diylc/swing/gui/editor/FieldEditorFactory.java @@ -21,18 +21,17 @@ */ package org.diylc.swing.gui.editor; -import java.awt.Color; -import java.awt.Component; -import java.awt.Font; - -import javax.swing.ImageIcon; -import javax.swing.JLabel; - -import org.apache.log4j.Logger; -import org.diylc.common.PropertyWrapper; -import org.diylc.core.annotations.DynamicList; -import org.diylc.core.annotations.MultiLineText; -import org.diylc.core.measures.AbstractMeasure; +import java.awt.Color; +import java.awt.Component; +import java.awt.Font; + +import javax.swing.JLabel; + +import org.apache.log4j.Logger; +import org.diylc.common.PropertyWrapper; +import org.diylc.core.annotations.DynamicList; +import org.diylc.core.annotations.MultiLineText; +import org.diylc.core.measures.AbstractMeasure; /** * Based on {@link PropertyWrapper#getType()}, creates an appropriate {@link Component} that can @@ -77,7 +76,7 @@ public class FieldEditorFactory { MeasureArrayEditor editor = new MeasureArrayEditor(property); return editor; } - if (ImageIcon.class.isAssignableFrom(property.getType())) { + if (byte[].class.isAssignableFrom(property.getType())) { ImageEditor editor = new ImageEditor(property); return editor; } diff --git a/diylc/diylc-swing/src/org/diylc/swing/gui/editor/ImageEditor.java b/diylc/diylc-swing/src/org/diylc/swing/gui/editor/ImageEditor.java index 119dea6e..49635646 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/gui/editor/ImageEditor.java +++ b/diylc/diylc-swing/src/org/diylc/swing/gui/editor/ImageEditor.java @@ -21,15 +21,18 @@ */ package org.diylc.swing.gui.editor; -import java.awt.event.ActionListener; -import java.io.File; - -import javax.swing.ImageIcon; -import javax.swing.JButton; - -import org.diylc.common.PropertyWrapper; -import org.diylc.swing.gui.DialogFactory; -import org.diylc.swing.plugins.file.FileFilterEnum; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; + +import javax.swing.JButton; + +import org.apache.poi.util.IOUtils; +import org.diylc.common.PropertyWrapper; +import org.diylc.swing.gui.DialogFactory; +import org.diylc.swing.plugins.file.FileFilterEnum; public class ImageEditor extends JButton { @@ -47,9 +50,22 @@ public class ImageEditor extends JButton { DialogFactory.getInstance().showOpenDialog(FileFilterEnum.IMAGES.getFilter(), null, FileFilterEnum.IMAGES.getExtensions()[0], null); if (file != null) { - property.setChanged(true); - ImageIcon image = new ImageIcon(file.getAbsolutePath()); - property.setValue(image); + property.setChanged(true); + FileInputStream fis; + try { + fis = new FileInputStream(file); + byte[] byteArray = IOUtils.toByteArray(fis); +// ImageIcon image = new ImageIcon(file.getAbsolutePath()); + property.setValue(byteArray); + fis.close(); + } catch (FileNotFoundException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } catch (IOException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + } } }); diff --git a/diylc/diylc-swing/update.xml b/diylc/diylc-swing/update.xml index e410250c..a8d7b22d 100644 --- a/diylc/diylc-swing/update.xml +++ b/diylc/diylc-swing/update.xml @@ -2477,7 +2477,11 @@ NEW_FEATURE Added ability to mark common lugs on all "Lever Switch" types with a different color - + + + IMPROVEMENT + Improve performance of "Image" component and greatly reduce file size when images are present + IMPROVEMENT Allow a file to be loaded if it references a missing component property, but show a warning.