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.