Merge commit '42b2e5ca519766e37ce6941ba4faecc9691cc403' into upstream
[debian/openrocket] / core / src / net / sf / openrocket / gui / preset / ImagePreviewPanel.java
diff --git a/core/src/net/sf/openrocket/gui/preset/ImagePreviewPanel.java b/core/src/net/sf/openrocket/gui/preset/ImagePreviewPanel.java
new file mode 100644 (file)
index 0000000..bab36ec
--- /dev/null
@@ -0,0 +1,105 @@
+
+package net.sf.openrocket.gui.preset;
+
+
+import javax.swing.*;
+import java.awt.*;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.io.File;
+
+/**
+ * From a JavaLobby article by Michael Urban:  http://www.javalobby.org/java/forums/t49462.html
+ */
+public class ImagePreviewPanel extends JPanel
+        implements PropertyChangeListener {
+
+    private int width, height;
+    private ImageIcon icon;
+    private Image image;
+    private static final int ACCSIZE = 155;
+    private Color bg;
+
+    public ImagePreviewPanel() {
+        setPreferredSize(new Dimension(ACCSIZE, -1));
+        bg = getBackground();
+    }
+
+    public void propertyChange(PropertyChangeEvent e) {
+        String propertyName = e.getPropertyName();
+
+        // Make sure we are responding to the right event.
+        if (propertyName.equals(JFileChooser.SELECTED_FILE_CHANGED_PROPERTY)) {
+            File selection = (File)e.getNewValue();
+            String name;
+
+            if (selection == null)
+                return;
+            else
+                name = selection.getAbsolutePath();
+
+            /*
+             * Make reasonably sure we have an image format that AWT can
+             * handle so we don't try to draw something silly.
+             */
+            if ((name != null) &&
+                    name.toLowerCase().endsWith(".jpg") ||
+                    name.toLowerCase().endsWith(".jpeg") ||
+                    name.toLowerCase().endsWith(".gif") ||
+                    name.toLowerCase().endsWith(".png")) {
+                icon = new ImageIcon(name);
+                image = icon.getImage();
+                scaleImage();
+                repaint();
+            }
+        }
+    }
+
+    private void scaleImage() {
+        width = image.getWidth(this);
+        height = image.getHeight(this);
+        double ratio = 1.0;
+
+        /*
+         * Determine how to scale the image. Since the accessory can expand
+         * vertically make sure we don't go larger than 150 when scaling
+         * vertically.
+         */
+        if (width >= height) {
+            ratio = (double)(ACCSIZE-5) / width;
+            width = ACCSIZE-5;
+            height = (int)(height * ratio);
+        }
+        else {
+            if (getHeight() > 150) {
+                ratio = (double)(ACCSIZE-5) / height;
+                height = ACCSIZE-5;
+                width = (int)(width * ratio);
+            }
+            else {
+                ratio = (double)getHeight() / height;
+                height = getHeight();
+                width = (int)(width * ratio);
+            }
+        }
+
+        image = image.getScaledInstance(width, height, Image.SCALE_DEFAULT);
+    }
+
+    public void paintComponent(Graphics g) {
+        g.setColor(bg);
+
+        /*
+         * If we don't do this, we will end up with garbage from previous
+         * images if they have larger sizes than the one we are currently
+         * drawing. Also, it seems that the file list can paint outside
+         * of its rectangle, and will cause odd behavior if we don't clear
+         * or fill the rectangle for the accessory before drawing. This might
+         * be a bug in JFileChooser.
+         */
+        g.fillRect(0, 0, ACCSIZE, getHeight());
+        g.drawImage(image, getWidth() / 2 - width / 2 + 5,
+                getHeight() / 2 - height / 2, this);
+    }
+
+}